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