Отменяет открытую ранее транзакцию. Все изменения, внесенные в информационную базу в процессе транзакции, будут отменены.
Синтаксис
ОтменитьТранзакцию()Примеры платформы
Если ОбнаруженыОшибки Тогда
ОтменитьТранзакцию();
КонецЕсли;Полное описание, параметры и ограничения
Глобальный контекст.ОтменитьТранзакцию (Global context.RollbackTransaction)
Глобальный контекст (Global context)
ОтменитьТранзакцию (RollbackTransaction)
Доступен, начиная с версии 8.0.
Синтаксис:
ОтменитьТранзакцию()
Описание:
Отменяет открытую ранее транзакцию. Все изменения, внесенные в информационную базу в процессе транзакции, будут отменены.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Пример:
Если ОбнаруженыОшибки Тогда
ОтменитьТранзакцию();
КонецЕсли;
См. также:
Глобальный контекст, метод НачатьТранзакцию
Глобальный контекст, метод ЗафиксироватьТранзакцию
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
В собственной транзакции сравнить замещение и добавление проводок
Только на новом стенде записывается один собственный документ. Все его движения отменяются вместе с транзакцией; рабочие регистраторы не выбираются.
Где и как запускать
Полный серверный общий модуль своей отдельной конфигурации УчебнаяБухгалтерия85.
Подготовка
Создайте НОВУЮ пустую файловую базу с именем корневой конфигурации УчебнаяБухгалтерия85, управляемым режимом блокировок. Это отдельный стенд, не УТ/КА2/УНФ/БП и не копия с рабочими данными.
Планы счетов → УчебныеСчета85: код Строка 20, Максимальное количество субконто 0, без флагов учёта. Создайте два предопределённых негрупповых счёта: УчебныйАктив, код DEMO-A, вид Активный; УчебныйПассив, код DEMO-P, вид Пассивный. Оба не забалансовые. Не создавайте счёт 41/60 и не называйте опыт реальным планом бухучёта.
Документы → УчебнаяОперация85: номер Строка 40, автонумерация выключена. Без пользовательских реквизитов, проведения, обработчиков, подписок, планов обмена и внешних вызовов.
Регистры бухгалтерии → УчебныеПроводки85: план УчебныеСчета85, Корреспонденция включена. Единственное измерение МеткаОперации: Строка 80, Балансовый включён, проверка заполнения Показывать ошибку. Единственный ресурс Сумма: Число 15,2, Балансовый включён. Реквизитов нет. Длина уточнения периода 3.
Создайте второй регистр УчебныеОдносторонние85 с теми же планом, измерением, ресурсом и длиной уточнения периода, но Корреспонденция выключена. У обоих единственный регистратор УчебнаяОперация85. Модули наборов и документа пустые, кроме отдельной экспортной учебной процедуры в последнем уроке.
Обновите конфигурацию базы данных и убедитесь, что предопределённые счета созданы как данные. Создайте серверный общий модуль УчебнаяБухгалтерияПримеры с флагом Сервер. Вставьте весь модуль одного урока, вызовите УчебнаяБухгалтерияПримеры.ВыполнитьПример() из серверной команды своей обработки.
Первые семь задач не записывают данные. Восьмая кратковременно записывает собственный документ и проводки в собственной транзакции, которую обязательно отменяет. Девятая относится к модулю собственного набора, а не общему модулю.
Отмена транзакции не отменяет письма, HTTP и внешние файлы. Поэтому у собственного документа и наборов не должно быть таких обработчиков или подписок. Привилегированный режим не включается.
Процедура ВыполнитьПример() Экспорт
Если Метаданные.Документы.Количество() <> 1
ИЛИ Метаданные.ПланыСчетов.Количество() <> 1
ИЛИ Метаданные.РегистрыБухгалтерии.Количество() <> 2
ИЛИ Метаданные.Документы.Найти("УчебнаяОперация85") = Неопределено
ИЛИ Метаданные.ПланыСчетов.Найти("УчебныеСчета85") = Неопределено Тогда
ВызватьИсключение "Разрешены только собственные документ, план счетов и два регистра";
КонецЕсли;
Если Метаданные.ПланыСчетов.УчебныеСчета85.МаксКоличествоСубконто <> 0 Тогда
ВызватьИсключение "В этом опыте план счетов без субконто";
КонецЕсли;
Для Каждого ИмяРегистра Из СтрРазделить("УчебныеПроводки85,УчебныеОдносторонние85", ",") Цикл
Описание = Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистра);
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найден собственный регистр " + ИмяРегистра;
КонецЕсли;
Если Описание.Корреспонденция <> (ИмяРегистра = "УчебныеПроводки85")
ИЛИ Описание.ПланСчетов.Имя <> "УчебныеСчета85"
ИЛИ Описание.Измерения.Количество() <> 1
ИЛИ Описание.Ресурсы.Количество() <> 1
ИЛИ Описание.Реквизиты.Количество() <> 0
ИЛИ Описание.Измерения.Найти("МеткаОперации") = Неопределено
ИЛИ Описание.Ресурсы.Найти("Сумма") = Неопределено
ИЛИ Описание.ДлинаУточненияПериода <> 3 Тогда
ВызватьИсключение "Схема собственного регистра отличается от учебной";
КонецЕсли;
КонецЦикла;
СчетДебета = ПланыСчетов.УчебныеСчета85.УчебныйАктив;
СчетКредита = ПланыСчетов.УчебныеСчета85.УчебныйПассив;
Если СчетДебета.Пустая() ИЛИ СчетКредита.Пустая() Тогда
ВызватьИсключение "Нужны два собственных предопределённых счёта";
КонецЕсли;
Если СчетДебета.ПолучитьОбъект() = Неопределено ИЛИ СчетКредита.ПолучитьОбъект() = Неопределено Тогда
ВызватьИсключение "Данные собственных счетов не созданы";
КонецЕсли;
Менеджер = РегистрыБухгалтерии.УчебныеПроводки85;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Нельзя запускать урок внутри чужой транзакции";
КонецЕсли;
НачатьТранзакцию();
Попытка
Документ = Документы.УчебнаяОперация85.СоздатьДокумент();
Документ.Дата = Дата(2026, 9, 15, 10, 0, 0);
Документ.Номер = "B-" + Строка(Новый УникальныйИдентификатор);
Документ.Записать();
СвояСсылка = Документ.Ссылка;
Набор = СвойНаборПроводок(СвояСсылка, СчетДебета, СчетКредита);
Набор.Записывать = Ложь;
Набор.Записать(Истина);
Проверка = Менеджер.СоздатьНаборЗаписей();
Проверка.Отбор.Регистратор.Установить(СвояСсылка);
Проверка.Прочитать();
Сообщить(Проверка.Количество() = 2 И Проверка.Итог("Сумма") = 800);
Проверка.Очистить();
Замена = Проверка.Добавить();
ЗаполнитьСвоюПроводку(Замена, СвояСсылка, СчетДебета, СчетКредита, 900);
Проверка.Записать(Истина);
Проверка.Прочитать();
Сообщить(Проверка.Количество() = 1 И Проверка.Итог("Сумма") = 900);
Добавление = Менеджер.СоздатьНаборЗаписей();
Добавление.Отбор.Регистратор.Установить(СвояСсылка);
Добавленная = Добавление.Добавить();
ЗаполнитьСвоюПроводку(Добавленная, СвояСсылка, СчетДебета, СчетКредита, 60);
Добавление.Записать(Ложь);
Сообщить(Добавление.Количество() = 0);
Проверка.Прочитать();
Сообщить(Проверка.Количество() = 2 И Проверка.Итог("Сумма") = 960);
Выборка = Менеджер.ВыбратьПоРегистратору(СвояСсылка);
ЧислоЗаписей = 0;
СуммаВыборки = 0;
Пока Выборка.Следующий() Цикл
ЧислоЗаписей = ЧислоЗаписей + 1;
СуммаВыборки = СуммаВыборки + Выборка.Сумма;
Сообщить(Выборка.Регистратор = СвояСсылка И Выборка.Активность);
Сообщить(Выборка.СчетДт = СчетДебета И Выборка.СчетКт = СчетКредита);
Сообщить(Выборка.Период = Документ.Дата);
Ключ = Менеджер.СоздатьКлючЗаписи(Новый Структура("Регистратор,НомерСтроки", Выборка.Регистратор, Выборка.НомерСтроки));
Сообщить(Ключ.Регистратор = СвояСсылка И Ключ.НомерСтроки = Выборка.НомерСтроки);
Сообщить("Уточнение сохранённой записи: " + Строка(Выборка.УточнениеПериода));
КонецЦикла;
Сообщить(ЧислоЗаписей = 2 И СуммаВыборки = 960);
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
После = Менеджер.СоздатьНаборЗаписей();
После.Отбор.Регистратор.Установить(СвояСсылка);
После.Прочитать();
Сообщить(После.Количество() = 0);
Сообщить(СвояСсылка.ПолучитьОбъект() = Неопределено);
КонецПроцедуры
Функция СвойНаборПроводок(СвояСсылка, СчетДебета, СчетКредита)
Набор = РегистрыБухгалтерии.УчебныеПроводки85.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СвояСсылка);
Для Каждого СуммаСтроки Из СтрРазделить("750,50", ",") Цикл
Запись = Набор.Добавить();
ЗаполнитьСвоюПроводку(Запись, СвояСсылка, СчетДебета, СчетКредита, Число(СуммаСтроки));
КонецЦикла;
Возврат Набор;
КонецФункции
Процедура ЗаполнитьСвоюПроводку(Запись, СвояСсылка, СчетДебета, СчетКредита, СуммаСтроки)
Запись.Период = Дата(2026, 9, 15, 10, 0, 0);
Запись.Регистратор = СвояСсылка;
Запись.Активность = Истина;
Запись.СчетДт = СчетДебета;
Запись.СчетКт = СчетКредита;
Запись.МеткаОперации = "DEMO-BOOK";
Запись.Сумма = СуммаСтроки;
КонецПроцедурыРазбор по шагам
Отказаться от запуска внутри чужой транзакции. Создать и записать только новый собственный документ в собственной транзакции.
Записать две проводки 750 и 50 с замещением. Флаг Записывать=Ложь не препятствует прямому вызову Записать.
Очистить свой считанный набор, добавить одну запись 900 и записать с замещением: две прежние записи своего регистратора заменены одной.
Отдельным набором добавить 60 без замещения: в базе внутри транзакции две записи 900/60, записанный добавлением набор очищен.
Обойти реальные записи только своего регистратора и составить ключ из сохранённых Регистратор и НомерСтроки, не из индекса массива.
Отменить собственную транзакцию при успехе и ошибке. После отмены повторно читать только свою ссылку и проверить исчезновение документа и движений.
Как проверить результат
Проверки 800,900,960 и очищенного после добавления набора Истина; выборка содержит две свои записи, сумма 960.
Две последние проверки Истина: по собственной ссылке нет движений и нет сохранённого документа.
Ожидаемый результат
Замещение, добавление, постоянный номер строки и отмена собственной записи показаны раздельно.
На что обратить внимание
Замещать=Истина удаляет старые движения текущего отбора. Здесь отбор только по своему только что созданному документу.
Отмена транзакции не является отменой внешних HTTP, писем и файлов. Собственная учебная схема должна быть без таких обработчиков.
Не выносите ЗафиксироватьТранзакцию из другого примера в этот модуль. Фиксации здесь намеренно нет.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Выбрать свои две проводки по индексированной метке и ограниченному периоду
Выбрать читает отдельные записи, не свёрнутые итоги. Для этого менеджерского метода отбор содержит ровно одно индексированное поле.
Где и как запускать
Полный серверный общий модуль собственной конфигурации УчебнаяБухгалтерия85. Нет работы с регистрами БП/КА2.
Подготовка
Создайте НОВУЮ пустую файловую базу с именем корневой конфигурации УчебнаяБухгалтерия85, управляемым режимом блокировок. Это отдельный стенд, не УТ/КА2/УНФ/БП и не копия с рабочими данными.
Планы счетов → УчебныеСчета85: код Строка 20, Максимальное количество субконто 0, без флагов учёта. Создайте два предопределённых негрупповых счёта: УчебныйАктив, код DEMO-A, вид Активный; УчебныйПассив, код DEMO-P, вид Пассивный. Оба не забалансовые. Не создавайте счёт 41/60 и не называйте опыт реальным планом бухучёта.
Документы → УчебнаяОперация85: номер Строка 40, автонумерация выключена. Без пользовательских реквизитов, проведения, обработчиков, подписок, планов обмена и внешних вызовов.
Регистры бухгалтерии → УчебныеПроводки85: план УчебныеСчета85, Корреспонденция включена. Единственное измерение МеткаОперации: Строка 80, Балансовый включён, проверка заполнения Показывать ошибку. Единственный ресурс Сумма: Число 15,2, Балансовый включён. Реквизитов нет. Длина уточнения периода 3.
Создайте второй регистр УчебныеОдносторонние85 с теми же планом, измерением, ресурсом и длиной уточнения периода, но Корреспонденция выключена. У обоих единственный регистратор УчебнаяОперация85. Модули наборов и документа пустые, кроме отдельной экспортной учебной процедуры в последнем уроке.
Обновите конфигурацию базы данных и убедитесь, что предопределённые счета созданы как данные. Создайте серверный общий модуль УчебнаяБухгалтерияПримеры с флагом Сервер. Вставьте весь модуль одного урока, вызовите УчебнаяБухгалтерияПримеры.ВыполнитьПример() из серверной команды своей обработки.
Первые семь задач не записывают данные. Восьмая кратковременно записывает собственный документ и проводки в собственной транзакции, которую обязательно отменяет. Девятая относится к модулю собственного набора, а не общему модулю.
Отмена транзакции не отменяет письма, HTTP и внешние файлы. Поэтому у собственного документа и наборов не должно быть таких обработчиков или подписок. Привилегированный режим не включается.
В обоих собственных регистрах использование итогов включено. Для урока выборки по метке у измерения МеткаОперации включите Индексировать, затем обновите конфигурацию базы данных.
Метка каждой задачи содержит новый UUID. Не подставляйте DEMO-BOOK или метку другого опыта: отчёт должен читать только собственные временные проводки.
План без субконто: фактические вызовы Остатки имеют четыре аргумента, Обороты и ОборотыДтКт — пять. В плане с субконто набор аргументов будет другим.
Процедура ВыполнитьПример() Экспорт
Если Метаданные.Документы.Количество() <> 1
ИЛИ Метаданные.ПланыСчетов.Количество() <> 1
ИЛИ Метаданные.РегистрыБухгалтерии.Количество() <> 2
ИЛИ Метаданные.Документы.Найти("УчебнаяОперация85") = Неопределено
ИЛИ Метаданные.ПланыСчетов.Найти("УчебныеСчета85") = Неопределено Тогда
ВызватьИсключение "Разрешены только собственные документ, план счетов и два регистра";
КонецЕсли;
Если Метаданные.ПланыСчетов.УчебныеСчета85.МаксКоличествоСубконто <> 0 Тогда
ВызватьИсключение "В этом опыте план счетов без субконто";
КонецЕсли;
Для Каждого ИмяРегистра Из СтрРазделить("УчебныеПроводки85,УчебныеОдносторонние85", ",") Цикл
Описание = Метаданные.РегистрыБухгалтерии.Найти(ИмяРегистра);
Если Описание = Неопределено Тогда
ВызватьИсключение "Не найден собственный регистр " + ИмяРегистра;
КонецЕсли;
Если Описание.Корреспонденция <> (ИмяРегистра = "УчебныеПроводки85")
ИЛИ Описание.ПланСчетов.Имя <> "УчебныеСчета85"
ИЛИ Описание.Измерения.Количество() <> 1
ИЛИ Описание.Ресурсы.Количество() <> 1
ИЛИ Описание.Реквизиты.Количество() <> 0
ИЛИ Описание.Измерения.Найти("МеткаОперации") = Неопределено
ИЛИ Описание.Ресурсы.Найти("Сумма") = Неопределено
ИЛИ Описание.ДлинаУточненияПериода <> 3 Тогда
ВызватьИсключение "Схема собственного регистра отличается от учебной";
КонецЕсли;
КонецЦикла;
СчетДебета = ПланыСчетов.УчебныеСчета85.УчебныйАктив;
СчетКредита = ПланыСчетов.УчебныеСчета85.УчебныйПассив;
Если СчетДебета.Пустая() ИЛИ СчетКредита.Пустая() Тогда
ВызватьИсключение "Нужны два собственных предопределённых счёта";
КонецЕсли;
Если СчетДебета.ПолучитьОбъект() = Неопределено ИЛИ СчетКредита.ПолучитьОбъект() = Неопределено Тогда
ВызватьИсключение "Данные собственных счетов не созданы";
КонецЕсли;
Менеджер = РегистрыБухгалтерии.УчебныеПроводки85;
Начало = Дата(2026, 9, 15, 0, 0, 0);
Конец = Дата(2026, 9, 16, 0, 0, 0);
СвояМетка = "REPORT-" + Строка(Новый УникальныйИдентификатор);
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Урок нельзя запускать внутри чужой транзакции";
КонецЕсли;
НачатьТранзакцию();
Попытка
Документ = Документы.УчебнаяОперация85.СоздатьДокумент();
Документ.Дата = Дата(2026, 9, 15, 10, 0, 0);
Документ.Номер = "R-" + Строка(Новый УникальныйИдентификатор);
Документ.Записать();
СвояСсылка = Документ.Ссылка;
Набор = СвойНаборПроводок(СвояСсылка, СчетДебета, СчетКредита);
Для Каждого Запись Из Набор Цикл
Запись.МеткаОперации = СвояМетка;
КонецЦикла;
Набор.Записать(Истина);
ОтборМетки = Новый Структура("МеткаОперации", СвояМетка);
Выборка = Менеджер.Выбрать(Начало, Конец, ОтборМетки, "МеткаОперации Возр");
Количество = 0;
Сумма = 0;
Пока Выборка.Следующий() Цикл
Количество = Количество + 1;
Сумма = Сумма + Выборка.Сумма;
Сообщить(Выборка.Регистратор = СвояСсылка);
Сообщить(Выборка.Активность);
Сообщить(Выборка.СчетДт = СчетДебета И Выборка.СчетКт = СчетКредита);
Сообщить("Сохранённый номер: " + Строка(Выборка.НомерСтроки));
КонецЦикла;
Сообщить(Количество = 2 И Сумма = 800);
ОтменитьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
После = Менеджер.СоздатьНаборЗаписей();
После.Отбор.Регистратор.Установить(СвояСсылка);
После.Прочитать();
Сообщить(После.Количество() = 0);
Сообщить(СвояСсылка.ПолучитьОбъект() = Неопределено);
КонецПроцедуры
Функция СвойНаборПроводок(СвояСсылка, СчетДебета, СчетКредита)
Набор = РегистрыБухгалтерии.УчебныеПроводки85.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СвояСсылка);
Для Каждого СуммаСтроки Из СтрРазделить("750,50", ",") Цикл
Запись = Набор.Добавить();
ЗаполнитьСвоюПроводку(Запись, СвояСсылка, СчетДебета, СчетКредита, Число(СуммаСтроки));
КонецЦикла;
Возврат Набор;
КонецФункции
Процедура ЗаполнитьСвоюПроводку(Запись, СвояСсылка, СчетДебета, СчетКредита, СуммаСтроки)
Запись.Период = Дата(2026, 9, 15, 10, 0, 0);
Запись.Регистратор = СвояСсылка;
Запись.Активность = Истина;
Запись.СчетДт = СчетДебета;
Запись.СчетКт = СчетКредита;
Запись.МеткаОперации = "DEMO-BOOK";
Запись.Сумма = СуммаСтроки;
КонецПроцедурыРазбор по шагам
Включить Индексировать у своей МеткаОперации до опыта. Для порядка также используется это индексированное строковое поле.
Записать только два собственных движения в собственной транзакции, обеим записям назначить один уникальный маркер.
Передать границы периода и структуру ровно с одной меткой. Не добавлять СчетДт/СчетКт в этот отбор: у Выбрать другой контракт, чем у Остатки.
В цикле обязательно вызвать Следующий и проверить реального регистратора, активность и стороны счетов.
Проверить две записи и 800. Для одинаковой метки порядок двух сумм не фиксируется; сохранённый номер выводится отдельно от счётчика цикла.
Отменить свою транзакцию, проверить исчезновение только своих данных.
Как проверить результат
Для каждой из двух записей три сообщения Истина, затем общая проверка количества 2 и суммы 800 Истина.
После отмены последние две проверки Истина: по собственной ссылке пусто, документ не существует.
Ожидаемый результат
Полный обход реальных собственных записей с правильным индексированным отбором.
На что обратить внимание
Одна структура не означает одинаковый контракт всех методов. Здесь Выбрать допускает только одно поле отбора.
Выборка не является изменяемой записью набора: свойства только читаются.
Порядок по одинаковой метке не гарантирует последовательность 750 затем 50. Проверяется сумма и количество, не случайный порядок.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.