İçeriğe geç
Educora
İleri20 dk10 / 14

Sorgu dili: seçim, birleştirmeler, gruplama ve toplamlar

1C sorgu diliyle veri seç: `ВЫБРАТЬ … ИЗ … ГДЕ`, parametreler, `ЛЕВОЕ` ve `ВНУТРЕННЕЕ СОЕДИНЕНИЕ`, `СГРУППИРОВАТЬ ПО`, `ИТОГИ`; kodda `Запрос` nesnesiyle çalış ve sorgu sihirbazını kullan.

Kendini test et
Bu derste öğreneceklerin
  • Seçim, koşul, sıralama ve parametrelerle sorgu yazmak
  • Tabloları birleştirmek, verileri gruplamak ve toplamlar almak
  • Sorguyu kodda çalıştırıp sonucu seçim ya da tablo olarak işlemek

SQL biliyorsan 1C sorgu dili sana tanıdık gelecek; anahtar sözcükler sadece Rusçadır. Ama iki önemli fark var: sorgular verileri yalnızca okur (verileri nesneler ve kayıt kümeleri değiştirir) ve tablolar VTYS tabloları değil, metadata nesneleridir: Справочник.Товары, Документ.РасходТовара.Товары, РегистрНакопления.ОстаткиТоваров.

İlk sorgu

1C Query
ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    Товары.Код КАК Код,
    Товары.Цена КАК Цена
ИЗ
    Справочник.Товары КАК Товары
ГДЕ
    Товары.Цена >= &МинЦена
    И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Цена УБЫВ
&МинЦена bir parametredir; КАК (AS) alanlara ve tablolara takma ad verir; УБЫВ (DESC) azalan sıralamadır.
1Cİngilizce sözdizimi / SQL
ВЫБРАТЬ, РАЗЛИЧНЫЕ, ПЕРВЫЕ 10SELECT, DISTINCT, TOP 10
ИЗ, КАК, ГДЕFROM, AS, WHERE
СГРУППИРОВАТЬ ПО, ИМЕЮЩИЕGROUP BY, HAVING
УПОРЯДОЧИТЬ ПО … УБЫВORDER BY … DESC
ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ … ПОLEFT / INNER / FULL JOIN … ON
ОБЪЕДИНИТЬ ВСЕUNION ALL
И, ИЛИ, НЕ, В, МЕЖДУ, ПОДОБНО, ЕСТЬ NULLAND, OR, NOT, IN, BETWEEN, LIKE, IS NULL
СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕSUM, COUNT, MAX, MIN, AVG

Sorguda bir referans alanından noktayla geçebilirsin: РасходТовары.Ссылка.Дата belgenin tarihini, Товары.Ссылка.Родитель.Наименование ise grubun adını verir. Platform bunun için arka planda gizli bir birleştirme oluşturur.

Sorgunun içinde koşula göre değer seçmek için ВЫБОР КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ (CASE WHEN) yapısı; bir numaralandırma değerini, önceden tanımlı bir öğeyi ya da boş bir referansı belirtmek için ise ЗНАЧЕНИЕ() (VALUE) fonksiyonu kullanılır. Böylece numaralandırma değeri parametre olmadan doğrudan metne yazılabilir.

1C Query
ВЫБРАТЬ
    Оплаты.Ссылка КАК Документ,
    ВЫБОР
        КОГДА Оплаты.ВидОплаты = ЗНАЧЕНИЕ(Перечисление.ВидыОплаты.Наличные)
            ТОГДА "Наличные"
        ИНАЧЕ "Безналичные"
    КОНЕЦ КАК Способ
ИЗ
    Документ.Оплата КАК Оплаты
ГДЕ
    Оплаты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), cari hesabı doldurulmamış belgeleri dışarıda bırakır.

Kodda `Запрос` nesnesi

1C
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Товары.Наименование КАК Наименование,
|    Товары.Цена КАК Цена
|ИЗ
|    Справочник.Товары КАК Товары
|ГДЕ
|    Товары.Цена >= &МинЦена
|УПОРЯДОЧИТЬ ПО
|    Цена УБЫВ";
Запрос.УстановитьПараметр("МинЦена", 5);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
    Сообщить("Ничего не найдено");
КонецЕсли;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование + " - " + Выборка.Цена);
КонецЦикла;

Таблица = Результат.Выгрузить();  // ТаблицаЗначений
İngilizce sözdiziminde: Новый Запрос = New Query, УстановитьПараметр = SetParameter, Выполнить = Execute, Выбрать = Select, Следующий = Next, Выгрузить = Unload.

