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

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

Как определить режим записи документа в 1С

Как определить режим записи документа в 1С: РежимЗаписиДокумента, проверка в обработчиках, ПередЗаписью и ПриЗаписи, типовые ошибки и примеры кода.

При разработке обработчиков записи документа в 1С почти всегда требуется понять, что именно делает пользователь: просто сохраняет документ, проводит его или отменяет проведение. От этого зависит логика проверок, заполнения реквизитов и блокировок. Платформа 1С передаёт эту информацию через параметр РежимЗаписи, который доступен в обработчиках событий формы и модуля объекта.

Режим записи документа — это значение системного перечисления РежимЗаписиДокумента, которое может принимать три значения: Запись, Проведение и ОтменаПроведения. Определить режим можно как на клиенте (в форме документа), так и на сервере (в модуле объекта), но способы и доступные параметры различаются.

Ниже разобраны все практические способы определения режима записи: через параметры обработчиков, через свойство Проведен, через анализ состояния объекта, а также типовые ошибки, которые приводят к неверным проверкам и падению проведения.

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

Документ в 1С может сохраняться в базу тремя разными способами, и каждый из них инициирует свой сценарий обработки. Системное перечисление РежимЗаписиДокумента описывает эти варианты:

  • РежимЗаписиДокумента.Запись — документ сохраняется без проведения, движения по регистрам не формируются;
  • РежимЗаписиДокумента.Проведение — документ записывается и сразу проводится, вызывается обработчик ОбработкаПроведения;
  • РежимЗаписиДокумента.ОтменаПроведения — существующие движения удаляются, вызывается ОбработкаУдаленияПроведения.

Важно понимать разницу между режимом записи и состоянием документа. Режим записи — это намерение, действие, которое выполняется прямо сейчас. Состояние (проведён или нет) — это факт, описываемый свойством Проведен. Документ может быть проведён, но перезаписываться в режиме простой записи — тогда он останется проведённым, но движения не пересчитаются.

Определение режима в форме документа

В модуле формы документа режим записи доступен в клиентских обработчиках ПередЗаписью и серверном ПередЗаписьюНаСервере, а также в ПриЗаписи и ПослеЗаписи. Параметр называется РежимЗаписи и содержит значение типа РежимЗаписиДокумента.

&НаКлиенте

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

// Пользователь проводит документ

ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда

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

Иначе

// Простая запись без проведения

КонецЕсли;

КонецПроцедуры

Обратите внимание: в форме есть ещё один параметр — РежимПроведения (оперативное или неоперативное проведение). Его не следует путать с режимом записи: РежимПроведения имеет смысл только когда РежимЗаписи = Проведение.

Программно задать режим записи из формы можно через метод Записать() объекта данных формы:

Объект.Записать(РежимЗаписиДокумента.Проведение);
1c
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
    Сообщить("Документ проводится");
ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
    Сообщить("Проведение отменяется");
Иначе
    Сообщить("Простая запись");
КонецЕсли;

Определение режима в модуле объекта и подписках

В модуле объекта документа обработчики ПередЗаписью и ПриЗаписи также получают параметр РежимЗаписи. Это самое надёжное место для серверных проверок, потому что код выполнится при любом способе записи: из формы, программно, при обмене данными (если не установлен ОбменДанными.Загрузка).

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если ОбменДанными.Загрузка Тогда

Возврат;

КонецЕсли;

Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

// Контроль обязательных реквизитов перед проведением

КонецЕсли;

КонецПроцедуры

В подписках на события ситуация аналогична: источником является объект документа, а параметры обработчика включают РежимЗаписи. Это удобно для единых проверок по группе видов документов без изменения их модулей.

Как определить, проведён ли документ: свойство Проведен

Если задача — не перехватить момент записи, а узнать текущее состояние документа, используйте свойство Проведен объекта или запрос к реквизиту Проведен таблицы документа. Это булево значение: Истина — документ проведён, Ложь — нет.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Проведен КАК Проведен

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Ссылка = &Ссылка";

Для проверки «документ был проведён, а сейчас его распроводят» в обработчике ПередЗаписью сравните оба признака: свойство Проведен ещё хранит старое состояние, а РежимЗаписи показывает новое действие:

