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

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

При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как 1С:Комплексная автоматизация 2, 1С:ERP или 1С:Управление торговлей 11, разработчики часто сталкиваются с ситуацией: программный код по заполнению табличной части дополнительных реквизитов отрабатывает без ошибок, данные записываются в базу, но на форме элемента в разделе «Реквизиты» значения остаются пустыми. При этом в текстовом представлении (на закладке «Карточка») или в печатных формах данные могут отображаться корректно. Разберем подробно, почему так происходит и как правильно реализовать программное управление свойствами.

Механизм работы дополнительных реквизитов в БСП

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

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

Причина 1: Свойство не входит в назначенный Набор

Это самая распространенная методическая ошибка. В программах 1С:ERP и КА 2 каждый вид номенклатуры жестко привязан к определенному Набору свойств. Рассмотрим ситуацию: вы создали свойство «Цвет» и программно записали его в карточку товара «Стол кухонный».

Если для вида номенклатуры «Мебель», к которому относится этот стол, в наборе свойств не указано свойство «Цвет», динамическая форма просто проигнорирует эту строку в табличной части. В типовых решениях часто требуется актуализация реквизитов номенклатуры по виду номенклатуры, так как форма редактирования (закладка «Реквизиты») ориентируется строго на состав Набора.

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

Причина 2: Ошибка типизации данных

Разберем технический нюанс заполнения колонки Значение в табличной части ДополнительныеРеквизиты. Эта колонка имеет составной тип данных. Если дополнительный реквизит имеет тип «Дополнительное значение» (ссылка на справочник ЗначенияСвойствОбъектов), а вы программно записываете туда обычную Строку, произойдет следующее:

  1. Объект успешно запишется, так как тип «Строка» входит в составной тип колонки.
  2. При формировании текстового представления система просто выведет вашу строку.
  3. Поле ввода на форме, ожидающее Ссылку на элемент справочника значений, не сможет распознать строковый тип и останется визуально пустым.

Посмотрим на пример неправильного кода:


НоваяСтрока = ОбъектНоменклатура.ДополнительныеРеквизиты.Add();
НоваяСтрока.Свойство = СсылкаНаСвойствоЦвет;
НоваяСтрока.Значение = "Темный розовый"; // ОШИБКА: записывается строка вместо ссылки
ОбъектНоменклатура.Write();

А теперь проанализируем, как сделать правильно. Необходимо сначала найти или создать элемент в справочнике ЗначенияСвойствОбъектов, владельцем которого является наше свойство, и записывать именно ссылку:


// Правильный подход
ЗначениеДляЗаписи = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Темный розовый", Ложь, , СсылкаНаСвойствоЦвет);
НоваяСтрока = ОбъектНоменклатура.ДополнительныеРеквизиты.Add();
НоваяСтрока.Свойство = СсылкаНаСвойствоЦвет;
НоваяСтрока.Значение = ЗначениеДляЗаписи; 
ОбъектНоменклатура.Write();

Причина 3: Игнорирование служебного поля «Текстовая строка»

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

Рекомендуемый способ записи через программный интерфейс БСП

Чтобы избежать описанных выше проблем, специалисты рекомендуют использовать штатные методы БСП. Вместо прямого редактирования табличной части объекта, лучше использовать процедуры из общего модуля УправлениеСвойствами.

Метод УправлениеСвойствами.ЗаписатьЗависимыеНаборыСвойств или использование специализированных функций для заполнения значений гарантирует, что все вспомогательные структуры и кэши будут обновлены корректно.

Выясним, как проверить корректность данных, если проблема уже возникла. Рассмотрим методику отладки:

  1. Откройте Консоль запросов.
  2. Выберите две карточки номенклатуры: одну, заполненную вручную (где все отображается), и вторую, заполненную программно.
  3. Выполните запрос к табличной части ДополнительныеРеквизиты для обеих ссылок.
  4. Сравните типы данных в колонке Значение (используйте функцию ТИПЗНАЧЕНИЯ в запросе) и содержимое колонки Свойство.

Проанализируем пример запроса для диагностики:


ВЫБРАТЬ
    НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
    НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
    НоменклатураДополнительныеРеквизиты.Значение КАК Значение,
    ТИПЗНАЧЕНИЯ(НоменклатураДополнительныеРеквизиты.Значение) КАК ТипЗначения
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
ГДЕ
    НоменклатураДополнительныеРеквизиты.Ссылка В (&МассивСсылок)

Если в результате запроса вы увидите, что в «хорошей» карточке тип значения — Дополнительное значение, а в «плохой» — Строка, значит, ваша проблема в типизации при загрузке данных. Если типы совпадают, но значения нет на форме — проверяйте принадлежность свойства к Набору свойств конкретного Виду номенклатуры. Для более сложных манипуляций с формами может пригодиться модификатор управляемых форм, позволяющий редактировать элементы «на лету».

Важный момент: если вы используете характеристики номенклатуры, помните, что дополнительные реквизиты могут принадлежать либо самой номенклатуре, либо её характеристике. Проверьте, не пытаетесь ли вы записать реквизит характеристики в объект номенклатуры — в этом случае форма также не покажет значение в стандартном месте.

Соблюдение этих правил и использование штатных механизмов БСП позволит вам избежать «мистики» с исчезающими данными и обеспечит стабильную работу ваших доработок в конфигурациях 1С.

← На главную