Часто при разработке на платформе 1С возникает задача вывести в динамический список данные, которые зависят от значений других реквизитов. Разберем типичную ситуацию: у нас есть справочник Карточка, в котором присутствуют реквизиты ФИО (строка), ОбщаяОчередь (число), ОчередьСДетьми (число) и РождениеРебенка (булево). Нам нужно вывести в динамическом списке одну колонку очереди, которая будет показывать значение из ОчередьСДетьми, если флажок установлен, или ОбщаяОчередь, если флажок снят. Проанализируем, как правильно и оптимально решить эту задачу.
Самый простой и распространенный способ объединить значения из разных реквизитов в одну колонку — использовать условный оператор в самом запросе. Рассмотрим по шагам, как это реализовать.
Справочник.Карточка). Если основная таблица не указана, список потеряет стандартные команды (создание, копирование, пометка на удаление), а системе придется вручную указывать поля ключа.ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.Посмотрим на пример запроса, который решает нашу задачу:
ВЫБРАТЬ
Т.Ссылка КАК Ссылка,
Т.ФИО КАК ФИО,
ВЫБОР
КОГДА Т.РождениеРебенка = ИСТИНА
ТОГДА Т.ОчередьСДетьми
ИНАЧЕ Т.ОбщаяОчередь
КОНЕЦ КАК КтоКрайний
ИЗ
Справочник.Карточка КАК Т
В этом запросе мы создали новое вычисляемое поле КтоКрайний. Чтобы эта колонка появилась в интерфейсе, необходимо добавить новый элемент формы (поле) в таблицу динамического списка и в его свойстве Путь к данным выбрать наше новое поле КтоКрайний.
При использовании вычисляемых полей в запросе следует учитывать особенности работы СУБД. Платформа 1С позволяет пользователям применять отборы и сортировки по колонкам динамического списка. Выясним причину возможных проблем: если поле формируется через конструкцию ВЫБОР, база данных будет вычислять это значение при каждом применении сортировки. Для небольших справочников это незаметно, но на больших таблицах сортировка по таким полям может сильно замедлить работу программы.
Если логика определения значения сложнее обычного условия (например, требует обращения к другим регистрам, проверки прав доступа или вызова функций общих модулей), перегружать произвольный запрос нельзя. Это вызовет серьезные "тормоза" при отрисовке интерфейса. Рассмотрим современную альтернативу, появившуюся в платформе 8.3.10 — событие динамического списка ПриПолученииДанныхНаСервере.
Суть метода заключается в том, что в запросе мы можем добавить пустое поле, а заполнять его программно только для тех строк, которые в данный момент отображаются на экране пользователя.
Разберем пример реализации:
0 КАК КтоКрайний.ПриПолученииДанныхНаСервере.
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
Для Каждого СтрокаСписка Из Строки Цикл
ДанныеСтроки = СтрокаСписка.Значение.Данные;
Если ДанныеСтроки.РождениеРебенка Тогда
ДанныеСтроки.КтоКрайний = ДанныеСтроки.ОчередьСДетьми;
Иначе
ДанныеСтроки.КтоКрайний = ДанныеСтроки.ОбщаяОчередь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Важное преимущество: этот код выполняется порционно (только для видимых строк, обычно это 20-45 записей), что минимизирует нагрузку на сервер БД.
Иногда задача сводится не к объединению данных в одной колонке, а к привлечению внимания оператора к приоритетным записям (например, выделить тех, кто с детьми). В таких случаях лучше обойтись без изменения запросов.
Проанализируем встроенный механизм Условное оформление. В свойствах динамического списка (или формы) можно задать визуальные правила: если значение реквизита РождениеРебенка равно Истина, применять к строке особый цвет фона или жирный шрифт. Это настраивается без программирования, работает максимально быстро и делает список более читаемым для пользователей.