← Назад к вопросам

Что такое транзакция в 1С? Есть ли вложенные транзакции?

2.0 Middle🔥 231 комментариев
#Блокировки и транзакции#Стандарты разработки

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

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

Определение и основные свойства ACID

Транзакция объединяет несколько операций в один логический блок, который либо полностью выполняется, либо полностью откатывается (rollback) при ошибке. Основные свойства:

  • A (Atomicity) — атомарность: либо всё выполнится, либо ничего
  • C (Consistency) — согласованность: база переходит из одного корректного состояния в другое
  • I (Isolation) — изолированность: параллельные транзакции не видят незафиксированные изменения
  • D (Durability) — долговечность: сохранённые данные сохраняются при сбоях

Синтаксис в 1С

НачатьТранзакцию();
Попытка
    Документ = Документы.ПродажиТовара.СоздатьДокумент();
    Документ.Номер = "001";
    Документ.Дата = ТекущаяДата();
    Документ.Записать(РежимЗаписиДокумента.Проведение);
    
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    Сообщение = Новый СообщениеПользователю();
    Сообщение.Текст = "Ошибка: " + ОписаниеОшибки();
    Сообщение.Сообщить();
КонецПопытки;

Вложенные транзакции

Строго говоря, вложенных транзакций в 1С нет! Это важный момент:

  • Если вы вызываете НачатьТранзакцию() уже внутри активной транзакции, счётчик вложенности увеличивается
  • При ЗафиксироватьТранзакцию() счётчик уменьшается на 1
  • Реальное фиксирование (commit) в БД происходит только когда счётчик достигает нуля
  • Это называется "виртуальные вложенные транзакции" (savepoints)

Примеры вложенности

НачатьТранзакцию();  // Счётчик = 1
Попытка
    НачатьТранзакцию();  // Счётчик = 2
    Попытка
        Элемент = Справочники.Товары.СоздатьЭлемент();
        Элемент.Наименование = "Новый товар";
        Элемент.Записать();
        
        ЗафиксироватьТранзакцию();  // Счётчик = 1
    Исключение
        ОтменитьТранзакцию();  // Счётчик = 1
    КонецПопытки;
    
    ЗафиксироватьТранзакцию();  // Счётчик = 0
Исключение
    ОтменитьТранзакцию();
КонецПопытки;

Критические особенности

При откате вложенной транзакции откатываются ВСЕ изменения с момента начала внешней транзакции.

Лучшие практики

✓ Минимизируйте размер транзакции (длинные транзакции блокируют ресурсы) ✓ Избегайте пользовательского взаимодействия внутри транзакции ✓ Используйте вложенные транзакции осторожно ✓ Документируйте границы транзакций в критичных местах ✓ Проверяйте логику откатов в обработчиках исключений

Вывод: Транзакция — основной механизм целостности данных в 1С. Вложенные транзакции существуют на уровне счётчика, но при откате откатываются ВСЕ изменения с начала внешней транзакции.

Что такое транзакция в 1С? Есть ли вложенные транзакции? | PrepBro