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

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

Как провести документ из формы в 1С

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

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

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

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

Интерактивное проведение кнопкой в форме

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

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

Признак успешного проведения — в заголовке или статусной области формы документ отображается как проведённый, а в списке документов у него появляется соответствующая пиктограмма. Если проведение не удалось, платформа выводит сообщение об ошибке в панель сообщений, и документ остаётся записанным, но не проведённым.

Программное проведение из кода формы

Когда проведение нужно запустить из собственной команды формы — например, по кнопке «Утвердить» или после заполнения дополнительных реквизитов, — используется метод Записать объекта формы с параметром режима записи. Это стандартный и безопасный способ, потому что он проходит через все обработчики объекта.

&НаКлиенте

Процедура ПровестиДокумент(Команда)

ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);

Если Записать(ПараметрыЗаписи) Тогда

ОповеститьОбИзменении(Объект.Ссылка);

Иначе

ПоказатьПредупреждение(, "Документ не проведён. См. сообщения об ошибках.");

КонецЕсли;

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

Метод Записать формы возвращает Истина, если запись и проведение прошли успешно, и Ложь в противном случае. Возвращаемое значение обязательно стоит проверять: по нему вы решаете, показывать ли пользователю подтверждение или сообщение о неудаче.

bsl
ПараметрыЗаписи = Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение);
Записать(ПараметрыЗаписи);

Режимы записи: проведение, отмена и простая запись

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

Если документ уже проведён и нужно перепровести его после изменений, снова используется режим Проведение — платформа удалит старые движения и сформирует новые. Отдельная отмена проведения перед повторным проведением не требуется.

РежимЧто делаетКогда применять
ЗаписьСохраняет данные, движений нетЧерновик, документ ещё не готов
ПроведениеСохраняет и формирует движенияОсновной рабочий режим
ОтменаПроведенияСохраняет и удаляет движенияИсправление ошибочно проведённого документа

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

Проведение на сервере и вне формы

Метод Записать формы работает в клиентском контексте, но фактическая запись и проведение выполняются на сервере. Если нужно провести документ без открытой формы — например, из обработки массового проведения, — работайте с объектом напрямую через ссылку.

&НаСервере

Процедура ПровестиПоСсылке(ДокументСсылка)

ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

Попытка

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Исключение

ЗаписьЖурналаРегистрации("Проведение", УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

КонецПопытки;

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

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

Обработка ошибок и контроль результата

Чаще всего проведение не выполняется из-за проверок в модуле объекта: контроль остатков на складе, незаполненные обязательные реквизиты, запрет операций в закрытом периоде. Текст причины платформа выводит в панель сообщений — начинайте диагностику с него.

Если вы добавляете собственные проверки в обработчик ОбработкаПроведения, используйте параметр Отказ: установка Отказ = Истина прерывает проведение, а документ остаётся записанным без движений. Сообщение пользователю формируйте через объект СообщениеПользователю с привязкой к реквизиту — тогда при интерактивном проведении курсор встанет на проблемное поле.

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

Как проверить результат

Статус в форме списка
Норма

У документа пиктограмма проведённого

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

Пиктограмма не проведённого или помеченного на удаление

Движения документа
Норма

Кнопка «Движения» показывает записи по регистрам

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

Список движений пуст при успешном проведении

Панель сообщений
Норма

Нет сообщений об ошибках

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

Есть сообщения с текстом отказа в проведении

Типичные ошибки при проведении из формы

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

Вторая частая проблема — игнорирование результата записи. Код выполняет Записать(...) и сразу закрывает форму или выводит «Документ проведён», хотя проведение было отклонено. Всегда анализируйте возвращаемое значение или оборачивайте серверный вызов в попытку.

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

Частые вопросы

Чем отличается «Записать» от «Провести» в форме документа?

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

Можно ли провести документ, если форма открыта только на просмотр?

Нет. Если форма открыта в режиме просмотра (ТолькоПросмотр = Истина), кнопки записи и проведения недоступны, а программный вызов Записать вернёт отказ. Нужно открыть документ на редактирование при наличии прав.

Почему Записать с режимом Проведение возвращает Ложь без видимой ошибки?

Текст причины выводится в панель сообщений, а не в возвращаемом значении. Откройте панель сообщений и посмотрите текст отказа — обычно это контроль остатков, незаполненный реквизит или дата запрета изменения данных.

Как провести документ без открытия формы?

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

Нужно ли отменять проведение перед повторным проведением?

Нет. Запись с режимом Проведение для уже проведённого документа автоматически удаляет старые движения и формирует новые. Явная отмена проведения требуется только когда движения нужно убрать совсем.

Безопасно ли проводить документы программно в цикле?

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

Итог

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

Интерактивно документ проводится кнопкой «Провести», программно из формы — методом Записать с параметром РежимЗаписи = РежимЗаписиДокумента.Проведение. Всегда проверяйте результат записи и читайте сообщения об ошибках, а массовое проведение сначала тестируйте на копии базы.