Интеграция торгового оборудования, особенно кассовых аппаратов под управлением драйверов АТОЛ, с устаревшими или кастомизированными конфигурациями 1С часто преподносит сюрпризы. В этой статье мы подробно разберем три критические проблемы, с которыми сталкиваются программисты и системные администраторы при работе с ККТ АТОЛ 11Ф (и другими моделями этой линейки) в среде 1С:Управление торговлей 10.3:
Давайте пошагово рассмотрим причины возникновения этих неполадок и разберем практические методы их устранения.
---
Эта ошибка является защитным механизмом самой платформы 1С. Программа сравнивает внутреннее состояние документов в информационной базе (ИБ) со статусом физического фискального регистратора (ФР) перед отправкой команды на печать. Если эти данные не совпадают, система блокирует транзакцию во избежание расхождений в учете.
Выясним основные причины рассинхронизации:
КассоваяСмена не записался или не провелся.Пошаговый алгоритм решения проблемы:
---
Данная ошибка сигнализирует о том, что используемая в 1С обработка обслуживания торгового оборудования пытается вызвать метод BeginItem() у COM-объекта драйвера ККТ, но сам объект этот метод не поддерживает.
Почему это происходит?
Методы BeginItem() и EndItem() используются в драйверах АТОЛ для построчной передачи товарных позиций чека в соответствии с требованиями формата фискальных данных ФФД 1.05. Старые версии драйверов (ниже 8.15) и старые библиотеки OLE-автоматизации (например, старая DLL-компонента fprnm1c82_54fz.dll) просто не содержат этих функций.
Часто проблема кроется в «засорении» операционной системы старыми библиотеками: драйвер вы обновили, а в системе осталась зарегистрированной старая OLE-компонента, к которой по-прежнему обращается 1С через ProgID FPrnM45.
Как исправить ситуацию:
regsvr32 "C:\Program Files (x86)\ATOL\Drivers8\BIN\FPrnM1C82_54FZ.dll"
После успешной регистрации библиотеки обновите обработку обслуживания (файл с расширением .epf) в справочнике «Обработки обслуживания торгового оборудования» внутри 1С на ту, которая поставляется вместе с установленным драйвером.
---
Если при попытке пробить чек без скидок все проходит гладко, но при добавлении ручной или автоматической скидки 1С возвращает ошибку «Ошибка реквизита: Неизвестная ошибка ФН» (в драйверах 8.16.1) или «При передаче скидки для печати запрещена регистрация скидки» (в драйверах 8.16.2/8.16.3) — вы столкнулись с жестким ограничением протокола работы с фискальными накопителями.
Разберем суть проблемы:
По правилам ФФД 1.0, касса могла самостоятельно рассчитывать скидки: в нее передавалась базовая цена позиции и процент/сумма скидки, а касса сама вычитала разницу. Начиная с требований ФФД 1.05, передача скидок отдельным реквизитом запрещена. Касса должна сразу получать конечную, уже рассчитанную цену позиции со всеми примененными скидками и округлениями.
Если старая обработка обслуживания в 1С пытается передать параметры скидки в методах драйвера, драйвер возвращает ошибку блокировки фискального накопителя.
Способы решения этой проблемы:
Способ А: Переход на ДТО 10. Самый правильный и перспективный путь. Драйверы 10-й линейки используют объектную модель передачи данных через JSON-задания, где скидки корректно транслируются и пересчитываются на стороне драйвера автоматически, исключая ошибки ФН.
Способ Б: Программное перераспределение сумм в 1С (без передачи скидок в ККТ). Если конфигурация УТ 10.3 сильно переписана и обновить драйвер или обработку обслуживания не представляется возможным, необходимо внести изменения в код конфигурации 1С. Нам нужно сделать так, чтобы в XML-пакет или в параметры фискализации передавалась уже скорректированная цена товара, а сумма скидки всегда приравнивалась к нулю.
Проанализируем пример доработки функции формирования чека. Обычно изменения вносятся в модуль обработки обслуживания ККТ или общий модуль работы с торговым оборудованием (процедура ПолучитьXMLПакетДляФискализацииЧека или аналогичная):
// Находим цикл обхода строк табличной части чека перед отправкой на ККТ
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
// Рассчитываем реальную цену одной единицы товара с учетом примененных скидок
Количество = СтрокаТовара.Количество;
Если Количество = 0 Тогда
Продолжить;
КонецЕсли;
// Вычисляем цену единицы делением итоговой суммы (которая уже уменьшена на скидку в 1С) на количество
ЦенаСоСкидкой = Окр(СтрокаТовара.Сумма / Количество, 2, РежимОкругления.Окр15как20);
// Записываем параметры позиции для передачи в драйвер ККТ
ПараметрыСтроки = Новый Структура;
ПараметрыСтроки.Вставить("Наименование", СтрокаТовара.Номенклатура.Наименование);
ПараметрыСтроки.Вставить("Количество", Количество);
// Передаем в кассу цену, которая уже включает в себя скидку
ПараметрыСтроки.Вставить("Цена", ЦенаСоСкидкой);
ПараметрыСтроки.Вставить("Сумма", СтрокаТовара.Сумма);
// КРИТИЧЕСКИ ВАЖНО: передаем значение скидки как 0, чтобы касса не пыталась ее регистрировать
ПараметрыСтроки.Вставить("Скидка", 0);
ПараметрыСтроки.Вставить("СтавкаНДС", СтрокаТовара.СтавкаНДС);
// Дальнейший код передачи сформированной строки в XML или OLE-драйвер...
КонецЦикла;
С помощью такого несложного изменения мы полностью исключаем конфликт драйвера АТОЛ с фискальным накопителем при работе со скидками, так как ККТ видит простую продажу товара по конечной цене.
Способ В: Изменение ФЛК (Форматно-логического контроля) в настройках 1С. В некоторых релизах УТ 10.3 в настройках параметров ККТ есть опция «Способ форматно-логического контроля». Попробуйте переключить этот параметр со значения «Контролировать» на значение «Разделять строки» или «Зачитывать суммы». Иногда это позволяет обойти проблему округления и скидок без прямого вмешательства в программный код.