При разработке обработок на платформе 1С:Предприятие 8.2 часто возникают сложности с логикой условий и типизацией реквизитов формы. Рассмотрим, почему возникает ошибка «Преобразование значения к типу Булево не может быть выполнено» и как правильно реализовать поиск данных в справочнике «Контрагенты» с учетом переключателя выбора.
Данная ошибка возникает, когда платформа пытается интерпретировать значение переменной как Булево (Истина или Ложь), но фактически в переменной хранится другой тип данных (например, «Произвольный» или «Строка»).
В вашем коде проверка Если НЕ ЭлементыФормы.Отбор.Значение Тогда ссылается на элемент формы, а не на сам реквизит. Чтобы избежать ошибки, необходимо обращаться напрямую к реквизиту формы, который привязан к элементу, и гарантировать его тип. Если в качестве переключателя используется поле с СписокВыбора, убедитесь, что значения элементов списка соответствуют типу Булево.
Главная проблема в исходном коде заключалась в том, что переменные Правда1, Правда2 и Правда3 заполнялись текстом запроса, но никак не использовались при выполнении операции. Чтобы поиск работал правильно, нужно формировать текст запроса динамически, исходя из значения, которое выбрал пользователь.
Наиболее эффективный способ фильтрации данных — это добавление условий в текст Запрос до его выполнения. Рассмотрим пошагово, как это сделать:
ГДЕ, если требуется отбор.Пример реализации логики в модуле:
// Предположим, ОтборПо - реквизит формы с типом Булево или Произвольный
ТекстЗапроса = "ВЫБРАТЬ
| Контрагенты.Номер,
| Контрагенты.Адрес,
| Контрагенты.ФИО
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Если ОтборПо = Истина Тогда
ТекстЗапроса = ТекстЗапроса + " ГДЕ Контрагенты.Номер <> """"""";
ИначеЕсли ОтборПо = Ложь Тогда
ТекстЗапроса = ТекстЗапроса + " ГДЕ Контрагенты.Номер = """"""";
КонецЕсли;
Запрос = Новый Запрос(ТекстЗапроса);
РезультатПоиска.Загрузить(Запрос.Выполнить().Выгрузить());
Если вы не хотите менять текст запроса, можно воспользоваться механизмом Отбор, встроенным в табличное поле. Однако помните, что этот метод работает медленнее, так как сначала считываются все данные, а затем фильтруются на клиенте.
Чтобы установить отбор для поля Номер, выполните следующий код:
ЭлементыФормы.РезультатПоиска.Отбор.Номер.Использование = Истина;
ЭлементыФормы.РезультатПоиска.Отбор.Номер.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.РезультатПоиска.Отбор.Номер.Значение = ЗначениеОтбора;
Чтобы научиться быстрее находить ошибки, возьмите на вооружение следующие рекомендации:
Если попадает программа.Ctrl+F1. Это даст полное описание всех доступных параметров.Постепенный переход от простого статического запроса к динамическому — отличная практика для начинающего программиста. Старайтесь избегать дублирования кода и всегда проверяйте, чтобы переменные, в которых вы храните тексты запросов, были действительно использованы в методе Запрос.Выполнить().