В процессе эксплуатации учетных систем на базе 1С:УПП (Управление производственным предприятием) после планового обновления конфигурации до версии 1.3.202.1 многие пользователи столкнулись с критической проблемой при работе с торговым оборудованием. Суть ошибки заключается в том, что при попытке пробить фискальный чек из документа Приходный кассовый ордер (ПКО) или Оплата от покупателя платежной картой, сформированных на основании реализации, чек аннулируется кассовым аппаратом. При этом в печатной форме (или в данных, передаваемых на ККТ) напротив каждой позиции номенклатуры проставляется полная сумма всего документа, а не стоимость конкретной позиции.
Разберем детально, почему это происходит, проанализируем программный код «виновных» модулей и рассмотрим шаги, которые помогут восстановить корректную работу розничных продаж и приема оплат.
Проанализируем ситуацию со стороны оборудования. Большинство современных онлайн-касс (например, популярные модели Атол 30Ф) выполняют жесткий логический контроль данных перед фискализацией. Если в чеке указано три позиции по 1000 рублей каждая, а итоговая сумма документа составляет те же 1000 рублей, касса зафиксирует математическое расхождение: Сумма строк (3000) != Итог чека (1000). В такой ситуации драйвер ККТ выдает ошибку, и операция аннулируется, чтобы не допустить нарушения правил ведения кассовых операций.
В релизе 1.3.202.1 ошибка носит чисто алгоритмический характер в коде конфигурации. Программа при формировании структуры данных для чека ошибочно присваивает каждой строке значение реквизита Всего из документа основания. Посмотрим, где именно в конфигурации скрывается этот недочет.
Рассмотрим изменения в общем модуле МенеджерОборудованияВызовСервера. Именно здесь сосредоточена логика подготовки данных перед их отправкой на драйвер подключаемого оборудования. Сравнение с предыдущими версиями показывает, что модификации подверглись следующие процедуры:
ЗаполнитьПоНовомуЗаполнитьТоварнуюСтрокуЧекаВ этих процедурах разработчики пытались оптимизировать распределение оплат для соответствия требованиям ФФД (формата фискальных данных) в части признаков способа расчета (предоплата, аванс, полный расчет). Однако при расчете переменной, отвечающей за сумму строки, была допущена ошибка в цикле обхода табличной части. Вместо того чтобы вычислять долю оплаты для каждой позиции, алгоритм приравнивал цену/сумму строки к общему итогу документа.
Рассмотрим пример ошибочной логики (схематично), которая могла привести к подобному результату в МенеджерОборудованияВызовСервера:
// Фрагмент, где могла быть допущена ошибка распределения
Для Каждого СтрокаТЧ Из ТаблицаТоваров Цикл
// Ошибочный алгоритм присваивал СуммуДокумента напрямую
СтруктураЧека.Сумма = ОбъектОснование.СуммаДокумента;
// Вместо пропорционального распределения:
// СтруктураЧека.Сумма = (СтрокаТЧ.Сумма / ИтогТЧ) * СуммаОплаты;
КонецЦикла;
Самый надежный и правильный метод — это обновление конфигурации до актуального релиза. Фирма «1С» оперативно выпустила исправление в экстренном релизе 1.3.202.2. В данном обновлении содержимое модуля МенеджерОборудованияВызовСервера было приведено в порядок, а ошибки в распределении сумм устранены.
Проанализируем порядок действий при обновлении:
МенеджерОборудованияВызовСервера процедуры расчета сумм соответствуют эталонным.Если ваша конфигурация сильно кастомизирована и быстрое обновление на новый релиз невозможно, можно прибегнуть к временному исправлению кода («хотфикс»). Для этого нам понадобится сравнить текущий модуль с модулем из стабильного релиза (например, 1.3.201.1).
Выполним следующие шаги:
МенеджерОборудованияВызовСервера.ЗаполнитьПоНовому и ЗаполнитьТоварнуюСтрокуЧека.Пример корректного подхода к заполнению строки чека, который должен быть в исправленной версии:
Процедура ЗаполнитьТоварнуюСтрокуЧека(ПараметрыЧека, ТекущаяСтрока, СуммаВсего, ДоляОплаты)
// Вычисляем корректную сумму для строки чека с учетом доли оплаты
СуммаСтроки = Окр(ТекущаяСтрока.Сумма * ДоляОплаты, 2, 1);
// Передаем данные в структуру для ККТ
НоваяСтрока = ПараметрыЧека.ПозицииЧека.Добавить();
НоваяСтрока.Наименование = ТекущаяСтрока.Номенклатура.Наименование;
НоваяСтрока.Количество = ТекущаяСтрока.Количество;
НоваяСтрока.Цена = СуммаСтроки / ТекущаяСтрока.Количество;
НоваяСтрока.Сумма = СуммаСтроки;
КонецПроцедуры
При возникновении подобных ошибок также полезно проверить версию драйвера торгового оборудования. Хотя в данном случае проблема признана программной со стороны 1С, стабильная работа ФР часто зависит от связки «Релиз конфигурации — Версия обработки обслуживания — Драйвер». Для Атол рекомендуется использовать актуальные версии драйверов 10-й ветки (например, 10.10.x), так как они более информативно сообщают о причинах аннулирования чека, выводя текст ошибки «Сумма всех типов оплаты меньше итога чека».
Подведем итог: если вы столкнулись с аннулированием чеков в УПП 1.3.202.1, не спешите менять кассу или переустанавливать драйверы. Проверьте суммы в логе драйвера ККТ. Если вы видите, что по каждой строке идет полная сумма документа — немедленно обновляйтесь до 1.3.202.2 или откатывайте общий модуль управления оборудованием.