Как правильно указывать тип номенклатуры (услуга, товар) в чеке онлайн-ККМ в 1С?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← На главную

Начиная с 1 марта 2021 года, согласно законодательству РФ о применении контрольно-кассовой техники (ФЗ-54), стало обязательным указывать в чеках онлайн-ККМ наименование товара (работы, услуги) и их количество. Критически важным требованием стало также включение в фискальные документы Признака предмета расчета (тег 1212). Игнорирование этого требования влечет за собой штрафы, что вызывает обоснованное беспокойство у пользователей и разработчиков 1С. Разберем, как реализовать передачу этого признака в вашей системе 1С.

Понимание Признака предмета расчета (тег 1212)

Признак предмета расчета (тег 1212) – это обязательный реквизит, который должен быть передан оператору фискальных данных (ОФД) в составе кассового чека. Его наличие и используемые значения зависят от версии Формата Фискальных Данных (ФФД), поддерживаемой вашей кассой.

Основные значения тега 1212, которые используются наиболее часто:

  1. 1 (или "товар"): Используется для реализации товаров, за исключением подакцизных.
  2. 2 (или "подакцизный товар"): Для реализации подакцизных товаров.
  3. 3 (или "работа"): Для выполнения работ.
  4. 4 (или "услуга"): Для оказания услуг.
  5. 10 (или "платеж"): Используется для авансов, предоплат, кредитов, взносов в счет оплаты, пеней, штрафов, вознаграждений, бонусов и других аналогичных расчетов.
  6. 11 (или "набор"): Для предмета расчета, состоящего из нескольких предметов, каждому из которых можно присвоить значение от 0 до 10.
  7. 12 (или "иной предмет расчета"): Для предметов расчета, не относящихся к перечисленным выше.

Эти значения необходимы для корректной передачи данных в ОФД и последующей отчетности.

Где получить тип номенклатуры в 1С

Прежде чем передавать данные в ККМ, нам необходимо определить, где в вашей конфигурации 1С хранится информация о типе номенклатуры (товар или услуга). Если ваше отраслевое решение основано на типовых конфигурациях 1С (например, УТ), то, скорее всего, у элемента справочника Номенклатура есть реквизит Вид номенклатуры, а у этого вида, в свою очередь, может быть реквизит Тип номенклатуры.

Рассмотрим по шагам, как можно получить это значение:

  1. Проверим реквизиты справочника "Номенклатура": Откройте справочник Номенклатура и найдите используемые вами виды номенклатуры. Возможно, поле, определяющее тип, уже существует.
  2. Настроим "Вид номенклатуры": Если такого реквизита нет, его можно добавить. В свойствах Вида номенклатуры убедитесь, что есть поле, позволяющее указать, является ли данная позиция товаром, услугой или работой. Возможно, потребуется разрешить предварительное редактирование реквизитов на форме вида номенклатуры.
  3. Получим значение программно: Ваша задача — убедиться, что при формировании данных для чека у каждой позиции можно получить это значение. Например, его можно хранить в дополнительном реквизите элемента номенклатуры или определять программно на основе каких-либо признаков. Для примера мы будем использовать некое свойство ПредметРасчета, которое мы добавим к объекту ТекущаяПозиция перед вызовом функции фискализации.

Интеграция с драйверами ККМ в 1С

Передача признака предмета расчета в ККМ обычно происходит через специализированные обработки обслуживания ККТ. В 1С часто используются универсальные обработки, которые могут работать с разными моделями касс (например, Атол и Штрих-М). Важно понимать, что на уровне вашего кода 1С вы можете передавать один и тот же "тип номенклатуры" (например, в свойстве ПредметРасчета), а уже сама обработка или её внутренние модули, взаимодействующие с драйверами ККТ, преобразуют это значение в нужный атрибут для конкретной модели кассы.

Давайте посмотрим на типичный фрагмент кода, где формируется XML-пакет для фискализации чека. Вы, вероятно, сталкивались с функцией типа ПолучитьXMLПакетДляФискализацияЧека. Наша задача — добавить признак предмета расчета в каждую фискальную строку.

Особенности реализации для Атол и Штрих-М

Несмотря на то, что функция в 1С может быть универсальной, драйверы разных ККМ ожидают разные имена атрибутов для одного и того же "Признака предмета расчета".

Для ККТ Атол

Для касс Атол при формировании XML-пакета обычно используется атрибут ItemType.

Возможные значения для ItemType:

  1. 1 – товар, за исключением подакцизного товара
  2. 2 – подакцизный товар
  3. 3 – работа
  4. 4 – услуга
  5. 5 – приём ставок при деятельности по организации и проведению азартных игр
  6. 6 – выплата выигрышей в азартных играх
  7. 7 – реализация лотерейных билетов или ставок при деятельности по организации и проведению лотерей
  8. 8 – выплата выигрышей в лотереях
  9. 9 – прав на использование результатов интеллектуальной деятельности или средств индивидуализации
  10. 10 – аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета
  11. 11 – предмет расчета, состоящий из предметов, каждому из которых может быть присвоено значение от 0 до 10 (набор)
  12. 12 – предмет расчета, не относящийся к предметам расчета, которым может быть присвоено значение от 0 до 11

Для ККТ Штрих-М

Для касс Штрих-М обычно используется атрибут PaymentItemSign.

Возможные значения для PaymentItemSign:

  1. 1. Товар
  2. 2. Подакцизный товар
  3. 3. Работа
  4. 4. Услуга
  5. 5. Ставка азартной игры
  6. 6. Выигрыш азартной игры
  7. 7. Лотерейный билет
  8. 8. Выигрыш лотереи
  9. 9. Предоставление РИД
  10. 10. Платеж
  11. 11. Составной предмет расчета
  12. 12. Иной предмет расчета

Также важно отметить, что некоторые драйверы или старые версии могут использовать атрибуты SignCalculationObject или CalculationSubject, что создает некоторую путаницу из-за различий в наименовании, но их суть остается той же — передача признака предмета расчета.

Добавление признака предмета расчета в XML-пакет 1С

Рассмотрим пример, как это можно реализовать, используя ваш код. Допустим, у вас есть структура ТекущаяПозиция, которая уже содержит Наименование, Количество, Цена и другие реквизиты. Нам нужно добавить в неё ПредметРасчета (или как вы его назвали в своей конфигурации) со значением, полученным из данных 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. Это может зависеть от версии драйвера или ОФД, с которым взаимодействует касса. В целом, ключевая идея — это передача числового кода, соответствующего типу предмета расчета.

Перед применением изменений обязательно протестируйте работу кассового аппарата и передачу данных в ОФД, чтобы убедиться в корректности формирования чеков и отсутствии ошибок. Для этого можно использовать тестовый режим ККМ или отправить несколько чеков с минимальной суммой.

Таким образом, задача сводится к двум основным шагам:

  1. Определить и получить значение признака предмета расчета (товар, услуга и т.д.) для каждой позиции чека в вашей конфигурации 1С. Это значение должно быть числовым, соответствующим спецификации ФФД.
  2. Внести изменения в код формирования XML-пакета для ККМ, добавив соответствующий атрибут (ItemType, PaymentItemSign или другой, в зависимости от модели кассы и драйвера) со значением из пункта 1.

Этот подход позволит вам соответствовать требованиям законодательства и избежать штрафов, обеспечив корректную работу с онлайн-кассами.

← На главную