Как исправить ошибку «Сумма товарных позиций больше суммы оплат» в 1С при работе с двумя ККТ

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При работе в режиме рабочего места кассира (РМК) в конфигурации 1С:Розница или 1С:Управление торговлей часто встречается ситуация, когда учет ведется по двум организациям одновременно. В этом случае система должна распределять товарные позиции по разным кассовым аппаратам (ККТ). Однако иногда возникает критическая ошибка: «Сумма товарных позиций больше суммы оплат». Особенность проблемы заключается в ее «плавающем» характере — она может проявляться несколько раз в день или отсутствовать неделями.

В данной статье мы подробно разберем причины возникновения этой ошибки, проанализируем программный код и определим шаги по устранению неисправности, основываясь на практическом опыте специалистов.

Анализ программной причины ошибки

Для начала выясним, где именно в коде 1С происходит проверка, вызывающая данное сообщение. Опытным путем установлено, что обработка этой ошибки выполняется в общем модуле ФорматноЛогическийКонтрольВызовСервера. Проанализируем процедуру ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов. В момент вызова этой процедуры данные для печати уже сформированы в структуру Параметры.

Ошибка возникает из-за того, что таблица оплат (Параметры.ТаблицаОплат) оказывается пустой или заполненной не полностью для одной из организаций, хотя фактически оплата по эквайринговому терминалу прошла успешно. Система видит товарную часть, но «теряет» связь с объектом оплаты в оперативной памяти.

Метод 1: Диагностика через расширение и логирование

Поскольку ошибку невозможно воспроизвести стабильно, мы применим метод сбора отладочных данных в реальном времени. Рассмотрим, как реализовать механизм логирования параметров чека непосредственно перед возникновением ошибки. Создадим расширение и перехватим процедуру проверки.

Рекомендуем добавить следующий фрагмент кода для сохранения состояния объектов в текстовый файл или журнал регистрации:


Процедура Расш1_ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов(Параметры, ...)
    // Проверяем, если таблица оплат пустая при наличии товарных позиций
    Если Параметры.ТаблицаОплат.Количество() = 0 И Параметры.ТаблицаТоваров.Количество() > 0 Тогда
        ТекстЛога = "Ошибка оплат: " + ТекущаяДата() + Символы.ПС;
        ТекстЛога = ТекстЛога + "Организация: " + Параметры.Организация + Символы.ПС;
        ТекстЛога = ТекстЛога + "Сумма по товарам: " + Параметры.ТаблицаТоваров.Итог("Сумма") + Символы.ПС;
        
        // Сериализуем структуру для детального анализа
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Параметры);
        ТекстЛога = ТекстЛога + ЗаписьXML.Закрыть();
        
        // Записываем в файл на диске
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        ТекстовыйДокумент.УстановитьТекст(ТекстЛога);
        ТекстовыйДокумент.Записать("C:\Logs\Error1C_KKT.log", КодировкаТекста.UTF8);
    КонецЕсли;
КонецПроцедуры

Анализ такого лога позволит выяснить, в какой момент очищается ТаблицаОплат: была ли она пустой изначально при передаче из формы РМК или данные потерялись в процессе распределения между ККТ.

Метод 2: Устранение проблем драйвера и ошибки «Out of memory»

Часто параллельно с основной ошибкой возникает сообщение драйвера ККТ Штрих-М: «FFFFFF8h, Out of memory». Это указывает не на нехватку оперативной памяти компьютера, а на переполнение внутреннего буфера драйвера при работе через интерфейс RNDIS. Рассмотрим шаги по стабилизации связи:

  1. Обновление драйвера: Версии драйверов ниже 4.15 имеют известные проблемы с утечкой памяти в многопоточном режиме (когда две организации обращаются к драйверу одновременно). Рекомендуем установить версию 5.16 или выше.
  2. Настройка тайм-аутов: В «Тесте драйвера» необходимо увеличить время ожидания ответа от ККТ. Установите параметр Тайм-аут в значение не менее 1000–2000 мс. При использовании двух касс на одной шине USB стандартных 300 мс может быть недостаточно.
  3. Служба ShtrihM_Proxy: Если вы используете прокси-службу для распределенного доступа, настройте ее перезапуск через планировщик Windows один раз в сутки (ночью). Это предотвратит накопление критических ошибок в памяти сессии.

Метод 3: Настройка электропитания и сетевых интерфейсов

Так как одна из касс подключена через виртуальный COM-порт, а вторая через RNDIS (эмуляция сетевого адаптера), критически важно исключить кратковременные разрывы связи, которые «сбивают» логику 1С. Проанализируем настройки операционной системы:

Зайдем в Диспетчер устройств, найдем USB-концентраторы и сетевой адаптер ККТ. В свойствах на вкладке «Управление электропитанием» обязательно снимем галочку «Разрешить отключение этого устройства для экономии энергии». Если ОС на мгновение «усыпляет» адаптер RNDIS, 1С теряет контекст оплаты, и при попытке напечатать чек мы получаем пустую таблицу оплат.

Метод 4: Проверка округления и скидок

Иногда сумма товарных позиций превышает сумму оплат всего на одну копейку из-за математических округлений при распределении скидки между двумя чеками разных организаций. Разберем, как это лечится:

Проанализируем настройки в 1С: перейдем в настройки ККМ и убедимся, что алгоритм округления в программе совпадает с настройками в самой ККТ (через таблицу параметров драйвера). Рекомендуется устанавливать «Округление в пользу покупателя», чтобы сумма оплат всегда была равна или чуть больше (на доли копейки) суммы товарных строк, что допустимо для драйвера, в отличие от обратной ситуации.

Заключение и итоговое решение

Проанализировав ситуацию, можно сделать вывод, что наиболее эффективным решением является комплексный подход:

  1. Обновление конфигурации 1С:Розница до актуального релиза (проблема часто исправляется производителем в рамках обновления логики РМК).
  2. Переход на современную версию драйвера Штрих-М (5.16+).
  3. Отключение функций энергосбережения для портов USB.

Если после выполнения этих действий ошибка сохраняется, воспользуйтесь методом логирования через СериализаторXDTO, описанным в первом методе, чтобы поймать конкретный набор товаров и оплат, вызывающий сбой. Это позволит понять, не является ли причиной специфический способ оплаты (например, частичная оплата бонусами и картой), который некорректно обрабатывается в коде вашей доработанной конфигурации.

← На главную