К статье
Практический материал

Разработка и Конфигурация · 11 мин

URI пространства имен в 1С: что это и зачем он нужен

URI пространства имен в 1С — уникальный идентификатор пакета XDTO и типов данных. Разбираем, где он используется, как его задать, проверить и не допустить типичных ошибок.

URI пространства имен в 1С — это строковый идентификатор, который однозначно определяет набор типов данных. Чаще всего разработчик сталкивается с ним при работе с пакетами XDTO, веб-сервисами, обменами EnterpriseData и механизмом сериализации. Платформа использует пространство имен, чтобы отличать одноименные типы из разных источников: например, тип «Контрагент» из вашего прикладного пакета и тип «Контрагент» из пакета внешнего веб-сервиса.

Несмотря на название, URI пространства имен не обязан быть реальным адресом в интернете. Это просто уникальная строка, оформленная в виде URI. Переход по ней в браузере ничего не даст — и это нормально. Главное требование к идентификатору — глобальная уникальность и неизменность после публикации, поскольку на него завязываются форматы сообщений, схемы обмена и код обработки данных.

Ошибки в пространствах имен — частая причина сбоев обменов: сообщение не распознается, типы «теряются», сериализация выдает неожиданный XML. Ниже разобрано, где именно используется URI пространства имен, как его задать, как проверить корректность и какие ошибки встречаются чаще всего.

Где в 1С используется пространство имен

Основное место встречи с пространством имен — пакеты XDTO в ветке «Общие» дерева конфигурации. У каждого пакета есть свойство «URI пространства имен», и все типы, описанные в этом пакете, принадлежат именно ему. Когда вы создаете объект XDTO или читаете XML, платформа сопоставляет элементы с типами именно через этот URI.

Второй сценарий — веб-сервисы. При публикации собственного веб-сервиса 1С вы указываете URI пространства имен в свойствах объекта метаданных «Web-сервис». Он попадет в WSDL-описание, и потребители сервиса будут использовать его при формировании запросов. При подключении к чужому сервису через WS-ссылку платформа, наоборот, импортирует пространства имен из чужой WSDL.

Третья область — форматы обмена: EnterpriseData, планы обмена с XDTO-сериализацией, механизмы «СериализаторXDTO» и «ФабрикаXDTO» в коде. Здесь пространство имен определяет, какие типы будут записаны в XML и как они будут прочитаны на приемной стороне.

Чем URI пространства имен отличается от обычного адреса

Формат URI выбран исторически: стандарт XML Namespaces требует, чтобы идентификатор пространства был URI. Это создает ложное впечатление, что строка должна вести на реальный сайт или файл схемы. На практике платформа 1С и любой XML-процессор используют эту строку только как метку для сравнения «символ в символ».

Из этого следуют два практических вывода. Первый: не нужно пытаться «открыть» URI в браузере и пугаться ошибки 404 — идентификатору не обязан соответствовать ресурс. Второй: при сравнении важна точность строки — отличие в регистре букв, лишнем слэше или протоколе (http вместо https) делает пространства разными, даже если визуально они «почти одинаковые».

Тем не менее принято использовать в URI собственный домен организации — это дешевый способ гарантировать уникальность, не регистрируя ничего дополнительно. Например, http://vashafirma.ru/1c/exchange/orders — рабочий вариант, даже если по этому адресу ничего не опубликовано.

Как задать URI пространства имен для пакета XDTO

Создайте в конфигураторе новый пакет XDTO: ветка «Общие» → «Пакеты XDTO» → «Добавить». Первое, что запросит платформа, — URI пространства имен. Придумайте строку по правилам: используйте домен, который контролируете, добавьте путь, отражающий назначение пакета, и при желании — версию формата.

После задания URI опишите типы: объекты типов XDTO и типы значений XDTO. Имена типов должны быть уникальны внутри пакета. Затем проверьте работу через «ФабрикуXDTO»: запишите объект в XML и убедитесь, что в выходном документе элементы получили правильное пространство имен, а чтение обратно проходит без ошибок.

