Начиная с 1 марта 2021 года, согласно законодательству РФ о применении контрольно-кассовой техники (ФЗ-54), стало обязательным указывать в чеках онлайн-ККМ наименование товара (работы, услуги) и их количество. Критически важным требованием стало также включение в фискальные документы Признака предмета расчета (тег 1212). Игнорирование этого требования влечет за собой штрафы, что вызывает обоснованное беспокойство у пользователей и разработчиков 1С. Разберем, как реализовать передачу этого признака в вашей системе 1С.
Признак предмета расчета (тег 1212) – это обязательный реквизит, который должен быть передан оператору фискальных данных (ОФД) в составе кассового чека. Его наличие и используемые значения зависят от версии Формата Фискальных Данных (ФФД), поддерживаемой вашей кассой.
Основные значения тега 1212, которые используются наиболее часто:
Эти значения необходимы для корректной передачи данных в ОФД и последующей отчетности.
Прежде чем передавать данные в ККМ, нам необходимо определить, где в вашей конфигурации 1С хранится информация о типе номенклатуры (товар или услуга). Если ваше отраслевое решение основано на типовых конфигурациях 1С (например, УТ), то, скорее всего, у элемента справочника Номенклатура есть реквизит Вид номенклатуры, а у этого вида, в свою очередь, может быть реквизит Тип номенклатуры.
Рассмотрим по шагам, как можно получить это значение:
ПредметРасчета, которое мы добавим к объекту ТекущаяПозиция перед вызовом функции фискализации.Передача признака предмета расчета в ККМ обычно происходит через специализированные обработки обслуживания ККТ. В 1С часто используются универсальные обработки, которые могут работать с разными моделями касс (например, Атол и Штрих-М). Важно понимать, что на уровне вашего кода 1С вы можете передавать один и тот же "тип номенклатуры" (например, в свойстве ПредметРасчета), а уже сама обработка или её внутренние модули, взаимодействующие с драйверами ККТ, преобразуют это значение в нужный атрибут для конкретной модели кассы.
Давайте посмотрим на типичный фрагмент кода, где формируется XML-пакет для фискализации чека. Вы, вероятно, сталкивались с функцией типа ПолучитьXMLПакетДляФискализацияЧека. Наша задача — добавить признак предмета расчета в каждую фискальную строку.
Несмотря на то, что функция в 1С может быть универсальной, драйверы разных ККМ ожидают разные имена атрибутов для одного и того же "Признака предмета расчета".
Для касс Атол при формировании XML-пакета обычно используется атрибут ItemType.
Возможные значения для ItemType:
1 – товар, за исключением подакцизного товара2 – подакцизный товар3 – работа4 – услуга5 – приём ставок при деятельности по организации и проведению азартных игр6 – выплата выигрышей в азартных играх7 – реализация лотерейных билетов или ставок при деятельности по организации и проведению лотерей8 – выплата выигрышей в лотереях9 – прав на использование результатов интеллектуальной деятельности или средств индивидуализации10 – аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета11 – предмет расчета, состоящий из предметов, каждому из которых может быть присвоено значение от 0 до 10 (набор)12 – предмет расчета, не относящийся к предметам расчета, которым может быть присвоено значение от 0 до 11Для касс Штрих-М обычно используется атрибут PaymentItemSign.
Возможные значения для PaymentItemSign:
1. Товар2. Подакцизный товар3. Работа4. Услуга5. Ставка азартной игры6. Выигрыш азартной игры7. Лотерейный билет8. Выигрыш лотереи9. Предоставление РИД10. Платеж11. Составной предмет расчета12. Иной предмет расчетаТакже важно отметить, что некоторые драйверы или старые версии могут использовать атрибуты SignCalculationObject или CalculationSubject, что создает некоторую путаницу из-за различий в наименовании, но их суть остается той же — передача признака предмета расчета.
Рассмотрим пример, как это можно реализовать, используя ваш код. Допустим, у вас есть структура ТекущаяПозиция, которая уже содержит Наименование, Количество, Цена и другие реквизиты. Нам нужно добавить в неё ПредметРасчета (или как вы его назвали в своей конфигурации) со значением, полученным из данных 1С.
В функции формирования XML-пакета, например, ПолучитьXMLПакетДляФискализацияЧека, вам нужно будет добавить строку с соответствующим атрибутом внутри блока FiscalString, учитывая тип ККМ.
Если ваша обработка обслуживания ККТ универсальна, то определение типа кассы происходит где-то выше или внутри этой же функции через свойства объекта драйвера ККМ (например, ОбъектДрайвераККМ.Модель). Для примера предположим, что у вас есть переменная ТипККМ, которая определяет производителя.
Если ОбщиеПараметры.ПозицииЧека <> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
Для ИндексМассива = 0 По ОбщиеПараметры.ПозицииЧека.Количество - 1 Цикл
ТекущаяПозиция = ОбщиеПараметры.ПозицииЧека[ИндексМассива];
Если ТекущаяПозиция.Свойство("ФискальнаяСтрока") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ТекущаяПозиция.Наименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("Price" , XMLСтрока(ТекущаяПозиция.Цена));
ЗаписьXML.ЗаписатьАтрибут("Amount" , XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("Tax" , XMLСтрока(ТекущаяПозиция.СтавкаНДС));
// *** Добавляем признак предмета расчета ***
Если ТекущаяПозиция.Свойство("ПредметРасчета") Тогда
// Здесь определяем ТипККМ, например, из параметров обработки
// или из настроек подключения.
// Пример: ТипККМ = ОбщиеПараметры.ПараметрыПодключения.ТипКассы;
Если ТипККМ = "Атол" Тогда
ЗаписьXML.ЗаписатьАтрибут("ItemType" , XMLСтрока(ТекущаяПозиция.ПредметРасчета));
ИначеЕсли ТипККМ = "ШтрихМ" Тогда
ЗаписьXML.ЗаписатьАтрибут("PaymentItemSign" , XMLСтрока(ТекущаяПозиция.ПредметРасчета));
Иначе
// Для других ККМ или если тип не определен,
// можно использовать универсальный атрибут,
// как в решении автора темы.
ЗаписьXML.ЗаписатьАтрибут("SignCalculationObject" , XMLСтрока(ТекущаяПозиция.ПредметРасчета));
КонецЕсли;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем FiscalString
СуммаЧека = СуммаЧека + ТекущаяПозиция.Сумма;
ИначеЕсли ТекущаяПозиция.Свойство("ТекстоваяСтрока") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", XMLСтрока(ТекущаяПозиция.Текст));
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем TextString
ИначеЕсли ТекущаяПозиция.Свойство("ШтрихКод") Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
ЗаписьXML.ЗаписатьАтрибут("BarcodeType", XMLСтрока(ТекущаяПозиция.ТипШтрихкода));
ЗаписьXML.ЗаписатьАтрибут("Barcode", XMLСтрока(ТекущаяПозиция.ШтрихКод));
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Barcode
Иначе
ТекстОшибки = НСтр("ru='Не определен тип позиции чека.'");
ВыходныеПараметры.Очистить();
ВыходныеПараметры.Вставить("ТекстОшибки", ТекстОшибки);
Результат = Ложь;
Возврат Результат;
КонецЕсли;
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Positions
КонецЕсли;
Обратите внимание, что в своем решении автор темы использовал атрибут SignCalculationObject со значениями 1 или 4. Это может зависеть от версии драйвера или ОФД, с которым взаимодействует касса. В целом, ключевая идея — это передача числового кода, соответствующего типу предмета расчета.
Перед применением изменений обязательно протестируйте работу кассового аппарата и передачу данных в ОФД, чтобы убедиться в корректности формирования чеков и отсутствии ошибок. Для этого можно использовать тестовый режим ККМ или отправить несколько чеков с минимальной суммой.
Таким образом, задача сводится к двум основным шагам:
ItemType, PaymentItemSign или другой, в зависимости от модели кассы и драйвера) со значением из пункта 1.Этот подход позволит вам соответствовать требованиям законодательства и избежать штрафов, обеспечив корректную работу с онлайн-кассами.