Разработка и Конфигурация · 10 мин
Отказ = Истина в 1С: что это и как работает отмена действия
Разбираем, что означает Отказ = Истина в 1С: где встречается параметр Отказ, как он отменяет запись и проведение, типичные ошибки и способы отладки.
При работе с 1С пользователи и разработчики регулярно сталкиваются с ситуацией: документ не проводится, элемент справочника не записывается, а в сообщении фигурирует слово «Отказ». В большинстве случаев причина кроется в параметре Отказ, которому в коде обработчика присвоено значение Истина. Это штатный механизм платформы, а не сбой программы.
Параметр Отказ передаётся в события объектов (ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаПроверкиЗаполнения и другие) и позволяет прервать выполняемое действие. Если внутри обработчика выполняется строка Отказ = Истина;, платформа отменяет операцию: запись не сохраняется, проведение откатывается, транзакция не фиксируется.
Понимание этого механизма важно и разработчику, который пишет проверки, и пользователю, который видит сообщение об отказе и не понимает, почему программа «не даёт» сохранить документ. Ниже разобрано, где встречается параметр, как он работает технически и что делать, если отказ происходит неожиданно.
Что такое параметр Отказ и где он встречается
Отказ — это предопределённый параметр типа Булево, который платформа автоматически передаёт в ряд событий объектов конфигурации. Изначально он равен Ложь. Если в процессе выполнения обработчика какой-либо код (модуль объекта, подписка на событие, расширение) установит его в Истина, платформа после завершения обработчиков прервёт операцию.
Основные события, где доступен параметр Отказ:
- ПередЗаписью — отменяет запись объекта до её выполнения;
- ПриЗаписи — отказ здесь откатывает уже начатую транзакцию записи;
- ОбработкаПроведения — отменяет проведение документа;
- ОбработкаПроверкиЗаполнения — блокирует запись при незаполненных реквизитах;
- ПередУдалением — запрещает удаление объекта;
- ОбработкаЗаполнения — реже, но тоже поддерживает отказ.
Важная особенность: параметр передаётся по ссылке через цепочку вызовов. Если в событие ПередЗаписью подписаны три подписки и модуль объекта, то значение Отказ накапливается — достаточно одному обработчику установить Истина, и операция будет отменена, даже если остальные обработчики отработали без замечаний.
Как технически работает отмена операции
Механизм устроен просто: платформа вызывает обработчики события, затем проверяет итоговое значение Отказ. Если оно Истина — действие не выполняется. При этом само присвоение не прерывает выполнение кода немедленно: после Отказ = Истина; остальные строки обработчика и последующие обработчики продолжат работать, если их не остановить явно через Возврат;.
Типовой фрагмент проверки в модуле объекта выглядит так:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(Склад) Тогда
Отказ = Истина;
Сообщить("Не заполнен склад. Запись отменена.");
Возврат;
КонецЕсли;
КонецПроцедуры
Если отказ происходит в событии ПриЗаписи или ОбработкаПроведения, ситуация серьёзнее: запись уже идёт внутри транзакции, и отказ приводит к откату всех изменений, сделанных в рамках этой транзакции. Данные в базе останутся в прежнем состоянии — это безопасно, но пользователь потеряет введённые в форму изменения, если они не были сохранены.
Типичные сценарии, где ставится Отказ = Истина
Проверка заполнения реквизитов
Самый частый сценарий — контроль обязательных полей. Хотя для простых случаев достаточно свойства «Проверка заполнения» у реквизита, сложные условия (например, поле обязательно только при определённом виде операции) реализуют кодом в ОбработкаПроверкиЗаполнения или ПередЗаписью с установкой Отказ при нарушении.
Контроль остатков и лимитов
В ОбработкаПроведения отказ ставится, когда документ пытается списать больше товара, чем есть на складе, или превышает кредитный лимит контрагента. Это классическая защита целостности учёта: проведение отменяется, движения не формируются.
Подписки на события и расширения
В типовых конфигурациях значительная часть проверок вынесена в подписки на события. Дополнительно отказ может устанавливать расширение конфигурации или внешняя обработка. Поэтому при поиске причины отказа нужно проверять не только модуль объекта, но и все подписки на соответствующее событие.
Ищите проверку в модуле объекта или подписке на ПередЗаписью
Проверяйте контроль остатков и лимитов
Включайте отладчик и смотрите стек вызовов
Проверяйте роли, RLS и условия по организации
Что делать пользователю, если документ не записывается
Если вы работаете в пользовательском режиме и получаете отказ при записи или проведении, первым делом прочитайте текст сообщения полностью. Корректно написанная проверка всегда сопровождает отказ пояснением: какое поле не заполнено, какого остатка не хватает, какое условие нарушено. Часто решение — просто заполнить указанный реквизит или исправить данные.
Если сообщения нет или оно непонятно, действуйте по шагам:
- 1Сохраните скриншот или текст сообщения об отказе
- 2Проверьте заполнение всех обязательных полей, включая табличные части
- 3Проверьте дату документа — закрытый период частая причина отказа
- 4Попробуйте записать документ без проведения, чтобы локализовать событие
- 5Если причина не найдена — передайте сообщение разработчику или администратору 1С
Отдельная частая причина — запрет изменения данных в закрытом периоде (дата запрета редактирования). В этом случае отказ ставит стандартная подсистема, и сообщение обычно прямо указывает на дату запрета. Решение — либо изменить дату документа, либо согласовать с администратором корректировку даты запрета.
Как разработчику найти, где ставится Отказ
Когда отказ происходит без понятного сообщения, основной инструмент — отладчик. Установите точку останова на событии (ПередЗаписью, ОбработкаПроведения) в модуле объекта и пошагово пройдите выполнение, наблюдая значение параметра Отказ. Если точка в модуле объекта не срабатывает, а отказ всё равно возникает — причина в подписке на событие или расширении.
Практические приёмы поиска:
- Откройте в конфигураторе список подписок на события и отфильтруйте по нужному событию и типу источника;
- Выполните глобальный поиск по строке «Отказ = Истина» с фильтром по общим модулям подписок;
- Проверьте подключённые расширения: отключите их по очереди и повторите операцию;
- Используйте замер производительности или стек вызовов в момент появления сообщения.
Типичные ошибки при работе с Отказ
Первая ошибка разработчиков — установка Отказ без поясняющего сообщения. Пользователь видит, что документ «не проводится», но не понимает почему. Правило простое: каждый Отказ = Истина должен сопровождаться вызовом Сообщить() или ОбщегоНазначения.СообщитьПользователю() с привязкой к полю.
Вторая ошибка — забытый Возврат; после установки отказа. Код продолжает выполняться, может выдать десяток сообщений или, что хуже, выполнить логику, рассчитанную на успешный сценарий. Третья ошибка — установка отказа в ПриЗаписи вместо ПередЗаписью: операция уже в транзакции, откат дороже, а смысл проверки тот же.
Отдельно выделим опасный антипаттерн: присвоение Отказ = Ложь в своём обработчике. Параметр общий для всей цепочки, и такое присвоение сбросит отказ, установленный другими проверками. Корректно только читать параметр или устанавливать его в Истина — никогда не «чинить» его обратно.
Ограничения и альтернативы механизму отказа
Отказ — не единственный способ контроля. Для простой обязательности полей достаточно свойства «Проверка заполнения» у реквизита: платформа сама заблокирует запись и подсветит поле. Для контроля прав лучше подходят роли и RLS, а не программные проверки. Для запрета редактирования старых данных — штатная дата запрета изменения данных.
Программный Отказ оправдан, когда условие сложное: зависит от нескольких реквизитов, остатков регистров, статусов связанных документов. Но и здесь стоит помнить ограничение: отказ работает только при записи через объектную модель. Прямые запросы и обмены данными могут обходить часть обработчиков, поэтому критичный контроль целостности стоит дублировать на уровне логики проведения.
Что важно запомнить
Отказ = Истина — штатный механизм отмены операции в 1С, а не ошибка. Причина всегда в какой-то проверке: модуль объекта, подписка на событие, расширение или дата запрета. Пользователю нужно читать текст сообщения и исправлять данные, разработчику — искать место установки отказа отладчиком и никогда не обходить чужие проверки силой.
Частые вопросы
Почему документ не проводится, а ошибки в сообщении нет?
Значит, какая-то проверка установила Отказ = Истина без поясняющего сообщения. Такое бывает с доработками и расширениями. Причину может найти разработчик через отладчик: точка останова на ОбработкаПроведения и просмотр значения параметра Отказ по шагам.
Можно ли отключить проверку, которая вызывает отказ?
Технически — да, через изменение кода или отключение расширения, но делать этого не стоит без понимания, что проверяет условие. Проверки защищают учётные данные: их обход приводит к отрицательным остаткам и расхождениям, которые сложно исправить задним числом.
Чем отличается Отказ в ПередЗаписью и в ПриЗаписи?
В ПередЗаписью отказ предотвращает начало записи — это дешёвая и безопасная отмена. В ПриЗаписи запись уже идёт внутри транзакции, и отказ вызывает откат всех изменений транзакции. Для проверок заполнения правильное место — ПередЗаписью или ОбработкаПроверкиЗаполнения.
Отказ возникает только у одного пользователя. В чём причина?
Скорее всего, условие проверки зависит от прав, ролей, настроек RLS или данных, доступных конкретному пользователю. Сравните роли пользователей и проверьте, не связана ли проверка с организацией, складом или подразделением, к которым у пользователя нет доступа.
Откатываются ли данные, если отказ произошёл при проведении?
Да. Проведение выполняется в транзакции, и отказ приводит к её откату: движения по регистрам не сохраняются, состояние базы остаётся таким, как до попытки проведения. Потеряются только несохранённые изменения в открытой форме документа.
Как найти все места в конфигурации, где ставится Отказ = Истина?
В конфигураторе выполните глобальный поиск по строке «Отказ = Истина» (меню Правка — Глобальный поиск) по всем модулям. Дополнительно проверьте подписки на события и подключённые расширения — в типовых конфигурациях большинство проверок находится именно там.