При работе в режиме рабочего места кассира (РМК) в конфигурации 1С:Розница или 1С:Управление торговлей часто встречается ситуация, когда учет ведется по двум организациям одновременно. В этом случае система должна распределять товарные позиции по разным кассовым аппаратам (ККТ). Однако иногда возникает критическая ошибка: «Сумма товарных позиций больше суммы оплат». Особенность проблемы заключается в ее «плавающем» характере — она может проявляться несколько раз в день или отсутствовать неделями.
В данной статье мы подробно разберем причины возникновения этой ошибки, проанализируем программный код и определим шаги по устранению неисправности, основываясь на практическом опыте специалистов.
Для начала выясним, где именно в коде 1С происходит проверка, вызывающая данное сообщение. Опытным путем установлено, что обработка этой ошибки выполняется в общем модуле ФорматноЛогическийКонтрольВызовСервера. Проанализируем процедуру ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов. В момент вызова этой процедуры данные для печати уже сформированы в структуру Параметры.
Ошибка возникает из-за того, что таблица оплат (Параметры.ТаблицаОплат) оказывается пустой или заполненной не полностью для одной из организаций, хотя фактически оплата по эквайринговому терминалу прошла успешно. Система видит товарную часть, но «теряет» связь с объектом оплаты в оперативной памяти.
Поскольку ошибку невозможно воспроизвести стабильно, мы применим метод сбора отладочных данных в реальном времени. Рассмотрим, как реализовать механизм логирования параметров чека непосредственно перед возникновением ошибки. Создадим расширение и перехватим процедуру проверки.
Рекомендуем добавить следующий фрагмент кода для сохранения состояния объектов в текстовый файл или журнал регистрации:
Процедура Расш1_ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов(Параметры, ...)
// Проверяем, если таблица оплат пустая при наличии товарных позиций
Если Параметры.ТаблицаОплат.Количество() = 0 И Параметры.ТаблицаТоваров.Количество() > 0 Тогда
ТекстЛога = "Ошибка оплат: " + ТекущаяДата() + Символы.ПС;
ТекстЛога = ТекстЛога + "Организация: " + Параметры.Организация + Символы.ПС;
ТекстЛога = ТекстЛога + "Сумма по товарам: " + Параметры.ТаблицаТоваров.Итог("Сумма") + Символы.ПС;
// Сериализуем структуру для детального анализа
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Параметры);
ТекстЛога = ТекстЛога + ЗаписьXML.Закрыть();
// Записываем в файл на диске
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстЛога);
ТекстовыйДокумент.Записать("C:\Logs\Error1C_KKT.log", КодировкаТекста.UTF8);
КонецЕсли;
КонецПроцедуры
Анализ такого лога позволит выяснить, в какой момент очищается ТаблицаОплат: была ли она пустой изначально при передаче из формы РМК или данные потерялись в процессе распределения между ККТ.
Часто параллельно с основной ошибкой возникает сообщение драйвера ККТ Штрих-М: «FFFFFF8h, Out of memory». Это указывает не на нехватку оперативной памяти компьютера, а на переполнение внутреннего буфера драйвера при работе через интерфейс RNDIS. Рассмотрим шаги по стабилизации связи:
Тайм-аут в значение не менее 1000–2000 мс. При использовании двух касс на одной шине USB стандартных 300 мс может быть недостаточно.Так как одна из касс подключена через виртуальный COM-порт, а вторая через RNDIS (эмуляция сетевого адаптера), критически важно исключить кратковременные разрывы связи, которые «сбивают» логику 1С. Проанализируем настройки операционной системы:
Зайдем в Диспетчер устройств, найдем USB-концентраторы и сетевой адаптер ККТ. В свойствах на вкладке «Управление электропитанием» обязательно снимем галочку «Разрешить отключение этого устройства для экономии энергии». Если ОС на мгновение «усыпляет» адаптер RNDIS, 1С теряет контекст оплаты, и при попытке напечатать чек мы получаем пустую таблицу оплат.
Иногда сумма товарных позиций превышает сумму оплат всего на одну копейку из-за математических округлений при распределении скидки между двумя чеками разных организаций. Разберем, как это лечится:
Проанализируем настройки в 1С: перейдем в настройки ККМ и убедимся, что алгоритм округления в программе совпадает с настройками в самой ККТ (через таблицу параметров драйвера). Рекомендуется устанавливать «Округление в пользу покупателя», чтобы сумма оплат всегда была равна или чуть больше (на доли копейки) суммы товарных строк, что допустимо для драйвера, в отличие от обратной ситуации.
Проанализировав ситуацию, можно сделать вывод, что наиболее эффективным решением является комплексный подход:
1С:Розница до актуального релиза (проблема часто исправляется производителем в рамках обновления логики РМК).Если после выполнения этих действий ошибка сохраняется, воспользуйтесь методом логирования через СериализаторXDTO, описанным в первом методе, чтобы поймать конкретный набор товаров и оплат, вызывающий сбой. Это позволит понять, не является ли причиной специфический способ оплаты (например, частичная оплата бонусами и картой), который некорректно обрабатывается в коде вашей доработанной конфигурации.