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