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