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