XML по схеме в 1С и .NET: почему разошёлся один из двадцати одного теста
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Что платформа 1С принимает и отвергает при чтении XML по схеме, как выглядят её ошибки и чем её вердикты отличаются от вердиктов независимого валидатора. Проверено на 21 тестовом файле, журналы и скрипты в архиве.
- В трёх проверенных файлах без указания типа ПрочитатьXML вернул anyType без свойств.
- Ошибки структуры называют только тип документа или свойство, но не то, где ошибка.
- Необязательный элемент различается тремя состояниями: не установлен, пустая строка, Неопределено.
- Время с зоной (Z, +03:00) платформа переводит в пояс компьютера; другие пояса требуют отдельного опыта.
- Дата без времени для dateTime принимается платформой и отвергается валидатором .NET.
Перед интеграцией полезно прогнать набор типичных отклонений через платформу и через валидатор принимающей стороны: расхождения видны только так.
Для кого: разработчики и интеграторы 1С, которые обмениваются XML с внешними системами по схеме.
- Стенд
- Как устроен набор файлов для проверки
- Ответ платформы на ошибки в структуре
- Ответ платформы на ошибки в значениях
- Чем пустое значение отличается от отсутствующего элемента
- Как платформа читает часовой пояс
- Что принимает платформа и отвергает валидатор
- Запись документа из кода
- Выгрузка продаж базы по схеме
- Скрипт разбора схемы
- Что не проверялось
- Итог
- Источники
- Файл к статье
Интеграция 1С с внешней системой по XML обычно ломается на мелочах: чужое пространство имён, пропущенный элемент, дата с часовым поясом, число с запятой. Перед тем как писать обмен, я собрала схему XSD, подготовила 21 файл XML: базовый пример и варианты с изменённой структурой или значениями и прогнала их через платформу 1С 8.3.27 и независимо через валидатор .NET (System.Xml). Для платформы использовала фабрику XDTO, созданную из файла схемы. Вопросы были простые: что платформа отвергает, что выдаёт в тексте ошибки и чем её ответ отличается от ответа обычного валидатора.
Результат: из 21 файла платформа и валидатор .NET (с включёнными предупреждениями) совпали в 20 случаях. Расходится один: дату без времени (2026-01-02) платформа принимает как dateTime, валидатор отвергает. При неверной структуре платформа пишет только тип целиком (чужое пространство имён, лишний элемент) или называет свойство, но не то, где ошибка (перепутанный порядок, пропущенный элемент). Время с часовым поясом платформа приводит к поясу компьютера. Три состояния необязательного элемента (нет, пустой, nil) читаются тремя разными значениями. Все числа и тексты ниже взяты из журнала прогона; в архиве лежат схема, файлы, скрипты и журналы.
Стенд
| Условие | Значение |
|---|---|
| Платформа | 1С:Предприятие 8.3.27.2130 (x86), файловая база «Нано-УТ 2.0», вызовы через COM; общий модуль стенда XDTOСтенд |
| Схема | sales.xsd, пространство имён urn:nopik:sales:1.0, 4 типа и один корневой элемент Sale |
| Независимый валидатор | System.Xml.XmlReader с XmlSchemaSet из .NET, Windows PowerShell 5.1 |
| Данные | 30 проведённых продаж «Нано-УТ» для опыта с выгрузкой; 21 файл XML в каталоге cases |
| Компьютер | Intel Core i5-2400 3,1 ГГц (4 ядра, 2011 год), 7,9 ГБ ОЗУ, SATA SSD, Windows 11 Pro; часовой пояс компьютера: Берлин (для январских дат из файлов смещение UTC+1, в дни опыта UTC+2). Компьютер рабочий: во время опытов были открыты браузер и приложение Claude |
Время обработки здесь не измерялось. Пакет XDTO в конфигурацию не добавлялся: фабрика создаётся в коде функцией СоздатьФабрикуXDTO по файлу XSD.

Как устроен набор файлов для проверки
Схема описывает продажу: номер, дату, покупателя, валюту из перечисления, строки с количеством и ценой и необязательную ссылку на документ-основание того же типа.
Чтение в коде стенда занимает несколько строк: фабрика из XSD, читающий поток, ПрочитатьXML с указанием типа документа.
Без указания типа ПрочитатьXML вернул объект типа anyType без свойств даже для файла с чужим пространством имён (файлы 01, 02 и 14 в журнале untyped.txt): проверка структуры по схеме не выполнялась. В этом сценарии тип необходимо передать явно; на другие схемы и способы создания фабрики этот результат не переносится.

