Язык запросов 1С похож на SQL, но работает с объектами конфигурации, а не с таблицами СУБД, и платформа сама переводит его в SQL. Запросы есть в любом собесе: написать, найти ошибку, объяснить план.
Структура
ВЫБРАТЬ [РАЗРЕШЕННЫЕ] [РАЗЛИЧНЫЕ] [ПЕРВЫЕ 10]
поля
[ПОМЕСТИТЬ ВТ]
ИЗ источники и соединения
ГДЕ условия
СГРУППИРОВАТЬ ПО ...
ИМЕЮЩИЕ ...
ОБЪЕДИНИТЬ [ВСЕ] ...
УПОРЯДОЧИТЬ ПО ...
ИТОГИ ... ПО ...
ИНДЕКСИРОВАТЬ ПО ...
Источники: Справочник.Номенклатура, Документ.Реализация, Документ.Реализация.Товары (табличная часть, поле Ссылка ведёт на документ), РегистрНакопления.ТоварыНаСкладах и его виртуальные таблицы.
Параметры
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Д.Ссылка ИЗ Документ.Заказ КАК Д ГДЕ Д.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Значения в текст не подставляют конкатенацией. Результат: Выбрать() для обхода, Выгрузить() в таблицу значений, Пустой() для проверки.
NULL и соединения
- ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО условие.
- У строк без пары поля правой таблицы NULL:
ЕСТЬNULL(Ост.КоличествоОстаток, 0). Проверка:Поле ЕСТЬ NULL. - Условие на правую таблицу в ГДЕ превращает левое соединение во внутреннее. Такие условия пишут в ПО.
- Соединение «один ко многим» до группировки размножает строки, и суммы растут. Сначала группируют, потом соединяют. РАЗЛИЧНЫЕ не лечит, а маскирует.
Полезные конструкции
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт),ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка).Т.Регистратор ССЫЛКА Документ.Реализация: проверка таблицы ссылки.ВЫРАЗИТЬ(Т.Регистратор КАК Документ.Реализация).Контрагент: приведение составного типа, одно соединение вместо многих.В ИЕРАРХИИ (&Группа),ПОДОБНО "%шуруп%"(% любые символы, _ один символ),МЕЖДУ,ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.ДАТАВРЕМЯ(2026, 1, 1),НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ).- Агрегаты: СУММА, КОЛИЧЕСТВО, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...), МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ.
Обращение через точку в запросе
Каждая точка это неявное левое соединение. Для поля составного типа соединение идёт со всеми таблицами типов, у которых есть реквизит. Длинные цепочки и точки от Регистратор делают SQL огромным. Лечение: ВЫРАЗИТЬ, явные соединения, только нужные поля.
Пакеты и временные таблицы
Пакет это несколько запросов через «;». Временная таблица создаётся предложением ПОМЕСТИТЬ (после списка полей) и живёт в рамках пакета или менеджера временных таблиц:
ВЫБРАТЬ
Т.Номенклатура КАК Номенклатура,
СУММА(Т.Количество) КАК Количество
ПОМЕСТИТЬ ВТТовары
ИЗ
Документ.Реализация.Товары КАК Т
ГДЕ
Т.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
Т.Номенклатура
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
ВЫБРАТЬ ... ИЗ ВТТовары КАК ВТ ...
Временные таблицы заменяют повторяющиеся подзапросы и помогают оптимизатору. После использования их уничтожают (УНИЧТОЖИТЬ ВТТовары).
Прочее
ВЫБРАТЬ РАЗРЕШЕННЫЕпри ограничениях RLS возвращает только доступные записи вместо ошибки.ОБЪЕДИНИТЬубирает дубли,ОБЪЕДИНИТЬ ВСЕнет и быстрее.ПЕРВЫЕбезУПОРЯДОЧИТЬ ПОвозвращает произвольные строки.ИТОГИ ... ПОдобавляет строки итогов, обход выборкой ПоГруппировкам.
Что спросят на собесе
- Напишите запрос остатков с ценами и нулём для товаров без остатка.
- Зачем ВЫРАЗИТЬ и что плохого в точке от составного поля?
- Почему левое соединение стало внутренним?
- Зачем временные таблицы и пакеты?
- Чем ОБЪЕДИНИТЬ отличается от ОБЪЕДИНИТЬ ВСЕ?