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

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

Многие начинающие разработчики 1С сталкиваются с ситуацией, когда в табличной части документа товары выстроены идеально по алфавиту или по порядку, но при нажатии кнопки «Печать» в сформированном макете данные отображаются в хаотичном порядке. Ситуация осложняется тем, что на компьютере разработчика всё может работать корректно, а у пользователя — нет. В этой статье мы подробно разберем, почему версия операционной системы здесь ни при чем, и как гарантировать правильный порядок строк в любых отчетах и формах.

Разберем причину: почему «на моем ПК работает», а у других — нет?

Сначала проанализируем распространенное заблуждение о влиянии версии Windows (например, Windows 11 против Windows 10) на сортировку в 1С. Версия операционной системы не влияет на порядок строк в запросе. Причина кроется в архитектуре хранения данных в СУБД (SQL Server, PostgreSQL и другие).

Когда мы выполняем запрос к базе данных без явного указания порядка, система возвращает записи в так называемом «естественном порядке». Этот порядок зависит от того, как SQL-серверу в данный момент «удобнее» прочитать данные с диска или из оперативной памяти. На это влияют:

Именно поэтому на одном компьютере (где база маленькая или недавно обновлялась) порядок может казаться правильным, а на другом — превращаться в хаос. Рассмотрим, как это исправить программно.

Выясним разницу между визуальной и физической сортировкой

Важно понимать, что пользователь, кликая по шапке колонки в документе (например, по колонке Наименование), выполняет визуальную сортировку. Она изменяет отображение строк только в текущем окне (в динамическом списке или табличной части формы), но абсолютно не меняет физический порядок строк в базе данных и не влияет на то, как эти данные будут получены программным кодом для печати.

Печатная форма чаще всего получает данные одним из двух способов:

  1. Напрямую из объекта документа (через коллекцию ЭтотОбъект.Товары).
  2. С помощью запроса к таблицам базы данных.

Если в коде формирования печатной формы нет явной команды сортировки, 1С выведет их так, как они были получены из базы «как есть».

Решение 1: Явная сортировка в запросе

Проанализируем самый надежный способ — использование конструкции УПОРЯДОЧИТЬ ПО в тексте запроса, который готовит данные для печати. Если вы хотите, чтобы в печатной форме товары шли ровно в том порядке, в котором их ввел пользователь в документе, нужно использовать поле НомерСтроки.

Посмотрим на пример правильного оформления запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ИнвентаризацияТовары.Номенклатура.Наименование КАК Наименование,
    |   ИнвентаризацияТовары.Количество КАК Количество,
    |   ИнвентаризацияТовары.НомерСтроки КАК НомерСтроки
    |ИЗ
    |   Документ.ИнвентаризацияТоваров.Товары КАК ИнвентаризацияТовары
    |ГДЕ
    |   ИнвентаризацияТовары.Ссылка = &Ссылка
    |УПОРЯДОЧИТЬ ПО
    |   НомерСтроки"; // Или по Наименование, если нужен алфавитный порядок

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить();

Важный момент: если вы забудете добавить УПОРЯДОЧИТЬ ПО, результат будет непредсказуемым. Всегда указывайте порядок в финальном запросе, даже если вы выбираете данные из временной таблицы. В качестве готовой основы для разработки алгоритмов формирования данных подойдёт пример внешней печатной формы на БСП 3.1.10.

Решение 2: Сортировка Таблицы Значений

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

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


// Допустим, у нас есть ТаблицаЗначений "ТЗ_Товары"
// Сортируем её перед циклом вывода в печатную форму
ТЗ_Товары.Сортировать("Наименование Возр"); // Возр - по возрастанию

// Если нужно сохранить порядок как в документе
ТЗ_Товары.Сортировать("НомерСтроки");

Метод Сортировать() гарантирует, что при обходе таблицы в цикле Для Каждого СтрокаТЗ Из ТЗ_Товары Цикл данные будут попадать в макет в нужном порядке. Для удобной проверки и тестирования кода вывода строк можно использовать шаблон внешней печатной формы с отладкой прямо из обработки.

Проанализируем ситуацию с временными таблицами

Часто разработчики совершают ошибку: они сортируют данные при помещении во временную таблицу, но не делают этого при итоговой выборке. В архитектуре SQL-серверов порядок во временной таблице не сохраняется автоматически при последующем соединении (JOIN) с другими таблицами.

Разберем по шагам правильную работу с временными таблицами:

  1. Помещаем данные во временную таблицу (здесь сортировка обычно не нужна, она только замедлит работу).
  2. В финальном запросе соединяем временную таблицу с основной (например, для получения цен или остатков).
  3. Обязательно в самом конце текста запроса пишем УПОРЯДОЧИТЬ ПО.

Особенности Системы компоновки данных (СКД)

Если ваша печатная форма построена на базе СКД, то настройки сортировки в самом запросе могут игнорироваться, так как у СКД есть свой механизм управления порядком. Выясним, на что обратить внимание:

Помните, что пользовательские настройки в режиме «1С:Предприятие» имеют более высокий приоритет, чем настройки, заданные программистом в Конфигураторе.

Нюансы сортировки строк и региональные настройки (Collation)

Рассмотрим более тонкие технические детали. Иногда сортировка по наименованию кажется странной: например, «Товар 10» идет раньше, чем «Товар 2». Это происходит потому, что 1С выполняет посимвольное сравнение строк. Чтобы этого избежать, старайтесь использовать числовые артикулы или коды с ведущими нулями (например, 00002, 00010).

Также упомянем параметр Collation (параметры сравнения в SQL). Если на разных серверах установлены разные кодировки (например, чувствительность к регистру), то товары, начинающиеся с маленькой буквы, могут оказаться в конце списка на одном сервере и в начале на другом. Это лишний раз подтверждает: управление порядком должно быть явным в коде 1С.

Подведем итог

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

  1. Никогда не полагайтесь на «порядок по умолчанию». Его не существует в мире баз данных.
  2. В любом запросе для печатной формы всегда добавляйте секцию УПОРЯДОЧИТЬ ПО.
  3. Если используете ТаблицуЗначений, вызывайте метод .Сортировать("ИмяКолонки") непосредственно перед началом вывода данных в макет.
  4. Если важен порядок «как в документе» — используйте колонку НомерСтроки.
  5. Проверяйте настройки порядка в СКД, если форма строится через компоновщик.

Соблюдение этих простых правил исключит любые «магические» проблемы с отображением данных на разных компьютерах и операционных системах.

← На главную