Как программно отсортировать строки табличной части в 1С и убрать запрос на сохранение?

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

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

Способ 1: Сортировка через метод объекта

Самый простой и популярный метод в обычных формах — это обращение к табличной части через элементы формы. Рассмотрим, как выполнить сортировку по конкретному полю.

Для сортировки по одному или нескольким полям используйте следующий подход:


// Сортировка по нескольким колонкам (возрастание и убывание)
Товары.Сортировать("Номенклатура, ХарактеристикаНоменклатуры, Размер Убыв");

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


// Сортировка по текущей активной колонке
ЭлементыФормы.тчТМЦ.Значение.Сортировать(ЭлементыФормы.тчТМЦ.Колонки.ТМЦ.Имя);

Способ 2: Реализация переключателя сортировки (Возр/Убыв)

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

Разберем пример кода для обработки нажатия кнопки:


Перем РеквизитБулево;

Процедура СортироватьПоТекущаяКолонкаНажатие(Элемент)
    Если РеквизитБулево = Неопределено Тогда
        ЭлементыФормы.ТабЗначений.Значение.Сортировать("" + ЭлементыФормы.ТабЗначений.ТекущаяКолонка.Имя + " Возр");
        РеквизитБулево = Истина;
    Иначе
        ЭлементыФормы.ТабЗначений.Значение.Сортировать("" + ЭлементыФормы.ТабЗначений.ТекущаяКолонка.Имя + " Убыв");
        РеквизитБулево = Неопределено;
    КонецЕсли;
КонецПроцедуры

Способ 3: Настройка сортировки при открытии формы

Если вам нужно, чтобы табличная часть всегда была отсортирована при открытии документа, лучше всего использовать событие ПриОткрытии. Это избавит пользователя от необходимости выполнять лишние клики.

Посмотрим на пример кода, который устанавливает порядок строк при инициализации формы:


Процедура ПриОткрытии()
    // Очищаем существующий порядок и устанавливаем свой
    ЭтаФорма.ЭлементыФормы.Список.Значение.Порядок.Очистить();
    ЭтаФорма.ЭлементыФормы.Список.Значение.Порядок.Установить("ДатаНачала возр, Наименование возр");
КонецПроцедуры

Важные рекомендации по работе с сортировкой

  1. Модифицированность формы: Если ваша задача — исключительно визуальное представление данных и вы не хотите менять объект, попробуйте выгрузить данные в ТаблицаЗначений, отсортировать её и загрузить обратно. Однако помните, что после метода Загрузить() форма все равно может стать модифицированной.
  2. Стандартный функционал: В современных версиях платформы (8.3 и выше) при использовании управляемых форм необходимость программной сортировки через код Сортировать() практически отпала. Платформа предоставляет возможность сортировки кликом по заголовку колонки штатно. Старайтесь использовать стандартные механизмы платформы, чтобы не перегружать код лишними функциями.
  3. Проверка типов данных: При использовании метода Сортировать() убедитесь, что в строке сортировки указаны корректные имена колонок. Ошибки в именах приведут к исключительным ситуациям, которые остановят выполнение программы.

Таким образом, для большинства задач в обычном приложении вполне достаточно использования метода Сортировать() или установки Порядок для элемента табличного поля. Если после выполнения кода система просит сохранить документ, это является подтверждением того, что данные внутри объекта действительно изменились.

← На главную