Выбрать() sonucu satır satır okuyan bir seçim döndürür; büyük sonuçlar için tutumludur. Выгрузить() ise her şeyi belleğe bir ТаблицаЗначений olarak yükler; sıralamak, gruplamak ya da forma aktarmak için kullanışlıdır. Değerleri asla metin birleştirmeyle sorgu metnine “yapıştırma”; her zaman &Parametre ve УстановитьПараметр kullan.

Birleştirmeler ve gruplama

1C Query
ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    ЕСТЬNULL(Продажи.Количество, 0) КАК Продано
ИЗ
    Справочник.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            РасходТовары.Товар КАК Товар,
            СУММА(РасходТовары.Количество) КАК Количество
        ИЗ
            Документ.РасходТовара.Товары КАК РасходТовары
        ГДЕ
            РасходТовары.Ссылка.Проведен
            И РасходТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец
        СГРУППИРОВАТЬ ПО
            РасходТовары.Товар) КАК Продажи
        ПО Товары.Ссылка = Продажи.Товар
УПОРЯДОЧИТЬ ПО
    Продано УБЫВ
Hiç satılmayanlar dahil tüm ürünler: ЛЕВОЕ СОЕДИНЕНИЕ sol tablonun tüm satırlarını tutar, ЕСТЬNULL (ISNULL) ise NULL değerini 0 ile değiştirir.
BirleştirmeHangi satırlar kalır
ВНУТРЕННЕЕ СОЕДИНЕНИЕyalnızca iki tabloda da eşi olan satırlar
ЛЕВОЕ СОЕДИНЕНИЕsoldaki tüm satırlar; eşi yoksa sağdaki alanlar NULL
ПОЛНОЕ СОЕДИНЕНИЕiki tablonun tüm satırları

СГРУППИРОВАТЬ ПО (GROUP BY) satırları gruplar; СУММА, КОЛИЧЕСТВО, МАКСИМУМ gibi toplama fonksiyonları grup başına hesaplar. Gruplara koşul koymak için ГДЕ değil ИМЕЮЩИЕ (HAVING) yazılır: ИМЕЮЩИЕ СУММА(РасходТовары.Сумма) > 1000. ГДЕ satırları gruplamadan önce, ИМЕЮЩИЕ ise sonra süzer.

Toplamlar: `ИТОГИ`

ИТОГИ (TOTALS), SQL'de olmayan bir 1C özelliğidir: sonuca gruplar bazında toplam satırları ekler. Sonuç ise ОбходРезультатаЗапроса.ПоГруппировкам (gruplamalara göre) ile iç içe seçimlerle dolaşılır: önce deponun toplamı, sonra ürünleri.

1C
Запрос.Текст =
"ВЫБРАТЬ
|    РасходТовары.Ссылка.Склад КАК Склад,
|    РасходТовары.Товар КАК Товар,
|    РасходТовары.Сумма КАК Сумма
|ИЗ
|    Документ.РасходТовара.Товары КАК РасходТовары
|ИТОГИ
|    СУММА(Сумма)
|ПО
|    Склад";

ВыборкаСклад = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
    Сообщить(СтрШаблон("%1: %2", ВыборкаСклад.Склад, ВыборкаСклад.Сумма));
    ВыборкаСтрок = ВыборкаСклад.Выбрать();
    Пока ВыборкаСтрок.Следующий() Цикл
        Сообщить(СтрШаблон("    %1: %2", ВыборкаСтрок.Товар, ВыборкаСтрок.Сумма));
    КонецЦикла;
КонецЦикла;
  1. 1
    Sihirbazı aç

    Modülde sağ tıkla → Конструктор запроса… (Sorgu sihirbazı). Kod da gerekiyorsa Конструктор запроса с обработкой результата… seç; Запрос nesnesini ve döngüyü de yazar.

  2. 2
    Tabloları ve alanları seç

    Таблицы и поля sekmesinde tabloları ve alanları sürükle; birleştirmeleri Связи, koşulları Условия, geri kalanını Группировка ve Порядок sekmelerinde ayarla.

  3. 3
    Konsolda dene

    Karmaşık bir sorguyu koddan çalıştırmadan önce 1C:Enterprise modunda sorgu konsolunda (Консоль запросов veri işlemcisi) dene: parametreleri gir ve sonucu hemen gör.

Önemli noktalar

  • Sorgular yalnızca okur; kaynaklar metadata nesneleridir (Справочник.X, Документ.X.Товары).
  • Değerleri &Parametre ve УстановитьПараметр ile aktar.
  • ЛЕВОЕ СОЕДИНЕНИЕ + ЕСТЬNULL, eşi olmayan satırları korumanın standart yoludur.
  • ГДЕ gruplamadan önce, ИМЕЮЩИЕ sonra süzer; ИТОГИ grup toplamları ekler.
  • Выбрать() satır satır seçim, Выгрузить() ise bir ТаблицаЗначений verir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Bir sorguya dışarıdan değer nasıl aktarılır?