Ошибка «Преобразование значения к типу Булево не может быть выполнено» при продаже пива: причины и решения

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Торговля и дистрибуция
← На главную

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

Проанализируем стек вызовов. Сбой происходит в общем модуле РозничныеПродажиКлиентСервер, когда система обращается к функции АлкогольнаяПродукцияЕГАИСМаркируемая. Выясним причину такого поведения конфигурации и разберем по шагам, как безопасно устранить данную ошибку.

Суть технической проблемы

Посмотрим на контекст появления сбоя. Массовые ошибки в релизах 1С:Комплексная автоматизация (КА), 1С:ERP и 1С:Розница совпали с законодательными изменениями по обязательной маркировке пива и слабоалкогольных напитков (интеграция ЕГАИС и «Честный ЗНАК»). Разработчикам пришлось экстренно добавлять новые проверки в РМК.

Ошибка всегда означает одно: в логическом условии (например, Если ... И ... Тогда) платформа ожидает строго значения Истина или Ложь. По стандартам встроенного языка 1С, если процедура или функция доходит до конца, но ничего явно не возвращает через оператор Возврат, она автоматически отдает значение Неопределено.

Разберем программный код проблемной функции, опубликованный разработчиками в переходных релизах:


Функция АлкогольнаяПродукцияЕГАИСМаркируемая(НоменклатураЕГАИС) Экспорт
    //++ Локализация
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ 
    | КлассификаторАлкогольнойПродукцииЕГАИС.Ссылка КАК Ссылка, 
    | КлассификаторАлкогольнойПродукцииЕГАИС.ВидПродукции КАК ВидПродукции, 
    | КлассификаторАлкогольнойПродукцииЕГАИС.ВидПродукции.Маркируемый КАК ВидПродукцииМаркируемый 
    |ИЗ 
    | Справочник.КлассификаторАлкогольнойПродукцииЕГАИС КАК КлассификаторАлкогольнойПродукцииЕГАИС 
    |ГДЕ 
    | КлассификаторАлкогольнойПродукцииЕГАИС.Ссылка = &НоменклатураЕГАИС 
    | И КлассификаторАлкогольнойПродукцииЕГАИС.ВидПродукции.Маркируемый = ИСТИНА";
    
    Запрос.УстановитьПараметр("НоменклатураЕГАИС", НоменклатураЕГАИС);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Истина;
    Иначе
        Возврат Ложь;
    КонецЕсли;
    //-- Локализация
    Возврат Ложь;
КонецФункции

В некоторых сценариях (особенно при переопределении модулей локализации) условие работает некорректно, и функция завершается досрочно, отдавая в вызывающий код Неопределено. Как только система пытается вычислить составное условие с этим результатом, происходит аварийное завершение пробития чека.

Почему нельзя снимать признак «Подакцизный товар»?

На многих форумах пользователи советуют временный «костыль» — убрать галочку «Подакцизный товар» в карточке номенклатуры. Делать это категорически не рекомендуется!

Посмотрим, к чему приведет такой обходной путь. Снятие признака подакцизности нарушает требования ФЗ-54 о применении ККТ. В фискальный чек (в ОФД и налоговую) уйдет неверный «Признак предмета расчета» (тег 1212). Вместо значения «подакцизный товар» или «маркированный подакцизный товар» позиция пробьется как обычный товар. За систематическое пробитие чеков с некорректными тегами при продаже алкоголя организацию ждут крупные штрафы от ФНС.

Правильные способы решения проблемы

Рассмотрим безопасные варианты исправления ошибки, которые не нарушают учет и законодательство.

  1. Обновление конфигурации и платформы. Как показывает практика, проблема полностью уходит при обновлении конфигурации до актуальных версий (например, КА 2.5.12 и выше) и платформы до стабильного релиза (8.3.23 и старше). Разработчики 1С уже устранили неточности в коде локализации.
  2. Установка официальных исправлений (патчей). Если у вас нет возможности оперативно провести ресурсоемкое обновление всей базы, проверьте наличие патчей. Перейдите в раздел Администрирование — Обслуживание — Обновление программы и выполните поиск официальных исправлений. Система автоматически загрузит точечный фикс для модуля розничных продаж, не меняя основную версию конфигурации.
  3. Исправление через расширение (для программистов). Если патча нет, а обновиться нельзя, создадим небольшое расширение конфигурации. Это наиболее грамотный метод «best practice» для исправления багов без снятия базы с поддержки.

Разберем подробнее создание расширения:

Вам нужно перехватить проблемную функцию АлкогольнаяПродукцияЕГАИСМаркируемая с помощью аннотации &Вместо. Внутри расширения вызовите стандартный метод через ПродолжитьВызов() и проверьте тип возвращаемого значения. Если он равен Неопределено или не является типом Булево, принудительно возвращайте Ложь. В остальных случаях возвращайте исходный результат.


&Вместо("АлкогольнаяПродукцияЕГАИСМаркируемая")
Функция Расш1_АлкогольнаяПродукцияЕГАИСМаркируемая(НоменклатураЕГАИС)
    Результат = ПродолжитьВызов(НоменклатураЕГАИС);
    
    Если ТипЗнч(Результат) <> Тип("Булево") Тогда
        Возврат Ложь;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

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

← На главную