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