При работе в современных конфигурациях на платформе 1С:Предприятие 8.3 (таких как УТ 11, ERP 2 или КА 2) программисты и администраторы часто сталкиваются с ошибкой «Преобразование значения к типу Булево не может быть выполнено». Эта ситуация особенно характерна для процесса создания документа Реализация товаров и услуг на основании Заказа клиента. Давайте вместе разберем, почему возникает эта ошибка, как работает логика системы в этот момент и какими способами можно устранить проблему, даже если программный код находится в защищенном от редактирования модуле.
Первым делом нам необходимо понять механику ошибки. В языке 1С существует строгая типизация для логических операций. Когда система встречает выражение вида Переменная = Значение1 И Значение2, она ожидает, что оба значения будут иметь тип Булево (Истина или Ложь). Если хотя бы одно из значений оказывается равным NULL, результат всей операции И также становится NULL (согласно правилам трехзначной логики).
Рассмотрим конкретный пример из практики. В коде конфигурации встречается строка:
ЗаполнениеПоОрдеру = ЗаполнятьПоОрдеру И ВыборкаТовары.ПроверятьОтгрузку;
Если ВыборкаТовары.ПроверятьОтгрузку содержит NULL, то переменной ЗаполнениеПоОрдеру пытается присвоиться это неопределенное значение. Поскольку переменная в данном контексте ожидает только Булево, платформа выбрасывает исключение, так как автоматического приведения NULL к Ложь в 1С не происходит.
Почему же в поле ПроверятьОтгрузку попадает NULL? Проанализируем типичный запрос, который формирует выборку данных для реализации. Как правило, это происходит из-за Левого соединения в тексте запроса. Когда данные о складе или настройках ордерной схемы отсутствуют в связанных таблицах (например, склад не настроен или строка заказа некорректно связана со справочником складов), поля из присоединяемой таблицы принимают значение NULL.
Для глубокого понимания проблемы нам важно вспомнить, как ведут себя логические операторы при взаимодействии с NULL. Давайте посмотрим на таблицу истинности для оператора И:
Следовательно, если ваша логика подразумевает обязательное получение булева значения, любая возможность появления NULL должна быть обработана заранее.
Самый правильный и производительный способ решения — это внесение изменений непосредственно в текст запроса, который подготавливает данные для выборки. Мы должны гарантировать, что поле ПроверятьОтгрузку всегда будет содержать либо Истина, либо Ложь. Для этого воспользуемся функцией ЕСТЬNULL.
Проанализируем пример изменения фрагмента запроса:
| ВЫБОР
| КОГДА ЗаказТовары.Номенклатура.ТипНоменклатуры В (ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга))
| ТОГДА ЛОЖЬ
| ИНАЧЕ ЕСТЬNULL(ЗаказТоварыСклад.ИспользоватьОрдернуюСхемуПриОтгрузке, ЛОЖЬ)
| КОНЕЦ КАК ПроверятьОтгрузку
В данном случае, если связь со складом не сработала и значение ИспользоватьОрдернуюСхемуПриОтгрузке не определено, функция ЕСТЬNULL подставит значение Ложь, и ошибка преобразования типов исчезнет.
Часто бывает так, что ошибка обнаруживается в модуле менеджера или в общем модуле типовой конфигурации, который закрыт для редактирования (находится на поддержке). В этой ситуации нам на помощь приходят расширения. Нам не нужно снимать конфигурацию с поддержки, достаточно создать расширение и переопределить нужный метод.
Рассмотрим алгоритм действий:
ПодготовитьДанныеДляСозданияНаОсновании или аналогичные).&Вместо.ПроверятьОтгрузку и оборачиваем его в ЕСТЬNULL(..., Ложь).Если же вы не хотите менять запрос, можно применить проверку непосредственно в цикле обхода выборки, используя метод &После или &Вместо:
&Вместо("СоздатьДокументНаОсновании")
Процедура Расш1_СоздатьДокументНаОсновании(Параметры)
// Код с исправленной логикой
Если ВыборкаТовары.ПроверятьОтгрузку = NULL Тогда
ТекущаяПроверка = Ложь;
Иначе
ТекущаяПроверка = ВыборкаТовары.ПроверятьОтгрузку;
КонецЕсли;
ЗаполнениеПоОрдеру = ЗаполнятьПоОрдеру И ТекущаяПроверка;
// ... дальнейшая логика
КонецПроцедуры
Иногда ошибка в коде — это лишь следствие некорректных данных в базе. Разберем, на что стоит обратить внимание пользователю или администратору:
NULL по всем параметрам этого склада.NULL в логических полях.Чтобы окончательно убедиться в причине, мы рекомендуем использовать Консоль запросов. Это самый эффективный инструмент для поиска «виновника» среди тысяч строк данных.
Выполните следующие шаги:
ПроверятьОтгрузку.NULL), значит, проблема именно в данных или в отсутствии ЕСТЬNULL в коде.Важный момент: Обратите внимание на условие ВЫБОР. В некоторых случаях условие может выглядеть так:
ИНАЧЕ Склад.ИспользоватьОрдернуюСхему = ИСТИНА И Склад.ДатаНачала <= &ТекущаяДата
Если Склад.ИспользоватьОрдернуюСхему равно NULL, то всё выражение NULL = ИСТИНА вернет NULL. Всегда проверяйте, чтобы в конце конструкции ВЫБОР стояло значение по умолчанию в ветке ИНАЧЕ, либо весь результат конструкции обрабатывался функцией ЕСТЬNULL.
Подводя итог, можно сказать, что данная ошибка — это классический пример невнимательности к возможным пустым значениям при соединении таблиц. Используя расширения и функцию ЕСТЬNULL, вы сможете быстро и элегантно устранить проблему, обеспечив стабильную работу системы при создании документов отгрузки.