При работе в конфигурации 1С:Управление торговлей редакции 11.5.12 пользователи часто сталкиваются с неприятной ситуацией: в момент закрытия кассовой смены система выдает каскад предупреждений о том, что обязательные поля, такие как Валюта, Налогообложение, Вид цены и Магазин, не заполнены (в этом случае помогает редактирование Чеков ККМ и Кассовых смен). Несмотря на эти сообщения, программа сообщает об успешном завершении операции, а кассовый аппарат (ККМ) выдает корректный Z-отчет (даже если при оплате наличными пробивается безнал). Разберем подробно, почему это происходит, как устранить данное поведение системы.
Для начала проанализируем ситуацию, в которой проявляется эта ошибка. Как правило, она возникает в сценариях, когда торговля ведется в так называемом «оптовом» режиме через контрольно-кассовую технику. В 1С:УТ 11 существуют две основные модели оформления продаж:
Отчет о розничных продажах.Реализация товаров и услуг, на основании которых пробиваются чеки (тип операции — «Оплата от покупателя»). В этом случае документ Отчет о розничных продажах не создается, так как выручка уже отражена в реализации.Выясним причину технического сбоя. Начиная с релизов ветки 11.5.12, разработчики внесли изменения в общий модуль ОборудованиеЧекопечатающиеУстройстваВызовСервера. В процедуру ПослеЗакрытияКассовойСмены была добавлена строка кода, которая принудительно инициирует проверку и создание объектов в информационной базе сразу после того, как касса успешно напечатала фискальный отчет.
Проблема заключается в том, что алгоритм пытается инициализировать структуру документа Отчет о розничных продажах (ОРП) даже в том случае, если в течение смены не было пробито ни одного розничного чека. Поскольку данных для заполнения документа нет (так как продажи были оптовыми), создается «пустой» объект. При попытке системы проверить этот объект срабатывают стандартные механизмы контроля заполнения реквизитов, что и порождает ошибки: Поле 'Валюта' не заполнено, Поле 'Налогообложение' не заполнено и другие.
Посмотрим на пример кода, который вызывает данную коллизию. В модуле ОборудованиеЧекопечатающиеУстройстваВызовСервера процедура выглядит следующим образом:
Функция ПослеЗакрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения) Экспорт
Результат = Истина;
ЗакрытьКассовуюСмену(РезультатВыполнения);
// Проблемная строка, добавленная в 11.5.12:
МенеджерОборудованияВызовСервераПереопределяемый.ПослеЗакрытияКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства, РезультатВыполнения);
Возврат Результат;
КонецФункции
Метод МенеджерОборудованияВызовСервераПереопределяемый.ПослеЗакрытияКассовойСмены запускает цепочку вызовов, которые в конечном итоге пытаются собрать данные для розничного отчета. Поскольку кассовая смена в 1С (объект КассоваяСмена) уже закрыта на фискальном устройстве, драйвер возвращает успех, но внутренняя логика 1С «спотыкается» на пустых значениях.
Самый правильный и рекомендуемый способ решения — это обновление программы. Данная ошибка была официально признана разработчиками 1С и исправлена в последующих минорных релизах. По результатам анализа практического опыта пользователей, в версии 11.5.17 и выше данная проблема отсутствует. В коде были добавлены проверки на наличие розничной выручки перед вызовом процедур пост-обработки. Если у вас есть возможность обновиться, это полностью снимет вопрос без вмешательства в программный код.
Если обновление в данный момент невозможно (например, конфигурация сильно доработана или требуется длительное тестирование), проанализируем, как можно исправить ошибку с помощью расширения. Нам необходимо перехватить вызов процедуры ПослеЗакрытияКассовойСмены и добавить проверку на необходимость формирования розничных данных.
Рассмотрим пример кода для расширения, где мы используем метод &Вместо для корректировки поведения:
&Вместо("ПослеЗакрытияКассовойСмены")
Функция Расш1_ПослеЗакрытияКассовойСмены(ПараметрыПодключения, РезультатВыполнения)
Результат = Истина;
// Выполняем стандартное закрытие смены в ИБ
ЗакрытьКассовуюСмену(РезультатВыполнения);
// Добавляем условие: вызываем переопределяемый метод только в том случае,
// если в системе есть данные, требующие обработки (например, наличие чеков ККМ)
// В простейшем случае, если мы используем только ОПТ, эту строку можно закомментировать:
// МенеджерОборудованияВызовСервераПереопределяемый.ПослеЗакрытияКассовойСмены(ПараметрыПодключения.ИдентификаторУстройства, РезультатВыполнения);
Возврат Результат;
КонецФункции
Важный момент: Простое комментирование строки является «быстрым» решением. Оно безопасно, если вы на 100% уверены, что в данной базе не оформляются документы Чек ККМ, требующие сборки в Отчет о розничных продажах. Если же у вас смешанный режим (и розница, и опт), необходимо добавить проверку наличия документов в текущей смене перед вызовом метода МенеджерОборудованияВызовСервераПереопределяемый.
Для пользователей, находящихся на официальной поддержке, фирма 1С выпускает оперативные исправления — патчи (файлы формата .efe). Проверьте раздел Обслуживание — Обновление программы — Установленные исправления (патчи). В поиске по описанию исправлений можно найти патч, касающийся закрытия кассовой смены в релизах 11.5.12. Это позволит исправить ошибку автоматически без ручного написания кода.
Дополнительно проанализируем настройки системы, которые могут влиять на поведение при закрытии смены. Даже если программная ошибка присутствует, стоит убедиться, что базовые реквизиты заполнены верно:
Магазин и Склад. Иногда заполнение этих полей в настройках оборудования позволяет «пустому» отчету подхватить значения и пройти проверку валидации без вывода предупреждений.Кассовая смена. Если после всех предупреждений статус изменился на Закрыта, значит, критических повреждений данных не произошло, и предупреждения носят лишь информационный характер.Подводя итог, отметим, что ситуация с предупреждениями в УТ 11.5.12 является следствием избыточной проверки в программном коде. Несмотря на пугающий вид сообщений, фискальные данные остаются в сохранности. Оптимальным путем решения остается переход на актуальный релиз ветки 11.5.17 или установка соответствующего патча от разработчика.