При формировании фискальных чеков по требованиям 54-ФЗ на фискальных регистраторах (например, АТОЛ 11Ф) разработчики часто сталкиваются с ситуацией, когда итоговая сумма чека или сумма НДС расходится с первичным документом учетной системы на несколько копеек. Особенно остро эта проблема проявляется в конфигурациях на платформе 1С:Предприятие 7.7 при передаче построчной номенклатуры.
Разберем причины возникновения таких ошибок и рассмотрим проверенные алгоритмы их устранения в коде учетной системы.
Проанализируем математическую и нормативную основу формирования чека:
Сумма = Округление(Цена * Количество). В кассу передается цена за единицу товара с учетом всех скидок и НДС. Если цена получается дробной (с тысячными долями), кассовый драйвер округляет ее до копеек, после чего умножает на количество, что дает погрешность в итоговой сумме.СуммаБезНДС * СтавкаНДС), а цена хранится без НДС. Попытка восстановить цену с НДС простым делением общей суммы строки на количество приводит к появлению периодических дробей.Рассмотрим правильную логику подготовки данных перед отправкой в драйвер фискального регистратора. Главный принцип: базовой и неизменной величиной является финальная сумма строки с НДС.
ЦенаСНДС = Округление(СуммаСНДС / Количество, 2).ЦенаСНДС * Количество. Если произведение не равно СуммаСНДС, используем алгоритм разбиения строк (Split Lines).СуммаПодстроки * 18 / 118 или СуммаПодстроки * 10 / 110), а не накапливаем сложением копеек от каждой штуки.Рассмотрим ситуацию: покупатель берет 3 единицы товара на общую сумму 100 рублей. Простое деление дает цену 33.3333... рубля. Если передать кассе цену 33.33 руб., то сумма чека составит 99.99 руб., возникнет расхождение на 1 копейку.
Чтобы избежать ошибки кассового драйвера, строку разбивают на две подстроки с разной ценой:
Количество - 1 (2 шт.) по цене 33.33 руб. = 66.66 руб.1 шт. по цене 33.34 руб. = 33.34 руб.66.66 + 33.34 = 100.00 руб. Соотношение Цена * Количество = Сумма соблюдено для обеих строк.Посмотрим на практическую реализацию выборки номенклатуры из связанной базы 1С 7.7 через OLE-соединение для формирования таблицы печати чека:
V7 = CreateObject("V77.Application");
Открыта = V7.Initialize(V7.RMTrade, "/d" + Путь + " /N" + Пользователь + " /P" + Пароль, "NO_SPLASH_SHOW");
Если Открыта = 0 Тогда
Предупреждение("Ошибка открытия информационной базы");
Возврат;
Иначе
Если ВидДокументаОснования = 1 Тогда
Импорт = V7.CreateObject("Документ.Счет");
ИначеЕсли ВидДокументаОснования = 2 Тогда
Импорт = V7.CreateObject("Документ.РасходнаяНакладная");
КонецЕсли;
КонецЕсли;
Если Импорт.НайтиДокумент(ВыбДокумент) = 1 Тогда
Импорт.ВыбратьСтроки();
Пока Импорт.ПолучитьСтроку() = 1 Цикл
ВсегоКоличество = Импорт.Количество;
ВсегоСуммаСНДС = Импорт.СуммаВКлНДС; // Итоговая сумма строки с учетом скидок и НДС
ЦенаБазовая = Окр(ВсегоСуммаСНДС / ВсегоКоличество, 2);
СуммаПоБазовойЦене = ЦенаБазовая * ВсегоКоличество;
Дельта = ВсегоСуммаСНДС - СуммаПоБазовойЦене;
Если (Дельта <> 0) И (ВсегоКоличество > 1) Тогда
// Разбиваем строку на две части
// 1. Основное количество
Список.НоваяСтрока();
Список.ТовНаим = СокрЛП(Импорт.Товар.Наименование);
Список.Количество = ВсегоКоличество - 1;
Список.Цена = ЦенаБазовая;
Список.Сумма = ЦенаБазовая * (ВсегоКоличество - 1);
Список.СтавкаНДС = Импорт.Товар.СтавкаНДС.Получить(Импорт.ДатаДок).Ставка;
// 2. Строка с компенсацией копеек
Список.НоваяСтрока();
Список.ТовНаим = СокрЛП(Импорт.Товар.Наименование);
Список.Количество = 1;
Список.Цена = ЦенаБазовая + Дельта;
Список.Сумма = ЦенаБазовая + Дельта;
Список.СтавкаНДС = Импорт.Товар.СтавкаНДС.Получить(Импорт.ДатаДок).Ставка;
Иначе
Список.НоваяСтрока();
Список.ТовНаим = СокрЛП(Импорт.Товар.Наименование);
Список.Количество = ВсегоКоличество;
Список.Цена = ЦенаБазовая;
Список.Сумма = ВсегоСуммаСНДС;
Список.СтавкаНДС = Импорт.Товар.СтавкаНДС.Получить(Импорт.ДатаДок).Ставка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для платформы 1С 7.7 фирмой «1С» были выпущены типовые интеграционные модули для работы с онлайн-кассами (в частности, в конфигурациях «Торговля и Склад 7.7»):
FprnM1C82_54FZ.dll.frATOL54_comm.ert.Использование актуальных сертифицированных библиотек и драйверов ДТО 10 позволяет переложить валидацию фискальных параметров на специализированный компонент и исключить ошибки несоответствия итогов документа и чека.