Как вывести дополнительные реквизиты в динамическом списке 1С, чтобы не пропадали строки?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Анализ проблемы: почему исчезают данные

Рассмотрим типичную ситуацию. У нас есть документ ЗаказКлиента и мы хотим вывести колонку с дополнительным реквизитом, например, "Кассовый аппарат". В исходном запросе автора сообщения использовалось Правое соединение и условие в секции ГДЕ. Посмотрим на упрощенную структуру такого запроса:


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

Проблема кроется в работе SQL-запросов и механизме ЛЕВОЕ СОЕДИНЕНИЕ (Left Join). Когда мы указываем условие по правой (присоединяемой) таблице в секции ГДЕ, мы фактически превращаем левое соединение во внутреннее (Inner Join).

Выясним причину: если у заказа клиента нет записи в таблице дополнительных реквизитов с нужным свойством, то после соединения поля правой таблицы примут значение NULL. Условие NULL = &Свойство всегда возвращает ложь (или Unknown), и такая строка просто отсекается из финальной выборки. В итоге пользователь видит только те заказы, где реквизит явно заполнен, а все остальные документы "исчезают" из списка.

Решение №1: Перенос условия в секцию соединения (ПО)

Самый эффективный и правильный способ решить эту проблему в рамках запроса — это перенести фильтрацию по конкретному свойству из секции ГДЕ непосредственно в условие соединения ПО. Рассмотрим, как изменится логика выполнения запроса.

Когда условие находится в секции ПО, система сначала ограничивает записи в присоединяемой таблице (выбирает только те строки, где Свойство = &Свойство), а уже затем выполняет левое соединение с основной таблицей. Если для какого-то заказа подходящей строки не нашлось, основная запись все равно останется в списке, а в поле "Кассовый аппарат" будет стоять NULL.

Проанализируем исправленный код запроса:


ВЫБРАТЬ
    ЗаказКлиента.Ссылка КАК ЗаказКлиента,
    ЗаказКлиентаДополнительныеРеквизиты.Значение КАК КассовыйАппарат
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказКлиентаДополнительныеРеквизиты
        ПО ЗаказКлиентаДополнительныеРеквизиты.Ссылка = ЗаказКлиента.Ссылка
        И ЗаказКлиентаДополнительныеРеквизиты.Свойство = &Свойство

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

Решение №2: Использование механизма характеристик

В платформе 1С существует штатный механизм для работы с дополнительными сведениями и реквизитами — Характеристики. Вместо того чтобы вручную прописывать соединения в тексте запроса динамического списка, мы можем настроить характеристики в метаданных или в самой схеме компоновки данных списка.

Рассмотрим преимущества этого метода:

  1. Автоматизация: Платформа сама построит оптимальный запрос к базе данных.
  2. Гибкость: Пользователь сможет самостоятельно выводить любые дополнительные реквизиты через "Изменить форму", не привлекая программиста.
  3. Производительность: Механизм характеристик оптимизирован для работы с большими объемами данных и правильно обрабатывает отсутствие значений.

Для настройки характеристик в динамическом списке нужно открыть настройки схемы компоновки данных (СКД), перейти на закладку "Характеристики" и указать там таблицу дополнительных реквизитов, поля "Свойство" и "Значение".

Обработка пустых значений с помощью ЕСТЬNULL

Часто в интерфейсе некрасиво смотрятся пустые ячейки или значения NULL. Чтобы список выглядел профессионально, рекомендуется использовать функцию ЕСТЬNULL в секции ВЫБРАТЬ. Это позволит заменить неопределенное значение на пустую ссылку нужного типа или понятный текст.

Посмотрим на пример оформления поля:


ВЫБРАТЬ
    ЗаказКлиента.Ссылка КАК ЗаказКлиента,
    ЕСТЬNULL(ЗаказКлиентаДополнительныеРеквизиты.Значение, ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК КассовыйАппарат
ИЗ
    ...

Такой подход гарантирует, что в колонке всегда будет объект определенного типа, что также поможет избежать ошибок при попытке программной обработки данных в строках списка.

Важные нюансы производительности

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

  1. Основная таблица: Всегда указывайте свойство "Основная таблица" в настройках динамического списка. Это позволяет платформе использовать динамическую выборку данных порциями (по 20-50 строк), а не загружать весь объем данных сразу.
  2. Индексация: Убедитесь, что свойство, по которому вы делаете отбор, проиндексировано. В типовых конфигурациях (УТ 11, ERP) дополнительные реквизиты обычно хранятся в индексированных табличных частях, но при создании собственных механизмов об этом стоит помнить.
  3. Флаг "Использовать всегда": Если вы используете значение дополнительного реквизита в каких-то расчетах или условном оформлении, но не выводите его на форму, обязательно установите флаг Использовать всегда для этого поля в настройках списка. В противном случае платформа может исключить соединение из запроса для оптимизации, и ваши условия перестанут работать.
  4. Вложенные запросы: Избегайте сложных вложенных запросов в секции ГДЕ динамического списка (как это было в примере автора с выборкой из РеализацияТоваровУслуг.Товары). Такие конструкции могут привести к полному сканированию таблиц (Full Scan) и значительным задержкам при открытии формы.

Подводя итог, можно сказать, что правильная работа с динамическими списками в 1С требует понимания основ SQL. Перенос условий фильтрации из ГДЕ в ПО при левом соединении — это базовый навык, который позволяет создавать надежные и быстрые интерфейсы для пользователей.

← На главную