Как правильно настроить сортировку и нумерацию строк при выводе в печатную форму 1С?

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

При разработке печатных форм в системе 1С:Предприятие программисты часто сталкиваются с ситуацией, когда данные в табличном документе (mxl) выводятся в хаотичном порядке или вовсе в обратной последовательности (например, 3, 2, 1 вместо положенных 1, 2, 3). Это происходит из-за особенностей работы СУБД: если порядок выборки не задан явно, система возвращает записи так, как ей удобнее в данный момент. Разберем подробно, как обеспечить правильную сортировку и красивую нумерацию строк в ваших отчетах и печатных формах.

Метод 1: Использование механизмов запроса и корректных псевдонимов

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

Проанализируем основные рекомендации по работе с конструктором запроса:

  1. Используйте псевдонимы: Никогда не оставляйте стандартные названия полей типа НомерСтроки, если в запросе участвует более одной таблицы. Переименуйте их, например, в НомерСтрокиТовары и НомерСтрокиУслуги.
  2. Настройка вкладки «Порядок»: В конструкторе запроса обязательно перейдите на закладку «Порядок» и добавьте туда ваше поле нумерации. Убедитесь, что установлено направление «Возр» (по возрастанию).
  3. Избегайте «Автопорядка»: Хотя в конструкторе на закладке «Дополнительно» есть флажок Автопорядок, для печатных форм лучше задавать сортировку явно. Это гарантирует предсказуемый результат даже при обновлении платформы или смене типа СУБД.

Метод 2: Программная нумерация строк в цикле вывода

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


// Перед началом цикла вывода строк инициализируем счетчик
НомерПоПорядку = 1;

Пока Выборка.Следующий() Цикл
    // Получаем область строки из макета
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    // Заполняем параметр нумерации значением счетчика
    ОбластьСтрока.Параметры.СвояНумерация = НомерПоПорядку;
    
    // Заполняем остальные данные из выборки
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    
    // Выводим область в табличный документ
    ТабДок.Вывести(ОбластьСтрока);
    
    // Инкрементируем (увеличиваем) номер для следующей строки
    НомерПоПорядку = НомерПоПорядку + 1;
КонецЦикла;

Важный нюанс: убедитесь, что в макете .mxl в соответствующей ячейке параметр действительно называется СвояНумерация. Если вы ошибетесь в названии хотя бы на один символ, 1С не выдаст ошибку при исполнении, но номера в печатной форме останутся пустыми.

Метод 3: Использование функции АВТОНОМЕРЗАПИСИ()

Начиная с версии платформы 8.3.13, в языке запросов появилась замечательная функция АВТОНОМЕРЗАПИСИ(). Она позволяет пронумеровать строки прямо в момент выполнения запроса на сервере. Это особенно полезно, если вы выводите плоский список данных без сложной иерархии.

Рассмотрим пример того, как это выглядит в тексте запроса:


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

Важное ограничение: Функция АВТОНОМЕРЗАПИСИ() работает корректно только в том случае, если в запросе не используются ИТОГИ. Если вам нужно группировать данные с итогами, лучше вернуться к методу с программным счетчиком в цикле.

Метод 4: Сортировка через промежуточную Таблицу Значений

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


ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

// Сортируем таблицу по нужному полю (или нескольким полям через запятую)
ТаблицаРезультат.Сортировать("НаименованиеТовара Возр, Артикул Возр");

Для Каждого СтрокаТЗ Из ТаблицаРезультат Цикл
    Область = Макет.ПолучитьОбласть("Строка");
    Область.Параметры.Заполнить(СтрокаТЗ);
    ТабДок.Вывести(Область);
КонецЦикла;

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

Проанализируем ситуацию, когда сортировка «слетает» неожиданно. Одной из причин может быть использование метода Присоединить() вместо Вывести(). Помните: Вывести() добавляет область вертикально вниз, создавая новую строку, а Присоединить() добавляет область справа к уже выведенной строке. Если вы перепутаете эти методы в цикле, структура таблицы нарушится, и визуально данные могут выглядеть хаотично. Для правильной организации вывода строк в несколько колонок с сохранением последовательной нумерации можно использовать обработку с примером печати в несколько колонок.

Также стоит упомянуть о «коммерческой тайне» кода. Часто программисты боятся выкладывать полный код из-за корпоративных стандартов, но для решения проблем с сортировкой обычно достаточно показать структуру запроса и цикл вывода. Помните, что именно в этих деталях кроется большинство ошибок: от неправильно написанного имени параметра до лишнего пробела в псевдониме поля.

В заключение отметим, что наиболее надежным и гибким способом считается комбинированный подход: правильная сортировка в запросе для логики данных и программный счетчик (Номер = Номер + 1) для отображения порядковых номеров в самой печатной форме. Это гарантирует, что даже если строки в документе будут перемешаны пользователем вручную, печатная форма будет выглядеть аккуратно и последовательно. В качестве готовой основы для разработки такого отчета отлично подойдет шаблон внешней печатной формы на БСП 3.1.10 с настроенной структурой вывода данных.

← На главную