Транзакции в 1С 8.3

Jul 18, 2022 22:48

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

Смотрите также:
Электронный учебник по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, ни­дер­ландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С
Программирование в 1С 8.3 с нуля - краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

программирование

Previous post Next post
Up