Разработка и Конфигурация · 12 мин
Фасет XDTO в 1С: что это и как работать с ограничениями значений
Разбираем, что такое фасет XDTO в 1С: виды фасетов, проверка значений по ограничениям, работа с пакетами XDTO, типичные ошибки и практические примеры кода.
При обмене данными через XML, веб-сервисы и форматы вроде ЭДО или выгрузок в банк 1С опирается на механизм XDTO (XML Data Transfer Objects). Одна из ключевых концепций этого механизма — фасет: ограничение, которое накладывается на значение типа данных. Фасеты отвечают на вопросы вроде «какая максимальная длина строки», «сколько знаков после запятой у числа», «в каком диапазоне лежит дата». Понимание фасетов необходимо, когда обмен ломается с ошибкой «Ошибка проверки данных XDTO» или когда вы создаёте собственные пакеты XDTO для интеграций.
Без фасетов XML-схема была бы просто набором полей без правил. Именно фасеты позволяют платформе автоматически проверять, что ИНН содержит 10 или 12 цифр, что сумма документа имеет не больше двух знаков после запятой, а код валюты соответствует перечисленным значениям. Когда проверка не проходит, 1С выбрасывает исключение ещё до записи или чтения данных — и это защищает базу от некорректных значений из внешних источников.
Что такое фасет и где он живёт в модели XDTO
Механизм XDTO в 1С описывает структуру данных через пакеты XDTO — аналог XML-схем (XSD). Каждый пакет содержит типы значений и типы объектов. Тип значения (например, «ИНН» или «СуммаДокумента») наследуется от базового примитивного типа — string, decimal, dateTime — и уточняется фасетами. Фасет — это свойство типа значения, хранящее ограничение: фиксированное или максимальное значение параметра.
В дереве конфигурации пакеты XDTO находятся в ветке «Общие → XDTO-пакеты». Открыв конкретный тип значения, вы увидите список его фасетов: длина, минимальная и максимальная длина, шаблон, перечисления, общее количество разрядов и так далее. Те же данные доступны программно через объект ФабрикаXDTO и свойства типа значения.
Важно понимать иерархию: базовый тип (string) → тип значения с фасетами (строка длиной 10) → свойство объекта, использующее этот тип. Фасеты наследуются и сужаются: дочерний тип может ужесточить ограничение родителя (например, сократить максимальную длину), но не может его ослабить — это правило XML Schema, которое платформа соблюдает.
Основные виды фасетов и их назначение
Набор доступных фасетов зависит от базового типа. Для строк доступны ограничения длины и шаблоны, для чисел — разрядность и границы диапазона, для дат — границы периода. Ниже перечислены фасеты, с которыми разработчик 1С сталкивается чаще всего.
| Фасет | К чему применяется | Что ограничивает |
|---|---|---|
| Длина (length) | Строки | Точное количество символов, например КПП — строго 9 |
| Минимальная / максимальная длина | Строки | Диапазон допустимой длины, например наименование от 1 до 150 символов |
| Шаблон (pattern) | Строки | Регулярное выражение, например ИНН — только цифры, 10 или 12 знаков |
| Перечисление (enumeration) | Строки, числа | Фиксированный список допустимых значений, например коды валют |
| Общее количество разрядов (totalDigits) | Числа | Максимальное число цифр в числе целиком |
| Количество разрядов дробной части (fractionDigits) | Числа | Точность после запятой, например 2 знака для сумм |
| Минимальное / максимальное значение | Числа, даты | Границы диапазона, включительно или исключительно |
| Обработка пробелов (whiteSpace) | Строки | Правило нормализации пробельных символов: сохранить, заменить, сжать |
На практике чаще всего встречаются связки «максимальная длина + шаблон» для идентификаторов и «totalDigits + fractionDigits» для денежных сумм. Например, тип суммы в банковских форматах обычно ограничен 18 разрядами всего и 2 разрядами дробной части — попытка записать сумму с тремя знаками после запятой вызовет ошибку проверки.
Как платформа проверяет значения по фасетам
Проверка выполняется автоматически в двух сценариях: при чтении XML в объекты XDTO и при записи объектов XDTO в XML. Если входящий файл содержит значение, нарушающее фасет (например, строку длиннее допустимой), чтение прерывается исключением с описанием типа, фасета и полученного значения. Та же проверка срабатывает, когда вы программно присваиваете свойству объекта XDTO неподходящее значение и затем вызываете запись.
Дополнительно можно вызвать проверку явно. У значений и объектов XDTO есть методы, позволяющие проверить корректность без записи: например, метод Проверить() у объекта XDTO выполняет валидацию всей структуры, включая обязательность свойств и соответствие фасетам. Это удобно перед отправкой данных в веб-сервис: лучше поймать ошибку локально, чем получить отказ от удалённой системы.
Попытка
ОбъектXDTO.Проверить();
Исключение
Сообщить("Нарушение фасета: " + ОписаниеОшибки());
КонецПопытки;Текст ошибки обычно содержит пространство имён пакета, имя типа, имя нарушенного фасета и фактическое значение. Например: «Ошибка проверки данных XDTO: значение '12345678901' не соответствует фасету 'МаксимальнаяДлина' типа 'ИННФЛ'». По этой диагностике можно быстро найти проблемное поле в исходном файле.
Практические сценарии работы с фасетами
Получение фасетов типа программно
Иногда нужно узнать ограничения типа до заполнения данных — например, чтобы обрезать строку до допустимой длины или показать пользователю подсказку. Тип значения XDTO предоставляет коллекцию фасетов, которую можно перебрать или запросить по виду фасета.
ТипЗначения = ФабрикаXDTO.Тип("http://mycompany.ru/exchange", "ИНН");
ФасетДлина = ТипЗначения.Фасеты.Получить(ВидФасетаXDTO.МаксДлина);
Если ФасетДлина <> Неопределено Тогда
МаксимальнаяДлина = Число(ФасетДлина.Значение);
КонецЕсли;Создание собственного пакета XDTO
При построении собственного формата обмена фасеты задаются в конфигураторе в свойствах типа значения либо импортируются из готовой XSD-схемы. Рекомендуется опираться на требования принимающей стороны: если банк или контрагент прислал XSD, импортируйте её напрямую через пункт «Импорт XML-схемы» в контекстном меню пакета — фасеты подтянутся автоматически, и вы избежите расхождений в ограничениях.
Обработка ошибок валидации при загрузке
Если входящие файлы периодически содержат «грязные» данные, не стоит отключать проверку полностью. Разумный подход — читать файл, перехватывать исключение, логировать текст ошибки с указанием файла и строки, а затем либо запрашивать исправленный файл у отправителя, либо аккуратно нормализовать значение (обрезать пробелы, округлить сумму) с явной записью в журнал.
Частые проблемы и способы их решения
Самая распространённая ситуация — ошибка «не соответствует фасету» при загрузке файла от внешней системы. Причины обычно три: отправитель использует другую версию схемы, данные содержат лишние пробелы или спецсимволы, либо ограничение в вашем пакете жёстче, чем реальные данные (например, наименование контрагента длиннее 150 символов).
Вторая типичная проблема — расхождение версий пакетов после обновления конфигурации. Если поставщик конфигурации изменил фасеты типового пакета, а ваша доработка опиралась на старые ограничения, обмен может начать падать. Перед обновлением имеет смысл проверить, не используете ли вы расширенные или изменённые типовые пакеты XDTO.
Как проверить корректность настройки
После создания или изменения пакета XDTO полезно прогнать контрольный сценарий: сформировать тестовый объект, заполнить его граничными значениями (строка ровно максимальной длины, сумма с максимальным числом разрядов) и выполнить запись в XML. Затем прочитать полученный файл обратно. Если запись и чтение проходят без исключений, а значения не искажены, фасеты настроены корректно.
Как проверить результат
Запись проходит без исключений, XML содержит все значения
Исключение с указанием типа и нарушенного фасета
Файл читается, значения совпадают с записанными
Ошибка проверки данных XDTO на этапе чтения
Строка максимальной длины и сумма с максимальной точностью проходят
Даже допустимые по смыслу значения отклоняются — фасеты заданы слишком жёстко
Принимающая сторона подтверждает формат
Файл отклонён — сверить XSD контрагента с вашим пакетом
Когда фасеты не нужны и какие есть альтернативы
Фасеты оправданы, когда формат обмена формализован и контролируется обеими сторонами: ЭДО, банковские выписки, обмен с государственными сервисами, корпоративные интеграции по XSD. Если же вы делаете быстрый разовый обмен или формат нестабилен, жёсткие ограничения создадут больше проблем, чем пользы — каждое отклонение будет ронять загрузку.
Сравнение вариантов
Подходит для стабильных формализованных форматов; даёт автоматическую валидацию, но требует поддержки схемы
Гибче к «грязным» данным, но проверки придётся писать вручную в коде
Полный контроль и максимальная терпимость к ошибкам формата, но нет автоматической типизации и валидации
Проще для новых интеграций, но встроенной схемной валидации в платформе для JSON нет — проверки только кодом
Компромиссный вариант — оставить в пакете только базовые типы без жёстких фасетов, а критичные проверки (ИНН, суммы, обязательные поля) реализовать кодом после чтения. Так вы получаете управляемые сообщения об ошибках и возможность частичной загрузки корректных данных вместо полного отказа.
Что важно запомнить
Фасет XDTO — это ограничение значения типа в схеме обмена: длина, шаблон, разрядность, диапазон, перечисление. Платформа проверяет фасеты автоматически при чтении и записи XML. Ошибки валидации чинятся сверкой схемы с реальными данными, а не ослаблением типовых пакетов. Для нестабильных форматов разумнее переносить проверки в код.
Частые вопросы о фасетах XDTO
Чем фасет отличается от типа значения XDTO?
Тип значения — это именованное определение данных в пакете (например, «ИНН»), а фасет — отдельное ограничение внутри этого типа. Один тип может содержать несколько фасетов одновременно: например, тип ИНН ограничен и шаблоном «только цифры», и длиной 10 или 12 символов.
Почему возникает ошибка «не соответствует фасету» при загрузке файла?
Значение во входящем XML нарушает ограничение, заданное в вашем пакете XDTO: строка длиннее допустимой, лишние знаки после запятой, недопустимый символ. Сначала прочитайте текст исключения — в нём указаны тип, фасет и само значение. Затем сверьте схему с форматом отправителя: чаще всего расходятся версии XSD.
Можно ли отключить проверку фасетов при чтении?
Штатного глобального отключения валидации нет. Обходные пути — ослабить ограничения в собственном (не типовом) пакете или читать файл низкоуровнево через ЧтениеXML с ручной разборкой. Изменять типовые пакеты не рекомендуется: правки затрутся при обновлении конфигурации.
Как узнать, какие фасеты заданы у типа, программно?
Получите тип через ФабрикаXDTO.Тип() и обратитесь к его коллекции фасетов: переберите её в цикле или запросите конкретный фасет методом Получить с указанием вида фасета (ВидФасетаXDTO). У каждого фасета доступны свойства вида, значения и признак фиксированности.
Что означает фиксированный фасет (fixed)?
Фиксированный фасет запрещает изменять это ограничение в производных типах. Если в родительском типе фасет «максимальная длина 100» помечен как фиксированный, дочерний тип не сможет задать ни 50, ни 150 — наследование типа с попыткой переопределить фасет приведёт к ошибке схемы.
Работают ли фасеты при обмене через веб-сервисы 1С?
Да. Веб-сервисы 1С используют ту же фабрику XDTO: при сериализации ответа и десериализации запроса значения проверяются по фасетам пакетов, на которые ссылается описание сервиса. Поэтому некорректное значение в запросе вызовет ошибку ещё до входа в код операции веб-сервиса.