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

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

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

Разбор механизма характеристик: почему это работает?

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

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

Благодаря этой связи платформа динамически расширяет схему компоновки данных, используемую динамическим списком. Она создает виртуальные поля, к которым можно обращаться через объектную ссылку. Именно поэтому в списке доступных полей выбора появляются свойства, хранящиеся в подчиненной табличной части.

Программное добавление колонок на форму

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

  1. Создать новый элемент формы типа ПолеФормы с видом ПолеВвода.
  2. Связать созданное поле с динамическими данными списка, указав правильный ПутьКДанным.

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

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


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

&НаСервере
Процедура УдалитьКолонкуСвойстваНаСервере(ИмяСвойства)
    
    ИмяЭлемента = "Список_" + СтрЗаменить(ИмяСвойства, " ", "_");
    НайденныйЭлемент = Элементы.Найти(ИмяЭлемента);
    
    Если НайденныйЭлемент <> Неопределено Тогда
        Элементы.Удалить(НайденныйЭлемент);
    КонецЕсли;
    
КонецПроцедуры

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

Решение проблемы сохранения колонок при перезапуске формы

При тестировании описанного выше решения вы можете столкнуться с проблемой: программно добавленные колонки пропадают при закрытии и повторном открытии формы. Выясним причину этого поведения.

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

Чтобы решить эту проблему, мы можем применить один из двух подходов:

  1. Принудительное сохранение состояния в хранилище настроек. Мы можем сохранять массив имен активных колонок дополнительных реквизитов в ХранилищеОбщихНастроек при закрытии формы или при нажатии кнопок выбора. Затем в обработчике события формы ПриСозданииНаСервере мы считываем этот массив и заново генерируем элементы формы.
  2. Использование пользовательских настроек компоновщика данных. Вместо прямого добавления элементов интерфейса мы можем программно добавлять поля в выбранные поля компоновщика настроек динамического списка. Для этого используется коллекция Список.КомпоновщикНастроек.Настройки.Выбор или пользовательские настройки.

Проанализируем первый вариант как наиболее надежный и простой в реализации для интерфейса управляемых форм. Ниже представлен шаблон кода для сохранения и восстановления динамических колонок:


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

&НаСервере
Процедура СохранитьНаборКолонок(МассивКолонок)
    
    // Записываем текущий набор колонок в системное хранилище настроек
    ХранилищеОбщихНастроек.Сохранить("НастройкиФормыСписка", "ДополнительныеКолонки", МассивКолонок);
    
EndПроцедуры

Ошибки при работе с документами и произвольными запросами

Иногда разработчики сталкиваются с ошибкой "Недопустимое значение" при попытке установить свойство ПутьКДанным для колонок динамического списка в документах. Выясним, почему это происходит и как исправить ситуацию.

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

  1. В свойствах динамического списка не заполнено поле ОсновнаяТаблица. Если основная таблица не указана, платформа не знает, к какому объекту привязывать характеристики, и виртуальные поля в квадратных скобках становятся недоступны.
  2. Поле Ссылка в тексте запроса переименовано (ей назначен алиас) или сама ссылка получается через сложные соединения таблиц. Для корректной работы характеристик поле ссылки должно выбираться непосредственно из основной таблицы списка.
  3. У данного типа документа в конфигураторе на вкладке "Характеристики" вообще не настроено описание дополнительных реквизитов. Убедитесь, что характеристики настроены аналогично справочникам.

Для устранения ошибки перейдите в свойства динамического списка в конфигураторе, установите свойство Основная таблица (например, Документ.РеализацияТоваровУслуг) и проверьте, чтобы в запросе выбиралось стандартное поле ссылки без переименований.

← На главную