Если пакет импортируется из внешней схемы XSD, URI подставится из атрибута targetNamespace схемы. Менять его после импорта не стоит: тогда сгенерированные внешней системой сообщения перестанут сопоставляться с типами пакета.

Порядок действий
  1. 1
    Создайте пакет XDTO и укажите URI по шаблону: домен организации + путь назначения + версия
  2. 2
    Опишите типы объектов и значений внутри пакета
  3. 3
    Сформируйте тестовый объект через ФабрикуXDTO и запишите его в XML
  4. 4
    Проверьте, что в XML проставлено ожидаемое пространство имен
  5. 5
    Прочитайте XML обратно и убедитесь, что типы распознаются без ошибок

Пример обращения к типу по пространству имен в коде

Встроенный язык позволяет получать типы и фабрики явно по URI. Это удобно, когда одноименные типы существуют в нескольких пакетах.

bsl
Тип = ФабрикаXDTO.Тип("http://vashafirma.ru/1c/exchange/orders", "Заказ");
Объект = ФабрикаXDTO.Создать(Тип);
Объект.Номер = "А-001";
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(Запись, Объект);
ТекстXML = Запись.Закрыть();

Как выбрать URI, чтобы не переделывать потом

Главный критерий — стабильность. Как только пакет опубликован и на него завязались обмены, менять URI нельзя: фактически это создание нового набора типов. Поэтому в URI не стоит включать временные элементы вроде «test», «new» или даты, которая быстро устареет смыслово.

Версионирование лучше закладывать осознанно. Если формат будет развиваться несовместимо, удобно включить номер версии в путь: .../orders/v1, а при несовместимом изменении выпустить .../orders/v2 и поддерживать оба пространства параллельно. Совместимые изменения (добавление необязательных полей) можно делать внутри одного пространства.

Также решите заранее, будет ли один пакет на всю конфигурацию или несколько по подсистемам. Дробление по смысловым областям (заказы, справочники, оплаты) упрощает сопровождение, но увеличивает число пространств, за которыми нужно следить.

Сравнение вариантов

URI на домене организации

Гарантирует уникальность и понятное владение. Требует дисциплины: домен не должен «уйти» вместе со сменой бренда, иначе URI станет вводить в заблуждение.

URI вида urn:mycompany:orders

Не привязан к домену, подчеркивает, что это чистый идентификатор. Менее привычен для внешних интеграторов, но полностью валиден.

URI с версией в пути

Упрощает параллельную поддержку несовместимых версий формата. Минус — рост числа пространств и необходимость маппинга между версиями.

Проверка и диагностика проблем

Если обмен «внезапно» перестал работать, первым делом сравните пространства имен в отправляемом XML и в пакете XDTO приемника. Откройте XML сообщения и посмотрите атрибуты xmlns у корневого и вложенных элементов — они должны точно совпадать с URI пакета.

Типичный симптом рассинхронизации: чтение XML проходит без явной ошибки, но объект создается не того типа, либо свойства оказываются пустыми. Это значит, что элементы попали в другое пространство имен (или вообще без пространства), и фабрика не сопоставила их с типами пакета.

Для веб-сервисов проверяйте WSDL: скачайте описание сервиса и найдите targetNamespace. Если потребитель формирует запросы с другим пространством, сервер 1С вернет ошибку или не распознает операцию.

Контрольные точки

Как проверить результат

Атрибут xmlns в сформированном XML
Норма

Точно совпадает с URI пакета XDTO

Тревожный признак

Другое пространство, пустое значение или лишний слэш

Чтение XML через ФабрикуXDTO
Норма

Объект создается ожидаемого типа, свойства заполнены

Тревожный признак

Тип не распознан, свойства пустые

WSDL опубликованного веб-сервиса
Норма

targetNamespace равен URI из свойств веб-сервиса

Тревожный признак

Пространство отличается от того, что шлет потребитель

