Разработка и Конфигурация · 9 мин
Как программно запретить проведение документа в 1С
Как программно запретить проведение документа в 1С: обработчик ОбработкаПроведения, Отказ, проверка заполнения, роли и подписки на события. Примеры кода.
Запретить проведение документа в 1С можно несколькими способами: через обработчик «ОбработкаПроведения» с установкой параметра «Отказ», через «ОбработкаПроверкиЗаполнения», через подписки на события, а также на уровне прав доступа. Выбор зависит от того, нужно ли блокировать проведение всегда или только при определённых условиях, и можно ли менять типовой модуль документа.
Самый прямой программный способ — в модуле объекта документа в обработчике «ОбработкаПроведения» установить параметру «Отказ» значение «Истина». При этом транзакция записи движений прерывается, документ остаётся непроведённым, а пользователь видит сообщение об ошибке, которое вы выводите через «Сообщить» или «ВызватьИсключение».
Важно понимать разницу между «не дать провести» и «не дать записать». Запрет в «ОбработкаПроведения» срабатывает только при проведении: документ можно записать, но нельзя провести. Если нужно запретить и запись, используются обработчики «ПередЗаписью» или «ОбработкаПроверкиЗаполнения» — там тоже доступен параметр «Отказ».
Запрет проведения через обработчик «ОбработкаПроведения»
Обработчик «ОбработкаПроведения» располагается в модуле объекта документа и вызывается платформой при интерактивном и программном проведении. У него два параметра: «Отказ» (булево) и «РежимПроведения» (оперативный или неоперативный). Установка «Отказ = Истина» отменяет проведение и откатывает транзакцию.
Типовой пример кода выглядит так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если НЕ РазрешеноПроведение() Тогда
Сообщить("Проведение документа запрещено: нарушены условия проверки.");
Отказ = Истина;
Возврат;
КонецЕсли;
// дальнейшая логика формирования движений
КонецПроцедуры
Обратите внимание: просто вывести сообщение недостаточно — без «Отказ = Истина» документ проведётся, а сообщение останется лишь информационным. Также не стоит использовать «ВызватьИсключение» без необходимости: исключение откатит транзакцию, но для пользователя выглядит как аварийная ошибка, а не как осмысленный отказ.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если СуммаДокумента > 100000 И НЕ Согласован Тогда
Сообщить("Документы свыше 100 000 проводятся только после согласования.");
Отказ = Истина;
КонецЕсли;
КонецПроцедурыЗапрет через «ОбработкаПроверкиЗаполнения»
Если запрет связан с некорректными или незаполненными данными, правильнее использовать обработчик «ОбработкаПроверкиЗаполнения». Он вызывается и при записи, и при проведении, поэтому блокирует документ раньше — ещё до начала формирования движений. Параметры: «Отказ» и «ПроверяемыеРеквизиты».
Пример: запретить проведение, если не указан договор или склад:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если НЕ ЗначениеЗаполнено(Договор) Тогда
Сообщить("Не заполнен договор. Проведение невозможно.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Преимущество этого подхода — единообразие: проверка сработает и при интерактивной записи, и при обмене данными, и при программном вызове «Записать(РежимЗаписиДокумента.Проведение)». Недостаток — внутри обработчика неудобно выполнять тяжёлые запросы, потому что он вызывается часто.
Подписки на события и расширения для типовых конфигураций
В типовых конфигурациях (БП, УТ, ERP) прямое изменение модуля объекта документа усложняет обновление. Правильные альтернативы — подписка на событие «ОбработкаПроведения» или расширение конфигурации. Подписка создаётся в ветке «Общие → Подписки на события», в свойствах указывается источник (тип документа), событие и обработчик из общего модуля.
Обработчик подписки получает те же параметры, что и обработчик объекта: «Источник», «Отказ», «РежимПроведения». Внутри можно выполнить любую проверку и установить «Отказ = Истина». Подписки срабатывают после обработчиков объекта, поэтому они дополняют типовую логику, а не заменяют её.
Расширение позволяет переопределить обработчик «ОбработкаПроведения» с директивами «&После», «&Вместо» или «&ИзменениеИКонтроль». Для запрета проведения обычно достаточно аннотации «&После»: типовая логика отработает, а затем ваша проверка отменит результат, если условия нарушены.
Способы запрета проведения
Максимальный контроль, но требует изменения конфигурации и усложняет обновление типовых решений.
Не меняет типовой код, легко отключить. Срабатывает после основного обработчика.
Современный вариант для типовых: переопределяет обработчики без снятия с поддержки.
Запрет для группы пользователей целиком, без условий по данным документа.
Запрет проведения через права и роли
Если задача — запретить проведение не по условиям, а определённым пользователям, программный код не нужен: достаточно настроить роли. В конфигураторе в роли для конкретного документа снимается право «Проведение» (и при необходимости «Отмена проведения»). Пользователь сможет создавать и записывать документы, но кнопка «Провести» будет недоступна.
Для более тонкой настройки используются шаблоны RLS (ограничение доступа на уровне записей), но к операции проведения RLS применяется ограниченно — чаще комбинируют роли и программные проверки. Например: роль запрещает проведение всем, а в обработчике делается исключение для пользователей с определённой дополнительной ролью через «ПользователиИнформационнойБазы» или функциональную опцию.
Проверка результата и частые ошибки
После внедрения запрета проверьте три сценария: интерактивное проведение из формы документа, программное проведение через «Объект.Записать(РежимЗаписиДокумента.Проведение)» и проведение из обработки группового перепроведения. Во всех трёх случаях документ должен остаться непроведённым, а в журнале регистрации или в окне сообщений должна быть понятная причина отказа.
Типичная ошибка — установка «Отказ = Истина» в клиентском обработчике формы (например, в «ПередЗаписью» формы с директивой «&НаКлиенте»). Такой запрет легко обходится программным проведением, потому что обработчики формы не вызываются при работе с объектом напрямую. Все проверки, влияющие на целостность данных, должны выполняться на сервере — в модуле объекта или подписке.
Вторая частая ошибка — проверка условия по данным формы, а не по данным объекта. В модуле объекта доступны только реквизиты документа и запросы к базе; обращение к элементам формы невозможно и приведёт к ошибке компиляции или выполнения.
Контрольные точки и ограничения
Перед запретом убедитесь, что он не сломает смежные механизмы: обмены данными, регламентные задания перепроведения, закрытие месяца. Если документ участвует в последовательностях, отказ в проведении сдвинет границу последовательности — это нормально, но смежные документы могут потребовать перепроведения.
При обменах данными отказ в подписке на «ОбработкаПроведения» может привести к ошибкам синхронизации на стороне приёмника. Если документы приходят из другой базы, в обработчике стоит проверять «ОбменДанными.Загрузка» и пропускать проверку либо переносить её в отдельный контроль после загрузки.
Как проверить результат
Документ не проводится, выводится понятное сообщение о причине
Документ проводится или ошибка без пояснения
Возникает отказ, транзакция откатывается
Запрет срабатывает только из формы
Движений нет, документ в статусе непроведённого
Остались частичные движения после отказа
FAQ
Как запретить проведение только для определённых пользователей?
Снимите право «Проведение» в роли, назначенной этим пользователям. Если нужен условный запрет, в обработчике проверяйте «РольДоступна("ПолныеПрава")» или собственную роль и устанавливайте Отказ = Истина для остальных.
Чем отличается Отказ в ОбработкаПроведения от Отказа в ПередЗаписью?
Отказ в «ОбработкаПроведения» запрещает только проведение — документ можно записать. Отказ в «ПередЗаписью» блокирует любую запись документа, включая простое сохранение без проведения.
Можно ли запретить проведение без изменения типовой конфигурации?
Да. Используйте подписку на событие «ОбработкаПроведения» или расширение конфигурации с переопределением обработчика через аннотацию «&После». Оба способа сохраняют конфигурацию на поддержке.
Почему документ проводится, хотя в коде стоит Отказ = Истина?
Чаще всего проверка находится в клиентском обработчике формы, а проведение выполняется программно, либо условие в обработчике не выполняется. Проверьте, что код расположен в модуле объекта или серверной подписке, и отладчиком убедитесь, что ветка с Отказом реально выполняется.
Как вывести пользователю понятную причину запрета?
Перед установкой «Отказ = Истина» вызовите «Сообщить("текст причины")» или объект «СообщениеПользователю» с привязкой к реквизиту. Тогда пользователь увидит конкретное поле, которое нужно исправить, а не общую ошибку.
Влияет ли запрет проведения на обмен данными между базами?
Да. Если в приёмнике сработает отказ, документ не проведётся и в очереди обмена появится ошибка. В обработчиках проверяйте свойство «ОбменДанными.Загрузка» и при необходимости пропускайте проверку для загружаемых объектов.
Что важно запомнить
Программный запрет проведения делается установкой Отказ = Истина в обработчике «ОбработкаПроведения» модуля объекта, подписки на событие или расширения. Проверки размещайте на сервере, всегда сообщайте пользователю причину отказа и тестируйте запрет на копии базы, включая сценарии обмена и группового перепроведения.