Переход на применение контрольно-кассовой техники по правилам 54-ФЗ создает множество сложностей для баз с сильно измененной конфигурацией, таких как 1С:Управление торговлей 10.3 или других решений на обычных формах. Штатное обновление невозможно накатить простым объединением без риска нарушить бизнес-логику компании. Разберем по шагам ключевые этапы переноса подсистемы торгового оборудования, а также проанализируем частые ошибки при работе с драйверами АТОЛ и Штрих-М и пути их решения.
Для поддержки касс с передачей данных в нетиповую конфигурацию необходимо перенести следующие ключевые объекты из актуального релиза:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент, МенеджерОборудованияКлиентСервер, МенеджерОборудованияВызовСервера.КассоваяСмена. Обратим внимание: в типовой УТ 10.3 этот документ и форма настройки оборудования созданы на управляемых формах. Если база работает в режиме обычного приложения без включенных управляемых форм, документ необходимо адаптировать под обычные формы или переписать обращение к формам.ATOLkkt.epf, ShtrihMkkt.epf), которые находятся в каталоге шаблонов конфигурации в папке TradeWareEpf.ЧекККМ, ПриходныйКассовыйОрдер, ОплатаОтПокупателяПлатежнойКартой в части подготовки фискальных данных по каждой строке (передача признаков способа и предмета расчета, расчет скидок и выделение ставок НДС).При попытке открыть кассовую смену на оборудовании АТОЛ с фискальным накопителем часто возникает ошибка парсинга даты. Выясним причину: в некоторых поставках внешняя компонента FprnM1C82_54FZ.dll содержит отладочную версию требований к драйверу.
Для исправления проблемы разберем следующий алгоритм действий:
1С:Предприятие.%AppData%\Roaming\1C\1cv8\ExtCompT\FprnM1C82_54FZ.dll (либо в каталоге платформы bin).
regsvr32 "C:\Windows\SysWOW64\FprnM1C82_54FZ.dll"
ProgID:
ПрогИД = "AddIn.ATOL_KKM_1C82_54FZ";
ПодключитьВнешнююКомпоненту(ПрогИД);
Драйвер = Новый (ПрогИД);
При подключении аппаратов линейки Штрих-М с драйвером версии 4.13.x возникает проблема: смена не открывается, а при пробитии чека выходит ошибка несоответствия или код 33h. Проанализируем причину: драйвер ККТ требует обязательной передачи информации о кассире. В стандартном вызове метода 1С отправляет пустое значение, из-за чего в Таблице 2 ККМ («Пароли кассиров и администраторов») в строке системного администратора очищается поле имени, блокируя выполнение фискальных операций.
Чтобы исключить эту ошибку, исправим вызовы в общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент:
ОткрытьСмену и другие процедуры вызова драйвера, где определяется переменная Кассир.
// Вместо: Кассир = "";
Кассир = "СИСТ. АДМИНИСТРАТОР"; // или имя текущего пользователя 1С
30.При закрытии смены метод ОбъектДрайвера.ЗакрытьСмену может выдавать ошибку разбора 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Атрибут);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
Стандартный интерфейс работы с онлайн-ККТ по стандарту 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();
В новых кассах длинные строки наименований товаров часто обрезаются драйвером до ширины печатной ленты. Чтобы вывести подробное описание товара, артикул или скидочные акции, используют вывод текстовых строк в структуре XML-пакета чека:
// В обработке обслуживания при заполнении позиций чека:
Для Каждого ТекСтрока Из МассивДополнительныхСтрок Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ТекСтрока));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
Для касс Штрих-М существует практический прием: если к наименованию в фискальной строке FiscalString Name добавить в начале два символа косой черты (//Товар), драйвер регистрирует продажу в фискальном накопителе и передает ее в ОФД, но не выводит стандартную строку на бумажный чек. Это позволяет полностью сформировать печатную форму чека через набор текстовых строк TextString без дублирования информации.
Если организация применяет специальные налоговые режимы (УСН, ЕНВД) или реализует товары без НДС, важно контролировать соответствие ставок между 1С и кассовым аппаратом. В процедуре ПодготовитьДанныеДляФискализацииЧека документа ЧекККМ убедимся, что при отключенном флаге печати налога ставка передается как 0, а не как ставка 18%:
Если СтрокаЧека.СтавкаНДС = Неопределено ИЛИ НЕ ПечататьНДСВКассовыхЧекахИзДокументовЧекККМ Тогда
СтрокаЧека.СтавкаНДС = 0;
КонецЕсли;
В фискальном регистраторе соответствие ставок задается в таблице налогов драйвера. Для корректной трансляции ставок убедитесь, что первая колонка таблицы заполнена в формате целых чисел сотых долей процента (1800 для 18%, 1000 для 10%, 0 для операций без налога).