Импорт XML-схемы в 1С 8.3: XDTO-пакет, фабрика и проверка файлов
Содержание
Загрузить XSD в 1С можно двумя путями. Первый — импортировать схему в конфигурацию: в конфигураторе откройте ветку Общие → XDTO-пакеты, в контекстном меню выберите Импорт XML-схемы... и укажите файл .xsd. Второй — загрузить схему прямо из кода, без изменения конфигурации: функция СоздатьФабрикуXDTO("путь к файлу.xsd") строит фабрику по схеме на лету.
Импорт в XDTO-пакет выбирают, когда формат постоянный: обмен с контрагентом, веб-сервис, своя интеграция. Загрузку из кода — когда схема меняется часто, приходит от внешней системы (как схемы форматов ФНС) или нужна разово, например чтобы проверить XML-файл перед отправкой. Есть и третий путь — собрать фабрику через построитель схем, если схема лежит в макете или строке.
| Способ | Где работает | Когда выбирать | Ограничения |
|---|---|---|---|
| Импорт в XDTO-пакет | Конфигуратор, конфигурация или расширение | Постоянный формат обмена, веб-сервисы | Нужно право менять конфигурацию, обновление БД |
СоздатьФабрикуXDTO | Код на сервере, внешняя обработка | Разовая проверка, схемы от внешних систем | Схема читается при каждом вызове, типы не видны в дереве метаданных |
ПостроительСхемXML + Новый ФабрикаXDTO | Код на сервере | Схема из нескольких файлов, схема хранится не в файле, а в строке или макете | Чуть больше кода |
Что проверить в XSD-файле до загрузки в 1С
Большинство неудачных импортов ломаются не в 1С, а на самом файле. Пять минут проверки до загрузки избавляют от повторов.
- 📄 Корректность XML. Откройте файл в любом редакторе с подсветкой XML и убедитесь, что он парсится: закрыты все теги, нет посторонних символов до
<?xml ...?>. - 🔤 Кодировка. Чаще всего UTF-8, у схем ФНС встречается windows-1251. Кодировка в прологе должна совпадать с реальной кодировкой файла.
- 🏷️ Пространство имён. Найдите атрибут
targetNamespaceв корневом элементеxs:schema. Именно по этому URI вы потом будете обращаться к типам из кода. У части схем (например, у форматов ФНС) атрибута нет — это допустимо, пространство имён будет пустым. - 🔗 Зависимости. Поищите в файле
xs:importиxs:include. Если они есть, рядом должны лежать файлы из атрибутаschemaLocation, и сохранить нужно ту же структуру папок. - 🔁 Конфликты. В одной конфигурации не может быть двух XDTO-пакетов с одним пространством имён. В типовых конфигурациях уже есть пакеты, например для формата EnterpriseData, — сверьте URI.
Если схема ссылается на стандартные пространства имён (например, XML-подписи http://www.w3.org/2000/09/xmldsig#), такую зависимость тоже придётся загрузить отдельной схемой — сама по себе она в конфигурации не появится.
Как загрузить XSD в конфигураторе через XDTO-пакет
Это основной способ для разработчика. Пакет становится частью конфигурации, его типы доступны через глобальную ФабрикаXDTO в любом серверном модуле.
Шаг 1. Подготовьте конфигурацию
- Откройте базу в конфигураторе и выполните
Конфигурация → Открыть конфигурацию. - Если конфигурация типовая и стоит на поддержке, добавлять объекты в неё без включения возможности изменений нельзя. Лучше не снимать её с поддержки, а создать расширение и импортировать схему туда: XDTO-пакеты в расширениях тоже поддерживаются.
- Если база подключена к хранилищу конфигурации, захватите корень конфигурации — без этого новый объект добавить не получится.
Перед любыми изменениями рабочей конфигурации сделайте выгрузку информационной базы в .dt или резервную копию средствами СУБД.
Шаг 2. Импортируйте схему
- В дереве конфигурации раскройте
Общиеи найдите веткуXDTO-пакеты. - Щёлкните по ней правой кнопкой мыши и выберите
Импорт XML-схемы.... - Укажите файл
.xsd. Если схема зависит от других файлов, начните с базовой схемы — той, на которую ссылаются остальные, — а потом импортируйте зависимые. - Платформа создаст новый XDTO-пакет. Дайте ему понятное имя латиницей или кириллицей, например
ОбменСоСкладом_v2.
Шаг 3. Проверьте результат
Откройте пакет двойным щелчком. В редакторе видно:
- поле с пространством имён — оно должно совпадать с
targetNamespaceиз файла; - список типов объектов и типов значений, перенесённых из схемы;
- глобальные свойства — корневые элементы схемы;
- список импортируемых пакетов, если схема ссылалась на другие пространства имён.
Если какой-то тип отсутствует, вернитесь к зависимостям: обычно не загружен файл, на который ссылается xs:import.
Шаг 4. Сохраните и обновите базу
Сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (клавиша F7). Структура таблиц от XDTO-пакета не меняется, но без обновления конфигурации базы новый пакет не будет доступен пользователям в режиме Предприятия. Для расширения — сохраните его и обновите расширение в базе.
Готовый пакет можно выгрузить обратно в файл: в контекстном меню пакета есть команда Экспорт XML-схемы.... Это удобно, чтобы отдать схему контрагенту или сравнить с исходником.
Загрузка XSD-схемы из кода, без изменения конфигурации
Когда схему нельзя или не хочется вносить в конфигурацию, её загружают во время работы программы. Так делают внешние обработки, которые проверяют регламентированные файлы, и интеграции, где схема приходит вместе с данными.
Вариант 1. Одной функцией из файла
&НаСервере
Функция ФабрикаПоСхеме(ПутьКСхеме)
// ПутьКСхеме — полный путь к .xsd на сервере 1С
Возврат СоздатьФабрикуXDTO(ПутьКСхеме);
КонецФункции
Функция выполняется на сервере, поэтому и путь должен быть доступен серверу 1С, а не компьютеру пользователя. Если файл выбирает пользователь:
- На клиенте поместите файл во временное хранилище (
НачатьПомещениеФайлаНаСерверилиПоместитьВоВременноеХранилище). - На сервере получите двоичные данные через
ПолучитьИзВременногоХранилища. - Запишите их во временный файл:
ИмяФайла = ПолучитьИмяВременногоФайла("xsd"), затемДвоичныеДанные.Записать(ИмяФайла). - Передайте
ИмяФайлавСоздатьФабрикуXDTO, а после работы удалите временный файл черезУдалитьФайлы.
Вариант 2. Через построитель схем
Этот вариант нужен, когда схема хранится не в файле, а в макете или строке, либо когда требуется сначала собрать набор из нескольких схем.
&НаСервере
Функция ФабрикаИзСтроки(ТекстСхемы)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(ТекстСхемы);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(Чтение);
Чтение.Закрыть();
ПостроительСхем = Новый ПостроительСхемXML;
Схема = ПостроительСхем.СоздатьСхемуXML(ДокументDOM);
НаборСхем = Новый НаборСхемXML;
НаборСхем.Добавить(Схема);
Возврат Новый ФабрикаXDTO(НаборСхем);
КонецФункции
Для нескольких связанных схем повторите чтение для каждого файла и добавьте все объекты СхемаXML в один НаборСхемXML до создания фабрики.
Внешнюю обработку пользователь откроет, только если у него есть право на интерактивное открытие внешних обработок. В конфигурациях на БСП такие обработки обычно подключают через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки.
Проверка XML-файла по загруженной схеме
Самый частый практический сценарий — убедиться, что выгруженный файл соответствует формату до отправки. Проверку в 1С выполняет XDTO: файл читается в объект по типу из схемы, а метод Проверить() сверяет объект с ограничениями схемы.
&НаСервере
Функция ПроверитьXMLПоСхеме(ПутьКСхеме, ПутьКФайлу)
Фабрика = СоздатьФабрикуXDTO(ПутьКСхеме);
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Попытка
Объект = Фабрика.ПрочитатьXML(Чтение);
Объект.Проверить();
Результат = "Файл соответствует схеме";
Исключение
Результат = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Чтение.Закрыть();
Возврат Результат;
КонецФункции
Как это работает:
ПрочитатьXMLбез указания типа определяет тип по корневому элементу файла — он должен быть объявлен в схеме как глобальный.- Уже на чтении платформа отбрасывает файл, если встречает неизвестный элемент или значение не того типа.
Проверить()дополнительно проверяет ограничения: обязательность, длину строк, перечисления, шаблоны.- Текст ошибки содержит имя свойства, на котором споткнулась проверка, — по нему легко найти место в файле.
Если пакет уже импортирован в конфигурацию, вместо СоздатьФабрикуXDTO используйте глобальную ФабрикаXDTO, а тип задайте явно:
Тип = ФабрикаXDTO.Тип("http://example.ru/exchange/v2", "Документ");
Объект = ФабрикаXDTO.ПрочитатьXML(Чтение, Тип);
Для разовой проверки файла без программирования подойдут внешние XML-редакторы с функцией валидации по XSD. Но если файл формирует 1С, проверку лучше встроить в саму выгрузку — ошибка всплывёт до отправки, а не после отказа приёмной стороны.
Как работать с типами схемы после импорта
Загрузить схему — половина задачи. Дальше по ней формируют и читают файлы обмена.
Создание и запись объекта:
Пространство = "http://example.ru/exchange/v2";
ТипДокумента = ФабрикаXDTO.Тип(Пространство, "Документ");
Документ = ФабрикаXDTO.Создать(ТипДокумента);
Документ.Номер = "А-125";
Документ.Дата = ТекущаяДатаСеанса();
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл(ИмяФайла, "UTF-8");
Запись.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(Запись, Документ);
Запись.Закрыть();
Имена свойств (Номер, Дата) берутся из схемы как есть — с учётом регистра и языка. Если в XSD элементы названы латиницей, обращайтесь к ним латиницей.
Полезные приёмы:
- 🧩 Для свойства-списка (в схеме
maxOccurs="unbounded") значение —СписокXDTO, новые элементы добавляют методомДобавить(). - 🧭 Тип вложенного объекта удобно получать через свойство родителя:
Документ.Свойства().Получить("Строки").Тип. - 🧪 Перед записью вызывайте
Документ.Проверить()— ошибки найдутся до того, как файл уйдёт контрагенту.
Ошибки при загрузке XSD и чтении файлов
Выберите симптом — откроется причина и порядок действий.
Новая версия схемы: как обновить XDTO-пакет
Форматы обмена живут годами и меняются. Чтобы обновление не сломало действующий обмен, договоритесь о порядке заранее.
Если меняется только содержимое
Пространство имён то же, добавились поля или ослабились ограничения. Порядок такой:
- Выгрузите текущий пакет через
Экспорт XML-схемы...— это ваша страховка. - Удалите старый пакет и импортируйте новую схему, задав пакету то же имя.
- Найдите в коде все обращения к удалённым или переименованным свойствам: глобальный поиск по имени свойства в модулях.
- Сравните файлы обмена до и после: сформируйте XML по старой и новой схеме на одних данных.
Если меняется пространство имён
Многие форматы включают номер версии прямо в URI. Тогда старый и новый пакеты могут жить рядом:
| Ситуация | Что делать |
|---|---|
| Контрагенты переходят на новую версию постепенно | Держите оба пакета, выбирайте фабрику по версии в файле |
| Старая версия больше не принимается | Удалите старый пакет после проверки, что код на него не ссылается |
| Схему меняет внешняя система без вашего участия | Загружайте её из кода через СоздатьФабрикуXDTO, не храня в конфигурации |
Как не потерять историю:
- 🗂️ Храните исходные
.xsdрядом с проектом в системе контроля версий, с номером версии в имени папки. - 📝 В комментарии к XDTO-пакету укажите дату и источник схемы.
- 🔍 Перед обновлением рабочей базы сравните конфигурации через
Конфигурация → Сравнить, объединить с конфигурацией из файла...— изменения в пакете будут видны в отчёте о сравнении.