При работе с типовыми конфигурациями 1С, построенными на базе Библиотеки Стандартных Подсистем (БСП), разработчики часто сталкиваются с механизмом дополнительных реквизитов и сведений. Конечные пользователи могут легко выводить эти реквизиты в списки через стандартное меню Изменить форму. Однако ручная настройка неудобна, если пользователю требуется быстро переключаться между различными наборами отображаемых свойств. В этой статье мы подробно разберем, как реализовать программное управление такими колонками с помощью кнопок на форме.
Для начала выясним причину, по которой табличная часть ДополнительныеРеквизиты доступна для выбора в виде отдельных колонок в режиме настройки формы, в то время как другие табличные части (например, контактная информация) там отсутствуют. Дело в том, что платформа 1С использует специальный механизм под названием Характеристики.
Если мы откроем любой справочник или документ в конфигураторе и перейдем на вкладку Данные, то в самом низу увидим кнопку Характеристики. В типовых решениях здесь настроена связь объекта метаданных с Планом видов характеристик (обычно это ДополнительныеРеквизитыИСведения) и табличной частью дополнительных реквизитов.
Благодаря этой связи платформа динамически расширяет схему компоновки данных, используемую динамическим списком. Она создает виртуальные поля, к которым можно обращаться через объектную ссылку. Именно поэтому в списке доступных полей выбора появляются свойства, хранящиеся в подчиненной табличной части.
Чтобы программно вывести колонку дополнительного реквизита в динамический список, нам необходимо выполнить две основные операции на сервере:
ПолеФормы с видом ПолеВвода.ПутьКДанным.Рассмотрим синтаксис обращения к виртуальному полю дополнительного реквизита. Путь к данным формируется по следующему шаблону: ИмяДинамическогоСписка.Ссылка.[ИмяСвойства]. Обратите внимание, что имя свойства обязательно должно быть заключено в квадратные скобки. Если у разных наборов свойств совпадают имена, платформа может потребовать указания владельца в скобках, например: Список.Ссылка.[Регион (Справочник "Лиды")].
Разберем готовый пример кода для добавления и удаления колонок на сервере:
&НаСервере
Процедура ДобавитьКолонкуСвойстваНаСервере(ИмяСвойства)
// Формируем уникальное имя для нового элемента формы
ИмяЭлемента = "Список_" + СтрЗаменить(ИмяСвойства, " ", "_");
// Проверим, не была ли колонка добавлена ранее
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
// Создаем новое поле формы в таблице динамического списка
НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.Заголовок = ИмяСвойства;
// Устанавливаем связь с виртуальным полем характеристики
НоваяКолонка.ПутьКДанным = "Список.Ссылка.[" + ИмяСвойства + "]";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УдалитьКолонкуСвойстваНаСервере(ИмяСвойства)
ИмяЭлемента = "Список_" + СтрЗаменить(ИмяСвойства, " ", "_");
НайденныйЭлемент = Элементы.Найти(ИмяЭлемента);
Если НайденныйЭлемент <> Неопределено Тогда
Элементы.Удалить(НайденныйЭлемент);
КонецЕсли;
КонецПроцедуры
Эти процедуры можно вызывать из клиентских обработчиков команд (кнопок), передавая в качестве параметра точное наименование свойства из плана видов характеристик.
При тестировании описанного выше решения вы можете столкнуться с проблемой: программно добавленные колонки пропадают при закрытии и повторном открытии формы. Выясним причину этого поведения.
Платформа 1С сохраняет пользовательские настройки формы (видимость, положение, состав колонок) в специальное системное хранилище. Однако элементы, добавленные программно с помощью метода Элементы.Добавить() во время работы формы, не регистрируются платформой как постоянные изменения интерфейса и не сериализуются автоматически в системные настройки.
Чтобы решить эту проблему, мы можем применить один из двух подходов:
ХранилищеОбщихНастроек при закрытии формы или при нажатии кнопок выбора. Затем в обработчике события формы ПриСозданииНаСервере мы считываем этот массив и заново генерируем элементы формы.Список.КомпоновщикНастроек.Настройки.Выбор или пользовательские настройки.Проанализируем первый вариант как наиболее надежный и простой в реализации для интерфейса управляемых форм. Ниже представлен шаблон кода для сохранения и восстановления динамических колонок:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Восстанавливаем список сохраненных колонок
СохраненныеКолонки = ХранилищеОбщихНастроек.Загрузить("НастройкиФормыСписка", "ДополнительныеКолонки");
Если ТипЗнч(СохраненныеКолонки) = Тип("Массив") Тогда
Для Каждого ИмяСвойства Из СохраненныеКолонки Цикл
ДобавитьКолонкуСвойстваНаСервере(ИмяСвойства);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьНаборКолонок(МассивКолонок)
// Записываем текущий набор колонок в системное хранилище настроек
ХранилищеОбщихНастроек.Сохранить("НастройкиФормыСписка", "ДополнительныеКолонки", МассивКолонок);
EndПроцедуры
Иногда разработчики сталкиваются с ошибкой "Недопустимое значение" при попытке установить свойство ПутьКДанным для колонок динамического списка в документах. Выясним, почему это происходит и как исправить ситуацию.
Основная причина заключается в использовании Произвольного запроса в динамическом списке. Если динамический список построен на основе произвольного запроса, платформа может потерять метаданные характеристик в следующих случаях:
ОсновнаяТаблица. Если основная таблица не указана, платформа не знает, к какому объекту привязывать характеристики, и виртуальные поля в квадратных скобках становятся недоступны.Ссылка в тексте запроса переименовано (ей назначен алиас) или сама ссылка получается через сложные соединения таблиц. Для корректной работы характеристик поле ссылки должно выбираться непосредственно из основной таблицы списка.Для устранения ошибки перейдите в свойства динамического списка в конфигураторе, установите свойство Основная таблица (например, Документ.РеализацияТоваровУслуг) и проверьте, чтобы в запросе выбиралось стандартное поле ссылки без переименований.