При загрузке данных из внешних источников, например, из Excel-файлов от поставщика, часто возникает задача сохранить дополнительную информацию, для которой нет стандартного поля в карточке номенклатуры — для этого подойдёт загрузка реквизитов номенклатуры из Excel. Классический пример — уникальный код товара поставщика. Рассмотрим, как программно создать для этого дополнительный реквизит и записать в него значение в "1С:Управление торговлей 11", а также проанализируем более правильные, системные подходы к решению этой задачи.
Этот подход можно разделить на два этапа: сначала нужно убедиться, что сам дополнительный реквизит (свойство) существует в системе, а затем записать конкретное значение для элемента номенклатуры. Чтобы реализовать программную работу с дополнительными реквизитами, сам реквизит достаточно создать один раз — выполнять эту задачу без написания кода позволяет загрузка номенклатуры и дополнительных реквизитов.
Шаг 1. Программное создание дополнительного реквизита
Если вам необходимо создать дополнительный реквизит именно кодом, а не вручную, нужно работать с планом видов характеристик ДополнительныеРеквизитыИСведения и справочником НаборыДополнительныхРеквизитовИСведений. Первый объект описывает сам реквизит (его имя, тип), а второй — привязывает его к определенному виду объектов, в нашем случае — к справочнику Номенклатура.
Рассмотрим пример кода, который создает новый дополнительный реквизит "Код товара поставщика" и добавляет его в набор для номенклатуры.
// Сначала ищем набор свойств для справочника "Номенклатура"
// У каждого объекта метаданных свой предопределенный набор
НаборСвойствСсылка = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию("Справочник_Номенклатура");
Если НЕ ЗначениеЗаполнено(НаборСвойствСсылка) Тогда
// Если по какой-то причине набора нет, можно попробовать его создать
// Но в типовых конфигурациях он обычно уже есть
Сообщить("Не найден набор свойств для номенклатуры!");
Возврат;
КонецЕсли;
// Проверяем, может такой реквизит уже есть
ИмяНовогоРеквизита = "Код товара поставщика";
НайденныйРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ИмяНовогоРеквизита);
Если НЕ ЗначениеЗаполнено(НайденныйРеквизит) Тогда
// Если реквизита нет, создаем его
НовыйРеквизитОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НовыйРеквизитОбъект.Наименование = ИмяНовогоРеквизита;
// Задаем тип значения. В нашем случае это число.
// Для строки был бы Тип("Строка")
НовыйРеквизитОбъект.ТипЗначения = Новый ОписаниеТипов("Число", , Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный));
// Записываем новый реквизит
НовыйРеквизитОбъект.Записать();
// Получаем ссылку на созданный реквизит
НайденныйРеквизит = НовыйРеквизитОбъект.Ссылка;
// Теперь нужно добавить наш новый реквизит в набор для номенклатуры
НаборСвойствОбъект = НаборСвойствСсылка.ПолучитьОбъект();
НоваяСтрока = НаборСвойствОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = НайденныйРеквизит;
НаборСвойствОбъект.Записать();
Сообщить("Новый дополнительный реквизит '" + ИмяНовогоРеквизита + "' успешно создан и добавлен для номенклатуры.");
Иначе
Сообщить("Дополнительный реквизит '" + ИмяНовогоРеквизита + "' уже существует.");
КонецЕсли;
Важно: Эту операцию достаточно выполнить один раз при первоначальной настройке обработки загрузки. Нет необходимости выполнять этот код для каждой загружаемой позиции.
Шаг 2. Запись значения в дополнительный реквизит
После того как реквизит создан, можно записывать в него значения для конкретных товаров — для массового изменения этих свойств подойдёт обработка управления свойствами и реквизитами. Для этого удобно использовать функцию УправлениеСвойствами.ЗаписатьСвойстваУОбъекта из Библиотеки стандартных подсистем (БСП). Она принимает на вход ссылку на объект (нашу номенклатуру) и таблицу значений со свойствами и их значениями.
Посмотрим на пример, как это сделать в цикле при загрузке товаров — готовой альтернативой без кода будет загрузка номенклатуры и характеристик из Excel:
// Предположим, у нас есть СсылкаНаНоменклатуру и КодТовараИзФайла
// 1. Находим наш дополнительный реквизит по наименованию
СвойствоКодТовара = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код товара поставщика", Истина);
Если НЕ СвойствоКодТовара.Пустая() Тогда
// 2. Создаем таблицу значений для передачи в функцию
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
ТаблицаДопРеквизитов.Колонки.Добавить("Значение");
// 3. Заполняем таблицу
НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
НоваяСтрока.Свойство = СвойствоКодТовара;
НоваяСтрока.Значение = КодТовараИзФайла; // Например, 12345
// 4. Вызываем процедуру записи
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СсылкаНаНоменклатуру, ТаблицаДопРеквизитов);
Сообщить("Для номенклатуры '" + СсылкаНаНоменклатуру + "' успешно записан код товара " + КодТовараИзФайла);
Иначе
Сообщить("Не найден дополнительный реквизит 'Код товара поставщика'!");
КонецЕсли;
Прежде чем добавлять дополнительные реквизиты, стоит проанализировать, действительно ли это лучший способ. Механизм доп. реквизитов изменяет структуру хранения самого объекта, что может влиять на производительность. Для решения задачи хранения кодов поставщика в 1С есть более подходящие инструменты.
В отличие от реквизитов, дополнительные сведения не являются частью самого объекта (справочника Номенклатура), а хранятся в отдельном регистре сведений. Это имеет несколько преимуществ:
Для задачи хранения кода поставщика, который является скорее справочной, а не неотъемлемой характеристикой товара, использование дополнительных сведений является более правильным архитектурным решением, чем использование доп. реквизитов.
Если стандартный реквизит Артикул в вашей базе не используется для других целей, его можно задействовать для хранения кода поставщика. Это самый простой способ, не требующий никаких доработок. Однако он не подойдет, если у вас уже используется артикул для внутренних нужд или если один и тот же товар могут поставлять несколько поставщиков с разными кодами.
Это самый правильный и системный способ для хранения информации о товарах поставщиков. В "1С:Управление торговлей" для этого предназначен специальный справочник Номенклатура контрагентов. Он позволяет создать связь между элементом вашего справочника Номенклатура и тем, как этот товар называется и кодируется у конкретного поставщика.
Преимущества этого подхода:
При загрузке данных из файла поставщика ваша задача будет сводиться к тому, чтобы найти или создать запись в справочнике Номенклатура контрагентов, заполнив поля "Владелец" (ваш элемент номенклатуры), "Контрагент" (поставщик), "Артикул поставщика" и "Наименование поставщика".
Итог: Хотя программно создать дополнительный реквизит и записать в него значение возможно, для задачи хранения кодов товаров поставщиков настоятельно рекомендуется использовать стандартный функционал — справочник Номенклатура контрагентов. Это обеспечит масштабируемость, производительность и правильную архитектуру вашего решения.