Как отобрать в пользовательском режиме элементы справочника с пустой табличной частью?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто перед разработчиками и опытными пользователями 1С возникает задача: найти в списке все элементы справочника, у которых конкретная табличная часть является пустой. Прямая попытка установить отбор по условию НомерСтроки равно «Не заполнено» (или 0) в стандартном динамическом списке обычно не дает результатов. Давайте разберемся, почему так происходит и как правильно настроить отбор без изменения конфигурации и написания программного кода.

Почему не работает простой отбор?

Чтобы понять причину, нужно вспомнить, как платформа 1С:Предприятие транслирует настройки отбора в SQL-запросы. Когда мы настраиваем отбор по ТабличнаяЧасть.НомерСтроки, платформа выполняет LEFT JOIN (левое соединение) с таблицей табличной части. Попытка задать условие, что номер строки «не заполнен», интерпретируется системой как поиск записей, где номер строки равен 0. Однако физически в базе данных 1С нумерация строк начинается с 1. Записей с НомерСтроки = 0 просто не существует, поэтому условие никогда не выполняется, и список остается пустым.

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

Чтобы получить нужный результат, нам необходимо изменить логику запроса с «найти строки, где номер равен нулю» на «найти элементы, у которых НЕ СУЩЕСТВУЕТ ни одной записи в табличной части». Для этого в настройках отбора динамического списка мы воспользуемся возможностью группировки условий с отрицанием.

  1. Откройте форму списка справочника в пользовательском режиме.
  2. Нажмите кнопку «Еще» -> «Настроить список...» (или используйте значок настройки в командной панели, если он вынесен).
  3. Перейдите на вкладку «Отбор».
  4. Добавьте новое условие отбора: выберите поле ИмяТабличнойЧасти.Ссылка (или НомерСтроки).
  5. Важный шаг: выделите добавленное условие и нажмите кнопку «Сгруппировать условия» (обычно это значок с иконкой группы).
  6. Для созданной группы установите флажок «Не» (отрицание).
  7. В качестве условия внутри группы укажите: НомерСтроки «Заполнено».

Таким образом, мы даем платформе инструкцию: «Отбери все элементы справочника, для которых НЕ выполняется условие наличия хотя бы одной заполненной строки в табличной части». При такой настройке 1С транслирует запрос с использованием NOT EXISTS, что корректно выводит именно те элементы, табличная часть которых пуста.

Особенности реализации и альтернативные методы

Хотя предложенный выше метод является штатным и удобным, при работе с большими объемами данных следует учитывать некоторые нюансы:

Рассмотрим пример того, как можно поддерживать такой реквизит в актуальном состоянии через модуль объекта:


Процедура ПередЗаписью(Отказ)
    // Устанавливаем признак наличия данных в ТЧ
    ЕстьДанныеВТЧ = (ТабличнаяЧасть.Количество() > 0);
КонецПроцедуры

Используя этот реквизит, вы сможете настроить отбор в списке очень быстро, так как поиск будет выполняться по обычному индексированному полю самого справочника, без выполнения сложных соединений с дочерними таблицами. Однако этот метод требует внесения изменений в конфигурацию.

Заключение

Итак, мы проанализировали ситуацию и выяснили, что для отбора элементов с пустой табличной частью в стандартном интерфейсе 1С необходимо использовать группу условий с логическим «НЕ». Этот метод позволяет решать задачу «на лету» без привлечения программиста. В случае же высокой нагрузки на систему всегда можно рассмотреть вариант с хранением признака наличия строк непосредственно в объекте.

← На главную