Мова запитів 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С критично важливе для читабельності та підтримки коду.
Правила оформлення рядка запиту
⚠️ ОБОВ'ЯЗКОВІ ПРАВИЛА:
- Використовуйте рядковий літерал з вертикальною рискою | для багаторядкових запитів
- Кожне ключове слово SQL на новому рядку з вертикальною рискою на початку
- Відступи для вкладених конструкцій (JOIN, підзапити) - 4 пробіли
- НЕ використовувати конкатенацію рядків для формування запиту
- Завжди використовувати параметри замість підстановки значень у текст
✅ ПРАВИЛЬНО - Використання вертикальної риски |
|
// Створення об'єкта запиту Запрос = Новый Запрос; // Формування тексту запиту з вертикальною рискою Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Номенклатура, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Артикул КАК Артикул, | ЦеныНоменклатуры.Цена КАК Цена |ИЗ | Справочник.Номенклатура КАК Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры | ПО Номенклатура.Ссылка = ЦеныНоменклатуры.Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ЛОЖЬ | И Номенклатура.Цена > &МинимальнаяЦена | И Номенклатура.ВидНоменклатуры = &ВыбранныйВид |УПОРЯДОЧИТЬ ПО | Наименование"; // Встановлення параметрів Запрос.УстановитьПараметр("МинимальнаяЦена", 1000); Запрос.УстановитьПараметр("ВыбранныйВид", ВидНоменклатуры); // Виконання запиту Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Обробка результатів Сообщить(Выборка.Наименование + " - " + Выборка.Цена); КонецЦикла; |
❌ НЕПРАВИЛЬНО - Конкатенація рядків
|
// ❌ НЕ РОБІТЬ ТАК! Запрос.Текст = "ВЫБРАТЬ " + "Номенклатура.Наименование " + "ИЗ Справочник.Номенклатура КАК Номенклатура"; // Погано читається! |
Складні запити з підзапитами
|
Запрос.Текст = "ВЫБРАТЬ | Продажи.Контрагент, | Продажи.ОбщаяСумма, | (ВЫБРАТЬ | СРЕДНЕЕ(Прод.Сумма) | ИЗ | Документ.РеализацияТоваров КАК Прод | ГДЕ | Прод.Контрагент = Продажи.Контрагент | ) КАК СредняяСумма |ИЗ | (ВЫБРАТЬ | РеализацияТоваров.Контрагент КАК Контрагент, | СУММА(РеализацияТоваров.СуммаДокумента) КАК ОбщаяСумма | ИЗ | Документ.РеализацияТоваров КАК РеализацияТоваров | ГДЕ | РеализацияТоваров.Дата МЕЖДУ &ДатаНач И &ДатаКон | СГРУППИРОВАТЬ ПО | РеализацияТоваров.Контрагент | ) КАК Продажи |УПОРЯДОЧИТЬ ПО | ОбщаяСумма УБЫВ"; |
💡 Переваги використання вертикальної риски |:
- Запит легко читається та редагується
- Структура SQL чітко видна
- Зручно копіювати в конструктор запитів для відладки
- Не потрібно додавати пробіли в кінці кожного рядка
- Автоматичне об'єднання рядків платформою 1С
Джерела даних
Основні типи джерел даних у 1С:
| Тип | Синтаксис | Приклад |
|---|---|---|
| Довідник | Справочник.<Ім'я> |
Справочник.Номенклатура |
| Документ | Документ.<Ім'я> |
Документ.РеализацияТоваров |
| Регістр відомостей | РегистрСведений.<Ім'я> |
РегистрСведений.Цены |
| Регістр накопичення | РегистрНакопления.<Ім'я>.Обороты |
РегистрНакопления.Продажи.Обороты |
| Табличная частина | Документ.<Ім'я>.<ТабличнаЧастина> |
Документ.Заказ.Товары |
Віртуальні таблиці регістрів
Регістри накопичення та бухгалтерії мають віртуальні таблиці для аналізу даних:
| Віртуальна таблиця | Призначення |
|---|---|
Обороты |
Обороти за період |
Остатки |
Залишки на кінець періоду |
ОстаткиИОбороты |
Залишки та обороти |
ОборотыПоСубконто |
Обороти з деталізацією по субконто |
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.Склад,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков,) КАК ТоварыНаСкладахОстатки
ГДЕ
ТоварыНаСкладахОстатки.КоличествоОстаток > 0
Корисні поради
✅ Рекомендації:
- Завжди використовуйте псевдоніми таблиць (
КАК) для кращої читабельності - Параметризуйте запити замість конкатенації рядків
- Використовуйте індекси для полів, що часто використовуються у
ГДЕ - Обмежуйте кількість записів через
ПЕРВЫЕдля великих вибірок - Для складних запитів використовуйте Конструктор запитів у 1С
⚠️ Уникайте:
- Вибірки всіх полів без необхідності (
ВЫБРАТЬ *) - Об'єднання великої кількості таблиць в одному запиті
- Підзапитів у циклах – краще виконати один запит з JOIN
- Запитів без умов фільтрації для великих таблиць