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

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

Отказ = Истина в 1С: что это и как работает отмена действия

Разбираем, что означает Отказ = Истина в 1С: где встречается параметр Отказ, как он отменяет запись и проведение, типичные ошибки и способы отладки.

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

Параметр Отказ передаётся в события объектов (ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаПроверкиЗаполнения и другие) и позволяет прервать выполняемое действие. Если внутри обработчика выполняется строка Отказ = Истина;, платформа отменяет операцию: запись не сохраняется, проведение откатывается, транзакция не фиксируется.

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

Что такое параметр Отказ и где он встречается

Отказ — это предопределённый параметр типа Булево, который платформа автоматически передаёт в ряд событий объектов конфигурации. Изначально он равен Ложь. Если в процессе выполнения обработчика какой-либо код (модуль объекта, подписка на событие, расширение) установит его в Истина, платформа после завершения обработчиков прервёт операцию.

Основные события, где доступен параметр Отказ:

  • ПередЗаписью — отменяет запись объекта до её выполнения;
  • ПриЗаписи — отказ здесь откатывает уже начатую транзакцию записи;
  • ОбработкаПроведения — отменяет проведение документа;
  • ОбработкаПроверкиЗаполнения — блокирует запись при незаполненных реквизитах;
  • ПередУдалением — запрещает удаление объекта;
  • ОбработкаЗаполнения — реже, но тоже поддерживает отказ.

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

Как технически работает отмена операции

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

Типовой фрагмент проверки в модуле объекта выглядит так:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Если Не ЗначениеЗаполнено(Склад) Тогда

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

Сообщить("Не заполнен склад. Запись отменена.");

Возврат;

КонецЕсли;

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

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

Типичные сценарии, где ставится Отказ = Истина

Проверка заполнения реквизитов

Самый частый сценарий — контроль обязательных полей. Хотя для простых случаев достаточно свойства «Проверка заполнения» у реквизита, сложные условия (например, поле обязательно только при определённом виде операции) реализуют кодом в ОбработкаПроверкиЗаполнения или ПередЗаписью с установкой Отказ при нарушении.

Контроль остатков и лимитов

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

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

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

Отказ в ПередЗаписьюЗапись не началась

Ищите проверку в модуле объекта или подписке на ПередЗаписью

Отказ в ОбработкаПроведенияПроведение отменено, движений нет

Проверяйте контроль остатков и лимитов

Отказ без сообщенияПричина скрыта

Включайте отладчик и смотрите стек вызовов

Отказ только у части пользователейЗависит от прав или данных

Проверяйте роли, RLS и условия по организации

Что делать пользователю, если документ не записывается

Если вы работаете в пользовательском режиме и получаете отказ при записи или проведении, первым делом прочитайте текст сообщения полностью. Корректно написанная проверка всегда сопровождает отказ пояснением: какое поле не заполнено, какого остатка не хватает, какое условие нарушено. Часто решение — просто заполнить указанный реквизит или исправить данные.

Если сообщения нет или оно непонятно, действуйте по шагам:

Порядок действий при отказе
  1. 1
    Сохраните скриншот или текст сообщения об отказе
  2. 2
    Проверьте заполнение всех обязательных полей, включая табличные части
  3. 3
    Проверьте дату документа — закрытый период частая причина отказа
  4. 4
    Попробуйте записать документ без проведения, чтобы локализовать событие
  5. 5
    Если причина не найдена — передайте сообщение разработчику или администратору 1С

Отдельная частая причина — запрет изменения данных в закрытом периоде (дата запрета редактирования). В этом случае отказ ставит стандартная подсистема, и сообщение обычно прямо указывает на дату запрета. Решение — либо изменить дату документа, либо согласовать с администратором корректировку даты запрета.

Как разработчику найти, где ставится Отказ

Когда отказ происходит без понятного сообщения, основной инструмент — отладчик. Установите точку останова на событии (ПередЗаписью, ОбработкаПроведения) в модуле объекта и пошагово пройдите выполнение, наблюдая значение параметра Отказ. Если точка в модуле объекта не срабатывает, а отказ всё равно возникает — причина в подписке на событие или расширении.

Практические приёмы поиска:

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

Типичные ошибки при работе с Отказ

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

Вторая ошибка — забытый Возврат; после установки отказа. Код продолжает выполняться, может выдать десяток сообщений или, что хуже, выполнить логику, рассчитанную на успешный сценарий. Третья ошибка — установка отказа в ПриЗаписи вместо ПередЗаписью: операция уже в транзакции, откат дороже, а смысл проверки тот же.

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

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

Ограничения и альтернативы механизму отказа

Отказ — не единственный способ контроля. Для простой обязательности полей достаточно свойства «Проверка заполнения» у реквизита: платформа сама заблокирует запись и подсветит поле. Для контроля прав лучше подходят роли и RLS, а не программные проверки. Для запрета редактирования старых данных — штатная дата запрета изменения данных.

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

Итог

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

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

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

Почему документ не проводится, а ошибки в сообщении нет?

Значит, какая-то проверка установила Отказ = Истина без поясняющего сообщения. Такое бывает с доработками и расширениями. Причину может найти разработчик через отладчик: точка останова на ОбработкаПроведения и просмотр значения параметра Отказ по шагам.

Можно ли отключить проверку, которая вызывает отказ?

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

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

В ПередЗаписью отказ предотвращает начало записи — это дешёвая и безопасная отмена. В ПриЗаписи запись уже идёт внутри транзакции, и отказ вызывает откат всех изменений транзакции. Для проверок заполнения правильное место — ПередЗаписью или ОбработкаПроверкиЗаполнения.

Отказ возникает только у одного пользователя. В чём причина?

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

Откатываются ли данные, если отказ произошёл при проведении?

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

Как найти все места в конфигурации, где ставится Отказ = Истина?

В конфигураторе выполните глобальный поиск по строке «Отказ = Истина» (меню Правка — Глобальный поиск) по всем модулям. Дополнительно проверьте подписки на события и подключённые расширения — в типовых конфигурациях большинство проверок находится именно там.