При эксплуатации связки «1С:Торговля и склад 7.7» с фискальными регистраторами «Штрих» через терминальный доступ нередко возникает ситуация: в чеках вид оплаты отображается верно, однако при снятии Z-отчета (отчета с гашением) все продажи аккумулируются исключительно в графе «Наличные», а безналичная оплата оказывается нулевой. Разберем по шагам причины такого поведения, особенности взаимодействия платформы с драйверами торгового оборудования и практические способы устранения неисправности.
Для понимания корня проблемы проанализируем схему формирования и закрытия смены. Сам Z-отчет формируется не алгоритмами конфигурации 1С, а непосредственно внутренней микропрограммой фискального регистратора. При выполнении закрытия смены 1С лишь отправляет устройству команду на печать фискального отчета:
Функция ЗакрытьСмену(Объект, Пароль, НомерЛенты)
Рез = 0;
Если ПустоеЗначение(Объект) = 1 Тогда
ОписаниеРезультата = "устройство не подключено";
Иначе
// переключение в режим снятия отчета
Объект.Mode = 3;
Объект.Password = Пароль;
Объект.SetMode();
Если Объект.Результат = 0 Тогда
Объект.ТипОтчета = 1;
Объект.Отчет();
Если Объект.Результат = 0 Тогда
Объект.GetStatus();
НомерЛенты = глДополнитьСтрокуЛ(Строка(Объект.Session), "0", 4);
Рез = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции
Суммы по видам оплат накапливаются в регистрах фискального регистратора в течение всей смены в момент закрытия каждого отдельного чека. Если при печати чека драйвер или аппарат не сопоставили безналичный расчет с нужной секцией фискальной памяти, сумма по умолчанию попадает в первый тип оплаты (наличные средства).
Такой сбой чаще всего возникает после переустановки драйверов (например, при обновлении общего пакета драйверов торгового оборудования для настройки сканеров ШК). При этом параметры драйвера сбрасываются к значениям по умолчанию, очищая соответствие видов платежей.
Посмотрим на типовой алгоритм функции печати чека во внешней обработке обслуживания. Для передачи типа оплаты в драйверах используется свойство TypeClose:
Если Число(ПолученоПоКарте) > 0 Тогда
Объект.TypeClose = 3; // или другой номер безналичного типа, заданный в драйвере
Иначе
Объект.TypeClose = 0; // 0 - наличные
КонецЕсли;
Обратите внимание: частая логическая ошибка разработчиков заключается в жесткой проверке флага вида Если Число(ПолученоПоКарте) = 1 Тогда. Если в алгоритме из документа передается не признак (флаг), а реальная сумма оплаты по карте (например, 1500 рублей), такое условие возвратит ложь, в результате чего чек будет закрыт с типом 0 (наличные). Обязательно проверяйте условие на строгое превышение нуля: > 0.
Если в коде 1С свойство TypeClose передается корректно, причина кроется в отсутствии таблицы сопоставления в самом драйвере. Выполним настройку конфигурации оборудования под тем пользователем операционной системы, который фактически работает с кассой (в терминальной сессии кассира):
30).0 соответствует наличным расчетам. Найдем строку, соответствующую номеру из кода (в нашем примере TypeClose = 3), и пропишем наименование для безналичного типа (например, «Плат. картой» или «Безналичными»).После этой настройки при передаче команды закрытия чека драйвер корректно перенаправит сумму в соответствующий регистр фискального накопителя/памяти, и при снятии Z-отчета итоги разделятся по строкам «Наличные» и «Безналичные».
В типовой конфигурации «1С:Торговля и склад 7.7» механизм подключения торгового оборудования хранит имя используемой внешней обработки в общих константах информационной базы. Если в центральной базе через интерфейс одного магазина изменить файл обработки, настройка автоматически изменится для всех остальных торговых точек. Если в сети используются аппараты разных производителей или моделей, это приводит к конфликтам.
Для реализации независимой работы нескольких фискальных регистраторов на одном сервере применим следующие архитектурные подходы:
HKEY_CURRENT_USER. Каждый кассир должен подключаться под своим уникальным логином терминального сервера с фиксированным номером проброшенного COM-порта.КаталогПользователя().
ИмяКассира = ИмяПользователя();
Если Найти(ИмяКассира, "Магазин1") > 0 Тогда
Объект.TypeClose = 3;
ИначеЕсли Найти(ИмяКассира, "Магазин2") > 0 Тогда
Объект.TypeClose = 1;
КонецЕсли;
Использование связки «проверка передаваемых параметров в 1С + явное сопоставление типов в драйвере под сеансом кассира» гарантирует корректное накопление сумм в памяти кассового аппарата и безошибочную печать Z-отчетов.