Ответ платформы на ошибки в структуре
Текст ошибки платформы по структуре называет только тип; на файл он не указывает.

Чужое пространство имён корня (файл 02), корневой элемент без пространства имён (19) и лишний элемент Note (14) дали один и тот же текст: тип Document, никакого указания на файл и строку. Перепутанный порядок элементов и пропущенный обязательный элемент платформа описывает точнее, но не всегда верно:

В файле 03 элементы идут в порядке Number, Customer, Date, Currency, а в схеме Customer стоит после Date. Платформа пожаловалась, что не установлено значение Date. В файле Date есть, но стоит позже, чем ждёт sequence. В файле 04 нет Customer, и платформа назвала его в последней строке, но блок «проверка свойства» относится к соседнему Currency. Читать такие тексты нужно целиком и сверять со схемой.
Файл без строк (18) получил внятное сообщение: Проверка свойства 'Lines', «Отсутствует обязательное свойство».
Ответ платформы на ошибки в значениях
Для значений платформа называет и тип, и нарушенное ограничение.

Валюту EUR (файл 05) платформа отвергла с пометкой о фасете перечисления, цену 100.125 (файл 06) - с названием фасета FractionDigits = '2'.
Количество с запятой (1,5, файл 15), текстом (abc, 16) и в экспоненциальной записи (1E3, 21) платформа отвергла как не соответствующее типу decimal. При записи из кода те же нарушения ловятся ещё при сборке объекта, до записи файла: цена 100.125, валюта EUR и строка «два» в числовом поле дали те же тексты ошибок на шаге «создание объекта» (опыты цена-3-знака, плохая-валюта, строка-в-числе в журнале).
Чем пустое значение отличается от отсутствующего элемента
Необязательный элемент Comment может быть в файле тремя способами. Платформа читает их тремя разными значениями.
| Файл | Что в XML | Что видит 1С в свойстве Comment |
|---|---|---|
| 07-nil-comment | <Comment xsi:nil="true"/> |
Неопределено (в отличие от 09, где свойство не установлено) |
| 08-empty-comment | <Comment></Comment> |
пустая строка |
| 09-no-comment | элемента нет | свойство не установлено |
При записи тоже три формы: присвоение Неопределено дало в файле <Comment xsi:nil="true"/>, пустой строки <Comment/>, а без присвоения элемента нет. Если внешняя система различает «не передано» и «передано пустым», в коде надо проверять Установлено(Свойство) и не сводить всё к ЗначениеЗаполнено. Пробелы в строках платформа не обрезает: Иванов пришло как Строка [ Иванов ].
Как платформа читает часовой пояс
| Файл | Значение в XML | Что прочитала 1С |
|---|---|---|
| 10-date-no-tz | 2026-01-02T10:00:00 |
2026-01-02 10:00:00 |
| 11-date-utc | 2026-01-02T10:00:00Z |
2026-01-02 11:00:00 |
| 12-date-offset | 2026-01-02T10:00:00+03:00 |
2026-01-02 08:00:00 |
| 13-date-only | 2026-01-02 |
2026-01-02 00:00:00 |
Время с зоной платформа перевела в пояс компьютера: 10:00Z стало 11:00: платформа взяла смещение пояса компьютера на дату из файла (2 января, UTC+1), 10:00+03:00 стало 08:00. Другие часовые пояса в опыте не проверялись; обмен по датам следует отдельно проверить на целевом сервере. Время без зоны осталось как есть. Чистую дату без времени платформа приняла для поля dateTime.
При записи из кода дата ушла в файл без зоны: 2026-01-02T10:00:00. Если принимающая система ждёт UTC с Z, сначала нужно определить исходный часовой пояс и перевести время в UTC. Просто дописать Z к местному времени нельзя: это изменит смысл даты.
Что принимает платформа и отвергает валидатор
Тот же набор файлов я прогнала через валидатор .NET. На снимке вердикты платформы и валидатора совпали по каждому файлу, кроме одного.

Расхождение в файле 13 значит, что принимающая сторона с обычным валидатором отвергнет то, что 1С приняла бы без возражений. Для 1С это удобно при чтении. Самой 1С при записи это не грозит: дата из кода уходит в файл полной (2026-01-02T10:00:00). Выводы про валидатор .NET относятся только к нему: другие валидаторы я не запускала. Пространство имён корня .NET по умолчанию не считает ошибкой (элемент без схемы пропускается); в опыте я включила проверку предупреждений, и тогда файлы 02 и 19 тоже отвергаются.
Запись документа из кода
При записи платформа дала такой файл:
Цена записана как 100 без .00: схема это допускает, но принимающая сторона, которая сравнивает текст, увидит другое значение. Пространства имён xs и xsi платформа добавила сама.
Выгрузка продаж базы по схеме
Для проверки на синтетических документах учебной базы функция стенда выгрузила 30 проведённых продаж «Нано-УТ» по этой же схеме: номер и дату документа, наименование контрагента, строки с товаром, количеством и ценой. Номер, дату, покупателя и строки платформа записала без ошибок. Файлы, записанные ЗаписьXML, начинаются с метки порядка байтов UTF-8 (BOM, видно в evidence/written); совместимость с внешним получателем нужно проверить отдельно. Результат проверки выгруженных файлов:

