При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 после очередного обновления пользователи могут столкнуться с ситуацией, когда при попытке создать или записать новую группу (папку) в справочнике ДоговорыКонтрагентов система выдает критическую ошибку.
В окне сообщений появляется диагностический текст следующего вида:
Ошибка при выполнении обработчика - 'ОбработкаПроверкиЗаполнения' по причине: {Справочник.ДоговорыКонтрагентов.МодульОбъекта}: Преобразование значения к типу Булево не может быть выполнено
Разберем детально механизм возникновения данной неполадки на уровне платформы «1С:Предприятие» и рассмотрим все доступные варианты её устранения.
Проанализируем модуль объекта справочника ДоговорыКонтрагентов, где в типовом событии ОбработкаПроверкиЗаполнения выполняется проверка реквизитов перед записью:
Если НЕ ПлатежныйАгент Тогда
МассивНепроверяемыхРеквизитов.Добавить("ПризнакАгента");
КонецЕсли;
Выясним, почему это условие приводит к аварийному завершению работы при записи группы:
ПлатежныйАгент в свойствах объекта конфигурации установлено значение Использование = Для элемента. Это означает, что реквизит физически и логически существует исключительно у элементов справочника.Null.НЕ, И, ИЛИ, а также ветвление Если...Тогда) требуют операнд строго булевого типа (Истина или Ложь). Значение Null не может быть неявно приведено к булеву типу, из-за чего платформа генерирует исключение времени выполнения.Данная проблема была зарегистрирована фирмой «1С» как официальная ошибка типовой конфигурации с кодом 10181319 (в частности, для релиза 3.0.51.16).
Разработчики устранили данную ошибку, начиная с релиза 3.0.51.20 конфигурации «Бухгалтерия предприятия 3.0».
Рассмотрим порядок действий для штатного обновления базы данных:
.dt или копия средствами СУБД).F7.Если оперативно обновить всю конфигурацию невозможно, исправим поведение обработчика с помощью расширения, не снимая основную конфигурацию с поддержки.
Поскольку для групп справочника вообще не требуется выполнять проверку реквизитов элементов (сроков действия, ИНН агентов, признаков платежных агентов и т.д.), самым надежным подходом является досрочный выход из процедуры валидации.
Выполним следующие шаги:
ДоговорыКонтрагентов.ОбработкаПроверкиЗаполнения с аннотацией &Вместо или &Перед.Пример реализации безопасного перехвата с аннотацией &Перед:
&Перед("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Если объект является группой, прерываем стандартные проверки
Если ЭтоГруппа Тогда
Возврат;
КонецЕсли;
КонецПроцедуры
При использовании аннотации &Вместо необходимо обернуть вызов стандартного метода, защитив его условием:
&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоГруппа Тогда
Возврат;
КонецЕсли;
ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
КонецПроцедуры
Если конфигурация уже снята с поддержки и находится на доработке, проанализируем варианты непосредственного исправления кода в процедуре ОбработкаПроверкиЗаполнения модуля объекта Справочник.ДоговорыКонтрагентов.
Вариант А: Досрочный выход для групп (рекомендуемый)
В самом начале процедуры добавим проверку реквизита ЭтоГруппа:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтоГруппа Тогда
Возврат;
КонецЕсли;
// Далее следует типовой код проверки реквизитов элемента
...
КонецПроцедуры
Вариант Б: Безопасное сравнение значения с типом Булево
Если в аналогичных ситуациях требуется сохранить выполнение остальной части кода, заменим прямое отрицание Если НЕ Реквизит Тогда на строгое сравнение:
// Вместо небезопасного: Если НЕ ПлатежныйАгент Тогда
Если ПлатежныйАгент <> Истина Тогда
МассивНепроверяемыхРеквизитов.Добавить("ПризнакАгента");
КонецЕсли;
В этом случае условие ПлатежныйАгент <> Истина корректно отработает как для значения Ложь, так и для значения Null, предотвратив аварийное падение программы.