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