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