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