Как получить характеристики номенклатуры с заполненными дополнительными реквизитами

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

В современных конфигурациях на базе 1С:Предприятие 8.3, таких как Управление торговлей 11, ERP Управление предприятием или Комплексная автоматизация, работа с характеристиками номенклатуры часто вызывает вопросы у разработчиков. Основная сложность заключается в том, что связь между номенклатурой и её характеристиками не всегда прямолинейна. Разберем подробно, как устроена эта связь и как правильно извлекать данные о характеристиках вместе с их дополнительными реквизитами.

Архитектура хранения характеристик: Индивидуальные vs Общие

Прежде чем приступать к написанию запроса, нам необходимо понять, как система определяет владельца характеристики. В справочнике ХарактеристикиНоменклатуры поле Владелец может принимать значения разных типов. Это зависит от настроек конкретного Вида номенклатуры:

  1. Индивидуальные характеристики: В этом случае характеристики создаются для конкретной карточки товара. Владельцем в справочнике характеристик будет выступать непосредственно элемент справочника Номенклатура.
  2. Общие характеристики для вида номенклатуры: В этом случае список характеристик (например, размеры одежды "S, M, L, XL") один и тот же для всех товаров данного вида. Здесь владельцем характеристики является элемент справочника ВидыНоменклатуры.

Проанализируем ситуацию: если мы ищем связь через Владелец и видим там Вид номенклатуры, значит, мы имеем дело со вторым вариантом. Это критически важно для построения корректного соединения в запросах.

Как устроены дополнительные реквизиты

Дополнительные реквизиты характеристик хранятся не в отдельных полях таблицы справочника, а в подчиненной табличной части ДополнительныеРеквизиты. Каждая строка этой таблицы содержит два ключевых поля:

Рассмотрим, как получить список характеристик, у которых заполнен хотя бы один доп. реквизит.

Построение запроса для получения характеристик

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


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Товар,
    Характеристики.Ссылка КАК Характеристика,
    ХарактеристикиДополнительныеРеквизиты.Свойство КАК ДопРеквизит,
    ХарактеристикиДополнительныеРеквизиты.Значение КАК ЗначениеРеквизита
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    
    // Соединяем с характеристиками
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК Характеристики
        ПО (ВЫБОР 
                КОГДА Номенклатура.ВидНоменклатуры.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристик.ОбщиеДляВидаНоменклатуры)
                    ТОГДА Характеристики.Владелец = Номенклатура.ВидНоменклатуры
                ИНАЧЕ Характеристики.Владелец = Номенклатура.Ссылка
            КОНЕЦ)
            
    // Соединяем с табличной частью дополнительных реквизитов
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры.ДополнительныеРеквизиты КАК ХарактеристикиДополнительныеРеквизиты
        ПО ХарактеристикиДополнительныеРеквизиты.Ссылка = Характеристики.Ссылка
ГДЕ
    // Отсекаем пустые значения, если реквизит был добавлен, но не заполнен
    НЕ ХарактеристикиДополнительныеРеквизиты.Значение ЕСТЬ NULL
    И ХарактеристикиДополнительныеРеквизиты.Значение <> ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)
    И ХарактеристикиДополнительныеРеквизиты.Значение <> ""

Важный момент: в этом примере мы используем ВНУТРЕННЕЕ СОЕДИНЕНИЕ с табличной частью. Это автоматически отфильтровывает те характеристики, у которых вообще нет записей в дополнительных реквизитах. Если характеристика существует, но в её табличной части пусто — она не попадет в выборку.

Особенности работы с общими характеристиками

Как верно подмечено в обсуждении, если характеристики являются общими для вида, то изменение значения доп. реквизита в одной характеристике отразится на всех товарах этого вида. Это происходит потому, что физически это один и тот же элемент справочника ХарактеристикиНоменклатуры, просто "привязанный" к виду номенклатуры, а не к конкретному товару.

Если вам нужно получить фактически используемые характеристики (те, по которым были движения на складе), следует обращаться к регистрам накопления, таким как ЗапасыНаСкладах или ВыручкаИСебестоимостьПродаж, соединяя их со справочником характеристик.

Использование Системы компоновки данных (СКД)

Если задача стоит в рамках создания отчета на СКД, программисту часто даже не нужно писать сложные соединения с табличными частями. Платформа 1С позволяет обращаться к дополнительным реквизитам через "точку".

Выясним, как это работает: в схеме компоновки данных вы можете выбрать поле Характеристика и развернуть его свойства. Если в системе настроены наборы свойств, то дополнительные реквизиты появятся в списке доступных полей. Система сама сгенерирует необходимый SQL-запрос к табличным частям, что значительно упрощает разработку.

Программное получение значений через общий модуль

Если вам нужно получить значения заполненных реквизитов в коде (например, при печати этикетки или обработке данных), рекомендуется использовать типовые механизмы БСП (Библиотеки стандартных подсистем). Проанализируем использование модуля УправлениеСвойствами.

Вместо написания запроса вручную, можно вызвать функцию:


// Параметр СсылкаНаХарактеристику - это ссылка на элемент справочника ХарактеристикиНоменклатуры
ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(СсылкаНаХарактеристику);

Для Каждого СтрокаСвойства Из ТаблицаСвойств Цикл
    Сообщить("Свойство: " + СтрокаСвойства.Свойство + " - Значение: " + СтрокаСвойства.Значение);
КонецЦикла;

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

Резюме

Для успешного получения характеристик с доп. реквизитами следуйте этим правилам:

  1. Всегда проверяйте настройку использования характеристик в виде номенклатуры, чтобы понять, кто является владельцем.
  2. Помните, что доп. реквизиты — это табличная часть справочника характеристик.
  3. При написании запросов используйте фильтрацию по полю Значение, чтобы исключить строки с пустыми ссылками.
  4. Для простых отчетов используйте возможности СКД, а для сложных алгоритмов — функции модуля УправлениеСвойствами.
← На главную