Профессия — 1С

Рукопашный бой Карташ

Категории

Организация транзакций средствами встроенного языка 1С

рубрики: Язык программирования 1С | Дата: 19 Апрель, 2017

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




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

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




&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()

	НачатьТранзакцию();

	//записываем новый товар
	Товар = Справочники.Товары.СоздатьЭлемент();
	Товар.Наименование = "Дырокол";
	Товар.Записать();

	//записываем цену
	НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();

	НоваяЗапись = НаборЗаписей.Добавить();
	НоваяЗапись.Период	= ТекущаяДата();
	НоваяЗапись.Товар	= Товар.Ссылка;
	НоваяЗапись.Сумма	= 100;

	НаборЗаписей.Записать();

	ЗафиксироватьТранзакцию();

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

После выполнения этого кода мы увидим, что у нас в справочнике товаров появился дырокол, а в регистр сведений с ценами записалась его цена на текущую дату.




А теперь давайте умышленно воспроизведем ошибку внутри транзакции. Для этого продублируем запись регистра сведений с тем же набором измерений (Товар) и периодом. Как известно платформа не даст записать в регистр сведений две записи с одинаковым набором измерений.




&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()

	НачатьТранзакцию();

	//записываем новый товар
	Товар = Справочники.Товары.СоздатьЭлемент();
	Товар.Наименование = "Дырокол";
	Товар.Записать();

	//записываем цену
	НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();

	НоваяЗапись = НаборЗаписей.Добавить();
	НоваяЗапись.Период	= ТекущаяДата();
	НоваяЗапись.Товар	= Товар.Ссылка;
	НоваяЗапись.Сумма	= 100;

	ЗаписьДубль = НаборЗаписей.Добавить();
	ЗаписьДубль.Период	= ТекущаяДата();
	ЗаписьДубль.Товар	= Товар.Ссылка;
	ЗаписьДубль.Сумма	= 100;

	НаборЗаписей.Записать();

	ЗафиксироватьТранзакцию();

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

при попытке выполнить этот код возникает ошибка


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




&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()

	НачатьТранзакцию();

	//записываем новый товар
	Товар = Справочники.Товары.СоздатьЭлемент();
	Товар.Наименование = "Дырокол";
	Товар.Записать();

	//записываем цену
	НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();

	НоваяЗапись = НаборЗаписей.Добавить();
	НоваяЗапись.Период	= ТекущаяДата();
	НоваяЗапись.Товар	= Товар.Ссылка;
	НоваяЗапись.Сумма	= 100;

	НаборЗаписей.Записать();

	Отказ = Истина;
	Если Отказ Тогда
		ОтменитьТранзакцию();
	Иначе
		ЗафиксироватьТранзакцию();
	КонецЕсли;

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

Вот таким образом, можно организовывать транзакции средствами встроенного языка 1С. Это самый примитивный вариант, который на практике используется очень редко, т.к. не очень красиво, когда выполнение кода завершается с показом системного сообщения об ошибке, которое далеко не всегда понятно пользователю. Как правило транзакции организуются совместно с конструкцией Попытка — Исключение, которая позволяет обработать ошибку и вывести понятное для пользователя сообщение. Но об этом поговорим в одной из следующих статей.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С