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