Транзакция подразумевает выполнение группы операций с условием, что либо выполнение всех операций завершается успешно, либо в случае завершения хотя бы одной из них с ошибкой выполнение всех операций отменяется. В контексте 1С:Предприятия транзакции как правило используются с операциями, которые изменяют состояние базы данных.
Например, в одной транзакции может выполняться запись элемента справочника и запись информации в регистр сведений, со ссылкой на этот элемент справочника. В языке программирования 1С для работы с транзакциями используются следующие методы:НачатьТранзакцию(), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию()
Рассмотрим конкретный пример. Пусть у нас есть справочник Товары и регистр сведений Цена с измерением Товар, в котором хранятся цены товаров. И мы хотим создать новый товар в справочнике и сразу записать его цену в рамках одной транзакции. То есть если при записи товара или цены произойдет ошибка, ни товар ни цена записаны не будут. Сделать это можно при помощи следующего кода:
&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()
НачатьТранзакцию();
//записываем новый товар
Товар = Справочники.Товары.СоздатьЭлемент();
Товар.Наименование = "Дырокол";
Товар.Записать();
//записываем цену
НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Товар = Товар.Ссылка;
НоваяЗапись.Сумма = 100;
НаборЗаписей.Записать();
ЗафиксироватьТранзакцию();
КонецПроцедуры
После выполнения этого кода мы увидим, что у нас в справочнике товаров появился дырокол, а в регистр сведений с ценами записалась его цена на текущую дату.
А теперь давайте умышленно воспроизведем ошибку внутри транзакции. Для этого продублируем запись регистра сведений с тем же набором измерений (Товар) и периодом. Как известно платформа не даст записать в регистр сведений две записи с одинаковым набором измерений.
&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()
НачатьТранзакцию();
//записываем новый товар
Товар = Справочники.Товары.СоздатьЭлемент();
Товар.Наименование = "Дырокол";
Товар.Записать();
//записываем цену
НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Товар = Товар.Ссылка;
НоваяЗапись.Сумма = 100;
ЗаписьДубль = НаборЗаписей.Добавить();
ЗаписьДубль.Период = ТекущаяДата();
ЗаписьДубль.Товар = Товар.Ссылка;
ЗаписьДубль.Сумма = 100;
НаборЗаписей.Записать();
ЗафиксироватьТранзакцию();
КонецПроцедуры
при попытке выполнить этот код возникает ошибка
Естественно, что ни нового товара ни записи с ценой мы после этого не обнаружим.
Если нам надо в зависимости от каких-то условий отменить транзакцию, необходимо воспользоваться методом ОтменитьТранзакцию().
&НаСервереБезКонтекста
Процедура ВыполнитьТранзакциюНаСервере()
НачатьТранзакцию();
//записываем новый товар
Товар = Справочники.Товары.СоздатьЭлемент();
Товар.Наименование = "Дырокол";
Товар.Записать();
//записываем цену
НаборЗаписей = РегистрыСведений.Цена.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Товар = Товар.Ссылка;
НоваяЗапись.Сумма = 100;
НаборЗаписей.Записать();
Отказ = Истина;
Если Отказ Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецПроцедуры
Вот таким образом, можно организовывать транзакции средствами встроенного языка 1С. Это самый примитивный вариант, который на практике используется очень редко, т.к. не очень красиво, когда выполнение кода завершается с показом системного сообщения об ошибке, которое далеко не всегда понятно пользователю. Как правило транзакции организуются совместно с конструкцией
Попытка - Исключение, которая позволяет обработать ошибку и вывести понятное для пользователя сообщение.
Смотрите также:
Электронный учебник по программированию в 1С Рекомендации по изучению программирования 1С с нуля Игра "Кто хочет стать миллионером?" с вопросами на определенную тематику (язык программирования JavaScript, английские, немецкие, французские, испанские, португальские, нидерландские, итальянские слова, электробезопасность, промышленная безопасность, бокс и т.п.), написанная на 1С Программирование в 1С 8.3 с нуля - краткий самоучитель Комплексная подготовка программистов 1С:Предприятие 8.2 Сайты с уроками программирования и со справочниками Youtube-каналы с уроками программирования Сайты для обучения программированию Лекции и уроки