Если Проведен И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда

// Проведённый документ распроводят

КонецЕсли;

Способы определения режима

Параметр РежимЗаписи в обработчике

Точно показывает текущее действие. Работает только внутри событий записи, недоступен в произвольном коде

Свойство Проведен

Показывает факт проведённости в любой момент, но не говорит, что происходит прямо сейчас

Запрос к реквизиту Проведен

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

Практические сценарии и проверка результата

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

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

Порядок реализации проверки по режиму записи
  1. 1
    Откройте модуль объекта документа или создайте подписку на ПередЗаписью
  2. 2
    Добавьте ветвление по параметру РежимЗаписи с сравнением через РежимЗаписиДокумента
  3. 3
    Разместите проверки только в нужной ветке, установите Отказ = Истина при нарушении
  4. 4
    Протестируйте все три сценария: запись, проведение, отмена проведения
  5. 5
    Убедитесь, что при ОбменДанными.Загрузка = Истина проверки пропускаются

Проверить результат просто: создайте документ, сохраните без проведения — проверки проведения не должны срабатывать. Затем проведите — сработает ветка Проведение. После отмены проведения должна отработать ветка ОтменаПроведения. Если какая-то ветка не выполняется, проверьте, не прерывает ли код раньше условие по ОбменДанными.Загрузка или другое раннее Возврат.

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

Как проверить корректность логики

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

Документ сохраняется, проверки проведения не срабатывают

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

Сообщения об ошибках появляются даже при простой записи

Проведение документа
Норма

Отрабатывает ветка РежимЗаписиДокумента.Проведение

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

Ветка не выполняется или срабатывает ветка Запись

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

Отрабатывает ветка ОтменаПроведения, движения удаляются

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

Документ остаётся проведённым или логика отмены не вызывается

Типичные ошибки при работе с режимом записи

Самая частая ошибка — сравнение режима записи со строкой или числом вместо значения перечисления. Значение РежимЗаписиДокумента.Проведение — это не строка «Проведение», и сравнение РежимЗаписи = "Проведение" всегда даст Ложь.

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

Типичные ошибки
01
Сравнение РежимЗаписи со строкой — условие никогда не выполняется, проверка молча не работает
02
Использование свойства Проведен вместо РежимЗаписи в ПередЗаписью — логика видит старое состояние, а не текущее действие
03
Проверки без учёта ОбменДанными.Загрузка — обмены и обработки загрузки падают на контролях
04
Попытка получить РежимЗаписи в ОбработкаПроведения — параметра там нет, обращение к нему вызовет ошибку

Также осторожность требуется при установке Отказ = Истина: отмена записи в обработчике ПриЗаписи вызывает откат транзакции и может привести к исключению в вызывающем коде. Жёсткие отказы лучше размещать в ПередЗаписью или ОбработкаПроверкиЗаполнения.

FAQ

Чем отличается РежимЗаписи от РежимПроведения?

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

Можно ли узнать режим записи уже проведённого ранее документа?

Нет, режим записи существует только в момент выполнения записи и не сохраняется в базе. Для истории действий используйте журнал регистрации или собственный механизм логирования в подписке на событие.

Почему условие по РежимЗаписи не срабатывает при загрузке из обработки?

Скорее всего, в коде обработки или обмена у объекта установлено ОбменДанными.Загрузка = Истина, и ваш обработчик завершается раньше проверки. Либо документ записывается методом Записать() без параметров — тогда режим будет Запись, а не Проведение.

Как программно провести документ с нужным режимом?

Вызовите метод Записать объекта с параметром: ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный). Второй параметр задаёт оперативность проведения.

Доступен ли РежимЗаписи в ОбработкаПроверкиЗаполнения?

Нет, в ОбработкаПроверкиЗаполнения параметра РежимЗаписи нет. Если проверка заполнения должна зависеть от режима, сохраните значение РежимЗаписи в дополнительном свойстве объекта в ПередЗаписью или выполняйте такие проверки непосредственно в ПередЗаписью.

Итог

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

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