Оглавление

Мова запитів 1С:Підприємство

Загальна інформація

Мова запитів 1С – SQL-подібна мова для вибірки та обробки даних з інформаційної бази 1С:Підприємство. Вона схожа на SQL, але має свої особливості та специфічні можливості.

📌 Важливо: Мова запитів використовується через об'єкт Запрос (Query) у коді 1С. Ключові слова завжди пишуться російською мовою.

Базовий синтаксис

Основні ключові слова SELECT-запиту

Ключове слово Опис Приклад використання
ВЫБРАТЬ Вибірка полів ВЫБРАТЬ Номенклатура.Наименование
РАЗЛИЧНЫЕ Унікальні значення ВЫБРАТЬ РАЗЛИЧНЫЕ Контрагент
ПЕРВЫЕ Обмеження кількості рядків ВЫБРАТЬ ПЕРВЫЕ 100
ИЗ Джерело даних ИЗ Справочник.Номенклатура
ГДЕ Умова фільтрації ГДЕ Цена > 1000
УПОРЯДОЧИТЬ ПО Сортування УПОРЯДОЧИТЬ ПО Наименование ВОЗР
СГРУППИРОВАТЬ ПО Групування СГРУППИРОВАТЬ ПО Контрагент

Напрямки сортування

Ключове слово Опис
ВОЗР За зростанням
УБЫВ За спаданням
ВЫБРАТЬ ПЕРВЫЕ 10 Номенклатура.Наименование КАК Товар, Номенклатура.Цена КАК Цена ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Цена > 1000 УПОРЯДОЧИТЬ ПО Цена УБЫВ

З'єднання таблиць (JOIN)

Тип з'єднання Опис
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Тільки записи, що мають відповідність в обох таблицях
ЛЕВОЕ СОЕДИНЕНИЕ Всі записи з лівої таблиці + відповідні з правої
ПРАВОЕ СОЕДИНЕНИЕ Всі записи з правої таблиці + відповідні з лівої
ПОЛНОЕ СОЕДИНЕНИЕ Всі записи з обох таблиць
💡 Примітка: Після типу з'єднання вказується умова з'єднання через ключове слово ПО.
ВЫБРАТЬ ПродажиОбороты.Номенклатура.Наименование, ПродажиОбороты.КоличествоОборот, Цены.Цена ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены КАК Цены ПО ПродажиОбороты.Номенклатура = Цены.Номенклатура

Агрегатні функції

Функція Опис Приклад
СУММА() Сума значень СУММА(Сумма)
КОЛИЧЕСТВО() Кількість записів КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагент)
СРЕДНЕЕ() Середнє значення СРЕДНЕЕ(Цена)
МИНИМУМ() Мінімальне значення МИНИМУМ(Дата)
МАКСИМУМ() Максимальне значення МАКСИМУМ(Количество)
ВЫБРАТЬ Продажи.Контрагент, СУММА(Продажи.Сумма) КАК ОбщаяСумма, КОЛИЧЕСТВО(Продажи.Номенклатура) КАК КоличествоПозиций, СРЕДНЕЕ(Продажи.Сумма) КАК СредняяСумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Продажи СГРУППИРОВАТЬ ПО Продажи.Контрагент

Об'єднання запитів (UNION)

Ключове слово Опис
ОБЪЕДИНИТЬ Об'єднання з виключенням дублікатів
ОБЪЕДИНИТЬ ВСЕ Об'єднання зі збереженням дублікатів
ВЫБРАТЬ Приход.Номенклатура, Приход.Количество, "Приход" КАК ТипДокумента ИЗ Документ.ПоступлениеТоваров.Товары КАК Приход ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Расход.Номенклатура, -Расход.Количество, "Расход" ИЗ Документ.РеализацияТоваров.Товары КАК Расход

Підзапити (вкладені запити)

Мова запитів 1С підтримує використання підзапитів у виразах та умовах:

ВЫБРАТЬ Номенклатура.Наименование, Номенклатура.Цена ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Цена > ( ВЫБРАТЬ СРЕДНЕЕ(Ном.Цена) ИЗ Справочник.Номенклатура КАК Ном )

Оператори для роботи з підзапитами

Оператор Опис
В Перевірка входження до списку значень
НЕ В Перевірка відсутності у списку значень

Робота з NULL значеннями

⚠️ УВАГА: Ключове слово NULL використовується ТІЛЬКИ в мові запитів. У коді модулів 1С для невизначеного значення використовується Неопределено.
Конструкція Опис
IS NULL Перевірка на невизначене значення
IS NOT NULL Перевірка на визначене значення
ЕСТЬNULL() Заміна NULL на вказане значення
ВЫБРАТЬ Контрагент.Наименование, ЕСТЬNULL(Контрагент.ИНН, "Не указан") КАК ИНН ИЗ Справочник.Контрагенты КАК Контрагент ГДЕ Контрагент.Email IS NOT NULL

Логічні оператори та умови

Оператор Опис
И Логічне "і"
ИЛИ Логічне "або"
НЕ Логічне заперечення
ПОДОБНО Пошук за шаблоном
МЕЖДУ Значення у діапазоні
ВЫБРАТЬ Товар.Наименование ИЗ Справочник.Номенклатура КАК Товар ГДЕ Товар.Наименование ПОДОБНО "%Компьютер%" И Товар.Цена МЕЖДУ 1000 И 5000 И НЕ Товар.ЭтоГруппа

Параметри запитів

Для передачі значень у запит використовуються параметри з префіксом &:

ВЫБРАТЬ Документ.Номер, Документ.Дата, Документ.Сумма ИЗ Документ.РеализацияТоваров КАК Документ ГДЕ Документ.Контрагент = &ВыбранныйКонтрагент И Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

