При обновлении кассового оборудования и переходе на новые форматы фискальных данных (ФФД 1.05 и выше) технические специалисты и бухгалтеры часто сталкиваются с загадочным поведением программы. Вместо привычного текста ошибки платформа «1С:Предприятие» может выдать на экран непонятную последовательность символов, напоминающую «эльфийские руны»: РкРцРГСЪР:Р1РёР»СЬЬР5С<PUtP-PTTCbPfeCf. Проанализируем эту ситуацию, выясним ее истинные причины и подробно разберем по шагам, как исправить как саму кодировку, так и логическую ошибку расхождения сумм в чеке.
Рассмотрим подробнее природу появления странных символов. Искажение текста вида РкРцРГСЪР... — это классический признак несовпадения кодировок при передаче данных между 1С, драйвером ККТ (контрольно-кассовой техники) и операционной системой.
Выясним причину доминирования заглавных букв «Р» и «С» в этой абракадабре. Современные драйверы ККТ и библиотека подключаемого оборудования 1С обмениваются данными в формате XML или JSON, используя универсальную кодировку UTF-8. В этой кодировке все русские символы записываются двумя байтами. Первый байт для большинства кириллических символов (от заглавной «А» до строчной «п») — это байт 0xD0. Если этот двухбайтовый поток UTF-8 прочитать в старой однобайтовой кодировке Windows-1251 (CP1251), то байт 0xD0 отобразится как заглавная буква «Р».
Для строчных букв от «р» до «я» первый байт в UTF-8 равен 0xD1, что в Windows-1251 превращается в заглавную букву «С». Именно по этой причине искаженный текст ошибки практически полностью состоит из слогов, начинающихся на «Р» и «С». Загадочная фраза автора РкРцРГСЪР... — это не что иное, как искаженная кодировкой фраза «Сумма всех оплат меньше стоимости товаров».
Разберем по шагам, как решить проблему с кодировкой, чтобы 1С корректно отображала системные сообщения от кассового аппарата:
Теперь, когда мы научились понимать язык кассы, проанализируем первопричину сбоя. Почему кассовый аппарат под управлением ФФД 1.05 отказывается пробивать чек, сообщая, что сумма оплат меньше стоимости товаров?
Дело в том, что начиная с формата ФФД 1.05 касса стала значительно строже контролировать математические расчеты в чеке. Каждая позиция номенклатуры должна быть четко рассчитана по формуле: Цена * Количество - Скидка = Итог по строке. Сумма всех строк должна до копейки совпадать с итоговой суммой оплат, переданных из 1С. Выделим две основные причины возникновения этой ошибки.
Посмотрим на пример. Предположим, покупатель приобретает 3 единицы товара общей стоимостью 100 рублей, и на весь чек применяется скидка 10%. Итоговая сумма к оплате составляет 90 рублей. 1С пытается распределить эту скидку поровну на каждую позицию товара. При делении 90 рублей на 3 позиции мы получаем ровные числа. Но что если сумма до скидки была другой, и при делении возникли бесконечные дробные копейки?
Алгоритмы округления в 1С и в математическом сопроцессоре самой кассы могут незначительно различаться. Если 1С передаст на кассу округленные до двух знаков цены по каждой строке, сумма которых в итоге составит 89.99 рублей, а в поле «Получено/Оплата» передаст ровно 90.00 рублей, касса заблокирует операцию. Для ККТ это означает, что покупатель пытается заплатить больше, чем стоит товар по строкам чека (или наоборот, если копейка округлилась в другую сторону).
Разберем методы устранения этой погрешности:
Для разработчиков, изменяющих типовые конфигурации, приведем пример кода, распределяющего скидку без накопления погрешности округления:
// Алгоритм распределения скидки с корректировкой последней строки
Процедура РаспределитьСкидкуБезПогрешностей(ТаблицаТоваров, ОбщаяСкидка)
ОстатокСкидки = ОбщаяСкидка;
ВсегоСтрок = ТаблицаТоваров.Количество();
Индекс = 0;
Для Каждого Строка Из ТаблицаТоваров Цикл
Индекс = Индекс + 1;
Если Индекс = ВсегоСтрок Тогда
// Последней строке отдаем весь оставшийся хвост
Строка.СуммаСкидки = ОстатокСкидки;
Иначе
ВычисленнаяСкидка = Округлить(ОбщаяСкидка * (Строка.Сумма / ИтоговаяСуммаДокумента), 2);
Строка.СуммаСкидки = ВычисленнаяСкидка;
ОстатокСкидки = ОстатокСкидки - ВычисленнаяСкидка;
КонецЕсли;
// Корректируем конечную сумму строки для передачи в ККТ
Строка.Сумма = Строка.Сумма - Строка.СуммаСкидки;
КонецЦикла;
КонецПроцедуры
В ФФД 1.05 платежи строго делятся по признакам способа расчета: наличные, безналичные, аванс, предоплата, кредит. Если клиент совершает покупку на сумму 10 000 рублей, при этом 3 000 рублей он оплатил ранее в качестве аванса, а сейчас доплачивает картой 7 000 рублей, то в кассу должны быть переданы два типа оплаты одновременно.
Если в 1С неправильно настроено сопоставление типов оплат ККТ или нарушена цепочка документов, программа может отправить на кассу команду пробития чека на товар стоимостью 10 000 рублей, но указать только одну оплату безналичными в размере 7 000 рублей. Касса мгновенно обнаружит нестыковку (не хватает 3 000 рублей зачета аванса) и выдаст ошибку о том, что сумма всех оплат меньше стоимости товаров.
Проанализируем ситуацию и выполним следующие действия для исправления:
Выполнение этих комплексных мер позволит навсегда избавиться от непонятных символов на экране и обеспечит стабильную, бесперебойную работу кассового узла при расчетах с покупателями.