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