Всем привет!
Я senior разработчик 1С, прошел много собеседований и почти на каждом спрашивают про транзакции. В процессе подготовки я понял что нормального сжатого материала по этой теме нет. Если вы решите погуглить то вам попадется куча обрывочных довольно нетривиальных статей и нужно потратить много времени разобраться в этом. Посему делюсь выжимкой знаний про то, что спрашивают на собесах и ответами на них.
P.S.: Здесь мы не будем разбирать другие вопросы, которые тоже очень часто любят спрашивать про транзакции - это ACID и уровни изоляции транзакций.
-
Что такое транзакция в общем?
Это принцип — выполнится «все или ничего». К примеру, в 1С это операции между конструкциями
НачатьТранзакцию(); // ЗафиксироватьТранзакцию(); -
Явные / Неявные транзакции:
Явные — через НачатьТранзакцию(), ЗафиксироватьТранзакцию()
Неявные — к примеру, в модуле объекта справочника ПриЗаписи() -
Бывают ли вложенные транзакции?
На уровне СУБД нет, на уровне кода 1С можно писать сколько угодно раз НачатьТранзакцию() (счетчик вложенности увеличивается) а потом столько же раз ЗафиксироватьТранзакцию() (счетчик вложенности уменьшается), НО на уровне СУБД при этом будет создана только одна транзакция и она будет завершена когда последняя ЗафиксироватьТранзакцию() (счетчик вложенности = 0) отработает.
-
Что такое сломанная транзакция?
Состояние, когда СУБД уже откатила транзакцию из‑за ошибки, но код приложения 1С продолжает выполняться, и любые дальнейшие обращения к БД приводят к ошибке «в данной транзакции уже происходили ошибки».
Из кода 1С мы никак не можем понять что транзакция сломана, но есть костыль:

-
Способы получения сломанной транзакции?

Вариант 1: Ошибка при операции в базе данных ! Ошибка может быть и во вложенной неявной транзакции. К примеру, в модуле объекта справочника, который мы пытаемся записать в попытке.

Вариант 2: через ОтменитьТранзакцию()
! ОтменитьТранзакцию() это так же установка флага Отказ в Истина, допустим, при записи справочника. -
Когда мы НЕ получим сломанную транзакцию?
Когда ошибка в Попытке/Исключении не будет связана с обращением к СУБД

-
Стандарты разработки по написанию транзакций:
НачатьТранзакцию(); Попытка // блокировки, чтение, запись // … ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; // если есть внешняя транзакция КонецПопыткиПолный код обработки:
Процедура СломаемТранзакциюВариант1() НачатьТранзакцию(); Попытка Запрос = Новый Запрос; Запрос.Текст = "Выбрать 1/0"; Запрос.Выполнить(); Исключение КонецПопытки; Сообщить(ЭтаТранзакцияСломана()); //Да! ЗафиксироватьТранзакцию(); КонецПроцедуры Процедура СломаемТранзакциюВариант2() НачатьТранзакцию(); Попытка НачатьТранзакцию(); ОтменитьТранзакцию(); Исключение КонецПопытки; Сообщить(ЭтаТранзакцияСломана()); //Да! ЗафиксироватьТранзакцию(); КонецПроцедуры Процедура НеСломаемТранзакцию() НачатьТранзакцию(); Попытка а = Новый Структура; б = а.НовоеПоле; Исключение КонецПопытки; Сообщить(ЭтаТранзакцияСломана()); //Нет! ЗафиксироватьТранзакцию(); КонецПроцедуры Функция ЭтаТранзакцияСломана() Попытка Запрос = Новый Запрос; Запрос.Текст = "Выбрать 1"; Запрос.Выполнить(); Возврат Ложь; Исключение Возврат Истина; КонецПопытки; КонецФункции
Комментарии (7)

USergey
27.04.2026 19:42Acid этож 4 принципа, в каждой буковке.
И понять сломана или нет, можно все таки вызвав исключение как и написано в стандарте.
А если мы попыткой вывод ошибок подавили, внутри доломали до rollback и чего тогда удивлятся что транзакция у нас уже со стороны субд уже нету.

mustafa222 Автор
27.04.2026 19:42Согласен с вами, но тема статьи про то что спрашивают на собеседованиях про транзакции и краткие ответы на них. Мои примеры тут больше рассчитаны на показ различий транзакции 1с и транзакции СУБД.

ulovka22
27.04.2026 19:42Пустая ветка Исключение не соответствует стандартам разработки, не надо давать такие примеры, господин senior разработчик 1С

mustafa222 Автор
27.04.2026 19:42Спасибо за внимательность, действительно в реальном проекте надо писать по стандартам. Но это был пример все-таки для показа логики поломки транзакции и я постарался для лучшего понимания выкинуть все лишнее.

USergey
27.04.2026 19:42Да не мети ты перед ними шляпой как нищий, они клюнули на твое представление о себе. Матерого сеньора который учит юнцов как обращатся с женщиной на собеседовании, чтоб она поняла что ты тоже опытный мужчина.
capitannemo
Подозрительно напоминает транскрибацию не самых последних курсов Богачева чатомжопити.
На самых последних он показывал как ТЖ расследовать «В данной транзакции уже происходили ошибки»
А почему я так думаю, потому, что из всех спикеров которых я знаю только Виктор употребляет выражение сломанная транзакция
Вам всем троим надо подтянуться и тому кто собеседует и тому кого собеседуют и чатужопити
Впрочем чатжопити не при делах, у него граница обучения октябрь 2024, он может и не знать
mustafa222 Автор
Смысл данной статьи это максимально просто и сжато показать ответы на вопросы, которые из моей практике спрашивают почти на каждом собеседовании на senior позиции. (На middle наверное тоже уже спрашивают). И я не нашел прозрачного и сжатого объяснения на просторах интернета - есть пара сложных статей которые я разобрал до основания, поэтому поделился выжимкой по ним для подготовки к собесам.
"только Виктор употребляет выражение сломанная транзакция" - достаточно 3 минуты поиска чтобы увидеть что в 90% случаев эта фраза используется уже везде.
Про chatGpt и deepSeek вы тоже явно не в теме, потому что они расписывают более понятно и локанично чем я написал.