При обработке документов «Корректировка записей регистров» пользователи часто сталкиваются с ситуацией, когда при удалении каждой строки платформа выводит модальный вопрос: «Удалить запись? Да/Нет». Если требуется обработать массив из тысяч строк, поочередное подтверждение занимает огромное количество времени.
Проанализируем причину такого поведения 1С и рассмотрим несколько эффективных способов решения этой задачи: от интерактивной групповой очистки до программной обработки.
Главная особенность документа «Корректировка записей регистров» заключается в том, что отображаемые в нем данные — это не стандартная табличная часть документа. В форме выводятся движения конкретных регистров накопления или сведений с отбором по измерению Регистратор.
Так как табличное поле связано напрямую с источником данных регистра, платформа автоматически генерирует системный диалог подтверждения при вызове команды удаления. Именно поэтому в коде модулей формы вы не найдете стандартного вызова функции Вопрос().
Если задача выполняется оператором вручную непосредственно в форме документа, нажимать клавишу Delete для каждой строки необязательно. Платформа позволяет запросить подтверждение единоразово для всей группы записей.
Рассмотрим пошаговый алгоритм действий:
ТоварыНаСкладах).В этом случае платформа запросит подтверждение «Удалить запись?» всего один раз для всего массива выделенных строк.
Если требуется полностью отключить появление диалогового окна при поштучном удалении строк, перехватим стандартную обработку платформы с помощью события элемента управления.
Для этого в конфигураторе открываем форму документа, находим табличное поле регистра и в его свойствах назначаем обработчик события ПередНачаломУдаления. Проанализируем пример кода:
Процедура ТабличноеПолеПередНачаломУдаления(Элемент, Отказ)
// Отменяем стандартное интерактивное удаление платформы
Отказ = Истина;
// Получаем текущую выделенную строку
ТекущиеДанные = Элемент.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Удаляем строку напрямую из коллекции источника данных
Элемент.Значение.Удалить(ТекущиеДанные);
КонецЕсли;
КонецПроцедуры
Установка параметра Отказ = Истина блокирует стандартный механизм платформы, благодаря чему окно с вопросом не появляется, а запись удаляется программно из коллекции элемента управления.
Интерактивное удаление массивов данных объемом 10 000 и более строк вызывает постоянную перерисовку графического интерфейса и может привести к зависанию сеанса. Для обработки большого количества записей рекомендуется использовать программное удаление через объект НаборЗаписей без участия формы.
Рассмотрим пример обработки движений регистра накопления ТоварыНаСкладах:
// Создаем объект набора записей для нужного регистра
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
// Устанавливаем отбор по конкретному документу-регистратору
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
// Обходим набор с конца, чтобы не сбивать индексы при удалении
Индекс = НаборЗаписей.Количество() - 1;
Пока Индекс >= 0 Цикл
Запись = НаборЗаписей[Индекс];
// Проверяем условие для удаления
Если Запись.Склад = СкладДляУдаления Тогда
НаборЗаписей.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// Записываем измененный набор в базу данных
НаборЗаписей.Записать();
Этот способ выполняет операцию мгновенно, не нагружает клиентское приложение и исключает человеческий фактор при выборочной очистке остатков.