Как сформировать XML-файл для выгрузки чека в кассу Атол из 1С?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Интеграция 1С с кассовым оборудованием Атол, особенно через облачные сервисы (Атол Онлайн) или веб-сервисы драйвера, часто требует формирования XML-структуры чека вручную. Процесс может вызвать затруднения из-за специфических требований к именованию тегов и форматам данных. Если вы ищете готовую реализацию для работы с современными протоколами, рекомендуем обратить внимание на специализированное рабочее место кассира для АТОЛ, поддерживающее ДТО WEB-сервер и ФФД 1.2. В этой статье мы разберем по шагам, как самостоятельно построить XML-документ, выясним назначение ключевых параметров и определим, какие методы встроенного языка 1С наиболее эффективны для этой задачи.

Анализируем общую структуру XML-чека

Прежде чем приступать к написанию кода, давайте проанализируем ситуацию с иерархией тегов. Типовая структура XML для фискальных операций Атол обычно строится по принципу вложенности. Рассмотрим пример верхнего уровня:


// <main>
//   <check>
//     <timestamp>20.01.2023 14:22:21</timestamp>
//     <external_id>GUID_или_УникальныйНомер</external_id>
//     <client>
//       <email>test@test.ru</email>
//       <phone>+79999999999</phone>
//     </client>
//     <receipt>
//       ... позиции чека ...
//     </receipt>
//   </check>
// </main>

Для создания такой структуры в 1С мы используем объект ЗаписьXML. Важно понимать разницу между созданием элемента и созданием атрибута. Если данные должны находиться внутри тегов (как <email>текст</email>), мы используем комбинацию методов ЗаписатьНачалоЭлемента, ЗаписатьТекст и ЗаписатьКонецЭлемента.

Разбираем назначение полей external_id и timestamp

Часто у разработчиков возникают вопросы по параметрам, которые не относятся напрямую к товарным позициям, но критичны для работы кассы. Выясним причину их важности:

  1. external_id — это уникальный идентификатор операции. Это должна быть любая уникальная комбинация символов (например, GUID или номер документа с префиксом). Это поле необходимо для предотвращения дублирования чеков. Если произойдет сбой связи и вы отправите запрос повторно, система не зафискализирует его второй раз. Некорректная работа с идентификаторами часто становится причиной того, что требуется инструкция для решения проблем с чеками при закрытии месяца.
  2. timestamp — это время формирования запроса. Важно передавать его в строгом формате (обычно ДД.ММ.ГГГГ ЧЧ:ММ:СС). Рассмотрим нюанс: время должно быть актуальным. Если передать время «из прошлого», касса может отклонить операцию.

Выбираем правильные методы ЗаписьXML

Рассмотрим подробнее вопрос о том, как записывать данные клиента (email и телефон). В 1С есть два способа передачи данных в XML: атрибуты и элементы. Для Атол чаще всего требуется именно создание вложенных элементов.

Посмотрим на пример правильной реализации блока клиента:


XML.ЗаписатьНачалоЭлемента("client");
    XML.ЗаписатьНачалоЭлемента("email");
    XML.ЗаписатьТекст("test@test.ru");
    XML.ЗаписатьКонецЭлемента(); // закрываем email
    
    XML.ЗаписатьНачалоЭлемента("phone");
    XML.ЗаписатьТекст("+79999999999");
    XML.ЗаписатьКонецЭлемента(); // закрываем phone
XML.ЗаписатьКонецЭлемента(); // закрываем client

Если вы примените метод ЗаписатьАтрибут, то получите структуру вида <client email="test@test.ru" />, что в большинстве случаев будет считаться ошибкой. Поэтому всегда проанализируем требования инструкции к конкретной версии драйвера.

Формируем состав чека (позиции и оплаты)

Ни один чек не обходится без товаров и итогов. Разберем, как должны выглядеть блоки items (позиции) и payments (оплаты). При реализации этого блока важно учитывать современные требования законодательства. Например, с 2024 года обязательна онлайн-проверка Честного Знака в разрешительном режиме для маркированных товаров, что накладывает дополнительные обязательства на структуру передаваемых данных.

Пример кода для циклического добавления товаров:


XML.ЗаписатьНачалоЭлемента("items");
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
    XML.ЗаписатьНачалоЭлемента("item");
        XML.ЗаписатьНачалоЭлемента("name");
        XML.ЗаписатьТекст(СтрокаТовара.Наименование);
        XML.ЗаписатьКонецЭлемента();
        
        XML.ЗаписатьНачалоЭлемента("price");
        XML.ЗаписатьТекст(XMLСтрока(СтрокаТовара.Цена));
        XML.ЗаписатьКонецЭлемента();
        
        XML.ЗаписатьНачалоЭлемента("quantity");
        XML.ЗаписатьТекст(XMLСтрока(СтрокаТовара.Количество));
        XML.ЗаписатьКонецЭлемента();
        
        XML.ЗаписатьНачалоЭлемента("sum");
        XML.ЗаписатьТекст(XMLСтрока(СтрокаТовара.Сумма));
        XML.ЗаписатьКонецЭлемента();
        
        // Важно: Налог НДС
        XML.ЗаписатьНачалоЭлемента("vat");
            XML.ЗаписатьНачалоЭлемента("type");
            XML.ЗаписатьТекст("vat20"); // или "none", "vat10"
            XML.ЗаписатьКонецЭлемента();
        XML.ЗаписатьКонецЭлемента();
    XML.ЗаписатьКонецЭлемента(); // закрываем item
КонецЦикла;
XML.ЗаписатьКонецЭлемента(); // закрываем items

Если данные для чека поступают не из документов 1С, а из внешней учетной системы, например, Frontol, вам может пригодиться соединение с базой Firebird для получения первичной информации о продажах.

Работа с пространством имен (Namespace)

Иногда в примерах кода встречается строка Запись.ЗаписатьСоответствиеПространстваИмен("", "http://tempuri.org/XMLSchema.xsd"). Выясним, нужна ли она вам. Пространства имен используются, если XML передается через SOAP-протокол. Если вы формируете файл для прямой загрузки в драйвер или отправки через современный REST API, то чаще всего это поле не требуется.

Практические советы по отладке

Если касса выдает ошибку при загрузке XML, рекомендуем выполнить следующие действия:

  1. Проверить итоговую сумму: Сумма всех блоков в items должна до копейки совпадать с суммой в блоке payments. Кассовое ПО очень чувствительно к математическим расхождениям.
  2. Использовать типовые примеры: Полезно изучить инструкцию по исправлению ошибок в кассовых чеках, где разобраны типичные сбои. Также в любой базе на БСП можно заглянуть в регистр сведений ФискальныеОперации, где хранятся готовые эталонные пакеты.
  3. Соблюдать типы данных: Для числовых значений всегда используйте функцию XMLСтрока(Значение), чтобы обеспечить правильный разделитель дробной части (точка вместо запятой).

Таким образом, создание XML для Атола — это процесс строгого следования иерархии тегов с использованием базовых методов ЗаписьXML. Главное — обеспечить уникальность external_id, корректность налоговых ставок и соответствие структуры актуальным требованиям ФФД.

← На главную