В процессе эксплуатации контрольно-кассовой техники (ККТ) ШТРИХ-М-01-Ф программисты часто сталкиваются с парадоксальной ситуацией: на бумажном чеке, который выдает аппарат, все реквизиты (включая название товара, цену и количество) отображаются корректно, однако в личном кабинете ОФД вместо наименования товара отображается пустая строка или прочерк. Разберем детально, почему это происходит и как настроить передачу данных в соответствии с требованиями законодательства.
Основная причина кроется в переходе на Формат фискальных данных (ФФД) 1.05 и выше. В старых протоколах касса могла принимать текстовую строку просто для печати на бумаге. Сейчас же для ОФД критически важно заполнение Тега 1030 (Наименование предмета расчета). Если ваше программное обеспечение использует устаревшие методы драйвера, оно может отправлять текст только в буфер печати принтера, но не передавать его в фискальный накопитель (ФН) как обязательный атрибут позиции.
Проанализируем ситуацию: использование стандартной библиотеки DrvFr1C.dll (которая часто идет в комплекте с обработками обслуживания 1С) во многих случаях ограничено. Она может некорректно транслировать параметры в современные прошивки ККТ. Как показала практика, решение часто заключается в переходе на прямую работу с нативной библиотекой DrvFr.dll и использовании более точных методов регистрации товара.
Рассмотрим один из нюансов работы драйвера «Штрих-М». Иногда порядок установки свойств объекта имеет решающее значение. Выясним, как правильно передавать данные в цикле обхода товаров. Посмотрим на пример кода, где наименование гарантированно попадает в структуру чека:
// Пример корректной последовательности установки свойств
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
СтрокаДляПечати = СписокТоваров.ТовНаим;
// Сначала устанавливаем пароль и строку наименования
Объект.Password = Пароль;
Объект.StringForPrinting = СтрокаДляПечати;
// Только ПОСЛЕ наименования устанавливаем цену и количество
Объект.Price = СписокТоваров.Цена;
Объект.Quantity = СписокТоваров.Количество;
Объект.Department = НомерСекции;
// Вызываем метод регистрации (продажи)
Объект.Sale();
КонецЦикла;
Важный момент: если в вашем коде сначала устанавливаются цена и количество, а только потом StringForPrinting, некоторые версии драйвера могут «забыть» привязать это наименование к фискальной операции продажи. Попробуйте изменить порядок установки свойств, как показано выше.
В некоторых реализациях драйверов «Штрих-М» существует механизм разделения текста для чека и текста для ОФД. Если обычная передача не помогает, попробуем применить префикс в виде двойного слэша. Рассмотрим, как это работает:
Если добавить "//" перед строкой наименования, драйвер интерпретирует это как команду: «Данный текст предназначен специально для передачи в ОФД». При этом на бумажный чек этот текст может выводиться без слэшей (зависит от настроек таблицы 17 ККТ).
// Принудительная передача наименования в ОФД
Объект.StringForPrinting = "//" + Товар.Наименование;
Объект.Price = Товар.Цена;
Объект.Quantity = Товар.Количество;
Объект.Sale();
Если манипуляции с порядком свойств и слэшами не принесли результата, проанализируем самый надежный способ. Проблема часто заключается в самой библиотеке DrvFr1C.dll, которая является лишь «оберткой» и может скрывать ошибки или не поддерживать новые методы ФФД. Профессиональное решение задачи — переписать обработку обслуживания на использование нативного COM-объекта AddIn.DrVFR (библиотека DrvFr.dll).
Разберем алгоритм перехода:
DrvFr1C.dll на DrvFr.dll.НапечататьФискСтроку(), используем прямые методы драйвера.При использовании DrvFr.dll мы получаем доступ к свойству ItemName, которое напрямую отвечает за заполнение Тега 1030. Посмотрим на логику работы:
// Прямая работа с нативным драйвером
Драйвер = СоздатьОбъект("AddIn.DrVFR");
Драйвер.Password = 30; // Пароль администратора по умолчанию
Драйвер.Quantity = Количество;
Драйвер.Price = Цена;
Драйвер.Department = 1;
Драйвер.Tax1 = 0; // Настройка НДС
// Устанавливаем именно ItemName для корректного ФФД 1.05
Драйвер.ItemName = "Пирожок с капустой";
// Регистрация позиции
Результат = Драйвер.FNOperation();
Если Результат <> 0 Тогда
Предупреждение("Ошибка кассы: " + Драйвер.ResultCodeDescription);
КонецЕсли;
Обратите внимание на использование метода FNOperation(). В отличие от старого Sale(), этот метод в современных прошивках специально предназначен для работы с фискальным накопителем в рамках ФФД 1.05 и выше.
Если программный код корректен, но наименование все равно не уходит, проанализируем настройки самой кассы через «Тест драйвера»:
Также проверьте длину передаваемой строки. Несмотря на то, что стандарт позволяет передавать длинные наименования, некоторые старые ревизии плат «Штрих-М» могут обрезать или вовсе игнорировать строки длиннее 64 или 128 символов при формировании пакета для ОФД. Попробуйте сократить наименование до 30-40 символов для теста.
Если ничего из вышеперечисленного не помогло, рекомендуем включить ведение лога в настройках драйвера. В лог-файле (обычно drvfr.log в папке драйвера) можно увидеть точную последовательность команд, которые 1С отправляет в порт. Если вы видите, что свойство StringForPrinting или ItemName заполнено, но команда Sale или FNOperation возвращает ошибку — проблема в прошивке кассы, и её необходимо обновить до актуальной версии у авторизованного сервисного центра.
Подводя итог: для исправления отсутствия наименования в ОФД на кассах ШТРИХ-М-01-Ф наиболее эффективным является переход на использование прямой библиотеки DrvFr.dll и метода FNOperation() с обязательным заполнением свойства ItemName. Это гарантирует попадание данных в Тег 1030 и корректное отображение чека в налоговых органах.