Как убрать группировку строк по товару в печатной форме ТОРГ-12 в 1С:Управление торговлей 10.3

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

При работе в конфигурации «1С:Управление торговлей 10.3» пользователи часто сталкиваются с тем, что типовая печатная форма ТОРГ-12 автоматически объединяет (группирует) строки, если в документе один и тот же товар указан несколько раз (например, с разной ценой или просто разными позициями). Однако в некоторых случаях — по требованию контрагентов или для специфического учета — необходимо, чтобы строки в печатной форме полностью соответствовали строкам в документе реализации.

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

Почему происходит группировка строк

Для начала выясним причину такого поведения программы. В типовых решениях на платформе 8.2 и 8.3 запрос к табличной части документа (например, РеализацияТоваровУслуг.Товары) специально спроектирован так, чтобы «схлопывать» одинаковые позиции. Это достигается за счет использования конструкции СГРУППИРОВАТЬ ПО в языке запросов 1С. Система суммирует количество и суммы, а в качестве номера строки выбирает минимальный номер из всех сгруппированных строк.

Шаг 1: Анализ структуры запроса в модуле

Рассмотрим ситуацию, когда нам необходимо внести правки непосредственно в текст запроса. Обычно формирование данных для ТОРГ-12 происходит в функции ПечатьТОРГ12. Основная сложность заключается в том, что запрос состоит из нескольких частей, соединенных оператором ОБЪЕДИНИТЬ ВСЕ, и часто содержит вложенные запросы.

Проанализируем типичный фрагмент проблемного кода, где используется агрегация:


|ВЫБРАТЬ
|   ВложенныйЗапрос.Номенклатура,
|   СУММА(ВложенныйЗапрос.Количество) КАК Количество,
|   МИНИМУМ(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
|ИЗ
|   (...) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО
|   ВложенныйЗапрос.Номенклатура

Чтобы убрать группировку, нам нужно избавиться от функций СУММА, МИНИМУМ и самой секции СГРУППИРОВАТЬ ПО.

Шаг 2: Изменение вложенного запроса

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

  1. Замена агрегатных полей: Найдем в блоке ВЫБРАТЬ вложенного запроса поля, которые суммируются. Вместо конструкций типа СУММА(РеализацияТоваровУслуг.Количество) нам нужно оставить просто РеализацияТоваровУслуг.Количество.
  2. Работа с номером строки: Типовой запрос часто использует МИНИМУМ(РеализацияТоваровУслуг.НомерСтроки). Это поле необходимо заменить на прямой выбор: РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки.
  3. Удаление секции группировки: Это самый критичный момент. Если мы убрали СУММА, но оставили СГРУППИРОВАТЬ ПО, система выдаст ошибку: «Поле не входит в группу». Поэтому мы полностью удаляем или комментируем блок СГРУППИРОВАТЬ ПО во вложенном запросе.

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


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

Шаг 3: Синхронизация объединяемых запросов

Посмотрим на ситуацию, которая часто вызывает ошибку «Разное количество полей в объединяемых запросах». В ТОРГ-12 данные могут собираться отдельно по товарам и отдельно по возвратной таре или услугам с помощью оператора ОБЪЕДИНИТЬ ВСЕ.

Проанализируем: если в первой части запроса (по товарам) мы добавили поле НомерСтроки или изменили его псевдоним, мы обязаны сделать то же самое во второй части запроса (например, по услугам). Количество колонок в выборке ВЫБРАТЬ до и после оператора ОБЪЕДИНИТЬ должно быть идентичным.

Шаг 4: Устранение ошибки «Поле не найдено НомерСтроки»

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

Разберем типичные ошибки при редактировании

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

  1. Ошибка «Поле не входит в группу...»: Означает, что вы оставили секцию СГРУППИРОВАТЬ ПО, но в секции ВЫБРАТЬ указали поле без агрегатной функции (без СУММА, МАКСИМУМ и т.д.). Решение: Полностью удалить СГРУППИРОВАТЬ ПО.
  2. Ошибка «Разное количество полей в объединяемых запросах»: Возникает, когда правки внесены только в один из блоков ОБЪЕДИНИТЬ ВСЕ. Решение: Проверить все части запроса и привести их к единому списку полей.
  3. Ошибка «Поле не найдено»: Скорее всего, поле было закомментировано в основном блоке ВЫБРАТЬ, но осталось в секции УПОРЯДОЧИТЬ ПО или ИТОГИ.

Важный нюанс с НДС и округлением

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

Для решения этой проблемы рекомендуется:

Рекомендация по использованию внешних печатных форм

Вместо того чтобы править код в основной конфигурации, крайне рекомендуем сохранить печатную форму как Внешнюю печатную форму (.epf). Посмотрим на преимущества этого подхода:

Таким образом, для успешного разделения строк в ТОРГ-12 достаточно превратить группирующий запрос в обычную линейную выборку, обеспечив при этом идентичность колонок во всех объединяемых частях кода.

← На главную