- 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
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
Товары.Код КАК Код,
Товары.Цена КАК Цена
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Цена >= &МинЦена
И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Цена УБЫВ&МинЦена bir parametredir; КАК (AS) alanlara ve tablolara takma ad verir; УБЫВ (DESC) azalan sıralamadır.| 1C | İngilizce sözdizimi / SQL |
|---|---|
ВЫБРАТЬ, РАЗЛИЧНЫЕ, ПЕРВЫЕ 10 | SELECT, DISTINCT, TOP 10 |
ИЗ, КАК, ГДЕ | FROM, AS, WHERE |
СГРУППИРОВАТЬ ПО, ИМЕЮЩИЕ | GROUP BY, HAVING |
УПОРЯДОЧИТЬ ПО … УБЫВ | ORDER BY … DESC |
ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ … ПО | LEFT / INNER / FULL JOIN … ON |
ОБЪЕДИНИТЬ ВСЕ | UNION ALL |
И, ИЛИ, НЕ, В, МЕЖДУ, ПОДОБНО, ЕСТЬ NULL | AND, 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.
ВЫБРАТЬ
Оплаты.Ссылка КАК Документ,
ВЫБОР
КОГДА Оплаты.ВидОплаты = ЗНАЧЕНИЕ(Перечисление.ВидыОплаты.Наличные)
ТОГДА "Наличные"
ИНАЧЕ "Безналичные"
КОНЕЦ КАК Способ
ИЗ
Документ.Оплата КАК Оплаты
ГДЕ
Оплаты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), cari hesabı doldurulmamış belgeleri dışarıda bırakır.Kodda `Запрос` nesnesi
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование КАК Наименование,
| Товары.Цена КАК Цена
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Цена >= &МинЦена
|УПОРЯДОЧИТЬ ПО
| Цена УБЫВ";
Запрос.УстановитьПараметр("МинЦена", 5);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Ничего не найдено");
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " - " + Выборка.Цена);
КонецЦикла;
Таблица = Результат.Выгрузить(); // ТаблицаЗначенийНовый Запрос = 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
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
ЕСТЬNULL(Продажи.Количество, 0) КАК Продано
ИЗ
Справочник.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РасходТовары.Товар КАК Товар,
СУММА(РасходТовары.Количество) КАК Количество
ИЗ
Документ.РасходТовара.Товары КАК РасходТовары
ГДЕ
РасходТовары.Ссылка.Проведен
И РасходТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец
СГРУППИРОВАТЬ ПО
РасходТовары.Товар) КАК Продажи
ПО Товары.Ссылка = Продажи.Товар
УПОРЯДОЧИТЬ ПО
Продано УБЫВЛЕВОЕ СОЕДИНЕНИЕ sol tablonun tüm satırlarını tutar, ЕСТЬNULL (ISNULL) ise NULL değerini 0 ile değiştirir.| Birleştirme | Hangi 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.
Запрос.Текст =
"ВЫБРАТЬ
| РасходТовары.Ссылка.Склад КАК Склад,
| РасходТовары.Товар КАК Товар,
| РасходТовары.Сумма КАК Сумма
|ИЗ
| Документ.РасходТовара.Товары КАК РасходТовары
|ИТОГИ
| СУММА(Сумма)
|ПО
| Склад";
ВыборкаСклад = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
Сообщить(СтрШаблон("%1: %2", ВыборкаСклад.Склад, ВыборкаСклад.Сумма));
ВыборкаСтрок = ВыборкаСклад.Выбрать();
Пока ВыборкаСтрок.Следующий() Цикл
Сообщить(СтрШаблон(" %1: %2", ВыборкаСтрок.Товар, ВыборкаСтрок.Сумма));
КонецЦикла;
КонецЦикла;- 1Sihirbazı aç
Modülde sağ tıkla →
Конструктор запроса…(Sorgu sihirbazı). Kod da gerekiyorsaКонструктор запроса с обработкой результата…seç;Запросnesnesini ve döngüyü de yazar. - 2Tabloları ve alanları seç
Таблицы и поляsekmesinde tabloları ve alanları sürükle; birleştirmeleriСвязи, koşullarıУсловия, geri kalanınıГруппировкаveПорядокsekmelerinde ayarla. - 3Konsolda 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
&ParametreveУстановитьПараметр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.