Интеграция 1С с кассовым оборудованием Атол, особенно через облачные сервисы (Атол Онлайн) или веб-сервисы драйвера, часто требует формирования XML-структуры чека вручную. Процесс может вызвать затруднения из-за специфических требований к именованию тегов и форматам данных. Если вы ищете готовую реализацию для работы с современными протоколами, рекомендуем обратить внимание на специализированное рабочее место кассира для АТОЛ, поддерживающее ДТО WEB-сервер и ФФД 1.2. В этой статье мы разберем по шагам, как самостоятельно построить XML-документ, выясним назначение ключевых параметров и определим, какие методы встроенного языка 1С наиболее эффективны для этой задачи.
Прежде чем приступать к написанию кода, давайте проанализируем ситуацию с иерархией тегов. Типовая структура 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>), мы используем комбинацию методов ЗаписатьНачалоЭлемента, ЗаписатьТекст и ЗаписатьКонецЭлемента.
Часто у разработчиков возникают вопросы по параметрам, которые не относятся напрямую к товарным позициям, но критичны для работы кассы. Выясним причину их важности:
ДД.ММ.ГГГГ ЧЧ:ММ:СС). Рассмотрим нюанс: время должно быть актуальным. Если передать время «из прошлого», касса может отклонить операцию.Рассмотрим подробнее вопрос о том, как записывать данные клиента (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 для получения первичной информации о продажах.
Иногда в примерах кода встречается строка Запись.ЗаписатьСоответствиеПространстваИмен("", "http://tempuri.org/XMLSchema.xsd"). Выясним, нужна ли она вам. Пространства имен используются, если XML передается через SOAP-протокол. Если вы формируете файл для прямой загрузки в драйвер или отправки через современный REST API, то чаще всего это поле не требуется.
Если касса выдает ошибку при загрузке XML, рекомендуем выполнить следующие действия:
items должна до копейки совпадать с суммой в блоке payments. Кассовое ПО очень чувствительно к математическим расхождениям.ФискальныеОперации, где хранятся готовые эталонные пакеты.XMLСтрока(Значение), чтобы обеспечить правильный разделитель дробной части (точка вместо запятой).Таким образом, создание XML для Атола — это процесс строгого следования иерархии тегов с использованием базовых методов ЗаписьXML. Главное — обеспечить уникальность external_id, корректность налоговых ставок и соответствие структуры актуальным требованиям ФФД.