Все 30 выгруженных файлов валидны для .NET и читаются обратно платформой. Этот результат повторён 23.10.2026 на новой базе версии 2.
При повторной проверке 23.10.2026 обнаружилась зависимость от версии базы: в новой «Нано-УТ» документ ПродажаТовара переименован, а старый скрипт продолжал работу после ошибки и показывал нулевую выгрузку. В версии 2 исходники совместимой базы включены в архив и проверяются по хешам до создания стенда. Ошибки подпроцессов и COM останавливают запуск; успех выгрузки требует 30 файлов, 30 валидных результатов .NET и 30 успешных обратных чтений. Существующие --work и --out сохраняются: скрипт требует новые каталоги.
Параметр --src необязателен: по умолчанию берётся fixture/src из архива. Это воспроизводимый учебный стенд; рабочую базу им наполнять не нужно.
Скрипт разбора схемы
xsd_inspect.py читает XSD до написания обмена и перечисляет типы, обязательность и повторяемость элементов, ограничения и замечания по полям, которые на стенде вели себя особо: nillable, даты, числа, перечисления, ограничения знаков, рекурсию. Для sales.xsd он выдал шесть замечаний, которые совпадают с разделами выше.
Скрипт не разрешает import и include, не учитывает семантику xs:choice и xs:extension; его замечания опираются только на мои 21 файл.
Что не проверялось
- Схемы с
importиinclude, пакеты XDTO внутри конфигурации, веб-сервисы и WSDL. - Типы через
xsi:type,xs:choice,xs:any, расширение и ограничение типов. - Большие документы и скорость чтения и записи.
- Платформа ниже 8.3.27 и разные часовые пояса сервера (проверен один).
- Валидаторы кроме
System.Xmlиз .NET. - Обмен с живой внешней системой: опыты шли на локальных файлах.
Итог
Перед интеграцией полезно один раз прогнать набор файлов с типичными отклонениями через платформу и через валидатор принимающей стороны: на стенде они совпали в 20 случаях из 21 (у .NET включены предупреждения), а расхождение (дата без времени) и часовой пояс видны только так. Ошибки платформы по структуре читаются плохо: тип целиком, иногда не то свойство, поэтому сверять их надо со схемой. Отсутствующий, пустой и nil-элемент читаются по-разному, и обработчику нужно проверять Установлено(Свойство). Файлы, схема, скрипты и журналы лежат в архиве.
Источники
- W3C, XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes, раздел о типе dateTime
- Infostart, «Поиск строки XML-файла, содержащей значение, не соответствующее типу свойства XDTO пакета» (разбор той же ошибки «значение не соответствует типу» на конкретном файле)
Файл к статье
Архив xdto-check-companion-v2.zip (версия 2 от 23.10.2026):
schemas/sales.xsd: схема;cases: 21 тестовый XML;xsd_inspect.py: разбор схемы;compare.py: сводная таблица по двум журналам;verify.py: проверка без платформы;stand: модуль стенда, чтение и запись через COM, проверка .NET,run_all.py, который повторяет все опыты (нужны Windows, Python 3.12+, платформа 8.3.27.2130 x86 с лицензией и зарегистрированный V83.COMConnector; исходники «Нано-УТ» включены);fixture/src: исходники «Нано-УТ» ревизииa45d068cc6ef9b96cd0849c76489629f1d87d911;fixture/manifest.json: хеши файлов;test_regressions.py: шесть проверок без запуска 1С: сохранность каталога, ошибки подпроцессов, пустая и неполная выгрузка, неполные журналы и отсутствие неверного предупреждения для float;evidence: свежие журналы прогона (старые сохранены вevidence/history-20261022): ответ платформы по каждому файлу, ответ .NET, сводка, выгрузка продаж.
Проверка комплекта включает отдельный запуск из чистой распаковки: python verify.py проходит без платформы, run_all.py повторил журналы на новой базе. README.md описывает порядок работы.
Вступайте в нашу телеграмм-группу Инфостарт