Как заполнить колонку динамического списка по условию из нескольких реквизитов в 1С?

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

Часто при разработке на платформе 1С возникает задача вывести в динамический список данные, которые зависят от значений других реквизитов. Разберем типичную ситуацию: у нас есть справочник Карточка, в котором присутствуют реквизиты ФИО (строка), ОбщаяОчередь (число), ОчередьСДетьми (число) и РождениеРебенка (булево). Нам нужно вывести в динамическом списке одну колонку очереди, которая будет показывать значение из ОчередьСДетьми, если флажок установлен, или ОбщаяОчередь, если флажок снят. Проанализируем, как правильно и оптимально решить эту задачу.

Решение 1: Использование конструкции ВЫБОР в произвольном запросе

Самый простой и распространенный способ объединить значения из разных реквизитов в одну колонку — использовать условный оператор в самом запросе. Рассмотрим по шагам, как это реализовать.

  1. Откройте свойства динамического списка в редакторе формы и установите флажок Произвольный запрос.
  2. Крайне важно: обязательно оставьте заполненным поле Основная таблица (в нашем случае это Справочник.Карточка). Если основная таблица не указана, список потеряет стандартные команды (создание, копирование, пометка на удаление), а системе придется вручную указывать поля ключа.
  3. В тексте запроса используйте конструкцию ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.

Посмотрим на пример запроса, который решает нашу задачу:


ВЫБРАТЬ
    Т.Ссылка КАК Ссылка,
    Т.ФИО КАК ФИО,
    ВЫБОР
        КОГДА Т.РождениеРебенка = ИСТИНА
            ТОГДА Т.ОчередьСДетьми
        ИНАЧЕ Т.ОбщаяОчередь
    КОНЕЦ КАК КтоКрайний
ИЗ
    Справочник.Карточка КАК Т

В этом запросе мы создали новое вычисляемое поле КтоКрайний. Чтобы эта колонка появилась в интерфейсе, необходимо добавить новый элемент формы (поле) в таблицу динамического списка и в его свойстве Путь к данным выбрать наше новое поле КтоКрайний.

Влияние на поиск и сортировку

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

Решение 2: Использование обработчика ПриПолученииДанныхНаСервере

Если логика определения значения сложнее обычного условия (например, требует обращения к другим регистрам, проверки прав доступа или вызова функций общих модулей), перегружать произвольный запрос нельзя. Это вызовет серьезные "тормоза" при отрисовке интерфейса. Рассмотрим современную альтернативу, появившуюся в платформе 8.3.10 — событие динамического списка ПриПолученииДанныхНаСервере.

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

Разберем пример реализации:

  1. В произвольном запросе создаем фиктивное поле: 0 КАК КтоКрайний.
  2. Для динамического списка назначаем обработчик события ПриПолученииДанныхНаСервере.
  3. В коде обработчика обходим коллекцию строк и заполняем значение.

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    
    Для Каждого СтрокаСписка Из Строки Цикл
        ДанныеСтроки = СтрокаСписка.Значение.Данные;
        
        Если ДанныеСтроки.РождениеРебенка Тогда
            ДанныеСтроки.КтоКрайний = ДанныеСтроки.ОчередьСДетьми;
        Иначе
            ДанныеСтроки.КтоКрайний = ДанныеСтроки.ОбщаяОчередь;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Важное преимущество: этот код выполняется порционно (только для видимых строк, обычно это 20-45 записей), что минимизирует нагрузку на сервер БД.

Решение 3: Условное оформление динамического списка

Иногда задача сводится не к объединению данных в одной колонке, а к привлечению внимания оператора к приоритетным записям (например, выделить тех, кто с детьми). В таких случаях лучше обойтись без изменения запросов.

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

← На главную