Почему при создании группы в справочнике «Договоры контрагентов» возникает ошибка преобразования к типу Булево?

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

При работе в конфигурации 1С:Бухгалтерия предприятия 3.0 после очередного обновления пользователи могут столкнуться с ситуацией, когда при попытке создать или записать новую группу (папку) в справочнике ДоговорыКонтрагентов система выдает критическую ошибку.

В окне сообщений появляется диагностический текст следующего вида:

Ошибка при выполнении обработчика - 'ОбработкаПроверкиЗаполнения' по причине: {Справочник.ДоговорыКонтрагентов.МодульОбъекта}: Преобразование значения к типу Булево не может быть выполнено

Разберем детально механизм возникновения данной неполадки на уровне платформы «1С:Предприятие» и рассмотрим все доступные варианты её устранения.

Анализ причин возникновения ошибки

Проанализируем модуль объекта справочника ДоговорыКонтрагентов, где в типовом событии ОбработкаПроверкиЗаполнения выполняется проверка реквизитов перед записью:


Если НЕ ПлатежныйАгент Тогда
    МассивНепроверяемыхРеквизитов.Добавить("ПризнакАгента");
КонецЕсли;

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

  1. Назначение реквизита в метаданных: Справочник договоров имеет иерархию «групп и элементов». Для реквизита ПлатежныйАгент в свойствах объекта конфигурации установлено значение Использование = Для элемента. Это означает, что реквизит физически и логически существует исключительно у элементов справочника.
  2. Поведение платформы для групп: Когда мы создаем или перезаписываем группу справочника (папку), платформа 1С возвращает для всех реквизитов со свойством «Для элемента» специальное значение Null.
  3. Неявное приведение типов: В языке 1С логические операторы (НЕ, И, ИЛИ, а также ветвление Если...Тогда) требуют операнд строго булевого типа (Истина или Ложь). Значение Null не может быть неявно приведено к булеву типу, из-за чего платформа генерирует исключение времени выполнения.

Данная проблема была зарегистрирована фирмой «1С» как официальная ошибка типовой конфигурации с кодом 10181319 (в частности, для релиза 3.0.51.16).

Способ 1. Обновление конфигурации на исправленный релиз

Разработчики устранили данную ошибку, начиная с релиза 3.0.51.20 конфигурации «Бухгалтерия предприятия 3.0».

Рассмотрим порядок действий для штатного обновления базы данных:

  1. Создадим резервную копию информационной базы (выгрузка .dt или копия средствами СУБД).
  2. Откроем информационную базу в режиме Конфигуратор.
  3. Перейдем в меню Конфигурация → Поддержка → Обновить конфигурацию.
  4. Установим официальный релиз версии 3.0.51.20 или более актуальный.
  5. Применим изменения конфигурации базы данных клавишей F7.

Способ 2. Исправление логики через расширение конфигурации

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

Поскольку для групп справочника вообще не требуется выполнять проверку реквизитов элементов (сроков действия, ИНН агентов, признаков платежных агентов и т.д.), самым надежным подходом является досрочный выход из процедуры валидации.

Выполним следующие шаги:

  1. В конфигураторе перейдем в меню Конфигурация → Расширения конфигурации и создадим новое расширение с назначением «Адаптация» или «Исправление».
  2. Добавим в расширение справочник ДоговорыКонтрагентов.
  3. В модуле объекта справочника перехватим обработчик ОбработкаПроверкиЗаполнения с аннотацией &Вместо или &Перед.

Пример реализации безопасного перехвата с аннотацией &Перед:


&Перед("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Если объект является группой, прерываем стандартные проверки
    Если ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

При использовании аннотации &Вместо необходимо обернуть вызов стандартного метода, защитив его условием:


&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    Если ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    
    ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
    
КонецПроцедуры

Способ 3. Корректировка кода в модуле объекта (при включенной возможности изменения)

Если конфигурация уже снята с поддержки и находится на доработке, проанализируем варианты непосредственного исправления кода в процедуре ОбработкаПроверкиЗаполнения модуля объекта Справочник.ДоговорыКонтрагентов.

Вариант А: Досрочный выход для групп (рекомендуемый)

В самом начале процедуры добавим проверку реквизита ЭтоГруппа:


Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    Если ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    
    // Далее следует типовой код проверки реквизитов элемента
    ...
КонецПроцедуры

Вариант Б: Безопасное сравнение значения с типом Булево

Если в аналогичных ситуациях требуется сохранить выполнение остальной части кода, заменим прямое отрицание Если НЕ Реквизит Тогда на строгое сравнение:


// Вместо небезопасного: Если НЕ ПлатежныйАгент Тогда
Если ПлатежныйАгент <> Истина Тогда
    МассивНепроверяемыхРеквизитов.Добавить("ПризнакАгента");
КонецЕсли;

В этом случае условие ПлатежныйАгент <> Истина корректно отработает как для значения Ложь, так и для значения Null, предотвратив аварийное падение программы.

← На главную