Урок по треку Разработка на 1С 6 мин

Язык запросов 1С

ВЫБРАТЬ, соединения, NULL, ВЫРАЗИТЬ, параметры, пакеты и временные таблицы, итоги.

Язык запросов 1С похож на SQL, но работает с объектами конфигурации, а не с таблицами СУБД, и платформа сама переводит его в SQL. Запросы есть в любом собесе: написать, найти ошибку, объяснить план.

Структура

ВЫБРАТЬ [РАЗРЕШЕННЫЕ] [РАЗЛИЧНЫЕ] [ПЕРВЫЕ 10]
	поля
[ПОМЕСТИТЬ ВТ]
ИЗ источники и соединения
ГДЕ условия
СГРУППИРОВАТЬ ПО ...
ИМЕЮЩИЕ ...
ОБЪЕДИНИТЬ [ВСЕ] ...
УПОРЯДОЧИТЬ ПО ...
ИТОГИ ... ПО ...
ИНДЕКСИРОВАТЬ ПО ...

Источники: Справочник.Номенклатура, Документ.Реализация, Документ.Реализация.Товары (табличная часть, поле Ссылка ведёт на документ), РегистрНакопления.ТоварыНаСкладах и его виртуальные таблицы.

Параметры

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Д.Ссылка ИЗ Документ.Заказ КАК Д ГДЕ Д.Контрагент = &Контрагент";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();

Значения в текст не подставляют конкатенацией. Результат: Выбрать() для обхода, Выгрузить() в таблицу значений, Пустой() для проверки.

NULL и соединения

  • ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ ... ПО условие.
  • У строк без пары поля правой таблицы NULL: ЕСТЬNULL(Ост.КоличествоОстаток, 0). Проверка: Поле ЕСТЬ NULL.
  • Условие на правую таблицу в ГДЕ превращает левое соединение во внутреннее. Такие условия пишут в ПО.
  • Соединение «один ко многим» до группировки размножает строки, и суммы растут. Сначала группируют, потом соединяют. РАЗЛИЧНЫЕ не лечит, а маскирует.

Полезные конструкции

  • ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт), ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка).
  • Т.Регистратор ССЫЛКА Документ.Реализация: проверка таблицы ссылки.
  • ВЫРАЗИТЬ(Т.Регистратор КАК Документ.Реализация).Контрагент: приведение составного типа, одно соединение вместо многих.
  • В ИЕРАРХИИ (&Группа), ПОДОБНО "%шуруп%" (% любые символы, _ один символ), МЕЖДУ, ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.
  • ДАТАВРЕМЯ(2026, 1, 1), НАЧАЛОПЕРИОДА(Дата, МЕСЯЦ).
  • Агрегаты: СУММА, КОЛИЧЕСТВО, КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ...), МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ.

Обращение через точку в запросе

Каждая точка это неявное левое соединение. Для поля составного типа соединение идёт со всеми таблицами типов, у которых есть реквизит. Длинные цепочки и точки от Регистратор делают SQL огромным. Лечение: ВЫРАЗИТЬ, явные соединения, только нужные поля.

Пакеты и временные таблицы

Пакет это несколько запросов через «;». Временная таблица создаётся предложением ПОМЕСТИТЬ (после списка полей) и живёт в рамках пакета или менеджера временных таблиц:

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

Временные таблицы заменяют повторяющиеся подзапросы и помогают оптимизатору. После использования их уничтожают (УНИЧТОЖИТЬ ВТТовары).

Прочее

  • ВЫБРАТЬ РАЗРЕШЕННЫЕ при ограничениях RLS возвращает только доступные записи вместо ошибки.
  • ОБЪЕДИНИТЬ убирает дубли, ОБЪЕДИНИТЬ ВСЕ нет и быстрее.
  • ПЕРВЫЕ без УПОРЯДОЧИТЬ ПО возвращает произвольные строки.
  • ИТОГИ ... ПО добавляет строки итогов, обход выборкой ПоГруппировкам.

Что спросят на собесе

  • Напишите запрос остатков с ценами и нулём для товаров без остатка.
  • Зачем ВЫРАЗИТЬ и что плохого в точке от составного поля?
  • Почему левое соединение стало внутренним?
  • Зачем временные таблицы и пакеты?
  • Чем ОБЪЕДИНИТЬ отличается от ОБЪЕДИНИТЬ ВСЕ?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.