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

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

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

Рассмотрим подробнее, почему эта задача вызывает трудности. Дополнительные реквизиты, реализованные через Библиотеку стандартных подсистем (БСП), физически хранятся не в основной таблице объекта, а в его табличной части или в отдельном регистре сведений (если это дополнительные сведения). Поэтому платформа по умолчанию их не видит без дополнительных связей. Разберем по шагам доступные методы решения этой проблемы.

Способ 1: Обращение через характеристики и путь к данным

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

Проанализируем синтаксис. Для добавления поля необходимо указать ПутьКДанным, используя квадратные скобки для обращения к характеристике:


НовоеПоле = Элементы.Добавить("ДопРеквизитЦех", Тип("ПолеФормы"), Элементы.Список);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Список.Ссылка.[ИмяДополнительногоРеквизита]";

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

Способ 2: Оформление через событие "ПриСозданииНаСервере" (Обходной путь)

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

  1. В обработчике ПриСозданииНаСервере выполняем собственный запрос к табличной части дополнительных реквизитов (или регистру сведений), чтобы получить массив ссылок на объекты с нужным значением реквизита.
  2. Программно создаем элемент условного оформления, где в качестве условия отбора указываем, что ссылка входит в полученный массив.
  3. Если пользователь изменяет объект, нам потребуется обновлять этот отбор.

Посмотрим на пример программного добавления условного оформления для раскраски строк:


// Создаем новый элемент условного оформления
НовыйЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

// Задаем цвет фона
ЭлементОформленияЦвет = НовыйЭлементОформления.Оформление.Элементы.Найти("ЦветФона");
ЭлементОформленияЦвет.Значение = WebЦвета.СветлоЗеленый;
ЭлементОформленияЦвет.Использование = Истина;

// Настраиваем условие (отбор) по массиву ссылок, полученных ранее запросом
ЭлементОтбора = НовыйЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = МассивСсылокСНужнымДопРеквизитом; // Наш массив из запроса
ЭлементОтбора.Использование = Истина;

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

Способ 3: Использование события "ПриПолученииДанныхНаСервере" (Современный метод)

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

Рассмотрим, как мы можем применить этот подход:

  1. В обработчик передается коллекция строк, которые будут выведены на экран.
  2. Мы собираем массив ключей (ссылок) из этой коллекции.
  3. Делаем один небольшой запрос к таблице дополнительных реквизитов по этим ссылкам.
  4. В цикле обходим результат запроса и оформляем конкретные ячейки — меняем цвет, текст или шрифт с помощью свойства оформления ячейки.

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

Способ 4: Изменение запроса через расширение (Рекомендуемый подход)

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

Рассмотрим алгоритм действий:

  1. Заимствуем форму списка в расширение конфигурации.
  2. Для динамического списка устанавливаем свойство ПроизвольныйЗапрос = Истина. При этом платформа автоматически сгенерирует текст запроса к основной таблице.
  3. Добавляем в запрос конструкцию ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN) с табличной частью дополнительных реквизитов (например, Справочник.ПодразделенияОрганизаций.ДополнительныеРеквизиты) или с регистром сведений ДополнительныеСведения.
  4. Выводим нужное значение в поля выборки.

После такого изменения новое поле станет полноценным полем компоновки данных. Пользователи смогут самостоятельно выводить его на форму через меню «Еще — Изменить форму», а вы сможете штатно настраивать условное оформление без написания сложного программного кода.

← На главную