При выполнении операции закрытия кассовой смены в конфигурации 1С:Розница (особенно релиза 2.1.8 и смежных) пользователи могут столкнуться со сбоем процесса. Если база опубликована на веб-сервере, на клиенте часто выводится некорректная ошибка с искаженными символами. Однако при запуске системы непосредственно на сервере или через тонкий клиент в локальном режиме проявляется истинный стек ошибки:
{Обработка.ЗакрытиеКассовойСмены.Форма.Форма.Форма(1393)}: Преобразование значения к типу Булево не может быть выполнено Если Выборка.ИспользоватьСерийныеНомера Тогда
Рассмотрим подробно причинно-следственные связи этой проблемы и разберем по шагам проверенные способы ее решения.
В встроенном языке платформы 1С:Предприятие 8.3 оператор Если требует, чтобы проверяемое условие строго возвращало тип Булево (значение Истина или Ложь). Автоматическое неявное приведение типов для значений NULL или Неопределено в платформе отсутствует. Если в результате выполнения запроса в поле ИспользоватьСерийныеНомера попадает значение NULL, исполнение кода немедленно прерывается с аварийным завершением.
Проанализируем основные ситуационные факторы, приводящие к выпаданию NULL в запросе закрытия смены:
ЕСТЬNULL.Особо отметим поведение системы при работе через веб-сервер: экстренное завершение сеанса на стороне сервера 1С приводит к формированию некорректного HTTP-ответа без заголовка длины тела, из-за чего браузер или веб-клиент отображает нечитаемые символы вместо понятного сообщения. Для получения точного текста ошибки всегда проверяйте выполнение операции в тонком клиенте напрямую на сервере базы данных.
Если нет возможности оперативно обновить конфигурацию, наилучшим решением для программиста является исправление текста запроса. Это можно сделать напрямую в конфигурации или через расширение.
Разберем пример изменения текста запроса в модуле формы обработки ЗакрытиеКассовойСмены. В месте соединения с таблицей видов номенклатуры необходимо обернуть поле серийных номеров функцией ЕСТЬNULL:
ВЫБРАТЬ
Чеки.Номенклатура КАК Номенклатура,
ЕСТЬNULL(ВидыНоменклатуры.ИспользоватьСерийныеНомера, ЛОЖЬ) КАК ИспользоватьСерийныеНомера
ИЗ
Документ.ЧекККМ.Товары КАК Чеки
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
ПО Чеки.Номенклатура.ВидНоменклатуры = ВидыНоменклатуры.Ссылка
В коде модуля перед вычислением условия также можно добавить явную проверку типа с помощью ЗначениеЗаполнено() или предварительное приведение к логическому типу:
ИспользоватьСерийники = Булево(Выборка.ИспользоватьСерийныеНомера);
Если ИспользоватьСерийники Тогда
// Логика обработки товаров с серийными номерами
КонецЕсли;
Для исправления ситуации без изменения кода необходимо проанализировать состав документов открытой смены:
<Объект не найден>, необходимо перевыбрать номенклатуру и перепровести документ.Так как данная проблема является зафиксированной ошибкой некоторых репродукций «1С:Розница 2.1», разработчики фирм 1С устранили отсутствие ЕСТЬNULL в последующих релизах. Рекомендуется выполнить обновление конфигурации на актуальный релиз ветки 2.2, 2.3 или 3.0.
Также целесообразно обновить платформу 1С:Предприятие до актуального рекомендованного релиза и очистить кэш клиентских приложений на рабочих станциях.
Для удаления ссылочной нецелостности, возникшей после некорректных обменов между «1С:Розница» и «1С:Управление торговлей», выполним следующие шаги: