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