Как адаптировать нетиповую УТ 10.3 под требования 54-ФЗ и устранить ошибки онлайн-ККТ?

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

Переход на применение контрольно-кассовой техники по правилам 54-ФЗ создает множество сложностей для баз с сильно измененной конфигурацией, таких как 1С:Управление торговлей 10.3 или других решений на обычных формах. Штатное обновление невозможно накатить простым объединением без риска нарушить бизнес-логику компании. Разберем по шагам ключевые этапы переноса подсистемы торгового оборудования, а также проанализируем частые ошибки при работе с драйверами АТОЛ и Штрих-М и пути их решения.

1. Особенности переноса функционала онлайн-ККТ в доработанную конфигурацию

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

  1. Общие модули подсистемы подключаемого оборудования: ПодключаемоеОборудованиеУниверсальныйДрайверКлиент, МенеджерОборудованияКлиентСервер, МенеджерОборудованияВызовСервера.
  2. Документ КассоваяСмена. Обратим внимание: в типовой УТ 10.3 этот документ и форма настройки оборудования созданы на управляемых формах. Если база работает в режиме обычного приложения без включенных управляемых форм, документ необходимо адаптировать под обычные формы или переписать обращение к формам.
  3. Новые внешние обработки обслуживания касс (ATOLkkt.epf, ShtrihMkkt.epf), которые находятся в каталоге шаблонов конфигурации в папке TradeWareEpf.
  4. Доработки в документах ЧекККМ, ПриходныйКассовыйОрдер, ОплатаОтПокупателяПлатежнойКартой в части подготовки фискальных данных по каждой строке (передача признаков способа и предмета расчета, расчет скидок и выделение ставок НДС).

2. Ошибка '2000.0.0 0:0:0,0' is not a valid date and time и проблемы DLL АТОЛ

При попытке открыть кассовую смену на оборудовании АТОЛ с фискальным накопителем часто возникает ошибка парсинга даты. Выясним причину: в некоторых поставках внешняя компонента FprnM1C82_54FZ.dll содержит отладочную версию требований к драйверу.

Для исправления проблемы разберем следующий алгоритм действий:

  1. Закроем 1С:Предприятие.
  2. Скачаем официальный дистрибутив драйверов ККМ (ДТО 8.12 или новее) с сайта производителя АТОЛ.
  3. Найдем в каталоге пользователя файл компоненты по пути: %AppData%\Roaming\1C\1cv8\ExtCompT\FprnM1C82_54FZ.dll (либо в каталоге платформы bin).
  4. Заменим файл библиотеки на версию из официального дистрибутива драйверов АТОЛ. Корректная библиотека имеет актуальный размер и версию требований 1.1.
  5. Зарегистрируем библиотеку в операционной системе вручную от имени администратора: regsvr32 "C:\Windows\SysWOW64\FprnM1C82_54FZ.dll"
  6. В коде подключения компоненты в обработке обслуживания можно заменить загрузку из временного хранилища на классическое подключение через ProgID:
    
    ПрогИД = "AddIn.ATOL_KKM_1C82_54FZ";
    ПодключитьВнешнююКомпоненту(ПрогИД);
    Драйвер = Новый (ПрогИД);
    

3. Ошибка Штрих-М: код 33h «Некорректные параметры в команде» и затирание имени кассира

При подключении аппаратов линейки Штрих-М с драйвером версии 4.13.x возникает проблема: смена не открывается, а при пробитии чека выходит ошибка несоответствия или код 33h. Проанализируем причину: драйвер ККТ требует обязательной передачи информации о кассире. В стандартном вызове метода 1С отправляет пустое значение, из-за чего в Таблице 2 ККМ («Пароли кассиров и администраторов») в строке системного администратора очищается поле имени, блокируя выполнение фискальных операций.

Чтобы исключить эту ошибку, исправим вызовы в общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент:

  1. Найдем функцию ОткрытьСмену и другие процедуры вызова драйвера, где определяется переменная Кассир.
  2. Заменим пустую строку на корректное текстовое имя:
    
    // Вместо: Кассир = "";
    Кассир = "СИСТ. АДМИНИСТРАТОР"; // или имя текущего пользователя 1С
    
  3. В драйвере ККМ через утилиту «Тест драйвера ФР» проверим Таблицу 2, строку 30 и вручную восстановим наименование администратора (например, «СИСТ. АДМИН.») и пароль 30.

4. Устранение ошибки закрытия смены: XMLЗначение Несоответствие типов

При закрытии смены метод ОбъектДрайвера.ЗакрытьСмену может выдавать ошибку разбора XML: Ошибка при вызове метода контекста (XMLЗначение): Несоответствие типов (параметр номер '2'). Это происходит в тех случаях, когда ККТ возвращает пустые атрибуты для даты или номеров непереданных фискальных документов.

Посмотрим на пример исправления в общем модуле МенеджерОборудованияВызовСервера в функции ПолучитьПараметрыСостоянияСменыИзXMLПакета:


