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