При разработке интерфейсов на платформе 1С:Предприятие 8.3 (управляемые формы) программисты часто сталкиваются с ситуацией, когда в табличной части документа или справочника внезапно перестают работать стандартные кнопки «Переместить вверх» и «Переместить вниз». При этом в конфигураторе все настройки кажутся верными: флажки Изменять состав строк и Изменять порядок строк установлены, а кнопки добавлены в командную панель.
В этой статье мы подробно разберем, почему платформа блокирует эти команды, как диагностировать причину в режиме реального времени и какие существуют способы решения этой задачи, если вам все же необходимо менять порядок строк при активных фильтрах.
Проанализируем ситуацию: в конфигураторе кнопки активны, но в режиме «Предприятие» они становятся серыми и недоступными для нажатия. Первым делом мы обычно проверяем свойства таблицы и её колонок. Если свойства ТолькоПросмотр установлено в значение Ложь, а ИзменятьПорядокСтрок — в Истина, значит, ограничение накладывается платформой динамически.
Основная и самая распространенная причина такого поведения — использование свойства ОтборСтрок у элемента формы типа Таблица. Рассмотрим механизм работы платформы подробнее: как только вы устанавливаете программный фильтр на строки (например, чтобы показать продукты только для определенной категории в документе «Меню-требование»), 1С блокирует стандартные команды перемещения. Это происходит потому, что при наличии визуального фильтра «физический» порядок строк в коллекции ДанныеФормыКоллекция перестает соответствовать их «визуальному» порядку на экране. Если бы платформа позволила двигать строки стандартным методом, перемещаемая строка могла бы «перепрыгнуть» через скрытые строки, что привело бы к непредсказуемым результатам и логическим ошибкам в данных.
Чтобы убедиться, что дело именно в отборе, выполним следующие шаги:
ПриОткрытии или события, связанные с обновлением табличной части (например, ПриАктивизацииСтроки другой таблицы).Элементы.ИмяВашейТаблицы.ОтборСтрок.Если результат вычисления отличен от Неопределено и содержит какие-либо условия, значит, именно этот фильтр блокирует работу стрелок перемещения.
Если порядок строк нужно изменить лишь изредка, можно реализовать механизм временного отключения фильтра. Проанализируем, как это работает: пользователь нажимает специальную кнопку «Режим сортировки», программа очищает свойство ОтборСтрок, кнопки перемещения становятся активными. После внесения изменений пользователь возвращает фильтр обратно.
Однако этот способ неудобен для оперативной работы, так как таблица будет постоянно «прыгать», показывая все скрытые ранее данные. Рассмотрим более элегантные инженерные решения.
Несмотря на то что стандартные команды заблокированы, программный метод коллекции Сдвинуть() продолжает работать. Мы можем создать собственные команды формы, назначить им красивые иконки (стрелки вверх и вниз) и прописать логику перемещения вручную. Главная сложность здесь — учесть наличие скрытых строк.
Разберем пример кода для перемещения строки вверх с учетом активного отбора. Для проверки того, видима ли строка пользователю в данный момент, используем метод таблицы ПроверитьСтроку().
&НаКлиенте
Процедура КомандаПереместитьВверх(Команда)
ТаблицаИмя = Элементы.МенюРаскладка; // Ваша таблица на форме
КоллекцияДанных = Объект.МенюРаскладка; // ТЧ в данных объекта
ТекущийИндекс = ТаблицаИмя.ТекущаяСтрока;
Если ТекущийИндекс = 0 Тогда
Возврат; // Мы уже в самом верху
КонецЕсли;
ИндексДляПеремещения = -1;
// Ищем ближайшую видимую строку выше текущей
Для Итератор = (ТекущийИндекс - 1) По 0 Цикл
Если ТаблицаИмя.ПроверитьСтроку(Итератор) Тогда
ИндексДляПеремещения = Итератор;
Прервать;
КонецЕсли;
КонецЦикла;
Если ИндексДляПеремещения <> -1 Тогда
// Вычисляем смещение. Сдвинуть(Индекс, Смещение)
// Смещение отрицательное для движения вверх
Смещение = ИндексДляПеремещения - ТекущийИндекс;
КоллекцияДанных.Сдвинуть(ТекущийИндекс, Смещение);
КонецЕсли;
КонецПроцедуры
В этом примере мы используем цикл, чтобы найти индекс именно той строки, которая отображается над текущей. Это позволяет пользователю «перепрыгивать» через скрытые фильтром строки, сохраняя при этом целостность данных в коллекции.
Если архитектура решения позволяет, рассмотрим альтернативный подход, который часто применяется в типовых конфигурациях (например, в БП 3.0 или ERP). Вместо физического перемещения строк в коллекции ДанныеФормыКоллекция, в табличную часть добавляется числовой реквизит НомерПорядка (или Очередность).
Преимущества этого метода:
ОтборСтрок никак не мешает менять значения в числовом поле.При нажатии на кнопку «Вверх» мы просто меняем местами значения в колонке НомерПорядка у текущей строки и строки, стоящей выше (также находя её с помощью ПроверитьСтроку()). После этого вызываем метод Порядок для коллекции, чтобы визуально обновить таблицу.
Проанализировав проблему, мы выяснили, что неактивность кнопок — это не ошибка конфигурации, а защитный механизм платформы 1С при работе с фильтрами. Чтобы восстановить функциональность, вы можете:
ОтборСтрок, и, если возможно, заменить его на динамический список или дерево значений.Сдвинуть().Использование собственных кнопок — наиболее гибкий вариант, который сохраняет привычный пользователю интерфейс и обеспечивает корректную работу программы в сложных условиях фильтрации данных.