К статье
Практический материал

Разработка и Конфигурация · 10 мин

Транзакция записи документа в 1С: что это и как работает

Что такое транзакция записи документа в 1С, как проходит запись в базу данных, какие проверки выполняются и как избежать ошибок при проведении.

Транзакция записи документа в 1С — это набор операций с базой данных, которые выполняются как единое целое: либо все изменения фиксируются полностью, либо вся группа действий отменяется без следов. Когда пользователь нажимает «Записать» или «Провести», платформа 1С открывает транзакцию, сохраняет шапку и табличные части документа, записывает движения по регистрам и только после успешного завершения всех шагов подтверждает изменения.

Такой механизм защищает учётные данные от рассогласования. Если на любом этапе возникает ошибка — например, нарушена проверка заполнения, сработал контроль остатков или прервалось соединение с сервером — платформа откатывает транзакцию, и база остаётся в том состоянии, в котором была до попытки записи. Частично записанного документа, у которого есть шапка, но нет движений, в нормальной работе появиться не должно.

Понимание транзакционной модели важно и бухгалтеру, который сталкивается с сообщением «Ошибка при вызове метода контекста (Записать)», и разработчику, который пишет обработчики проведения. Ниже разобрано, какие этапы проходит запись документа, чем отличаются режимы записи и что проверять при сбоях.

Что происходит при записи документа шаг за шагом

При нажатии кнопки «Записать» платформа последовательно выполняет несколько этапов. Сначала вызываются обработчики событий — «ПередЗаписью» и «ПриЗаписи», в которых конфигурация может проверить условия, дозаполнить реквизиты или отказаться от записи. Затем выполняется проверка заполнения обязательных реквизитов, и только после этого данные физически сохраняются в таблицах базы данных.

При проведении документа цепочка длиннее. После записи самого документа вызывается обработчик «ОбработкаПроведения», в котором формируются движения по регистрам: накопления, сведений, бухгалтерии. Далее платформа выполняет контроль остатков, если он включён для регистра, и фиксирует транзакцию. Весь этот набор операций выполняется в рамках одной транзакции СУБД.

Этапы записи документа с проведением
  1. 1
    Вызов обработчика «ПередЗаписью» — проверки и дозаполнение данных
  2. 2
    Проверка заполнения обязательных реквизитов
  3. 3
    Физическая запись шапки и табличных частей в базу данных
  4. 4
    Вызов «ОбработкаПроведения» — формирование движений по регистрам
  5. 5
    Контроль остатков и дополнительные проверки конфигурации
  6. 6
    Фиксация транзакции либо полный откат при любой ошибке

Чем запись отличается от проведения

Запись без проведения сохраняет только сам документ: его реквизиты, табличные части, дату и номер. Движения по регистрам при этом не формируются, и документ не влияет на учётные итоги — остатки товаров, взаиморасчёты, проводки. Такой документ существует в базе как черновик.

Проведение включает запись плюс формирование движений. Именно проведённый документ меняет данные отчётов: оборотно-сальдовой ведомости, остатков склада, задолженности контрагентов. Отмена проведения удаляет движения, но сам документ остаётся в базе.

Сравнение режимов

Запись без проведения

Сохраняет только реквизиты документа. Подходит для черновиков и документов, не требующих движений. Не влияет на отчёты и итоги.

Проведение

Записывает документ и формирует движения по регистрам. Именно этот режим меняет остатки, обороты и проводки.

Отмена проведения

Удаляет движения документа, оставляя сам документ в базе. Используется для исправления ошибок перед повторным проведением.

Почему транзакция откатывается: типичные причины ошибок

Самая частая причина отказа в записи — незаполненные обязательные реквизиты. Платформа выводит список незаполненных полей и не даёт сохранить документ, пока пользователь не исправит данные. Это штатное поведение, а не сбой.

Вторая группа причин — программные отказы в обработчиках. Конфигурация может запретить запись, если, например, дата документа попадает в закрытый период, склад не соответствует организации или сумма документа превышает лимит. В этом случае текст сообщения об ошибке обычно указывает, какое правило нарушено.

Третья группа — конфликты блокировок в многопользовательском режиме. Если два пользователя одновременно записывают документы, затрагивающие одни и те же данные (например, остатки одного товара), одна из транзакций может завершиться ошибкой «Конфликт блокировок при выполнении транзакции». Обычно достаточно повторить запись через несколько секунд.

Типичные ошибки пользователей и разработчиков
01
Игнорирование текста ошибки: сообщение платформы почти всегда указывает конкретную причину отказа — незаполненный реквизит, закрытый период или отрицательный остаток
02
Запись в цикле без учёта транзакций: при массовой обработке документов каждый документ записывается в отдельной транзакции, и ошибка на одном не должна прерывать обработку остальных без логирования
03
Попытка исправить «зависший» документ прямым редактированием в базе: это нарушает целостность и приводит к рассогласованию движений
04
Использование метода Записать() внутри обработчика записи того же объекта — это вызывает рекурсию и ошибку

Что такое управляемые блокировки и зачем они нужны