Типичные ошибки и ограничения

Самая распространенная ошибка — изменить URI существующего пакета «для красоты» после запуска обмена. Все накопленные сценарии интеграции, внешние системы и сохраненные сообщения мгновенно становятся несовместимыми. Если переименование неизбежно, его нужно выполнять как выпуск новой версии формата с миграцией.

Вторая ошибка — копирование чужого URI (например, из примера в документации) в собственный пакет. При совместной загрузке пакетов возникают конфликты одноименных типов, а сопровождение превращается в головоломку. Третья группа проблем — небрежность с регистром и слэшами при ручном формировании XML в коде: строки пишутся «на глаз» и расходятся с пакетом.

Отдельно стоит упомянуть попытки использовать URI как источник схемы: платформа не скачивает ничего по этому адресу. Схемы XSD импортируются из файлов, а не подтягиваются по пространству имен автоматически.

Типичные ошибки
01
Изменение URI опубликованного пакета — ломает все действующие обмены и сохраненные сообщения
02
Копирование URI из чужих примеров — конфликты типов при совместном использовании пакетов
03
Расхождение в регистре или слэше при ручной сборке XML — типы не распознаются фабрикой
04
Ожидание, что по URI загрузится схема — платформа использует URI только как строку-метку
05
Включение в URI слов test или tmp — приходится сопровождать «временный» идентификатор годами

Практические рекомендации по сопровождению

Зафиксируйте все используемые пространства имен в едином реестре: URI, назначение пакета, владелец, версия формата, системы-потребители. Это простое действие экономит часы при расследовании сбоев обмена, особенно когда интеграций больше двух-трех.

При разработке выносите строки URI в константы или функции-обертки, а не размножайте литералы по коду. Тогда опечатка обнаружится в одном месте, а не в десятке процедур. Для тестов обменов держите эталонные XML-файлы и сверяйте пространства имен автоматически при изменениях пакетов.

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

Маршрут решения

Как выбрать действие

Нужен новый пакет для собственного формата обменаСформируйте URI на своем домене с путем назначения и зафиксируйте его в реестре
Формат меняется несовместимо с текущей версиейВыпустите новое пространство имен с новой версией и поддерживайте оба параллельно
Обмен сломался без изменений с вашей стороныСравните xmlns в приходящем XML с URI пакета и проверьте, не обновился ли внешний сервис
Подключаете чужой веб-сервисИмпортируйте пространства через WS-ссылку и не редактируйте их вручную
Итог

Что важно запомнить

URI пространства имен — стабильная уникальная строка-метка типов, а не ссылка. Задавайте его на своем домене, не меняйте после публикации, версионируйте через новые пространства и проверяйте точное совпадение xmlns при сбоях обмена.

Частые вопросы

Обязательно ли URI должен вести на реальный сайт?

Нет. Это идентификатор, а не адрес ресурса. Платформа и XML-процессоры используют строку только для точного сравнения, поэтому отсутствие страницы по этому URI — нормальная ситуация.

Можно ли использовать русские буквы в URI пространства имен?

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

Что будет, если два пакета имеют одинаковый URI?

При совместной загрузке возникнут конфликты одноименных типов, а фабрика может сопоставить элементы не с тем пакетом. Такие ситуации нужно разрешать объединением пакетов или изменением URI одного из них до публикации.

Как изменить пространство имен, если обмен уже работает?

Напрямую — никак без последствий. Правильный путь: создать новое пространство имен (новую версию формата), поддержать прием и отправку в обоих пространствах на переходный период и только потом отключить старое.

Где посмотреть URI пространства имен существующего пакета?

В конфигураторе: откройте пакет в ветке «Общие» → «Пакеты XDTO» и посмотрите свойство «URI пространства имен». Для веб-сервиса аналогичное свойство находится в объекте метаданных «Web-сервис», а также видно в WSDL как targetNamespace.

Чувствительно ли пространство имен к регистру букв?

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