Ошибка в документации ИТС: кириллица в теге Date XML-пакета чека коррекции и как её исправить

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

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

Суть проблемы: опечатка в теге Date

В процессе разработки механизма формирования чеков коррекции (согласно ФФД 1.05, 1.1 и 1.2) программисты обращаются к разделу документации, описывающему формат обмена с драйвером подключаемого оборудования. Рассмотрим внимательно секцию CorrectionData.

В документации для реквизита "Дата совершения корректируемого расчета" может быть указано имя тега Datе. На первый взгляд, все выглядит корректно. Однако, если скопировать это название непосредственно со страницы браузера и вставить в код 1С, выясняется неприятная деталь: буква "е" в слове "Datе" набрана в русской раскладке (кириллица).

Давайте проанализируем, к чему это может привести. Стандарт XML (Extensible Markup Language) чувствителен к кодировке и набору символов. С точки зрения машины, Date (все латинские) и Datе (с русской "е") — это два совершенно разных тега. Если XSD-схема драйвера ожидает латинское написание, то передача кириллического варианта должна вызывать ошибку валидации.

Почему код может работать даже с ошибкой?

В ходе обсуждения данной проблемы выяснилось интересное поведение некоторых интеграционных компонент. Давайте разберем, почему, несмотря на явную ошибку в имени тега, оборудование может продолжать работать.

На практике (как подтверждают тесты на эмуляторах и реальных кассах, например, Атол 55Ф) некоторые драйверы обладают встроенным механизмом "защиты от дурака". Разработчики драйверов, зная о распространенных ошибках и опечатках в документации, намеренно добавляют в парсер XML логику, которая:

  1. Пытается найти тег в правильном (латинском) написании.
  2. Если тег не найден, проверяет альтернативные варианты с частыми опечатками (например, с кириллической "е" или "а").
  3. Игнорирует регистр символов (case-insensitive parsing), хотя XML по стандарту чувствителен к регистру.

Именно поэтому, если вы используете оборудование определенного вендора (например, Атол), ваш код может отработать без ошибок: чек коррекции будет сформирован, и дата в нем будет верной. Однако, это недокументированное поведение, на которое категорически нельзя полагаться.

Риски использования некорректного тега

Давайте рассмотрим, почему использование "всеядных" драйверов не освобождает нас от необходимости писать код правильно, и к каким последствиям может привести копирование опечатки из ИТС.

1. Несовместимость с другим оборудованием

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

2. Ошибки в данных ОФД

Если драйвер проигнорирует некорректный тег, он может подставить вместо даты нарушения текущую дату и время пробития чека. В контексте чека коррекции это критическая ошибка.

Чек коррекции пробивается для исправления нарушения, совершенного в прошлом (например, неприменение ККТ). Если в поле Date секции CorrectionData не будет указана реальная дата нарушения, налоговая инспекция (ФНС) может не принять такой чек как достаточное основание для освобождения от административной ответственности по статье 14.5 КоАП РФ. Для ФНС будет выглядеть так, будто вы корректируете расчет, совершенный прямо сейчас, что лишает операцию смысла.

3. Проблемы при обновлении драйверов

Поведение драйвера, принимающего кириллицу, не является стандартом. В следующем обновлении драйвера разработчик может убрать этот "костыль" или ужесточить правила валидации XML для повышения производительности. В результате рабочий код внезапно перестанет функционировать после обновления ПО кассы.

Правильная техническая реализация

Теперь давайте сформулируем правильный подход к формированию XML-пакета для чека коррекции в 1С, который будет гарантированно работать на любом оборудовании, поддерживающем стандарт БПО (Библиотека подключаемого оборудования).

1. Используйте только латиницу

При написании кода формирования XML никогда не копируйте имена тегов напрямую из браузера, если есть подозрение на опечатку. Набирайте имена тегов вручную на английской раскладке клавиатуры.

Правильное имя тега: Date.

2. Соблюдайте стандарт XSD

Ориентируйтесь не на текстовое описание в статьях, а на XSD-схемы, которые поставляются вместе с SDK драйверов или описаны в стандарте "Требования к разработке драйверов подключаемого оборудования". В схеме этот элемент определен однозначно:


<xs:element name="Date" type="xs:dateTime"/>

3. Формат значения даты

Помимо имени тега, важно соблюдать формат самого значения. Согласно стандарту, дата и время передаются в формате ISO 8601. В 1С для этого удобно использовать функцию XMLСтрока() или форматирование строки.

Пример правильного формирования фрагмента XML в коде 1С:


// Получаем дату нарушения, которую нужно передать в чек
ДатаНарушения = Объект.ДатаСовершенияНарушения; 

// Формируем XML. Обратите внимание: теги набраны латиницей
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("CorrectionData"); // Латиница

// Преобразуем дату 1С в формат XML (YYYY-MM-DDTHH:MM:SS)
СтрокаДаты = XMLСтрока(ДатаНарушения); 

// Записываем атрибут Date (строго латиница!)
ЗаписьXML.ЗаписатьАтрибут("Date", СтрокаДаты);

// Записываем тип коррекции (0 - самостоятельно, 1 - по предписанию)
ЗаписьXML.ЗаписатьАтрибут("CorrectionType", "0"); 

ЗаписьXML.ЗаписатьКонецЭлемента(); // CorrectionData

РезультатXML = ЗаписьXML.Закрыть();

Рекомендации по отладке

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

  1. Проверка XML. Выгрузите сформированный XML-пакет в файл или скопируйте его из отладчика. Откройте его в любом текстовом редакторе (например, Notepad++).
  2. Поиск кириллицы. Используйте функцию поиска, чтобы проверить наличие русских символов в именах тегов. В Notepad++ можно использовать регулярное выражение [а-яА-Я] для поиска любой кириллицы.
  3. Валидация схемы. Если возможно, проверьте ваш XML на соответствие XSD-схеме, предоставляемой производителем ККТ.
  4. Логи драйвера. Включите ведение логов драйвера ККТ на максимальный уровень детализации. В логах часто можно увидеть конкретную причину отказа: например, "Unknown element 'Datе'" (где 'е' будет иметь другой код символа).

Заключение

Опечатки в документации — явление неприятное, но встречающееся. Главное правило при работе с интеграционными задачами в 1С: код и стандарты (XSD, JSON-схемы) всегда имеют приоритет над описательным текстом в статьях. При формировании чеков коррекции всегда используйте тег Date, набранный латинскими буквами, независимо от того, что написано в справочных материалах. Это гарантирует стабильную работу с любыми моделями фискальных регистраторов и корректную передачу данных в налоговую инспекцию.

← На главную