Почему при печати счета на оплату в 1С нарушается порядок строк и как это исправить?

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

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

Причины нарушения порядка строк при печати

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

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

Где формируется печатная форма счета на оплату

Выясним причину проблемы непосредственно в исходном коде конфигурации. Для этого откроем дерево метаданных в конфигураторе:

  1. Перейдем к документу, из которого формируется печать (например, ЗаказКлиента или СчетНаОплатуПокупателю).
  2. Откроем модуль менеджера документа. В типовых решениях («1С:Управление торговлей», «1С:Комплексная автоматизация», «1С:ERP») формирование данных вынесено в специализированные функции.
  3. Найдем экспортную функцию ДанныеДляПечатныхФормСчетаНаОплатуИзвещения() или схожую процедуру печати, где выполняется сборка пакета запросов для макета.

Важно: Редактирование макета через пользовательский режим («Администрирование» — «Печатные формы, отчеты и обработки») позволяет настроить только внешний вид, ширину колонок и шрифты. Порядок выборки данных задается исключительно в коде запроса.

Способ 1. Исправление запроса формирования печатных данных

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

Разберем пример запроса, в котором добавлено сохранение минимального номера строки и явная сортировка:


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

При таком подходе даже при объединении дублирующихся строк результирующая таблица будет отсортирована по первому вхождению позиции в исходном документе.

Способ 2. Переопределение алгоритма через расширение конфигурации

Чтобы сохранить типовую конфигурацию на полной поддержке без снятия с замка, рекомендуется вынести изменения в расширение:

  1. Создадим новое расширение с назначением «Адаптация» или «Дополнение».
  2. Добавим в расширение модуль менеджера нужного документа.
  3. Переопределим функцию формирования печатной формы с помощью аннотации &Вместо или &ИзменениеИКонтроль.
  4. Внесем изменения в текст запроса, добавив сортировку по полю НомерСтроки.

Способ 3. Создание внешней печатной формы

Если внесение изменений в саму конфигурацию нежелательно, наилучшим решением будет разработка внешней печатной формы (ВПФ):

  1. Создадим внешнюю обработку и добавим стандартные процедуры регистрации в БСП.
  2. Перенесем макет и программный код формирования счета на оплату во внешнюю обработку.
  3. Скорректируем запрос, задав жесткие правила упорядочивания данных.
  4. Подключим готовую обработку через справочник «Дополнительные отчеты и обработки». Это гарантирует стабильную работу механизма печати при последующих типовых обновлениях конфигурации.
← На главную