Функция ПолучитьПараметрыСостоянияСменыИзXMLПакета(Данные, НомерСмены) Экспорт
    
    ЧтениеXML = Новый ЧтениеXML; 
    ЧтениеXML.УстановитьСтроку(Данные);
    ЧтениеXML.ПерейтиКСодержимому();
    
    Параметры = МенеджерОборудованияКлиентСервер.ПараметрыНормализуемыхФискальныхДанных();
    Параметры.НомерСменыККТ = НомерСмены;
    
    Если ЧтениеXML.Имя = "StatusParameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        Если ЧтениеXML.Прочитать() И ЧтениеXML.Имя = "Parameters" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда  
            
            пXMLАтрибут = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentsCounter");
            Если пXMLАтрибут <> Неопределено Тогда
                Параметры.КоличествоНепереданныхФД = Число(пXMLАтрибут);
            КонецЕсли;
            
            пXMLАтрибут = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstNumber");
            Если пXMLАтрибут <> Неопределено Тогда
                Параметры.НомерПервогоНепереданногоФД = пXMLАтрибут;
            КонецЕсли;
            
            пXMLАтрибут = ЧтениеXML.ЗначениеАтрибута("BacklogDocumentFirstDateTime");
            Если пXMLАтрибут <> Неопределено И ЗначениеЗаполнено(пXMLАтрибут) Тогда
                Параметры.ДатаПервогоНепереданногоФД = XMLЗначение(Тип("Дата"), пXMLАтрибут);
            КонецЕсли;
            
        КонецЕсли;
    КонецЕсли;
    
    Возврат Параметры;
    
КонецФункции

5. Печать X-отчета (отчета без гашения) в онлайн-кассах

Стандартный интерфейс работы с онлайн-ККТ по стандарту 1С не всегда предоставляет прямую команду печати суточного отчета без гашения (X-отчета) из пользовательского интерфейса. Однако реализовать печать можно прямым обращением к низкоуровневому объекту драйвера.

Рассмотрим пример функции снятия X-отчета для ККТ АТОЛ через библиотеку FPrnM8:


Функция НапечататьХОтчетАТОЛ(Объект) Экспорт
    Результат = Истина;
    СоответствиеПараметров = Объект.Параметры.СписокПараметров;
    
    // Освобождаем порт устройства
    Объект.Драйвер.Отключить(Объект.ИДУстройства);
    
    Попытка
        ПрогИД = "AddIn.FPrnM8";
        ПодключитьВнешнююКомпоненту(ПрогИД);
        Драйвер = Новый (ПрогИД);
        Драйвер.AddDevice();
        ЗаполнитьЗначенияСвойств(Драйвер, СоответствиеПараметров);
        Драйвер.DeviceEnabled = 1;
        
        Драйвер.Mode = 2; // Режим отчетов без гашения
        Драйвер.Password = 30; // Пароль администратора
        Драйвер.SetMode();
        
        Драйвер.ReportType = 2; // Суточный отчет без гашения
        Драйвер.Report();
        
        Драйвер.DeviceEnabled = 0;
        Драйвер.DeleteDevice();
    Исключение
        Сообщить("Ошибка печати X-отчета: " + ОписаниеОшибки());
        Результат = Ложь;
    КонецПопытки;
    
    // Возвращаем подключение кассы
    Подключить(Объект);
    Возврат Результат;
КонецФункции

Для касс Штрих-М вызов отчета без гашения выполняется через объект AddIn.DrvFR:


ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
FR = Новый COMОбъект("AddIn.DrvFR");
FR.Password = 30;
FR.Connect();
FR.PrintReportWithoutCleaning(); // Печать отчета без гашения
FR.Disconnect();

6. Вывод нефискальных данных и перенос длинных наименований

В новых кассах длинные строки наименований товаров часто обрезаются драйвером до ширины печатной ленты. Чтобы вывести подробное описание товара, артикул или скидочные акции, используют вывод текстовых строк в структуре XML-пакета чека:


// В обработке обслуживания при заполнении позиций чека:
Для Каждого ТекСтрока Из МассивДополнительныхСтрок Цикл
    ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
    ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ТекСтрока));
    ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;

Для касс Штрих-М существует практический прием: если к наименованию в фискальной строке FiscalString Name добавить в начале два символа косой черты (//Товар), драйвер регистрирует продажу в фискальном накопителе и передает ее в ОФД, но не выводит стандартную строку на бумажный чек. Это позволяет полностью сформировать печатную форму чека через набор текстовых строк TextString без дублирования информации.

7. Ставки НДС и системы налогообложения

Если организация применяет специальные налоговые режимы (УСН, ЕНВД) или реализует товары без НДС, важно контролировать соответствие ставок между 1С и кассовым аппаратом. В процедуре ПодготовитьДанныеДляФискализацииЧека документа ЧекККМ убедимся, что при отключенном флаге печати налога ставка передается как 0, а не как ставка 18%:


Если СтрокаЧека.СтавкаНДС = Неопределено ИЛИ НЕ ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ Тогда
    СтрокаЧека.СтавкаНДС = 0;
КонецЕсли;

В фискальном регистраторе соответствие ставок задается в таблице налогов драйвера. Для корректной трансляции ставок убедитесь, что первая колонка таблицы заполнена в формате целых чисел сотых долей процента (1800 для 18%, 1000 для 10%, 0 для операций без налога).

← На главную