Как убрать подтверждение удаления и массово удалить строки в документе «Корректировка записей регистров» в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обработке документов «Корректировка записей регистров» пользователи часто сталкиваются с ситуацией, когда при удалении каждой строки платформа выводит модальный вопрос: «Удалить запись? Да/Нет». Если требуется обработать массив из тысяч строк, поочередное подтверждение занимает огромное количество времени.

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

Выясним причину поведения системы

Главная особенность документа «Корректировка записей регистров» заключается в том, что отображаемые в нем данные — это не стандартная табличная часть документа. В форме выводятся движения конкретных регистров накопления или сведений с отбором по измерению Регистратор.

Так как табличное поле связано напрямую с источником данных регистра, платформа автоматически генерирует системный диалог подтверждения при вызове команды удаления. Именно поэтому в коде модулей формы вы не найдете стандартного вызова функции Вопрос().

Способ 1. Интерактивное групповое удаление через отбор

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

Рассмотрим пошаговый алгоритм действий:

  1. Откроем документ «Корректировка записей регистров» и перейдем на закладку нужного регистра (например, ТоварыНаСкладах).
  2. Установим отбор по необходимому условию (например, кликнув правой кнопкой мыши по колонке «Склад» и выбрав пункт «Отфильтровать по значению»).
  3. Выделим все отфильтрованные строки комбинацией клавиш Ctrl + A.
  4. Нажмем клавишу Delete или соответствующую кнопку на панели табличного поля.

В этом случае платформа запросит подтверждение «Удалить запись?» всего один раз для всего массива выделенных строк.

Способ 2. Программное отключение вопроса через событие формы

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

Для этого в конфигураторе открываем форму документа, находим табличное поле регистра и в его свойствах назначаем обработчик события ПередНачаломУдаления. Проанализируем пример кода:


Процедура ТабличноеПолеПередНачаломУдаления(Элемент, Отказ)
	
	// Отменяем стандартное интерактивное удаление платформы
	Отказ = Истина;
	
	// Получаем текущую выделенную строку
	ТекущиеДанные = Элемент.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		// Удаляем строку напрямую из коллекции источника данных
		Элемент.Значение.Удалить(ТекущиеДанные);
	КонецЕсли;

КонецПроцедуры

Установка параметра Отказ = Истина блокирует стандартный механизм платформы, благодаря чему окно с вопросом не появляется, а запись удаляется программно из коллекции элемента управления.

Способ 3. Оптимальный метод: программное удаление через набор записей

Интерактивное удаление массивов данных объемом 10 000 и более строк вызывает постоянную перерисовку графического интерфейса и может привести к зависанию сеанса. Для обработки большого количества записей рекомендуется использовать программное удаление через объект НаборЗаписей без участия формы.

Рассмотрим пример обработки движений регистра накопления ТоварыНаСкладах:


// Создаем объект набора записей для нужного регистра
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();

// Устанавливаем отбор по конкретному документу-регистратору
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();

// Обходим набор с конца, чтобы не сбивать индексы при удалении
Индекс = НаборЗаписей.Количество() - 1;
Пока Индекс >= 0 Цикл
	Запись = НаборЗаписей[Индекс];
	
	// Проверяем условие для удаления
	Если Запись.Склад = СкладДляУдаления Тогда
		НаборЗаписей.Удалить(Индекс);
	КонецЕсли;
	
	Индекс = Индекс - 1;
КонецЦикла;

// Записываем измененный набор в базу данных
НаборЗаписей.Записать();

Этот способ выполняет операцию мгновенно, не нагружает клиентское приложение и исключает человеческий фактор при выборочной очистке остатков.

← На главную