В клиент-серверном режиме 1С использует управляемые блокировки: перед изменением данных транзакция явно блокирует нужные диапазоны, например записи регистра остатков по конкретному товару и складу. Это позволяет параллельно проводить документы по разным товарам без взаимных ожиданий.

Если конфигурация работает в режиме автоматических блокировок, платформа блокирует данные неявно, что чаще приводит к конфликтам при интенсивной работе. Перевод конфигурации на управляемый режим блокировок — одна из основных мер по снижению числа ошибок «Конфликт блокировок» в базах с большим числом пользователей.

Как разработчику работать с транзакциями явно

Во встроенном языке 1С есть методы явного управления транзакциями: НачатьТранзакцию(), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию(). Они применяются, когда нужно записать несколько объектов атомарно — например, документ и связанный с ним элемент справочника, чтобы не осталось «половинчатого» результата.

Обязательное правило — оборачивать такой код в конструкцию Попытка/Исключение и в ветке исключения вызывать ОтменитьТранзакцию(). Если этого не сделать, при ошибке транзакция может остаться открытой, что приведёт к блокировкам и непредсказуемым сбоям.

bsl
НачатьТранзакцию();
Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    КонтрагентОбъект.Записать();
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ЗаписьЖурналаРегистрации("Запись документа", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

Вложенные явные транзакции в 1С фактически не создают новых транзакций СУБД: повторный вызов НачатьТранзакцию() только увеличивает счётчик. Это важно учитывать при проектировании длинных цепочек вызовов.

Как проверить, что запись прошла корректно

После проведения документа убедитесь, что движения действительно сформированы. В форме документа это делается через кнопку перехода к движениям (обычно «Ещё → Движения документа» или иконка перехода по регистрам). Отсутствие записей в регистрах при проведённом документе — признак того, что обработчик проведения не отработал или движения были очищены.

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

Контрольные точки

Как проверить результат записи

Статус документа в списке
Норма

Документ отмечен как проведённый (иконка без красной пометки)

Тревожный признак

Документ не проведён или помечен на удаление, хотя пользователь нажимал «Провести»

Движения документа
Норма

По регистрам сформированы записи с корректными суммами и количеством

Тревожный признак

Список движений пуст или суммы не сходятся с табличной частью

Журнал регистрации
Норма

Нет ошибок за момент записи

Тревожный признак

Есть записи уровня «Ошибка» с текстом отказа в транзакции

Ограничения и риски при работе с транзакциями

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

Отдельный риск — прямое вмешательство в базу данных средствами СУБД в обход платформы. Такие изменения не проходят через транзакционную логику 1С, нарушают служебные механизмы (нумерацию, итоги регистров) и могут привести к необратимому рассогласованию данных. Любые исправления следует выполнять штатными средствами: обработками, групповым перепроведением, тестированием и исправлением.

Частые вопросы о транзакции записи документа

Почему документ не проводится, хотя все поля заполнены?

Чаще всего срабатывает программная проверка в обработчике проведения: дата в закрытом периоде, отрицательный остаток на складе, несоответствие договора валюте документа. Точную причину указывает текст сообщения об ошибке — читайте его полностью, включая детали после основной фразы.

Что делать при ошибке «Конфликт блокировок при выполнении транзакции»?

В большинстве случаев достаточно повторить запись через несколько секунд — конфликт вызван параллельной работой другого пользователя с теми же данными. Если ошибка повторяется постоянно, нужно искать длительные транзакции (обмены, отчёты, фоновые задания) и оптимизировать их.

Может ли документ записаться частично — шапка есть, а движений нет?

При штатной работе платформы нет: транзакция либо фиксируется целиком, либо откатывается. Такое состояние возможно только после сбоев оборудования, прямого вмешательства в базу или удаления движений специальными обработками. Лечится перепроведением документа.

Чем отличается Записать() от Записать(РежимЗаписиДокумента.Проведение)?

Первый вариант сохраняет только данные документа без формирования движений. Второй выполняет полное проведение: вызывает обработчик проведения, записывает движения по регистрам и выполняет контроль остатков. Выбор зависит от того, должен ли документ влиять на учётные итоги.

Безопасно ли перепроводить документы за прошлые периоды?

Технически да, но с оговорками: перепроведение может изменить движения, если в конфигурации изменилась логика проведения или появились новые контроли. Перед массовым перепроведением закрытых периодов сделайте резервную копию и сверьте ключевые отчёты до и после.

Где смотреть ошибки записи при фоновой обработке документов?

В журнале регистрации (раздел «Администрирование» → «Журнал регистрации»). Отфильтруйте события по уровню «Ошибка» и нужному периоду — там будут тексты отказов транзакций с указанием объектов, на которых произошёл сбой.

Итог

Что важно запомнить

Транзакция записи документа — это гарантия целостности: документ и его движения сохраняются либо полностью, либо не сохраняются вовсе. Ошибки записи почти всегда объяснимы: читайте текст сообщения, проверяйте движения и журнал регистрации, а при массовых сбоях останавливайте работу и восстанавливайте базу из копии.