Проверка заполнения табличной части в запросах 1С

Узнайте, как быстро проверить заполненность табличной части в 1С. Избегайте ошибок проведения и пустых отчётов с нашими лайфхаками для разработчиков.

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

В конфигурациях 1С часто возникает необходимость определить, содержит ли документ (или справочник) строки в табличной части. Это может понадобиться для:

  • формирования условий отбора в отчётах;
  • блокировки проведения документа при пустой табличной части;
  • вывода сообщения пользователю о незаполненных данных;
  • оптимизации запросов, исключая обработку пустых строк.

Ниже рассмотрены наиболее распространённые способы проверки заполнения табличной части непосредственно в тексте запроса.

Подсчёт количества строк через КОЛИЧЕСТВО

Самый прямой способ – посчитать количество строк в табличной части и сравнить результат с нулём.

Пример: проверка документа РеализацияТоваровУслуг.

ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Документ,
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары) КАК КолвоСтрок
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
КОЛИЧЕСТВО(РеализацияТоваровУслуг.Товары) > 0

Если нужно вернуть только флаг «заполнена/не заполнена», можно воспользоваться функцией ЕСТЬNULL (или ЕСТЬ) вместе с подзапросом:

ВЫБРАТЬ
Документ.Ссылка КАК Документ,
ЕСТЬNULL(ВложенныйЗапрос.Колво, 0) КАК ЕстьСтроки
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
КОЛИЧЕСТВО(1) КАК Колво
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка
) КАК ВложенныйЗапрос
ПО Документ.Ссылка = ВложенныйЗапрос.Ссылка

Поле ЕстьСтроки будет содержать количество строк табличной части; если оно равно 0 – часть пуста.

Проверка через ЕСТЬNULL и левое соединение

Если нужно просто узнать, есть ли хотя бы одна строка, достаточно выполнить левое соединение табличной части и проверить, не равно ли связанное поле NULL.

Пример:

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

Здесь поле ЕстьЗаполнение принимает значение 1, если в табличной части есть хотя бы одна строка, и 0 – иначе.

Использование агрегатной функции СУММА с условием

Иногда удобно посчитать не просто количество строк, а, например, сумму некоторого количества (кол-во, сумма) и проверить, больше ли оно нуля.

Пример: проверка, что сумма количества товаров в реализации больше нуля.

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

Если после ГРУППИРОВКА нет строк, значит табличная часть пуста (или все количества равны нулю).

Проверка через ВЫБОР КОГДА … THEN … END в составе подзапроса

Можно построить подзапрос, который возвращает 1 для документов с заполненной табличной частью и 0 – для пустых, а затем использовать его в основном запросе.

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

Рекомендации по производительности

  • Избегайте повторного вычисления одного и того же подзапроса несколько раз в одном запросе – лучше вынести его в ВЫБРАТЬ … ЛЕВОЕ СОЕДИНЕНИЕ ( … ).
  • Если проверка нужна только для фильтрации документов, помещайте условие в ГДЕ или ИМЕЮЩИЕ, а не в список выбираемых полей – так движок сможет применить индексы раньше.
  • Для больших объёмов данных предпочтительно использовать КОЛИЧЕСТВО или СУММА с условием > 0, чем проверять каждое поле на NULL через ЕСТЬNULL.
  • При необходимости проверить несколько табличных частей одновременно можно построить несколько левых соединений и объединить результаты через ВЫБОР.

Проверка заполнения табличной части в запросе 1С реализуется несколькими простыми приёмами:

  1. Подсчёт строк через функцию КОЛИЧЕСТВО.
  2. Левое соединение с последующей проверкой на NULL (или использование ЕСТЬNULL).
  3. Агрегатные функции (СУММА, СРЕДНЕЕ) с условием > 0.
  4. Условные выражения ВЫБОР … КОГДА … ТОгда … ИНАЧЕ … КОНЕЦ для формирования флага.

Выбор конкретного способа зависит от задачи: нужна ли просто факт наличия строк, требуется ли знать их количество или суммировать какое‑то поле, а также от требований к производительности запроса. При правильном использовании этих техник вы сможете гибко управлять логикой отборов и обработки данных в своих конфигурациях 1С.