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