В типовых конфигурациях 1С, построенных на обычных формах (таких как Управление производственным предприятием 1.3, Комплексная автоматизация 1.1 или Управление торговлей 10.3), часто возникает задача расширения функционала групп справочников. Одной из популярных задач является добавление механизма дополнительных свойств для групп контрагентов или номенклатуры. Разберем подробно, как реализовать этот функционал, если стандартные средства конфигуратора не сразу поддаются логике начинающего разработчика.
Прежде чем приступать к программированию, проанализируем, как работает механизм свойств в "толстом клиенте". Он не является частью метаданных конкретного справочника. Значения свойств хранятся в отдельном регистре сведений ЗначенияСвойствОбъектов, а описание самих свойств — в плане видов характеристик (ПВХ) СвойстваОбъектов. Для отображения и редактирования этих данных на форме используется специальная вспомогательная обработка ЗначенияСвойствОбъекта.
Рассмотрим самую частую ошибку: попытку добавить реквизит в список реквизитов самого справочника Контрагенты. Это неверный путь, так как нам не нужно хранить объект обработки в базе данных. Нам нужно создать реквизит формы.
Разберем по шагам действия в конфигураторе:
Контрагенты.ЗначенияСвойствОбъекта.Обратите внимание: если вы не видите типа ОбработкаОбъект, убедитесь, что вы находитесь именно на закладке реквизитов формы. В обычных формах состав доступных типов для реквизитов формы шире, чем для реквизитов самого объекта метаданных.
После того как реквизит формы создан, перейдем на закладку "Диалог". Нам нужно визуализировать таблицу свойств. Проанализируем ситуацию: обработка ЗначенияСвойствОбъекта обычно имеет в своем составе табличную часть (или набор данных), которую мы и выведем на экран.
ЗначенияСвойствОбъекта.СвойстваИЗначения.Простого добавления элементов на форму недостаточно. Выясним причину: при открытии формы объект обработки пуст, он не знает, для какого именно контрагента (или группы) ему нужно показать свойства. Нам необходимо связать форму и обработку программно. Перейдем в модуль формы и найдем процедуру ПриОткрытии.
Рассмотрим пример кода для инициализации:
Процедура ПриОткрытии()
// Указываем обработке, с каким объектом мы работаем.
// В случае формы группы это будет Ссылка на текущую группу.
ЗначенияСвойствОбъекта.Объект = Ссылка;
// Вызываем стандартный метод обработки для заполнения дерева свойств
// Это заполнит таблицу СвойстваИЗначения данными из регистра
ЗначенияСвойствОбъекта.ЗаполнитьСвойстваИЗначения(Ссылка);
КонецПроцедуры
Если после выполнения всех действий список свойств остается пустым, проанализируем настройки метаданных. План видов характеристик СвойстваОбъектов имеет настройку "Назначение свойств". Это список типов объектов, к которым могут относиться те или иные свойства.
Выполним следующие проверки:
СвойстваОбъектов в конфигураторе.СправочникСсылка.Контрагенты.Контрагенты разрешены дополнительные характеристики.Критически важный момент: свойства хранятся в независимом регистре сведений, поэтому при нажатии кнопки "Записать" или "ОК" в форме справочника автоматического сохранения свойств не произойдет. Мы должны инициировать запись вручную.
Найдем процедуру ПриЗаписи (или ПередЗаписью) в модуле формы и добавим туда вызов метода записи:
Процедура ПриЗаписи()
// Метод обработки запишет все измененные строки в регистр ЗначенияСвойствОбъектов
ЗначенияСвойствОбъекта.ЗаписатьЗначенияСвойств();
КонецПроцедуры
Рассмотрим ситуацию, когда пользователь создает новую группу. В этом случае Ссылка объекта еще пуста. Чтобы избежать ошибок, рекомендуется проверять ссылку перед инициализацией или выполнять заполнение свойств после того, как объект был впервые записан.
Также посмотрим на структуру регистра ЗначенияСвойствОбъектов. Он состоит из трех основных измерений: Объект (наш контрагент), Свойство (ссылка на ПВХ) и ресурса Значение. Понимание этой структуры поможет вам в будущем строить отчеты по добавленным свойствам, используя обычные запросы к регистру сведений, соединяя их с основной таблицей контрагентов по полю Объект.
Таким образом, мы разобрали полный цикл подключения механизма дополнительных свойств. Помните, что ключевым моментом является использование именно реквизита формы с типом ОбработкаОбъект, что позволяет использовать богатый встроенный функционал типовых конфигураций без написания сложного кода "с нуля".