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