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

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Почему возникают ошибки при установке реквизитов

Основная причина заключается в непонимании механизмов транзакционности платформы 1С. Рассмотрим основные моменты:

  1. Неправильный выбор события: Событие ПриЗаписи() в модуле объекта срабатывает, когда данные документа уже подготовлены к записи в базу данных. Попытка изменить реквизит в этот момент часто игнорируется или затирается типовыми механизмами, которые отрабатывают следом.
  2. Рекурсия: Если вы пытаетесь вызвать метод Записать() внутри процедуры ПриЗаписи(), вы запускаете бесконечный цикл, так как каждый вызов записи снова активирует эту же процедуру. Это приводит к ошибкам или принудительному завершению операции.
  3. Типовые подписки: В конфигурациях часто существуют ПодпискиНаСобытия, которые могут перезаписывать или сбрасывать ваши значения, если логика программы требует контроля над изменением этих реквизитов.
  4. Транзакции: Когда начинается процесс записи, платформа открывает транзакцию. Изменения, внесенные в объект после определенного этапа, могут не войти в состав записываемой структуры, если объект уже был передан на серверную запись.

Как правильно решить задачу с уведомлениями

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

Способ 1: Использование события ПередЗаписью()

Это оптимальное место для изменения данных объекта перед тем, как они отправятся в базу данных. В этом событии объект уже содержит все данные, а транзакция записи еще не завершена.


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() Тогда 
        УведомлениеПослеСозданияЗаявки = Истина;    
    КонецЕсли;
КонецПроцедуры

Используя метод ЭтоНовый(), вы гарантируете, что логика сработает только при первом сохранении документа, не затрагивая уже существующие записи.

Способ 2: Использование регистра сведений (Рекомендуемый подход)

Для профессиональных решений лучше не менять структуру самого документа, а создать РегистрСведений (например, ИсторияОтправкиУведомлений). Это позволит вам:

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

Отправка писем через ИнтернетПочта или COM-объекты непосредственно в ПередЗаписью() или ПриЗаписи() опасна тем, что если почтовый сервер будет недоступен, пользователь не сможет сохранить документ. Весь процесс записи будет блокироваться ожиданием ответа от сервера.

Рекомендованный алгоритм работы:

  1. При записи документа делайте запись в РегистрСведений со статусом «К отправке».
  2. Настройте РегламентноеЗадание, которое будет считывать записи с таким статусом.
  3. Задание выполняет реальную отправку писем и при успехе переводит статус в Отправлено.

Такой подход защитит вашу систему от зависаний, позволит повторно отправлять письма в случае ошибок и избавит от необходимости бесконечного перепроведения документов для «проставления галочек».

Резюме

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

← На главную