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

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

При разработке интерфейсов на управляемых формах 1С часто возникает задача вывести дополнительные поля или характеристики объекта в таблицу динамического списка без написания программного кода. Разберем, как устроен механизм работы с полями в динамических списках, почему секция {ХАРАКТЕРИСТИКИ} ведет себя иначе, чем в отчетах СКД, и какие существуют способы отображения и сортировки таких данных.

Архитектурные различия между отчетом СКД и динамическим списком

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

  1. Динамический список и компоновщик настроек: отвечают исключительно за порционную выборку данных и применение условий (отборы, группировки, условное оформление). В отличие от отчетов, динамический список не строит автоматически макет и не генерирует элементы интерфейса при изменении коллекции ВыбранныеПоля.
  2. Элементы управляемой формы: за отображение колонок таблицы на экране отвечает коллекция элементов формы (Элементы). Чтобы поле появилось в списке, для него обязательно должен существовать соответствующий элемент типа ПолеФормы, привязанный к пути к данным.
  3. Секция характеристик в запросе: конструкция {ХАРАКТЕРИСТИКИ ...} предназначена в первую очередь для отборов, группировок и оформления. Виртуальные поля характеристик формируются динамически, но платформа не создает под них визуальные колонки в таблице сама по себе.

Способ 1. Добавление колонок через интерфейс «Изменить форму»

Рассмотрим стандартный интерактивный способ, доступный пользователю или администратору без изменения конфигурации:

  1. В правом верхнем углу списка или через меню Еще (Все действия) выберем пункт Изменить форму.
  2. В дереве элементов найдем таблицу динамического списка и нажмем кнопку Добавить поля.
  3. В открывшемся окне найдем требуемые реквизиты объекта или доступные характеристики и установим напротив них флажки.
  4. Нажмем ОК и применим настройки. Добавленные колонки отобразятся в таблице формы.

Важное ограничение сортировки: если поле добавлено через секцию {ХАРАКТЕРИСТИКИ}, при попытке интерактивной сортировки по заголовку такой колонки платформа выдаст ошибку о невозможности упорядочивания. Это связано с тем, что курсорная выборка динамического списка требует прямой индексированной сортировки на уровне СУБД, чего динамические левые соединения СКД обеспечить не могут.

Также учтем, что изменения через диалог «Изменить форму» сохраняются в ХранилищеСистемныхНастроек конкретного пользователя, а не в настройках компоновщика данных. Для распространения этих колонок другим пользователям потребуется переносить настройки интерфейса.

Способ 2. Явное левое соединение в запросе динамического списка

Если для дополнительного реквизита или параметра обязательно требуется возможность сортировки по клику на заголовок, секцию {ХАРАКТЕРИСТИКИ} использовать нельзя. В этом случае пропишем явное соединение с таблицей значений в тексте запроса динамического списка:


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

После добавления поля в выборку запроса перетащим его в конфигураторе в состав колонок таблицы динамического списка. Поле станет полноценной колонкой с поддержкой быстрой сортировки (при условии индексации реквизита в регистре).

Способ 3. Программное добавление колонок на форму

Если состав дополнительных характеристик динамический, но необходимо отображать их как колонки без ручной настройки формы каждым пользователем, добавим элементы программно в серверном событии формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем новую колонку в таблицу формы "Список"
    ИмяЭлемента = "СписокПараметрГрузоперевозки";
    Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
        НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список);
        НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
        НоваяКолонка.ПутьКДанным = "Список.ПараметрГрузоперевозки";
        НоваяКолонка.Заголовок = "Параметр перевозки";
    КонецЕсли;
    
КонецПроцедуры

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

Способ 4. Перенос настроек колонок между пользователями

Когда колонки настроены интерактивно через «Изменить форму», перенесем готовую пользовательскую настройку интерфейса другим пользователям программно через системное хранилище:


КлючОбъекта = "Справочник.CW_Грузоперевозки.Форма.ФормаСписка/НастройкиФормы";
ХранилищеСистемныхНастроек.Копировать(КлючОбъекта, "ПользовательИсточник", "ПользовательПриемник");

В типовых конфигурациях для аналогичного результата воспользуемся стандартной административной обработкой Настройки пользователей и прав (Управление настройками пользователей).

Итоги

Без использования кода или диалога «Изменить форму» вывести отдельную колонку характеристики на форму динамического списка невозможно в силу разделения механизмов СКД и элементов управляемой формы. Для простых отборов и группировок достаточно секции {ХАРАКТЕРИСТИКИ}, а для полноценного отображения с возможностью сортировки следует использовать явные соединения в запросе либо программное создание элементов формы.

← На главную