При переходе конфигурации 1С:Торговля и Склад 7.7 на работу по требованиям 54-ФЗ нередко возникает ситуация, когда чеки с 1–2 позициями печатаются без сбоев, но при попытке пробить чек с 10–30 товарными позициями кассовый аппарат выдает ошибку, а в Z-отчете накапливаются неотправленные данные. Разберем по шагам, почему возникает эта проблема и какими способами её можно решить.
Проанализируем архитектуру взаимодействия типовой обработки 1С с фискальным регистратором:
FprnM1C82_54FZ.dll. Вся информация по чеку упаковывается в единый XML-документ и передается драйверу целиком. На слабых кассовых компьютерах и старых операционных системах (например, Windows XP) парсинг и валидация тяжелых пакетов вызывают задержки и ошибки буфера.&), переводов строк или непечатных символов в названиях номенклатуры нарушает структуру XML, из-за чего драйвер полностью отклоняет весь пакет.Наиболее надежное решение для платформы 1С 7.7 — отказаться от пакетной передачи XML через типовой драйвер 1С и использовать прямое управление через нативный COM-объект драйвера ККТ (версии 8.x или 9.x). Это снижает нагрузку на систему и позволяет регистрировать каждую позицию чека отдельной командой.
Рассмотрим пример алгоритма построчной фискализации на встроенном языке 1С 7.7:
// Создание прямого COM-объекта драйвера ККТ
ДрайверККТ = СоздатьОбъект("AddIn.FprnM45");
// Открытие чека (1 - продажа)
ДрайверККТ.Mode = 1;
ДрайверККТ.SetMode();
ДрайверККТ.CheckType = 1;
ДрайверККТ.OpenCheck();
// Построчная регистрация позиций
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
// Ограничиваем длину наименования требованиями ФФД
ИмяТовара = Лев(СокрЛП(Товар.Наименование), 128);
ДрайверККТ.Name = ИмяТовара;
ДрайверККТ.Price = Цена;
ДрайверККТ.Quantity = Количество;
ДрайверККТ.Department = 1;
ДрайверККТ.TaxTypeNumber = 4; // Без НДС или ставка по учету
Если ДрайверККТ.Registration() <> 0 Тогда
Сообщить("Ошибка регистрации позиции: " + ДрайверККТ.ResultDescription, "!");
ДрайверККТ.CancelCheck();
Возврат;
КонецЕсли;
КонецЦикла;
// Закрытие чека с передачей типа оплаты (нал/безнал)
ДрайверККТ.Summ = Итог("Сумма");
ДрайверККТ.TypeClose = 0; // Наличные
ДрайверККТ.Delivery();
ДрайверККТ.CloseCheck();
Если вы продолжаете использовать типовой механизм на базе XML, необходимо выполнить следующие корректировки:
Функция ОчиститьИмя(СтрИмя)
Стр = СокрЛП(СтрИмя);
Стр = СтрЗаменить(Стр, """", " ");
Стр = СтрЗаменить(Стр, "'", " ");
Стр = СтрЗаменить(Стр, "<", " ");
Стр = СтрЗаменить(Стр, ">", " ");
Стр = СтрЗаменить(Стр, "&", " ");
Стр = СтрЗаменить(Стр, Симв(10), "");
Стр = СтрЗаменить(Стр, Симв(13), "");
Стр = СтрЗаменить(Стр, Симв(9), "");
Возврат Лев(Стр, 128);
КонецФункции
Выясним причину появления сообщения о неотправленных чеках при закрытии смены (Z-отчете). Проблема часто кроется в конфликте службы EoU (Ethernet over USB) на операционной системе Windows XP: