Многие разработчики сталкиваются с ситуацией, когда при попытке программно установить значение реквизита типа Булево в модуле объекта или формы, после завершения записи документа значение сбрасывается в Ложь. Давайте подробно разберем, почему это происходит и как правильно организовать логику отправки уведомлений или смены состояний в 1С.
Основная причина заключается в непонимании механизмов транзакционности платформы 1С. Рассмотрим основные моменты:
ПриЗаписи() в модуле объекта срабатывает, когда данные документа уже подготовлены к записи в базу данных. Попытка изменить реквизит в этот момент часто игнорируется или затирается типовыми механизмами, которые отрабатывают следом.Записать() внутри процедуры ПриЗаписи(), вы запускаете бесконечный цикл, так как каждый вызов записи снова активирует эту же процедуру. Это приводит к ошибкам или принудительному завершению операции.ПодпискиНаСобытия, которые могут перезаписывать или сбрасывать ваши значения, если логика программы требует контроля над изменением этих реквизитов.Использование простого реквизита (галочки) в документе — не самый надежный архитектурный подход, однако, если вы решили двигаться этим путем, необходимо соблюдать строгий порядок действий.
Способ 1: Использование события ПередЗаписью()
Это оптимальное место для изменения данных объекта перед тем, как они отправятся в базу данных. В этом событии объект уже содержит все данные, а транзакция записи еще не завершена.
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() Тогда
УведомлениеПослеСозданияЗаявки = Истина;
КонецЕсли;
КонецПроцедуры
Используя метод ЭтоНовый(), вы гарантируете, что логика сработает только при первом сохранении документа, не затрагивая уже существующие записи.
Способ 2: Использование регистра сведений (Рекомендуемый подход)
Для профессиональных решений лучше не менять структуру самого документа, а создать РегистрСведений (например, ИсторияОтправкиУведомлений). Это позволит вам:
РегламентныеЗадания, что исключает задержки в интерфейсе пользователя при отправке почты.Отправка писем через ИнтернетПочта или COM-объекты непосредственно в ПередЗаписью() или ПриЗаписи() опасна тем, что если почтовый сервер будет недоступен, пользователь не сможет сохранить документ. Весь процесс записи будет блокироваться ожиданием ответа от сервера.
Рекомендованный алгоритм работы:
РегистрСведений со статусом «К отправке».РегламентноеЗадание, которое будет считывать записи с таким статусом.Отправлено.Такой подход защитит вашу систему от зависаний, позволит повторно отправлять письма в случае ошибок и избавит от необходимости бесконечного перепроведения документов для «проставления галочек».
Если вы все же хотите использовать «галочку» в документе, делайте это исключительно в событии ПередЗаписью() модуля объекта. Но помните: создание РегистрСведений — это стандарт, который принят в профессиональной разработке 1С. Это позволит сделать вашу конфигурацию стабильной, быстрой и удобной для последующих обновлений.