Как исправить ошибку преобразования к типу Булево и правильно настроить отбор в обработке 1С?

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

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

Разбор ошибки преобразования к типу Булево

Данная ошибка возникает, когда платформа пытается интерпретировать значение переменной как Булево (Истина или Ложь), но фактически в переменной хранится другой тип данных (например, «Произвольный» или «Строка»).

В вашем коде проверка Если НЕ ЭлементыФормы.Отбор.Значение Тогда ссылается на элемент формы, а не на сам реквизит. Чтобы избежать ошибки, необходимо обращаться напрямую к реквизиту формы, который привязан к элементу, и гарантировать его тип. Если в качестве переключателя используется поле с СписокВыбора, убедитесь, что значения элементов списка соответствуют типу Булево.

Правильная архитектура поиска

Главная проблема в исходном коде заключалась в том, что переменные Правда1, Правда2 и Правда3 заполнялись текстом запроса, но никак не использовались при выполнении операции. Чтобы поиск работал правильно, нужно формировать текст запроса динамически, исходя из значения, которое выбрал пользователь.

Реализация динамического отбора в запросе

Наиболее эффективный способ фильтрации данных — это добавление условий в текст Запрос до его выполнения. Рассмотрим пошагово, как это сделать:

  1. Определим переменную, хранящую значение выбора пользователя.
  2. Сформируем базовый текст запроса.
  3. Добавим секцию ГДЕ, если требуется отбор.
  4. Выполним запрос и загрузим результат в таблицу на форме.

Пример реализации логики в модуле:


// Предположим, ОтборПо - реквизит формы с типом Булево или Произвольный
ТекстЗапроса = "ВЫБРАТЬ
|   Контрагенты.Номер,
|   Контрагенты.Адрес,
|   Контрагенты.ФИО
|ИЗ
|   Справочник.Контрагенты КАК Контрагенты";

Если ОтборПо = Истина Тогда
    ТекстЗапроса = ТекстЗапроса + " ГДЕ Контрагенты.Номер <> """"""";
ИначеЕсли ОтборПо = Ложь Тогда
    ТекстЗапроса = ТекстЗапроса + " ГДЕ Контрагенты.Номер = """"""";
КонецЕсли;

Запрос = Новый Запрос(ТекстЗапроса);
РезультатПоиска.Загрузить(Запрос.Выполнить().Выгрузить());

Использование стандартного отбора табличного поля

Если вы не хотите менять текст запроса, можно воспользоваться механизмом Отбор, встроенным в табличное поле. Однако помните, что этот метод работает медленнее, так как сначала считываются все данные, а затем фильтруются на клиенте.

Чтобы установить отбор для поля Номер, выполните следующий код:


ЭлементыФормы.РезультатПоиска.Отбор.Номер.Использование = Истина;
ЭлементыФормы.РезультатПоиска.Отбор.Номер.ВидСравнения = ВидСравнения.Равно;
ЭлементыФормы.РезультатПоиска.Отбор.Номер.Значение = ЗначениеОтбора;

Советы по обучению и отладке

Чтобы научиться быстрее находить ошибки, возьмите на вооружение следующие рекомендации:

Постепенный переход от простого статического запроса к динамическому — отличная практика для начинающего программиста. Старайтесь избегать дублирования кода и всегда проверяйте, чтобы переменные, в которых вы храните тексты запросов, были действительно использованы в методе Запрос.Выполнить().

← На главную