У коді 1С:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
    |    Документ.Номер,
    |    Документ.Дата,
    |    Документ.Сумма
    |ИЗ
    |    Документ.РеализацияТоваров КАК Документ
    |ГДЕ
    |    Документ.Контрагент = &ВыбранныйКонтрагент
    |    И Документ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания"
;

Запрос.УстановитьПараметр("ВыбранныйКонтрагент", МойКонтрагент);
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));

Результат = Запрос.Выполнить();

Як формувати запити в коді 1С

Правильне оформлення тексту запиту в модулі 1С критично важливе для читабельності та підтримки коду.

Правила оформлення рядка запиту

⚠️ ОБОВ'ЯЗКОВІ ПРАВИЛА:
  1. Використовуйте рядковий літерал з вертикальною рискою | для багаторядкових запитів
  2. Кожне ключове слово SQL на новому рядку з вертикальною рискою на початку
  3. Відступи для вкладених конструкцій (JOIN, підзапити) - 4 пробіли
  4. НЕ використовувати конкатенацію рядків для формування запиту
  5. Завжди використовувати параметри замість підстановки значень у текст

✅ ПРАВИЛЬНО - Використання вертикальної риски |

// Створення об'єкта запиту
Запрос = Новый Запрос;

// Формування тексту запиту з вертикальною рискою
Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Номенклатура,
    |    Номенклатура.Наименование КАК Наименование,
    |    Номенклатура.Артикул КАК Артикул,
    |    ЦеныНоменклатуры.Цена КАК Цена
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    |    ПО Номенклатура.Ссылка = ЦеныНоменклатуры.Номенклатура
    |ГДЕ
    |    Номенклатура.ЭтоГруппа = ЛОЖЬ
    |    И Номенклатура.Цена > &МинимальнаяЦена
    |    И Номенклатура.ВидНоменклатуры = &ВыбранныйВид
    |УПОРЯДОЧИТЬ ПО
    |    Наименование"
;

// Встановлення параметрів
Запрос.УстановитьПараметр("МинимальнаяЦена", 1000);
Запрос.УстановитьПараметр("ВыбранныйВид", ВидНоменклатуры);

// Виконання запиту
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

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

❌ НЕПРАВИЛЬНО - Конкатенація рядків

// ❌ НЕ РОБІТЬ ТАК!
Запрос.Текст = "ВЫБРАТЬ " + "Номенклатура.Наименование " + "ИЗ Справочник.Номенклатура КАК Номенклатура";  // Погано читається!

Складні запити з підзапитами

Запрос.Текст =
    "ВЫБРАТЬ
    |    Продажи.Контрагент,
    |    Продажи.ОбщаяСумма,
    |    (ВЫБРАТЬ
    |        СРЕДНЕЕ(Прод.Сумма)
    |    ИЗ
    |        Документ.РеализацияТоваров КАК Прод
    |    ГДЕ
    |        Прод.Контрагент = Продажи.Контрагент
    |    ) КАК СредняяСумма
    |ИЗ
    |    (ВЫБРАТЬ
    |        РеализацияТоваров.Контрагент КАК Контрагент,
    |        СУММА(РеализацияТоваров.СуммаДокумента) КАК ОбщаяСумма
    |    ИЗ
    |        Документ.РеализацияТоваров КАК РеализацияТоваров
    |    ГДЕ
    |        РеализацияТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |    СГРУППИРОВАТЬ ПО
    |        РеализацияТоваров.Контрагент
    |    ) КАК Продажи
    |УПОРЯДОЧИТЬ ПО
    |    ОбщаяСумма УБЫВ"
;
💡 Переваги використання вертикальної риски |:
  • Запит легко читається та редагується
  • Структура SQL чітко видна
  • Зручно копіювати в конструктор запитів для відладки
  • Не потрібно додавати пробіли в кінці кожного рядка
  • Автоматичне об'єднання рядків платформою 1С

Джерела даних

Основні типи джерел даних у 1С:

Тип Синтаксис Приклад
Довідник Справочник.<Ім'я> Справочник.Номенклатура
Документ Документ.<Ім'я> Документ.РеализацияТоваров
Регістр відомостей РегистрСведений.<Ім'я> РегистрСведений.Цены
Регістр накопичення РегистрНакопления.<Ім'я>.Обороты РегистрНакопления.Продажи.Обороты
Табличная частина Документ.<Ім'я>.<ТабличнаЧастина> Документ.Заказ.Товары

Віртуальні таблиці регістрів

Регістри накопичення та бухгалтерії мають віртуальні таблиці для аналізу даних:

Віртуальна таблиця Призначення
Обороты Обороти за період
Остатки Залишки на кінець періоду
ОстаткиИОбороты Залишки та обороти
ОборотыПоСубконто Обороти з деталізацією по субконто
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.Склад, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков,) КАК ТоварыНаСкладахОстатки ГДЕ ТоварыНаСкладахОстатки.КоличествоОстаток > 0

Корисні поради

✅ Рекомендації:
  • Завжди використовуйте псевдоніми таблиць (КАК) для кращої читабельності
  • Параметризуйте запити замість конкатенації рядків
  • Використовуйте індекси для полів, що часто використовуються у ГДЕ
  • Обмежуйте кількість записів через ПЕРВЫЕ для великих вибірок
  • Для складних запитів використовуйте Конструктор запитів у 1С
⚠️ Уникайте:
  • Вибірки всіх полів без необхідності (ВЫБРАТЬ *)
  • Об'єднання великої кількості таблиць в одному запиті
  • Підзапитів у циклах – краще виконати один запит з JOIN
  • Запитів без умов фільтрації для великих таблиць

Оглавление Платформа 8.3.13.1809