Почему программно добавленные дополнительные реквизиты перечеркнуты на форме и как это исправить?

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

Довольно часто при загрузке номенклатуры из файлов Excel мы сталкиваемся с необходимостью программно заполнить дополнительные реквизиты товаров. На первый взгляд, самое логичное и быстрое решение — напрямую добавить строки в табличную часть ДополнительныеРеквизиты справочника номенклатуры. Однако после такой загрузки на форме элемента мы видим неприятную картину: эти реквизиты отображаются серым перечеркнутым шрифтом, а кнопка выбора значения недоступна. Давайте разберем по шагам, почему так происходит и как правильно работать с подсистемой свойств.

Выясним причину: почему реквизиты перечеркнуты?

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

Если реквизит отображается перечеркнутым, это означает, что значение для этого свойства записано в табличную часть самого объекта (номенклатуры), но само это свойство отсутствует в назначенном наборе свойств.

Система воспринимает такие данные как «осиротевшие». Это может произойти, если свойство удалили из набора, если у номенклатуры изменили вид на тот, где этого свойства нет, или, как в нашем случае, если мы записали значение в ТЧ объекта, но забыли связать само свойство (ПВХ) с набором свойств. В целях безопасности форма специально блокирует их редактирование, показывая неактуальность данных.

Разберем правильную привязку свойств

Посмотрим на схему связей объектов в 1С при работе с доп. реквизитами:

  1. При создании элемента справочника ВидыНоменклатуры система автоматически создает соответствующий элемент в справочнике НаборыДополнительныхРеквизитовИСведений.
  2. Ссылка на этот созданный набор записывается в реквизит НаборСвойств элемента вида номенклатуры.
  3. Чтобы свойство стало доступным для номенклатуры определенного вида, элемент Плана Видов Характеристик ДополнительныеРеквизитыИСведения должен быть добавлен в табличную часть этого набора свойств.

Как только мы добавим наше свойство в связанный набор свойств, перечеркивание на форме исчезнет автоматически.

Решение 1: Использование API БСП для записи

Для программной записи значений дополнительных реквизитов настоятельно не рекомендуется писать код, который напрямую добавляет строки в табличную часть ДополнительныеРеквизиты объекта.

Рассмотрим более безопасный подход. Следует использовать готовые программные интерфейсы (API) БСП. Для обновления свойств используйте вызов процедуры УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(). В эту процедуру необходимо передать ссылку на объект (номенклатуру) и массив структур, где указаны свойства и их новые значения. Использование стандартных методов БСП гарантирует правильное выполнение всех внутренних проверок.

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

Если в процессе загрузки нам необходимо "на лету" создавать новые свойства, проанализируем пример того, как программно создать элемент ПВХ и привязать его к набору.


НовСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НовСвойство.ДополнительныеЗначенияИспользуются = Истина;
НовСвойство.Заголовок = ИмяДРС;
НовСвойство.ЗаголовокФормыВыбораЗначения = ИмяДРС;
НовСвойство.ЗаголовокФормыЗначения = ИмяДРС;

// Привязываем свойство к нужному набору. 
// Сюда нужно передать ссылку на набор свойств конкретного Вида номенклатуры.
НовСвойство.НаборСвойств = СсылкаНаНаборСвойствВидаНоменклатуры;

НаименованиеНабора = ЗначениеРеквизитаОбъекта(НовСвойство.НаборСвойств, "Наименование");
НовСвойство.Наименование = ИмяДРС + " (" + НаименованиеНабора + ")";

// Определение типа значения свойства
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка")); // Пример для строкового типа
НовСвойство.ТипЗначения = Новый ОписаниеТипов(МассивТипов, Новый КвалификаторыСтроки(100));

НовСвойство.Комментарий = "#Введено автоматически";
НовСвойство.ЭтоДополнительноеСведение = Ложь; // Указываем, что это реквизит, а не сведение
НовСвойство.ОбменДанными.Загрузка = Истина;
НовСвойство.Записать();

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

Дополнительные сведения как альтернатива

Проанализируем ситуацию загрузки данных глубже. Если загружаемые данные носят исключительно справочный характер (например, внешний ID товара из прайса поставщика, временные метки загрузки) и не являются ключевыми характеристиками товара, целесообразнее использовать Дополнительные сведения, а не реквизиты.

Отличия и преимущества дополнительных сведений:

  1. Они хранятся в отдельном независимом регистре сведений, а не внутри табличной части справочника Номенклатура.
  2. Запись или обновление дополнительных сведений не требует блокировки и записи самого элемента справочника. Это критически важно при массовых загрузках, так как снижает риск взаимоблокировок базы данных.

Чтобы создать дополнительное сведение, в коде выше достаточно установить флаг НовСвойство.ЭтоДополнительноеСведение = Истина.

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

← На главную