Как сохранить позицию курсора на текущей строке после удаления строки в 1С 7.7?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

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

Рассмотрим стандартный обработчик кнопки удаления строки в таблице значений:


Процедура КомандаУдалить()     
    НомерСтроки = СведенияСотрудников.ТекущаяСтрока();
    СведенияСотрудников.УдалитьСтроку(НомерСтроки);
КонецПроцедуры

В приведенном коде метод ТекущаяСтрока() корректно получает индекс выделенной строки, после чего вызов УдалитьСтроку() удаляет её. Однако после модификации состава строк платформа 1С 7.7 сбрасывает фокус таблицы на начало. Чтобы позиция не терялась, необходимо явным образом переустановить фокус на нужную строчку после удаления.

Алгоритм сохранения фокуса на текущей позиции

Сформулируем правильную логику позиционирования курсора:

  1. Перед удалением сохраняем номер текущей выделенной строки с помощью метода ТекущаяСтрока().
  2. Удаляем выбранную строку вызовом метода УдалитьСтроку().
  3. Учитываем крайний случай: если удаляемая строка была последней в списке, новый индекс не должен превышать общее количество оставшихся строк.
  4. Устанавливаем курсор на новую актуальную позицию с помощью метода ТекущаяСтрока(Индекс).

Реализация решения на языке 1С 7.7

Проанализируем программный код, реализующий данный алгоритм. Внимание: для определения общего количества строк в объекте ТаблицаЗначений используется метод КоличествоСтрок() (а не РазмерСписка(), который предназначен исключительно для объекта СписокЗначений).


Процедура КомандаУдалить()     
    ИндексСтр = СведенияСотрудников.ТекущаяСтрока();
    Если ИндексСтр > 0 Тогда
        СведенияСотрудников.УдалитьСтроку(ИндексСтр);
        
        // Корректируем индекс на случай удаления последней строки
        ИндексСтр = Мин(ИндексСтр, СведенияСотрудников.КоличествоСтрок());
        
        Если ИндексСтр > 0 Тогда
            СведенияСотрудников.ТекущаяСтрока(ИндексСтр);
            Форма.Обновить();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Рассмотрим подробнее ключевые моменты этой процедуры:

  1. Конструкция Мин(ИндексСтр, СведенияСотрудников.КоличествоСтрок()) гарантирует, что если вы удалили последнюю строку (например, 10-ю из 10), новый индекс станет равен 9, и курсор корректно встанет на новую последнюю строку.
  2. Проверка Если ИндексСтр > 0 защищает код от ошибок позиционирования при очистке полностью пустой таблицы.
  3. Вызов Форма.Обновить() обеспечивает мгновенную визуальную перерисовку элемента на форме, что предотвращает визуальные сбои прокрутки при работе с большими массивами данных.

Альтернативные подходы к работе со списками

Рассмотрим еще два практических сценария, с которыми часто сталкиваются разработчики в 1С 7.7:

1. Массовое удаление строк по условию
Если перед нами стоит задача удалить не одну строку, а сразу группу строк (например, с нулевыми суммами), нельзя использовать прямой цикл от 1 до КоличествоСтрок(), так как при каждом удалении индексы нижестоящих строк сдвигаются. Для массового удаления всегда используем обратный цикл:


Для Сч = -СведенияСотрудников.КоличествоСтрок() По -1 Цикл
    НомерСтр = -Сч;
    Если СведенияСотрудников.ПолучитьЗначение(НомерСтр, "Сумма") = 0 Тогда
        СведенияСотрудников.УдалитьСтроку(НомерСтр);
    КонецЕсли;
КонецЦикла;

2. Логическое исключение (пометка вместо удаления)
Чтобы исключить сдвиги строк и потенциальные проблемы с фокусом, в таблицу значений можно добавить числовую колонку-флаг Исключить. По кнопке пользователь просто меняет значение флага для текущей строки, а при формировании итогового отчета или печатной формы строки с пометкой просто пропускаются.

← На главную