Как объединить и просуммировать одинаковые товары при печати документов в 1С

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

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

Архитектурный подход: разделение номенклатуры и характеристик

Прежде чем переходить к написанию программного кода свёртки, проанализируем структуру справочников. Распространенная ошибка — создание отдельных элементов в справочнике номенклатуры под каждый размер (например, «Футболка белая 46» и «Футболка белая 48»).

Методологически верное решение заключается в следующем:

  1. В справочнике Номенклатура создается один основной элемент — например, «Футболка белая».
  2. Параметры размера и цвета выносятся в подчиненный справочник Характеристики номенклатуры.
  3. Складской учет и проведение документов выполняются с детализацией по конкретным характеристикам.
  4. При печати табличная часть сворачивается исключительно по ссылке на объект Номенклатура, а поля характеристик исключаются из вывода.

Реализация свёртки при печати

Поскольку типовые формы печатных документов выводят детализированные строки с характеристиками, для агрегирования данных создается внешняя печатная форма (ВПФ) или расширение конфигурации. Разберем два основных технических способа реализации группировки.

Способ 1. Использование метода Свернуть() для Таблицы Значений

Если алгоритм печатной формы сначала выгружает данные табличной части документа в объект ТаблицаЗначений, к нему применяется метод Свернуть(). В параметрах метода указываются колонки группировки и колонки суммирования.

Посмотрим на пример кода обработки табличной части:


// Выгружаем табличную часть "Товары" из документа
ТЗПечать = ДокументСсылка.Товары.Выгрузить();

// Сворачиваем таблицу по номенклатуре и цене, суммируя количество и сумму
ТЗПечать.Свернуть("Номенклатура, Цена", "Количество, Сумма");

// Выводим свернутую таблицу значений в макет печатной формы
Для Каждого СтрокаТЗ Из ТЗПечать Цикл
    // Заполнение параметров и вывод области макета
КонецЦикла;

Способ 2. Группировка данных на уровне запроса

Если выборка данных для макета печатной формы выполняется с помощью запроса, агрегацию строк эффективнее доверить СУБД с помощью инструкции СГРУППИРОВАТЬ ПО и агрегатных функций СУММА().

Рассмотрим пример построения запроса:


ВЫБРАТЬ
	ДокументТаблица.Номенклатура КАК Номенклатура,
	ДокументТаблица.Цена КАК Цена,
	СУММА(ДокументТаблица.Количество) КАК Количество,
	СУММА(ДокументТаблица.Сумма) КАК Сумма
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК ДокументТаблица
ГДЕ
	ДокументТаблица.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
	ДокументТаблица.Номенклатура,
	ДокументТаблица.Цена

Ограничения и важные нюансы при свёртке строк

Проанализируем возможные учетные риски перед внедрением такой печатной формы:

  1. Различные цены одной номенклатуры: Если товары одинакового наименования продаются по разным ценам (например, уценка отдельных размеров или разные акционные скидки), группировка обязана включать поле Цена. Иначе рассчитываемая средняя цена станет дробной, что вызовет вопросы у покупателя.
  2. Округление НДС: Для плательщиков НДС построчная свёртка может давать расхождение в итоговой копейке налога из-за математического округления НДС по каждой отдельной позиции. Если предприятие работает без НДС, эта проблема отсутствует.
  3. Маркировка и приемка на складе: Для маркируемых товаров (Честный ЗНАК) и документов ЭДО группировка недопустима, так как каждая позиция требует передачи уникального кода маркировки или GTIN. В обычных накладных свёртка также может затруднить физическую приемку товара кладовщиком покупателя по размерам.
← На главную