К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать сортировку в табличной части 1С

Как отсортировать табличную часть документа в 1С: кнопка «Ещё — Сортировать», метод Сортировать(), СортироватьСтроки() и сортировка динамического списка. Примеры кода.

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

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

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

Как пользователю отсортировать табличную часть без изменения конфигурации

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

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

Если пункта «Сортировать» в меню нет, значит разработчик формы не вывел эту команду или таблица является динамическим списком, а не табличной частью. Для динамического списка сортировка делается кликом по заголовку колонки или через «Ещё — Настроить список».

Сортировка табличной части кодом: метод Сортировать()

Программно табличную часть документа сортируют методом Сортировать() с указанием колонок и направления. Метод доступен у объекта документа (на сервере) и у данных формы, если табличная часть выведена на управляемую форму как реквизит.

// На сервере, в модуле объекта или обработки

ДокОбъект = ДокументСсылка.ПолучитьОбъект();

ДокОбъект.Товары.Сортировать("Номенклатура Возр");

ДокОбъект.Записать();

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

ДокОбъект.Товары.Сортировать("Склад Возр, Номенклатура Возр, Цена Убыв");

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

1c
ДокОбъект.Товары.Сортировать("Номенклатура Возр");
ДокОбъект.Записать();

Сортировка таблицы значений на управляемой форме

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

&НаСервере

Процедура СортироватьПоНаименованию()

ТоварыТЗ = РеквизитФормыВЗначение("ТаблицаТоваров");

ТоварыТЗ.Сортировать("Наименование Возр");

ЗначениеВРеквизитФормы(ТоварыТЗ, "ТаблицаТоваров");

КонецПроцедуры

Если данные не нужно менять, а требуется только показать упорядоченно, преобразование в значение не обязательно: у объекта ДанныеФормыТаблица сортировка выполняется через параметры отображения элемента формы или через временную таблицу значений. На практике проще всего отсортировать таблицу значений до загрузки в реквизит формы.

Порядок действий для сортировки на форме
  1. 1
    Определите, что лежит в основе таблицы: табличная часть объекта, таблица значений или динамический список
  2. 2
    Для табличной части или таблицы значений вызовите метод Сортировать() с нужными колонками
  3. 3
    Сохраните результат: запишите объект или загрузите таблицу обратно в реквизит формы
  4. 4
    Проверьте порядок строк в форме и в печатной форме документа

Сортировка динамического списка

Динамический список — это не хранимая таблица, а результат запроса, поэтому метод Сортировать() к нему не применяется. Порядок задаётся двумя способами: через свойство «Сортировка» списка в настройках формы или через предложение УПОРЯДОЧИТЬ ПО в произвольном запросе списка.

Пользователь меняет сортировку динамического списка кликом по заголовку колонки или через «Ещё — Настроить список — Сортировка». Разработчик задаёт порядок по умолчанию в конфигураторе: в свойствах динамического списка формы, закладка «Настройки», либо программно через Список.КомпоновщикНастроек.

// Программная установка сортировки динамического списка

ЭлементПорядка = Список.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));

ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Дата");

ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;

ЭлементПорядка.Использование = Истина;

Выбор способа: сравнение вариантов

Сравнение вариантов сортировки

Кнопка «Ещё — Сортировать» в форме

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

Метод Сортировать() у табличной части

Подходит для автоматического упорядочивания при записи документа или по кнопке. Требует прав на изменение объекта и записи документа.

Сортировка таблицы значений

Подходит для обработок и отчётов, где данные готовятся перед показом. Не затрагивает данные в базе.

Настройка динамического списка

Подходит для журналов и списков. Не меняет данные, влияет только на отображение; порядок можно задать по умолчанию в конфигураторе.

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

Типичные ошибки и ограничения

Типичные ошибки
01
Сортировка по ссылочной колонке вместо наименования: строки упорядочиваются по внутреннему представлению ссылки, а не по алфавиту — результат выглядит хаотичным
02
Вызов Сортировать() без последующей записи объекта: порядок меняется только в памяти и теряется после закрытия формы
03
Попытка применить Сортировать() к динамическому списку: метод недоступен, нужна настройка порядка списка или запроса
04
Указание заголовка колонки вместо её имени в конфигураторе: возникает ошибка «Поле не найдено»
05
Сортировка табличной части в подчинённом клиентском контексте без серверного вызова: на тонком клиенте объектные методы недоступны

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

Как проверить результат сортировки

Контрольные точки

Как проверить результат

Порядок строк в открытой форме документа
Норма

Строки идут по возрастанию или убыванию значения выбранной колонки

Тревожный признак

Порядок не изменился или изменился частично

Порядок после перезаписи и повторного открытия
Норма

Сортировка сохранилась после закрытия и открытия документа

Тревожный признак

Строки вернулись к прежнему порядку — объект не был записан

Печатная форма документа
Норма

Позиции выводятся в новом порядке

Тревожный признак

Печатная форма строится собственным запросом с другой сортировкой

Сортировка строкового поля с числами
Норма

Числа хранятся как числа и сортируются по значению

Тревожный признак

«10» идёт раньше «2» — поле строковое, требуется преобразование типа

Обратите внимание на последний пункт таблицы: если колонка имеет строковый тип, сортировка идёт посимвольно, и «10» окажется раньше «2». Проверяйте тип данных колонки в конфигураторе до настройки сортировки, особенно если колонка заполняется из внешних источников.

FAQ

Можно ли отсортировать табличную часть по наименованию номенклатуры, если такой колонки нет?

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

Почему после сортировки кодом порядок строк не сохранился?

Чаще всего объект не был записан после вызова Сортировать(). Метод меняет порядок только в памяти. Нужен вызов Записать() у объекта документа. Вторая причина — сортировка выполнялась на клиенте над данными формы, которые затем были перечитаны с сервера.

Как задать сортировку по умолчанию для журнала документов?

В конфигураторе откройте форму списка, выделите динамический список, в его свойствах откройте настройки и на закладке «Порядок» добавьте нужное поле и направление. Либо задайте УПОРЯДОЧИТЬ ПО в произвольном запросе списка — тогда пользователь не сможет отменить этот порядок.

Можно ли сортировать строки в произвольном, не алфавитном порядке?

Стандартный метод Сортировать() поддерживает только возрастание и убывание по значениям колонок. Для произвольного порядка (например, статусы «Согласован — На проверке — Черновик») добавьте числовую колонку-вес, заполните её по своему правилу и сортируйте по ней.

Влияет ли сортировка табличной части на проведение документа?

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

Как отсортировать табличную часть в обычной (неуправляемой) форме?

В обычных формах доступен тот же метод Сортировать() у табличной части объекта, а у элемента «ТабличноеПоле» есть свойство «НастройкаПорядка», позволяющее пользователю менять сортировку интерактивно. Логика программной сортировки полностью совпадает с управляемыми формами.

Итог

Что важно запомнить

Табличную часть документа сортируют кнопкой «Ещё — Сортировать» или методом Сортировать() с обязательной записью объекта; динамический список — только настройками порядка или запросом. Проверяйте тип колонки и помните: сортировка ссылочного поля идёт не по наименованию.