Почему не срабатывает ОбработкаПроверкиЗаполнения в управляемой форме и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

1. Проверяем свойство формы «ПроверитьЗаполнениеАвтоматически»

Самой распространенной причиной, по которой управляемая форма игнорирует настройки обязательности полей метаданных, является отключение стандартной проверки на уровне самой формы. Рассмотрим, как это работает.

У управляемой формы существует встроенное свойство ПроверитьЗаполнениеАвтоматически. Если в процессе разработки (или в результате доработок конфигурации сторонними специалистами) это свойство было случайно или намеренно переведено в значение Ложь, стандартное поведение платформы меняется: для этого подойдёт логика контроля заполнения и блокировка записи.

Решение проблемы: откройте управляемую форму вашего документа в конфигураторе. Перейдите в палитру свойств формы (правый клик по корню формы — «Свойства»). Найдите в группе свойств «Использование» строку ПроверитьЗаполнениеАвтоматически и установите для нее значение Авто или Истина. Также реализовать контроль ввода данных поможет контроль ввода данных и обязательности полей.

2. Проверяем обработчик «ОбработкаПроверкиЗаполненияНаСервере» в модуле формы

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

Для управляемой формы существует стандартный обработчик ОбработкаПроверкиЗаполненияНаСервере. Если этот обработчик определен в модуле формы, платформа передает управление сначала в него. В параметрах этой процедуры присутствует массив ПроверяемыеРеквизиты.

Иногда разработчики очищают этот массив или удаляют из него конкретные реквизиты, чтобы обойти стандартные проверки в определенных сценариях. Если в этом обработчике массив очищается полностью или некорректно модифицируется, то проверка полей объекта выполняться не будет.

Проанализируем пример некорректного кода в модуле формы, который может приводить к ошибке:


&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
    // Опасный код: полная очистка проверяемых реквизитов отключает все проверки объекта!
    ПроверяемыеРеквизиты.Очистить(); 
КонецПроцедуры

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


&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
    // Удаляем из проверки конкретный реквизит только при определенном условии
    Если Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыДокументов.Черновик") Тогда
        Индекс = ПроверяемыеРеквизиты.Найти("Контрагент");
        Если Индекс <> Неопределено Тогда
            ПроверяемыеРеквизиты.Удалить(Индекс);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

3. Специфика документов с возможностью проведения

Платформа «1С:Предприятие» имеет жестко заданную логику разделения записи и проведения документов. Выясним причину зависимости проверок от возможности проведения документа:

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

4. Особенности контекста выполнения метода «ПроверитьЗаполнение»

Разберем типичную ошибку при попытке вызвать принудительную проверку реквизитов программно. Разработчики часто путают контексты вызова метода ПроверитьЗаполнение в модуле формы и модуле объекта.

Рассмотрим следующую ситуацию. Вы пытаетесь вызвать метод в модуле формы перед записью объекта:


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    // В модуле формы данный вызов абсолютно корректен
    Если Не ПроверитьЗаполнение() Тогда 
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

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

Это связано с тем, что в модуле объекта нет глобального метода с таким именем. Для вызова проверки заполнения на уровне объекта базы данных необходимо использовать обращение к контексту самого объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Правильный вызов проверки заполнения в модуле объекта
    Если Не ЭтотОбъект.ПроверитьЗаполнение() Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

5. Интерактивная запись против программного создания

Необходимо четко разграничивать интерактивные действия пользователя и программное выполнение кода. Автоматический контроль заполнения реквизитов платформой — это исключительно интерактивный механизм, привязанный к логике работы экранных форм.

Если документ создается, заполняется и записывается программно (например, при загрузке данных из внешнего файла, через веб-сервисы или в фоновом задании), платформа не будет выполнять автоматическую проверку заполнения и не вызовет прерывание транзакции, даже если все обязательные реквизиты остались пустыми. Событие ОбработкаПроверкиЗаполнения в этом случае также игнорируется.

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


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполнение реквизитов...
НовыйДокумент.Дата = ТекущаяДата();

// Перед записью принудительно проверяем заполнение
Если НовыйДокумент.ПроверитьЗаполнение() Тогда
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Иначе
    ВызватьИсключение "Не удалось записать документ: не заполнены обязательные поля!";
КонецЕсли;

6. Настройка отладчика в клиент-серверном режиме

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

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

  1. Служба сервера «1С:Предприятия» должна быть запущена в режиме отладки с ключом -debug.
  2. В конфигураторе в меню Отладка -> Подключение... должны быть настроены правила автоматического подключения серверных модулей и фоновых заданий к текущему сеансу отладки.

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

7. Режим совместимости конфигурации

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

Механизм автоматической проверки заполнения реквизитов (свойство «Выдавать ошибку» и обработчик ОбработкаПроверкиЗаполнения) был полноценно реализован начиная с версии платформы 8.2.13. Если в свойствах вашей конфигурации установлен Режим совместимости с версией 8.1, то этот функционал будет полностью заблокирован платформой для обеспечения обратной совместимости со старыми конфигурациями.

Для исправления ситуации потребуется изменить режим совместимости в свойствах конфигурации на значение Не использовать или выбрать версию **8.2.13** (или выше).

← На главную