При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как 1С:Комплексная автоматизация 2, 1С:ERP или 1С:Управление торговлей 11, разработчики часто сталкиваются с ситуацией: программный код по заполнению табличной части дополнительных реквизитов отрабатывает без ошибок, данные записываются в базу, но на форме элемента в разделе «Реквизиты» значения остаются пустыми. При этом в текстовом представлении (на закладке «Карточка») или в печатных формах данные могут отображаться корректно. Разберем подробно, почему так происходит и как правильно реализовать программное управление свойствами.
Для начала проанализируем, как устроена система дополнительных реквизитов. В отличие от типовых реквизитов конфигурации, дополнительные реквизиты управляются механизмами Библиотеки стандартных подсистем (БСП). Форма карточки номенклатуры строится динамически: при открытии система считывает настройки из справочника НаборыДополнительныхРеквизитовИСведений и на их основе «рисует» поля ввода. Существуют различные способы того, как реализовать добавление реквизитов и элементов формы на управляемые формы программно, однако стандартный механизм БСП имеет свои строгие правила.
Если вы просто добавите строку в табличную часть ДополнительныеРеквизиты объекта Номенклатура, этого может быть недостаточно для корректной работы интерфейса. Рассмотрим основные причины возникновения «невидимых» значений.
Это самая распространенная методическая ошибка. В программах 1С:ERP и КА 2 каждый вид номенклатуры жестко привязан к определенному Набору свойств. Рассмотрим ситуацию: вы создали свойство «Цвет» и программно записали его в карточку товара «Стол кухонный».
Если для вида номенклатуры «Мебель», к которому относится этот стол, в наборе свойств не указано свойство «Цвет», динамическая форма просто проигнорирует эту строку в табличной части. В типовых решениях часто требуется актуализация реквизитов номенклатуры по виду номенклатуры, так как форма редактирования (закладка «Реквизиты») ориентируется строго на состав Набора.
Решение: убедитесь, что добавляемое свойство входит в набор, соответствующий Виду номенклатуры данного объекта. Проверить это можно через справочник Наборы дополнительных реквизитов и сведений, где также доступно интерактивное управление свойствами элементов дополнительных реквизитов для настройки их отображения.
Разберем технический нюанс заполнения колонки Значение в табличной части ДополнительныеРеквизиты. Эта колонка имеет составной тип данных. Если дополнительный реквизит имеет тип «Дополнительное значение» (ссылка на справочник ЗначенияСвойствОбъектов), а вы программно записываете туда обычную Строку, произойдет следующее:
Посмотрим на пример неправильного кода:
НоваяСтрока = ОбъектНоменклатура.ДополнительныеРеквизиты.Add();
НоваяСтрока.Свойство = СсылкаНаСвойствоЦвет;
НоваяСтрока.Значение = "Темный розовый"; // ОШИБКА: записывается строка вместо ссылки
ОбъектНоменклатура.Write();
А теперь проанализируем, как сделать правильно. Необходимо сначала найти или создать элемент в справочнике ЗначенияСвойствОбъектов, владельцем которого является наше свойство, и записывать именно ссылку:
// Правильный подход
ЗначениеДляЗаписи = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Темный розовый", Ложь, , СсылкаНаСвойствоЦвет);
НоваяСтрока = ОбъектНоменклатура.ДополнительныеРеквизиты.Add();
НоваяСтрока.Свойство = СсылкаНаСвойствоЦвет;
НоваяСтрока.Значение = ЗначениеДляЗаписи;
ОбъектНоменклатура.Write();
В некоторых версиях БСП в табличной части дополнительных реквизитов присутствует скрытое поле ТекстоваяСтрока. Оно используется системой для кэширования представлений и быстрого поиска. При ручном вводе данных через интерфейс система заполняет его автоматически. При программной записи напрямую в объект разработчики часто забывают про это поле, что может приводить к сбоям в отображении в различных списках и формах.
Чтобы избежать описанных выше проблем, специалисты рекомендуют использовать штатные методы БСП. Вместо прямого редактирования табличной части объекта, лучше использовать процедуры из общего модуля УправлениеСвойствами.
Метод УправлениеСвойствами.ЗаписатьЗависимыеНаборыСвойств или использование специализированных функций для заполнения значений гарантирует, что все вспомогательные структуры и кэши будут обновлены корректно.
Выясним, как проверить корректность данных, если проблема уже возникла. Рассмотрим методику отладки:
ДополнительныеРеквизиты для обеих ссылок.Значение (используйте функцию ТИПЗНАЧЕНИЯ в запросе) и содержимое колонки Свойство.Проанализируем пример запроса для диагностики:
ВЫБРАТЬ
НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
НоменклатураДополнительныеРеквизиты.Значение КАК Значение,
ТИПЗНАЧЕНИЯ(НоменклатураДополнительныеРеквизиты.Значение) КАК ТипЗначения
ИЗ
Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
ГДЕ
НоменклатураДополнительныеРеквизиты.Ссылка В (&МассивСсылок)
Если в результате запроса вы увидите, что в «хорошей» карточке тип значения — Дополнительное значение, а в «плохой» — Строка, значит, ваша проблема в типизации при загрузке данных. Если типы совпадают, но значения нет на форме — проверяйте принадлежность свойства к Набору свойств конкретного Виду номенклатуры. Для более сложных манипуляций с формами может пригодиться модификатор управляемых форм, позволяющий редактировать элементы «на лету».
Важный момент: если вы используете характеристики номенклатуры, помните, что дополнительные реквизиты могут принадлежать либо самой номенклатуре, либо её характеристике. Проверьте, не пытаетесь ли вы записать реквизит характеристики в объект номенклатуры — в этом случае форма также не покажет значение в стандартном месте.
Соблюдение этих правил и использование штатных механизмов БСП позволит вам избежать «мистики» с исчезающими данными и обеспечит стабильную работу ваших доработок в конфигурациях 1С.