При переходе на новые форматы фискальных данных (ФФД 1.05 и выше) перед разработчиками и бухгалтерами встала важная задача: правильно отражать авансы, предоплаты и последующую отгрузку товаров. Просто написать в текстовом наименовании позиции «Предоплата за товар» теперь недостаточно. Согласно требованиям 54-ФЗ, кассовый аппарат должен строго идентифицировать тип операции по специальным фискальным тегам.
В этой статье мы подробно разберем, как решить эту задачу в системе 1С:Предприятие 7.7 при работе с популярным фискальным регистратором АТОЛ 30Ф. Мы рассмотрим логику работы с драйверами АТОЛ ДТО 8 (на котором написана большая часть старых обработок) и современным ДТО 10, а также приведем готовые примеры кода для внедрения в ваши конфигурации.
Если касса при печати чека выводит «Полный расчет» вместо «Предоплата», это означает, что драйверу ККТ не были переданы специальные фискальные признаки для конкретной позиции чека. Начиная с ФФД 1.05, за это отвечают два ключевых реквизита:
1 — Предоплата 100% (полная предварительная оплата до момента передачи товара).2 — Предоплата (частичная предварительная оплата до момента передачи товара).3 — Аванс (когда деньги принимаются, но конкретный список товаров или услуг еще не определен).4 — Полный расчет (оплата в момент передачи товара, значение по умолчанию).1 — Товар (используется при предоплате за конкретную номенклатурную позицию).10 — Платеж / Выплата / Аванс (используется при оформлении общего аванса).Давайте выясним, как передать эти теги в фискальный регистратор программным путем.
Рассмотрим структуру кода, который используется во многих конфигурациях 1С 7.7. Взаимодействие с кассой происходит через OLE-объект драйвера АТОЛ ДТО 8. Чтобы передать теги 1214 и 1212, нам необходимо установить свойства PaymentMode (признак способа расчета) и ItemType (признак предмета расчета) непосредственно перед вызовом метода Registration() или Return() для каждой товарной позиции в цикле.
Проанализируем ситуацию на примере доработки стандартного цикла печати чека из обработки обслуживания. Мы добавим условия, которые будут определять тип оплаты на основе данных нашей учетной системы.
// Предположим, у нас есть СписокТоваров с колонками: ТовНаим, Цена, Количество, СтавкаНДС, ТипРасчета
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
Объект.Name = СписокТоваров.ТовНаим;
Объект.Price = СписокТоваров.Цена;
Объект.Quantity = СписокТоваров.Количество;
// Определение признака способа расчета (Тег 1214) и предмета расчета (Тег 1212)
Если СписокТоваров.ТипРасчета = "Предоплата100" Тогда
Объект.PaymentMode = 1; // Предоплата 100%
Объект.ItemType = 1; // Товар
ИначеЕсли СписокТоваров.ТипРасчета = "ПредоплатаЧастичная" Тогда
Объект.PaymentMode = 2; // Предоплата
Объект.ItemType = 1; // Товар
ИначеЕсли СписокТоваров.ТипРасчета = "Аванс" Тогда
Объект.PaymentMode = 3; // Аванс
Объект.ItemType = 10; // Платеж / Аванс
Иначе
// Обычная продажа (Полный расчет)
Объект.PaymentMode = 4; // Полный расчет
Объект.ItemType = 1; // Товар
КонецЕсли;
// Установка ставки НДС
Если СписокТоваров.СтавкаНДС = "none" Тогда
Объект.TaxTypeNumber = 4;
ИначеЕсли СписокТоваров.СтавкаНДС = "20" Тогда
Объект.TaxTypeNumber = 3;
ИначеЕсли СписокТоваров.СтавкаНДС = "10" Тогда
Объект.TaxTypeNumber = 2;
ИначеЕсли СписокТоваров.СтавкаНДС = "0" Тогда
Объект.TaxTypeNumber = 1;
КонецЕсли;
// Регистрация позиции
Если ПризнВозврата = 0 Тогда
Если Объект.Registration() <> 0 Тогда
ОписаниеРезультата = Объект.ResultDescription;
Возврат 0;
КонецЕсли;
Иначе
Если Объект.Return() <> 0 Тогда
ОписаниеРезультата = Объект.ResultDescription;
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Важный нюанс: Обратите внимание, что свойства PaymentMode и ItemType должны устанавливаться заново для каждой позиции чека внутри цикла, иначе драйвер применит значения по умолчанию или сохранит параметры предыдущей строки чека.
Согласно требованиям фискального законодательства РФ, при работе по предоплате вы обязаны пробить два документа:
PaymentMode = 2 (Предоплата) или 1 (Предоплата 100%). Способ оплаты в конце чека указывается как наличные или безналичные.PaymentMode = 4 (Полный расчет), а способ оплаты в конце чека указывается как зачет аванса (в драйвере АТОЛ за это отвечает свойство TypeClose).Рассмотрим, как реализовать закрытие чека в 1С 7.7 при зачете предоплаты. Посмотрим на пример кода, отвечающего за проведение оплаты в ККТ:
// Ввод оплаты в зависимости от ее типа
Если Док.ПолученоНаличными <> 0 Тогда
Объект.TypeClose = 0; // Наличные
Объект.Summ = Док.ПолученоНаличными;
Объект.Payment();
КонецЕсли;
Если Док.ПолученоПоБанку <> 0 Тогда
Объект.TypeClose = 1; // Безналичные (Электронные)
Объект.Summ = Док.ПоБанку;
Объект.Payment();
КонецЕсли;
// Если происходит отгрузка ранее оплаченного товара (Зачет предоплаты)
Если Док.ЗачетПредоплаты <> 0 Тогда
// Тип закрытия 2 или 3 (зависит от настроек таблиц ККТ АТОЛ, обычно 2 - "Предварительная оплата (Аванс)")
Объект.TypeClose = 2;
Объект.Summ = Док.ЗачетПредоплаты;
Объект.Payment();
КонецЕсли;
// Закрываем чек
Если Объект.CloseCheck() <> 0 Тогда
ОписаниеРезультата = Объект.ResultDescription;
Возврат 0;
КонецЕсли;
Перед внедрением этой логики обязательно убедитесь, какая секция оплат (какой номер TypeClose) в настройках вашей ККТ АТОЛ отвечает за "Зачет аванса/предоплаты". По умолчанию в большинстве прошивок это тип закрытия 2 или 3.
Разработчикам решений на базе 1С 7.7 важно помнить, что драйверы серии ДТО 8 уже давно признаны устаревшими и сняты с поддержки производителем. Они не поддерживают современные изменения законодательства, такие как работа с маркировкой («Честный знак») по ФФД 1.2. Если вы планируете долгосрочное использование оборудования АТОЛ 30Ф, мы настоятельно рекомендуем переписать функции фискализации под ДТО 10.
В ДТО 10 архитектура взаимодействия с кассой изменилась. Вместо прямого изменения свойств объекта используется универсальный метод setParam() с указанием номера тега по классификатору ФНС перед регистрацией позиции. Разберем по шагам, как это выглядит на практике:
// Пример регистрации позиции предоплаты в ДТО 10
Объект.setParam(65535, "Предоплата за холодильник"); // Наименование позиции чека
Объект.setParam(65536, 15000.00); // Цена за единицу
Объект.setParam(65537, 1); // Количество
Объект.setParam(65538, 15000.00); // Общая сумма позиции
// Передача фискальных тегов ФФД 1.05
Объект.setParam(1214, 2); // Тег 1214: Способ расчета = Предоплата
Объект.setParam(1212, 1); // Тег 1212: Предмет расчета = Товар
// Передача ставки НДС (например, Без НДС - значение "none" или НДС 20% - значение "vat20")
Объект.setParam(1199, 6); // Тег 1199: 6 - Без НДС, 1 - НДС 20%
// Вызов метода регистрации позиции в чеке
Объект.registration();
Использование ДТО 10 позволяет коду быть более гибким и не зависеть от внутренних свойств старой библиотеки драйвера, гарантируя корректное отображение всех необходимых тегов в чеке и их отправку оператору фискальных данных (ОФД).