Почему 1С:УНФ пробивает лишние чеки коррекции после обновления и как это исправить?

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

После планового обновления конфигурации 1С:Управление нашей фирмой (УНФ) пользователи часто сталкиваются с аномальным поведением торгового оборудования. Одной из наиболее острых проблем является дублирование чеков при попытке выполнить корректировку операции. Вместо положенных по закону документов ККТ выдает двойной или даже четверной комплект чеков. Рассмотрим подробно, почему это происходит, как устроена логика современных форматов фискальных данных (ФДД) и как программно устранить эту ошибку.

Разберем теорию: сколько чеков должно быть на самом деле?

Прежде чем приступать к правке кода, нам необходимо четко понимать требования законодательства (54-ФЗ) и форматов фискальных данных. Количество чеков напрямую зависит от причины коррекции и используемого протокола ФФД:

  1. ФФД 1.05: Исправление ошибки производилось обычным чеком возврата.
  2. ФФД 1.1 и 1.2: Логика изменилась. Для исправления ошибки в ранее пробитом чеке необходимо сформировать два чека коррекции:
    • Первый чек — «обратный» (например, Возврат прихода), который полностью аннулирует неверную операцию (сторно).
    • Второй чек — «правильный» (Приход), который содержит верные реквизиты (например, правильный тип оплаты или актуальную ставку НДС).

Проанализируем ситуацию автора темы: при выполнении коррекции «Исправление ошибки» система генерирует два документа (Сторно и Скорректированный). Это штатное поведение УНФ. Однако проблема заключается в том, что по каждому из этих документов ККТ пробивает по два чека, итого — четыре. Это явный признак технического сбоя в механизме взаимодействия программы с драйвером ККТ.

Выясним причину дублирования в коде

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

В старых версиях или при ручных правках код мог выглядеть следующим образом:


// ОПАСНЫЙ ФРАГМЕНТ КОДА, ВЫЗЫВАЮЩИЙ ДУБЛИРОВАНИЕ
Если Объект.НеприменениеККТ Тогда 
    ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФормированиеЧекаКоррекцииНаФискальномУстройстве( 
        Оповещение, 
        ЭтотОбъект.УникальныйИдентификатор, 
        ИдентификаторУстройства, 
        ОбщиеПараметры); 
Иначе 
    ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаНаФискальномУстройстве( 
        Оповещение, 
        ЭтотОбъект.УникальныйИдентификатор, 
        ИдентификаторУстройства, 
        ОбщиеПараметры); 
КонецЕсли;

Проанализируем этот код. В новых версиях БПО метод НачатьФормированиеЧекаКоррекцииНаФискальномУстройстве стал универсальным для определенных типов операций. Если в коде принудительно вызывается специализированный метод коррекции без учета того, что типовая конфигурация УНФ уже подготовила XML-пакет именно для коррекции, возникает ситуация «двойного вызова». Система сначала инициирует стандартную фискализацию, а затем, из-за неверно расставленных условий, повторно отправляет команду на ККТ.

Пошаговое решение проблемы

Для устранения дублирования чеков нам необходимо выполнить следующие действия:

Шаг 1. Анализ регистра сведений «Фискальные операции»

Прежде всего, проверим, сколько записей создает система в регистре. Перейдем в Функции для специалиста и найдем регистр сведений ФискальныеОперации. Если на один документ ЧекКоррекции приходится две записи с разными номерами фискальных документов (ФД), значит, команда на пробитие была отправлена дважды на уровне программного кода 1С.

Шаг 2. Поиск и удаление устаревших «заплаток»

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

Проанализируем структуру вызовов. В современных релизах УНФ логика определения того, какой метод использовать — НачатьФискализациюЧека... или НачатьФормированиеЧекаКоррекции... — уже инкапсулирована внутри типовых процедур БПО. Нам нужно убрать все ручные условия, которые принудительно разделяют эти потоки, если они были добавлены ранее. Рекомендуется вернуть код к типовому виду, который предлагает поставщик обновления.

Пример правильного (типового) подхода в новых версиях:


// Типовой механизм сам определит параметры фискализации на основе данных объекта
ПараметрыФискализации = СформироватьПараметрыФискализации(Объект);
ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
    Оповещение, 
    УникальныйИдентификатор, 
    ИдентификаторУстройства, 
    ПараметрыФискализации);

Шаг 3. Проверка параметров драйвера ККТ

Обратим внимание на версию драйвера. В рассматриваемом случае используется АТОЛ 10.10.0.0. Драйверы этой ветки очень чувствительны к асинхронным вызовам. Если 1С отправляет команду и не дожидается корректного завершения (из-за модифицированного кода), обработка может запуститься повторно. Убедитесь, что в настройках подключаемого оборудования не установлены флаги, форсирующие печать чеков коррекции старым способом.

Почему это работало раньше?

Многие задаются вопросом: «Почему до обновления с этими изменениями всё работало прекрасно?». Ответ кроется в изменении структуры XML-пакета, который 1С передает драйверу. Раньше параметры коррекции могли передаваться как обычные текстовые поля или дополнительные реквизиты чека. После перехода на ФФД 1.2 и обновления БПО, эти данные вынесены в специфические теги. Когда ваш старый код пытается «помочь» системе и вызывает специфический метод коррекции, он фактически заставляет драйвер выполнять операцию дважды: один раз по старым правилам и второй — по новым.

Итоги и рекомендации

Подведем итог. Если после обновления УНФ вы получаете лишние чеки, попробуйте групповое создание чеков коррекции. Если вы получаете 4 чека вместо 2 при коррекции ошибки:

  1. Проверьте, не осталось ли в конфигурации старых доработок в модуле формы ЧекКоррекции.
  2. Убедитесь, что вы используете актуальный драйвер ККТ, сертифицированный для данной версии БПО.
  3. Помните, что для исправления ошибки два чека — это норма. Лишними являются только те, что дублируют одну и ту же операцию (например, два возврата прихода с одинаковыми суммами, но разными номерами ФД).

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

← На главную