Как правильно вывести сертификаты номенклатуры в отчете СКД без дублирования строк?

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

При разработке отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с задачей: вывести список номенклатуры из документов или справочников и сопоставить каждой позиции действующие сертификаты качества. Однако прямое обращение к справочнику Справочник.СертификатыНоменклатуры не дает результата, поскольку между ним и номенклатурой нет прямой ссылки. Попытки соединить таблицы напрямую нередко приводят к дублированию строк, выпадению позиций без сертификатов или ошибкам выполнения запроса.

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

Архитектура хранения связи номенклатуры и сертификатов

В типовых решениях (1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей) связь между товарами и сертификатами реализована через регистр сведений РегистрСведений.ОбластиДействияСертификатовНоменклатуры. Сертификат может распространяться:

  1. На конкретную позицию Справочник.Номенклатура;
  2. На связку номенклатуры с определенной характеристикой или серией;
  3. На вид номенклатуры целиком;
  4. На список артикулов.

По этой причине для получения сертификата в запросе необходимо соединять данные документа или номенклатуры именно с регистром сведений ОбластиДействияСертификатовНоменклатуры, а не со справочником сертификатов напрямую.

Типичные ошибки при составлении запроса

Проанализируем основные причины, из-за которых отчет работает некорректно или возвращает задвоенные данные:

  1. Использование внутреннего соединения вместо левого. Если использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, из итогового отчета пропадут все товары, для которых в регистре нет зарегистрированных сертификатов. Для сохранения полного перечня номенклатуры документа обязательно применяется ЛЕВОЕ СОЕДИНЕНИЕ.
  2. Декартово произведение независимых табличных частей. Если в одном запросе соединяются несколько табличных частей одного документа (например, Товары и пользовательская ТЧ ПломбированиеТО) только по полю Ссылка, каждая строка первой таблицы умножается на каждую строку второй таблицы. Это приводит к геометрической прогрессии дублей.
  3. Отсутствие учета дополнительных измерений. Сертификат может быть привязан к характеристике или серии. Если соединять данные только по полю Номенклатура, к одной строке товара подтянутся сертификаты всех существующих характеристик и серий этого товара.
  4. Игнорирование сроков действия. У сертификатов есть период действия (дата начала и дата окончания). Без условий проверки актуальности в отчет попадут все исторические и просроченные сертификаты.

Вариант 1. Соединение таблиц в одном запросе

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


ВЫБРАТЬ
    Товары.Ссылка КАК ДокументСсылка,
    Товары.НомерСтроки КАК НомерСтроки,
    Товары.Номенклатура КАК Номенклатура,
    Товары.Характеристика КАК Характеристика,
    Товары.Серия КАК Серия,
    Товары.Количество КАК Количество,
    ОбластиДействия.СертификатНоменклатуры КАК СертификатНоменклатуры
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбластиДействияСертификатовНоменклатуры КАК ОбластиДействия
        ПО Товары.Номенклатура = ОбластиДействия.Номенклатура
        И (ОбластиДействия.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
            ИЛИ Товары.Характеристика = ОбластиДействия.Характеристика)
        И (ОбластиДействия.Серия = ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
            ИЛИ Товары.Серия = ОбластиДействия.Серия)

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

Вариант 2. Связывание через несколько наборов данных в СКД

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

Разберем по шагам настройку схемы:

  1. Создаем НаборДанных1 (Запрос): выбираем основные строки документа из табличной части Товары с полями Ссылка, Номенклатура, Характеристика, Количество.
  2. Создаем НаборДанных2 (Запрос): выбираем записи из регистра РегистрСведений.ОбластиДействияСертификатовНоменклатуры с полями Номенклатура, Характеристика, СертификатНоменклатуры.
  3. Создаем НаборДанных3 (Запрос): при необходимости выбираем независимые строки дополнительной табличной части (например, пломбирование) по полю Ссылка.
  4. Настраиваем вкладку «Связи наборов данных»:

    Указываем источник связи (НаборДанных1), приемник связи (НаборДанных2), условие связи по полям Номенклатура и Характеристика. СКД выполнит соединение коллекций на этапе компоновки без риска получить декартово произведение строк.

Вариант 3. Агрегация сертификатов в одну строку

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

Выполним следующие действия:

  1. Переходим на вкладку «Ресурсы» схемы компоновки данных.
  2. Добавляем поле СертификатНоменклатуры.
  3. В колонке «Выражение» прописываем формулу: СоединитьСтроки(Массив(СертификатНоменклатуры), ", ")

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

← На главную