Всем привет!

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

P.S.: Здесь мы не будем разбирать другие вопросы, которые тоже очень часто любят спрашивать про транзакции - это ACID и уровни изоляции транзакций.

  1. Что такое транзакция в общем?

    Это принцип — выполнится «все или ничего». К примеру, в 1С это операции между конструкциями

    НачатьТранзакцию();
    //
    ЗафиксироватьТранзакцию();
  2. Явные / Неявные транзакции:

    Явные — через НачатьТранзакцию(), ЗафиксироватьТранзакцию()
    Неявные — к примеру, в модуле объекта справочника ПриЗаписи()

  3. Бывают ли вложенные транзакции?

    На уровне СУБД нет, на уровне кода 1С можно писать сколько угодно раз НачатьТранзакцию() (счетчик вложенности увеличивается) а потом столько же раз ЗафиксироватьТранзакцию() (счетчик вложенности уменьшается), НО на уровне СУБД при этом будет создана только одна транзакция и она будет завершена когда последняя ЗафиксироватьТранзакцию() (счетчик вложенности = 0) отработает.

  4. Что такое сломанная транзакция?

    Состояние, когда СУБД уже откатила транзакцию из‑за ошибки, но код приложения 1С продолжает выполняться, и любые дальнейшие обращения к БД приводят к ошибке «в данной транзакции уже происходили ошибки».

    Из кода 1С мы никак не можем понять что транзакция сломана, но есть костыль:

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

    Вариант 1: Ошибка при операции в базе данных
    Вариант 1: Ошибка при операции в базе данных












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

    Вариант 2: через ОтменитьТранзакцию()
    Вариант 2: через ОтменитьТранзакцию()













    ! ОтменитьТранзакцию() это так же установка флага Отказ в Истина, допустим, при записи справочника.

  6. Когда мы НЕ получим сломанную транзакцию?

    Когда ошибка в Попытке/Исключении не будет связана с обращением к СУБД











  7. Стандарты разработки по написанию транзакций:

    НачатьТранзакцию();
    Попытка
         // блокировки, чтение, запись 
         // … 
         ЗафиксироватьТранзакцию();
    Исключение
         ОтменитьТранзакцию();
         ВызватьИсключение; // если есть внешняя транзакция
    КонецПопытки

    Полный код обработки:

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

Процедура СломаемТранзакциюВариант2()
  
  НачатьТранзакцию();
  
  Попытка
    НачатьТранзакцию();
    ОтменитьТранзакцию();
  Исключение
  КонецПопытки;
  
  Сообщить(ЭтаТранзакцияСломана()); //Да!
  
  ЗафиксироватьТранзакцию();
  
КонецПроцедуры

Процедура НеСломаемТранзакцию()
  
  НачатьТранзакцию();
  
  Попытка
    а = Новый Структура;
    б = а.НовоеПоле;
  Исключение
  КонецПопытки;
  
  Сообщить(ЭтаТранзакцияСломана()); //Нет!
    
  ЗафиксироватьТранзакцию();
  
КонецПроцедуры


Функция ЭтаТранзакцияСломана()

  Попытка
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать 1";
    Запрос.Выполнить();
    Возврат Ложь;
  Исключение
    Возврат Истина;
  КонецПопытки;
  
КонецФункции

Комментарии (7)


  1. capitannemo
    27.04.2026 19:42

    Подозрительно напоминает транскрибацию не самых последних курсов Богачева чатомжопити.
    На самых последних он показывал как ТЖ расследовать «В данной транзакции уже происходили ошибки»

    А почему я так думаю, потому, что из всех спикеров которых я знаю только Виктор употребляет выражение сломанная транзакция
    Вам всем троим надо подтянуться и тому кто собеседует и тому кого собеседуют и чатужопити
    Впрочем чатжопити не при делах, у него граница обучения октябрь 2024, он может и не знать


    1. mustafa222 Автор
      27.04.2026 19:42

      Смысл данной статьи это максимально просто и сжато показать ответы на вопросы, которые из моей практике спрашивают почти на каждом собеседовании на senior позиции. (На middle наверное тоже уже спрашивают). И я не нашел прозрачного и сжатого объяснения на просторах интернета - есть пара сложных статей которые я разобрал до основания, поэтому поделился выжимкой по ним для подготовки к собесам.

      "только Виктор употребляет выражение сломанная транзакция" - достаточно 3 минуты поиска чтобы увидеть что в 90% случаев эта фраза используется уже везде.

      Про chatGpt и deepSeek вы тоже явно не в теме, потому что они расписывают более понятно и локанично чем я написал.


  1. USergey
    27.04.2026 19:42

    Acid этож 4 принципа, в каждой буковке.

    И понять сломана или нет, можно все таки вызвав исключение как и написано в стандарте.

    А если мы попыткой вывод ошибок подавили, внутри доломали до rollback и чего тогда удивлятся что транзакция у нас уже со стороны субд уже нету.


    1. mustafa222 Автор
      27.04.2026 19:42

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


  1. ulovka22
    27.04.2026 19:42

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


    1. mustafa222 Автор
      27.04.2026 19:42

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


  1. USergey
    27.04.2026 19:42

    Да не мети ты перед ними шляпой как нищий, они клюнули на твое представление о себе. Матерого сеньора который учит юнцов как обращатся с женщиной на собеседовании, чтоб она поняла что ты тоже опытный мужчина.
    Да не мети ты перед ними шляпой как нищий, они клюнули на твое представление о себе. Матерого сеньора который учит юнцов как обращатся с женщиной на собеседовании, чтоб она поняла что ты тоже опытный мужчина.