Как правильно создать характеристику номенклатуры с заполненными свойствами при обмене с сайтом в 1С?

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

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

Разберем по шагам, как программно реализовать корректное создание характеристики, чтобы все свойства отображались в интерфейсе 1С и могли использоваться в учете.

В чем заключается основная проблема примитивного кода

Рассмотрим код, который часто встречается в самописных скриптах или старых версиях модулей:


НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
НоваяХарактеристика.Владелец = Номенклатура;
НоваяХарактеристика.Наименование = "Крем, 2500х2500мм";
НоваяХарактеристика.Записать();

Проанализируем ситуацию: этот код создает запись в справочнике, но он игнорирует тот факт, что свойства в УТ 11 — это не просто текст. Они хранятся в табличной части ДополнительныеРеквизиты. Если мы не заполним эту таблицу, для программы характеристика останется «пустой», несмотря на красивое наименование.

Шаг 1. Поиск существующей характеристики (защита от дублей)

Прежде чем создавать новую характеристику, мы должны убедиться, что ее еще нет в базе. Искать только по наименованию — плохая практика, так как наименования могут дублироваться или записываться по-разному. Правильнее всего искать по владельцу и уникальному идентификатору, который передает сайт.

Выполним запрос для поиска:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
    |ИЗ
    |	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |ГДЕ
    |	ХарактеристикиНоменклатуры.Владелец = &Владелец
    |	И ХарактеристикиНоменклатуры.Наименование = &Наименование";

Запрос.УстановитьПараметр("Владелец", ТекущаяНоменклатура);
Запрос.УстановитьПараметр("Наименование", СтрокаТовараНаименование);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ХарактеристикаОбъект = Выборка.Ссылка.ПолучитьОбъект();
Иначе
    ХарактеристикаОбъект = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
    ХарактеристикаОбъект.Владелец = ТекущаяНоменклатура;
    ХарактеристикаОбъект.Наименование = СтрокаТовараНаименование;
КонецЕсли;

Шаг 2. Определение владельца характеристики

Важно помнить, что в 1С характеристика может принадлежать либо конкретной Номенклатуре, либо Виду номенклатуры (общие характеристики). Проанализируем настройки базы: если в 1С включены индивидуальные характеристики, то Владелец — это ссылка на справочник Номенклатура. Если характеристики общие, то владельцем будет ВидНоменклатуры. Несоответствие типа владельца приведет к ошибке при записи.

Шаг 3. Заполнение свойств в табличной части ДополнительныеРеквизиты

Теперь перейдем к самому важному — заполнению свойств. Допустим, с сайта нам приходят пары «Название свойства» и «Значение». В 1С эти свойства описаны в Плане видов характеристик ДополнительныеРеквизитыИСведения.

Рассмотрим алгоритм добавления свойства в характеристику:

  1. Находим ссылку на само свойство (например, «Цвет»).
  2. Находим или создаем значение этого свойства (ссылка на справочник ЗначенияСвойствОбъектов).
  3. Добавляем строку в таблицу ДополнительныеРеквизиты объекта характеристики.

Пример программной реализации этого процесса:


// Предположим, у нас есть СтруктураСвойств, полученная из XML сайта
Для Каждого ТекСвойство Из СтруктураСвойств Цикл
    
    // 1. Ищем само свойство в системе
    СсылкаНаСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(ТекСвойство.Ключ);
    
    Если СсылкаНаСвойство.Пустая() Тогда
        Продолжить; // Или создаем новое, если логика обмена это позволяет
    КонецЕсли;
    
    // 2. Ищем значение свойства (например, "Красный")
    // Значения свойств — это подчиненный справочник ЗначенияСвойствОбъектов
    ЗначениеСвойства = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(ТекСвойство.Значение, Ложь, , СсылкаНаСвойство);
    
    Если ЗначениеСвойства.Пустая() Тогда
        // Если значения нет, его нужно создать, чтобы 1С восприняла его корректно
        НовоеЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
        НовоеЗначение.Владелец = СсылкаНаСвойство;
        НовоеЗначение.Наименование = ТекСвойство.Значение;
        НовоеЗначение.Записать();
        ЗначениеСвойства = НовоеЗначение.Ссылка;
    КонецЕсли;

    // 3. Записываем в табличную часть характеристики
    // Сначала проверим, нет ли уже такого свойства в таблице, чтобы не дублировать строки
    ПараметрыПоиска = Новый Структура("Свойство", СсылкаНаСвойство);
    НайденныеСтроки = ХарактеристикаОбъект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыПоиска);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        ТекСтрока = НайденныеСтроки[0];
    Иначе
        ТекСтрока = ХарактеристикаОбъект.ДополнительныеРеквизиты.Добавить();
        ТекСтрока.Свойство = СсылкаНаСвойство;
    КонецЕсли;
    
    ТекСтрока.Значение = ЗначениеСвойства;

КонецЦикла;

ХарактеристикаОбъект.Записать();

Шаг 4. Использование типовых механизмов (БСП)

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

Проанализируем пример использования типового API:


// Подготовка набора свойств
НаборСвойств = Новый ТаблицаЗначений;
НаборСвойств.Колонки.Добавить("Свойство");
НаборСвойств.Колонки.Добавить("Значение");

// Заполнение набора...
// ...

// Запись свойств объекта через типовой механизм
УправлениеСвойствами.ЗаписатьДополнительныеРеквизиты(ХарактеристикаОбъект.Ссылка, НаборСвойств);

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

Рекомендации по настройке модуля обмена Битрикс

Если вы используете стандартный модуль «Битрикс», обратите внимание на структуру приходящего файла orders.xml. Если свойства приходят в блоке ЗначенияРеквизитов или как свойства корзины, 1С по умолчанию запишет их в текстовое поле «Комментарий» или в дополнительные сведения заказа, но не в саму характеристику товара.

Чтобы «подцепить» их к характеристике, вам потребуется:

  1. Изменить код в модуле обмена (обычно это обработка Б_ОбменССайтомСервер).
  2. Найти процедуру, отвечающую за создание номенклатуры и характеристик при загрузке заказа.
  3. Внедрить туда вышеописанный алгоритм поиска свойства по имени и записи в табличную часть ДополнительныеРеквизиты.

Помните, что наименование характеристики в 1С часто формируется автоматически на основе выбранных свойств. После записи свойств через код, полезно вызвать процедуру обновления наименования, чтобы оно соответствовало стандартам вашей базы:


// В конфигурациях УТ 11/ERP для этого есть специальные механизмы
ХарактеристикаОбъект.Наименование = ХарактеристикиНоменклатурыКлиентСервер.СформироватьРабочееНаименование(ХарактеристикаОбъект.ДополнительныеРеквизиты);

Таким образом, мы получаем полностью заполненный и корректно отображающийся объект, который не создаст проблем при складском учете и подборе товаров в документы.

← На главную