Как получить номер документа при его создании и почему это стоит делать иначе?

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

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

Давайте подробно разберем, почему попытки получить номер до записи являются архитектурной ошибкой и как правильно реализовать бизнес-логику отправки сообщений в 1С.

Почему нельзя просто получить номер до записи?

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

Некоторые пытаются использовать метод УстановитьНовыйНомер() для принудительного присвоения номера на этапе создания. Однако мы настоятельно не рекомендуем этот подход по следующим причинам:

  1. Разрыв нумерации: Если вы зарезервируете номер, а пользователь передумает записывать документ и закроет форму, в нумерации образуется «дырка» или «битый» номер.
  2. Конкурентный доступ: В многопользовательской системе два пользователя могут одновременно инициировать создание документов, что приведет к конфликтам и дублированию номеров.
  3. Ненадежность: Номер, присвоенный в памяти, не гарантирует, что при физической записи в базу произойдет именно это событие — транзакция может быть отменена по разным причинам.

Правильный подход: работа после записи

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

1. Использование события «ПослеЗаписи» на форме

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

Пример логики в модуле формы:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Документ уже в базе, номер присвоен
    ОтправитьУведомление(Объект.Ссылка);
КонецПроцедуры

2. Вынос логики из транзакции проведения

Частая ошибка — отправка писем прямо внутри процедуры ОбработкаПроведения. Помните, что эта процедура выполняется в рамках транзакции записи. Если письмо уйдет, а затем в транзакции возникнет ошибка, документ не сохранится, но письмо получатель уже получит. Это нарушает целостность бизнес-процесса.

Для решения этой проблемы мы рекомендуем следующий алгоритм:

Такой подход делает систему устойчивой к сбоям: даже если почтовый сервер временно недоступен, сообщение не потеряется, а будет отправлено при следующем запуске задания.

Технические нюансы: использование ссылки

Всегда используйте Ссылка как основной идентификатор объекта. Если вам нужно передать данные в общий модуль для отправки, передавайте туда не объект (который может быть изменен на форме), а именно ссылку. Внутри модуля вы сможете получить актуальные данные, включая номер, прямо из базы данных:


Процедура ОтправитьУведомление(СсылкаНаДокумент) Экспорт
    // Получаем актуальный номер из базы
    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    НомерДокумента = ДокументОбъект.Номер;
    
    ТекстСообщения = "Создан документ № " + НомерДокумента;
    // ... логика отправки почты
КонецПроцедуры

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

← На главную