При переходе на новые релизы программных продуктов семейства 1С пользователи и технические специалисты нередко сталкиваются со сбоями в работе торгового оборудования. Одним из таких критических сбоев стала ошибка закрытия кассовой смены на релизе конфигурации 1С:Управление торговлей 10.3.57.1. При попытке выполнить штатное закрытие смены система прерывает процесс и выдает системное сообщение:
Ошибка вызова метода <ОбъектДрайвера.ЗакрытьСмену>. Слишком много фактических параметров.
При этом сама кассовая смена на фискальном регистраторе (например, Штрих-М или Атол) фактически может закрыться (или распечатать Z-отчет), но в самой программе 1С статус смены не меняется, и документ «Отчет о розничных продажах» не формируется. В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия 1С с драйверами ККТ и предложим несколько вариантов решения этой проблемы — от официального патча до ручного исправления кода в конфигураторе.
Для того чтобы понять суть проблемы, нам необходимо обратиться к стандартам интеграции подключаемого оборудования, которые разрабатывает фирма 1С для взаимодействия конфигураций с внешними драйверами ККТ. В разных версиях требований к разработке драйверов метод ЗакрытьСмену принимает разное количество аргументов:
ЗакрытьСмену(ИДУстройства, ВходныеПараметры, ВыходныеПараметры, НомерСмены, НомерДокумента).ЗакрытьСмену(ИДУстройства, ВходныеПараметры, ВыходныеПараметры).В релизе 1С:Управление торговлей 10.3.57.1 разработчики обновили Библиотеку подключаемого оборудования (БПО), но допустили логическую ошибку при проверке условий версии драйвера ККТ. Давайте проанализируем фрагмент кода в общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент, где происходит вызов метода закрытия смены:
Если ПараметрыПодключения.РевизияИнтерфейса > 2001 Тогда // Версия стандарта 2.2 (ОФД 1.0.5/1.1)
Попытка
ПараметрыОперации = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляОперации(ВходныеПараметры);
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.0.5/1.1)
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния);
Иначе
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния, НомерСмены, НомерДокумента);
КонецЕсли;
Рассмотрим эту ситуацию детально. Современные сертифицированные драйверы ККТ (включая популярные версии драйверов Штрих-М и Атол) используют стандарт интеграции версии 2.5, возвращая в платформу значение ревизии интерфейса, равное 2005.
При выполнении вышеуказанного кода программа проверяет условие: равен ли показатель РевизияИнтерфейса числу 3000 или более? Так как 2005 меньше 3000, выполнение программы переходит в ветку Иначе. В этой ветке код пытается передать драйверу ККТ 5 параметров вместо 3. Поскольку драйвер версии 2.5 строго ожидает только 3 параметра, происходит аварийное завершение транзакции с системной ошибкой переполнения фактических параметров.
Данная проблема была официально признана разработчиками 1С и зарегистрирована под кодом ошибки 00-00261739.
---
Самый надежный и правильный способ решения проблемы — это обновление вашей информационной базы. Фирма 1С оперативно исправила данную ошибку, выпустив технический релиз 10.3.57.2 буквально через несколько дней после обнаружения бага.
Если у вас установлена типовая конфигурация, находящаяся на стандартной поддержке, выполните следующие действия:
1cv8.upd и завершите процесс обновления, следуя подсказкам помощника.---
Если ваша конфигурация «Управление торговлей» сильно доработана, находится на нетиповой поддержке, и оперативно обновить ее до версии 10.3.57.2 не представляется возможным, вы можете исправить программный код вручную. Это займет не более 5 минут.
Разберем процесс исправления по шагам:
ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ЗакрытьСмену. Для быстрого поиска нажмите клавиши Ctrl + F и введите текст: ОбъектДрайвера.ЗакрытьСмену.2005 (стандарт 2.5) метод также вызывался с тремя параметрами. Измените код следующим образом:Было:
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.0.5/1.1)
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния);
Иначе
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния, НомерСмены, НомерДокумента);
КонецЕсли;
Стало (исправленный вариант):
Если (ПараметрыПодключения.РевизияИнтерфейса >= 3000) Или (ПараметрыПодключения.РевизияИнтерфейса = 2005) Тогда
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния);
Иначе
Результат = ОбъектДрайвера.ЗакрытьСмену(ПараметрыПодключения.ИДУстройства, ПараметрыОперации, ПараметрыСостояния, НомерСмены, НомерДокумента);
КонецЕсли;
После изменения кода сохраните конфигурацию (клавиша F7) и запустите 1С:Предприятие. Теперь при попытке закрытия смены система корректно распознает ревизию интерфейса 2005 и вызовет метод с тремя параметрами.
---
Если у вас нет возможности вносить изменения в конфигурацию (например, используется базовая версия программы, не позволяющая редактировать код общего модуля), можно обойти ошибку с помощью понижения версии (даунгрейда) драйвера самой кассы.
Поскольку ошибка возникает из-за того, что современный установленный в системе драйвер ККТ сообщает платформе 1С о поддержке ревизии интерфейса 2005, мы можем установить более старую версию драйвера производителя оборудования (Штрих-М или Атол), которая работает по стандарту интеграции версии 2.2 и возвращает ревизию 2001 или 2002.
В этом случае платформа 1С отработает по ветке Иначе, передаст все 5 параметров, и старый драйвер примет их без ошибок.
Важное предупреждение: Использование устаревших драйверов ККТ может повлечь за собой проблемы с поддержкой новых реквизитов маркировки продукции (например, кодов маркировки систем «Честный Знак») или новых форматов фискальных данных (ФФД 1.2). Используйте данный метод исключительно как временную меру для экстренного закрытия текущей смены.
---
Обратите внимание, что в релизе 10.3.57.1 также изменилась сигнатура серверного метода разбора XML-пакета фискальных данных. В строке вызова функции ПолучитьПараметрыСменыИзXMLПакета появился новый третий параметр:
ФискальныеДанныеСтруктура = МенеджерОборудованияВызовСервера.ПолучитьПараметрыСменыИзXMLПакета(ПараметрыСостояния, НомерСмены, ПараметрыПодключения.РевизияИнтерфейса);
Если после исправления вызова метода ЗакрытьСмену вы столкнетесь с ошибками при чтении параметров закрытой смены, убедитесь, что в коде общего модуля передаются все три параметра для корректной идентификации XML-пакета. При использовании ручного исправления кода по Способу 2, все фискальные данные будут корректно расшифрованы платформой автоматически.