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

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

Как программно запретить проведение документа в 1С

Как программно запретить проведение документа в 1С: обработчик ОбработкаПроведения, Отказ, проверка заполнения, роли и подписки на события. Примеры кода.

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

Самый прямой программный способ — в модуле объекта документа в обработчике «ОбработкаПроведения» установить параметру «Отказ» значение «Истина». При этом транзакция записи движений прерывается, документ остаётся непроведённым, а пользователь видит сообщение об ошибке, которое вы выводите через «Сообщить» или «ВызватьИсключение».

Важно понимать разницу между «не дать провести» и «не дать записать». Запрет в «ОбработкаПроведения» срабатывает только при проведении: документ можно записать, но нельзя провести. Если нужно запретить и запись, используются обработчики «ПередЗаписью» или «ОбработкаПроверкиЗаполнения» — там тоже доступен параметр «Отказ».

Запрет проведения через обработчик «ОбработкаПроведения»

Обработчик «ОбработкаПроведения» располагается в модуле объекта документа и вызывается платформой при интерактивном и программном проведении. У него два параметра: «Отказ» (булево) и «РежимПроведения» (оперативный или неоперативный). Установка «Отказ = Истина» отменяет проведение и откатывает транзакцию.

Типовой пример кода выглядит так:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если НЕ РазрешеноПроведение() Тогда

Сообщить("Проведение документа запрещено: нарушены условия проверки.");

Отказ = Истина;

Возврат;

КонецЕсли;

// дальнейшая логика формирования движений

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

Обратите внимание: просто вывести сообщение недостаточно — без «Отказ = Истина» документ проведётся, а сообщение останется лишь информационным. Также не стоит использовать «ВызватьИсключение» без необходимости: исключение откатит транзакцию, но для пользователя выглядит как аварийная ошибка, а не как осмысленный отказ.

bsl
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	Если СуммаДокумента > 100000 И НЕ Согласован Тогда
		Сообщить("Документы свыше 100 000 проводятся только после согласования.");
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

Запрет через «ОбработкаПроверкиЗаполнения»

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

Пример: запретить проведение, если не указан договор или склад:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

Если НЕ ЗначениеЗаполнено(Договор) Тогда

Сообщить("Не заполнен договор. Проведение невозможно.");

Отказ = Истина;

КонецЕсли;

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

Преимущество этого подхода — единообразие: проверка сработает и при интерактивной записи, и при обмене данными, и при программном вызове «Записать(РежимЗаписиДокумента.Проведение)». Недостаток — внутри обработчика неудобно выполнять тяжёлые запросы, потому что он вызывается часто.

Подписки на события и расширения для типовых конфигураций

В типовых конфигурациях (БП, УТ, ERP) прямое изменение модуля объекта документа усложняет обновление. Правильные альтернативы — подписка на событие «ОбработкаПроведения» или расширение конфигурации. Подписка создаётся в ветке «Общие → Подписки на события», в свойствах указывается источник (тип документа), событие и обработчик из общего модуля.

Обработчик подписки получает те же параметры, что и обработчик объекта: «Источник», «Отказ», «РежимПроведения». Внутри можно выполнить любую проверку и установить «Отказ = Истина». Подписки срабатывают после обработчиков объекта, поэтому они дополняют типовую логику, а не заменяют её.

Расширение позволяет переопределить обработчик «ОбработкаПроведения» с директивами «&После», «&Вместо» или «&ИзменениеИКонтроль». Для запрета проведения обычно достаточно аннотации «&После»: типовая логика отработает, а затем ваша проверка отменит результат, если условия нарушены.

Способы запрета проведения

Модуль объекта (ОбработкаПроведения)

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

Подписка на событие

Не меняет типовой код, легко отключить. Срабатывает после основного обработчика.

Расширение конфигурации

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

Права доступа (роли)

Запрет для группы пользователей целиком, без условий по данным документа.

Запрет проведения через права и роли

Если задача — запретить проведение не по условиям, а определённым пользователям, программный код не нужен: достаточно настроить роли. В конфигураторе в роли для конкретного документа снимается право «Проведение» (и при необходимости «Отмена проведения»). Пользователь сможет создавать и записывать документы, но кнопка «Провести» будет недоступна.

Для более тонкой настройки используются шаблоны RLS (ограничение доступа на уровне записей), но к операции проведения RLS применяется ограниченно — чаще комбинируют роли и программные проверки. Например: роль запрещает проведение всем, а в обработчике делается исключение для пользователей с определённой дополнительной ролью через «ПользователиИнформационнойБазы» или функциональную опцию.

Проверка результата и частые ошибки

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

Типичная ошибка — установка «Отказ = Истина» в клиентском обработчике формы (например, в «ПередЗаписью» формы с директивой «&НаКлиенте»). Такой запрет легко обходится программным проведением, потому что обработчики формы не вызываются при работе с объектом напрямую. Все проверки, влияющие на целостность данных, должны выполняться на сервере — в модуле объекта или подписке.

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

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

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

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

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

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

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

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

Документ не проводится, выводится понятное сообщение о причине

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

Документ проводится или ошибка без пояснения

Программное проведение через Записать()
Норма

Возникает отказ, транзакция откатывается

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

Запрет срабатывает только из формы

Движения по регистрам
Норма

Движений нет, документ в статусе непроведённого

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

Остались частичные движения после отказа

FAQ

Как запретить проведение только для определённых пользователей?

Снимите право «Проведение» в роли, назначенной этим пользователям. Если нужен условный запрет, в обработчике проверяйте «РольДоступна("ПолныеПрава")» или собственную роль и устанавливайте Отказ = Истина для остальных.

Чем отличается Отказ в ОбработкаПроведения от Отказа в ПередЗаписью?

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

Можно ли запретить проведение без изменения типовой конфигурации?

Да. Используйте подписку на событие «ОбработкаПроведения» или расширение конфигурации с переопределением обработчика через аннотацию «&После». Оба способа сохраняют конфигурацию на поддержке.

Почему документ проводится, хотя в коде стоит Отказ = Истина?

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

Как вывести пользователю понятную причину запрета?

Перед установкой «Отказ = Истина» вызовите «Сообщить("текст причины")» или объект «СообщениеПользователю» с привязкой к реквизиту. Тогда пользователь увидит конкретное поле, которое нужно исправить, а не общую ошибку.

Влияет ли запрет проведения на обмен данными между базами?

Да. Если в приёмнике сработает отказ, документ не проведётся и в очереди обмена появится ошибка. В обработчиках проверяйте свойство «ОбменДанными.Загрузка» и при необходимости пропускайте проверку для загружаемых объектов.

Итог

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

Программный запрет проведения делается установкой Отказ = Истина в обработчике «ОбработкаПроведения» модуля объекта, подписки на событие или расширения. Проверки размещайте на сервере, всегда сообщайте пользователю причину отказа и тестируйте запрет на копии базы, включая сценарии обмена и группового перепроведения.