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