При работе с розничными продажами в конфигурации 1С:Управление торговлей 10.3 (особенно в измененных или переписанных версиях) часто возникает необходимость разделения выручки по секциям или отделам непосредственно на фискальном накопителе кассового аппарата. Это позволяет владельцам бизнеса получать локальную аналитику из X-отчетов и Z-отчетов прямо на кассовой ленте, разделяя продажи, например, на продукты, услуги или оптовые отгрузки.
В этой статье мы подробно разберем, как устроен механизм передачи номера секции из 1С в ККТ через Библиотеку подключаемого оборудования (БПО), как правильно модифицировать код программы и какие настройки необходимо выполнить в драйвере кассового аппарата.
До реформы 54-ФЗ деление по секциям являлось основным инструментом разграничения денежных потоков внутри кассового аппарата. С переходом на онлайн-кассы и форматы фискальных документов (ФФД 1.05, 1.1, 1.2) ситуация изменилась. В современных требованиях налогового законодательства понятие «секция» отсутствует. ОФД и Федеральная налоговая служба не принимают этот параметр для анализа — для них важнее признаки предмета и способа расчета, ставки НДС и агентские реквизиты.
Тем не менее производители ККТ (такие как АТОЛ и Штрих-М) сохранили понятие отделов (секций) на уровне внутреннего программного обеспечения касс. В 1С этот параметр остался для обратной совместимости и внутреннего учета. Рассмотрим, как его использовать.
Для начала проанализируем структуру данных, которая формируется в 1С перед отправкой пакета на печать. В типовом механизме интеграции за формирование полей каждой позиции чека отвечает специализированная функция. Нам необходимо убедиться, что в структуре параметров фискальной строки присутствует свойство НомерСекции.
Давайте посмотрим на пример структуры, которая используется для формирования строки чека:
Функция ПараметрыФискальнойСтрокиЧека() Экспорт
ПараметрыСтроки = Новый Структура();
ПараметрыСтроки.Вставить("ФискальнаяСтрока");
// Обязательные поля для ФФД
ПараметрыСтроки.Вставить("Наименование"); // Наименование предмета расчета
ПараметрыСтроки.Вставить("Количество" , 0); // Количество предмета расчета
ПараметрыСтроки.Вставить("Цена" , 0); // Цена без учета скидок и наценок
ПараметрыСтроки.Вставить("Сумма" , 0); // Cтоимость предмета расчета с учетом скидок
ПараметрыСтроки.Вставить("НомерСекции" , 0); // Номер секции ККТ (по умолчанию 0 или 1)
ПараметрыСтроки.Вставить("СтавкаНДС" , 0); // Cтавка НДС в %
ПараметрыСтроки.Вставить("Штрихкод"); // Штрихкод номенклатуры
// Дополнительные реквизиты ФФД
ПараметрыСтроки.Вставить("КодПризнакаСпособаРасчета"); // Таблица 25 документа ФФД
ПараметрыСтроки.Вставить("КодПризнакаПредметаРасчета"); // Таблица 25 документа ФФД
ПараметрыСтроки.Вставить("ЕдиницаИзмеренияПредметаРасчета");
ПараметрыСтроки.Вставить("КодТоварнойНоменклатуры");
Возврат ПараметрыСтроки;
КонецФункции
Как мы видим, свойство НомерСекции по умолчанию инициализируется значением 0 (или в некоторых версиях БПО значением 1). Если оставить этот параметр без изменений, все товары будут пробиваться по первой (дефолтной) секции ККТ.
Выяснив, где хранится параметр, мы должны настроить его динамическое заполнение при обходе табличной части документа (например, ЧекККМ или РеализацияТоваровУслуг). Распределять товары по секциям можно на основании различных аналитик: по складам, по номенклатурным группам, ставкам НДС или типу номенклатуры (товар или услуга).
Рассмотрим практический пример заполнения структуры фискальной строки, где номер секции определяется в зависимости от того, является ли позиция услугой или товаром:
// Создаем массив для позиций чека
ПозицииЧека = Новый Массив();
Для Каждого СтрокаТЧ Из СсылкаНаДокумент.Товары Цикл
ПараметрыСтроки = ПараметрыФискальнойСтрокиЧека();
ПараметрыСтроки.Наименование = СтрокаТЧ.Номенклатура.Наименование;
ПараметрыСтроки.Количество = СтрокаТЧ.Количество;
ПараметрыСтроки.Цена = СтрокаТЧ.Цена;
ПараметрыСтроки.Сумма = СтрокаТЧ.Сумма;
// Определяем секцию: товары пойдут в секцию 1, услуги — в секцию 2
Если СтрокаТЧ.Номенклатура.Услуга Тогда
ПараметрыСтроки.НомерСекции = 2;
Иначе
ПараметрыСтроки.НомерСекции = 1;
КонецЕсли;
// Заполнение остальных реквизитов (НДС, признаки расчета)
ПараметрыСтроки.СтавкаНДС = ?(СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС20, 20, 0);
ПозицииЧека.Добавить(ПараметрыСтроки);
КонецЦикла;
Этот код позволяет гибко управлять распределением товаров. Вместо жесткого условия вы можете добавить дополнительный реквизит в саму карточку Номенклатура (например, числовое поле "Номер секции в ККТ") и считывать значение напрямую оттуда.
Давайте разберем техническую сторону передачи параметра. Когда 1С собирает общую структуру чека, она преобразует ее в XML-пакет (так называемый CheckPackage) и передает его интеграционной компоненте драйвера ККТ.
В XML-пакете номер секции транслируется в атрибут Department внутри тега фискальной строки:
<FiscalString Name="Шоколад Аленка" Quantity="1" Price="100" Sum="100" Department="2" Tax="20" ... />
При использовании драйвера АТОЛ 10.х компонента 1С переводит атрибут Department во внутренний низкоуровневый параметр драйвера LIBFPTR_PARAM_DEPARTMENT. Если этот параметр корректно заполнен в XML и поддерживается вашей моделью кассы, ККТ зафиксирует продажу по указанному отделу.
Часто программисты сталкиваются с ситуацией: в коде 1С явно передается ПараметрыСтроки.НомерСекции = 2, но на бумажном чеке ККТ все равно упорно печатает «Секция 1» (или «Отдел 1»). Проанализируем основные причины этой проблемы и способы их решения:
Решение: Подключите кассу к компьютеру, запустите утилиту «Тест драйвера ККТ» (для АТОЛ) или «Тест драйвера ФР» (для Штрих-М). Перейдите в параметры оборудования, найдите раздел «Секции» (или «Отделы») и убедитесь, что они активны. Настройте наименования секций в соответствующих таблицах кассы (например, задайте секции 1 имя "Товары", а секции 2 — "Услуги").
1.
Решение: В этом случае потребуется обновить драйвер ККТ до актуальной версии или переопределить передачу параметров непосредственно в коде обработки обслуживания ККТ в обход стандартной БПО (через прямое обращение к методам драйвера).
Решение: Вы можете выводить название отдела в виде дополнительного текстового нефискального поля. Для этого в xml-пакет чека добавляется текстовая строка с помощью тега <TextString>:
// Пример вывода дополнительного нефискального текста под позицией
ПараметрыСтроки.Вставить("ТекстСтроки", "Отдел: Услуги и сервис");
Таким образом, настройка секций в 1С:Управление торговлей 10.3 сводится к правильному наполнению структуры фискальной строки и сопоставлению этих данных с внутренними таблицами самого фискального регистратора. Проведя эти несложные манипуляции, вы сможете полностью удовлетворить требования заказчика к детализации отчетов кассы.