Odin | База знаний 1С

Как использовать "П...
 

Как использовать "Попытка-Исключение" и транзакции для очистки регистров 1С?


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

/а как это оформить через попытку исключение и возможно транзакцию?



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

Для удаления записей в периодическом независимом регистре сведений с использованием конструкции "Попытка-Исключение" и транзакции в 1С (8.3) можно оформить код следующим образом:

Процедура ОчиститьРегистры()
	
	Попытка
		// Начинаем транзакцию
		НачатьТранзакцию();
		
		// Создаем набор записей регистра сведений
		НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
		
		// Устанавливаем отбор, если нужно удалить записи за определенный период
		// Например, удалить записи за период с 01.01.2025 по 31.12.2025
		// НаборЗаписей.Отбор.Дата.Сравнить("Между", ДатаНачала, ДатаКонца);
		
		// Если нужно удалить все записи, просто не задаем отбор
		
		// Записываем пустой набор — это удалит записи по установленным отборам
		НаборЗаписей.Записать();
		
		// Фиксируем транзакцию
		ЗафиксироватьТранзакцию();
		
	Исключение
		// В случае ошибки откатываем транзакцию
		Если ТранзакцияАктивна() Тогда
			ОтменитьТранзакцию();
		КонецЕсли;
		
		// Выводим сообщение об ошибке
		Сообщить("Ошибка при очистке регистра: " + ОписаниеОшибки());
	КонецПопытки;

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

**Пояснения:**

- `НачатьТранзакцию()` — открывает транзакцию, в рамках которой все изменения будут либо зафиксированы, либо отменены.
- `НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей()` — создается набор записей для работы с регистром.
- Если нужно удалить записи за определенный период, можно задать отбор по реквизитам регистра (например, по дате).
- Вызов `НаборЗаписей.Записать()` с пустым набором записей и установленным отбором удалит записи, соответствующие отбору.
- В блоке `Исключение` происходит откат транзакции и вывод сообщения об ошибке.
- Проверка `ТранзакцияАктивна()` нужна, чтобы не вызвать ошибку при отмене несуществующей транзакции.

Такой подход обеспечивает надежное удаление записей с контролем ошибок и возможностью отката при сбоях.

Рекомендую посмотреть здесь: https://infostart.ru/public/1044910/ (пример работы с транзакциями и удалением записей в регистрах)



   
ОтветитьЦитата