Xdto 1С

  • автор:

Значение не является значением объектного типа 1С

Программное обеспечение 1С:Предприятия значительно упрощает работу разного рода предприятий в оформлении и создании цифровых документов. Внутри продукта реализован специальный язык конфигурирования документов. С его помощью пользователи могут создавать базы данных, торговые формы и другие программные модули. Особенностью языка является команды и операторы на русском языке. При создании документов многие сталкиваются с ошибкой — «Значение не является значением объектного типа (Имя)». В этой статье мы определим её причину и научимся устранять этот сбой.

Причина ошибки объектного типа в 1С

Распространенными версиями программы на сегодняшний день являются 1С:Пердприятия 8.2, 8.3. Именно в них, по словам пользователей, появляется ошибка с типами объектов. Во всех случаях причиной является недостаточный опыт того, кто пытается написать программу. Другими словами — ошибку вызывает неверно написанный код. Но в некоторых случаях проблема может появляться по другим причинам. Рассмотрим всевозможные варианты устранения ошибки в 1С:Предприятия.

Полезно знать: ошибка в 1С 7.7 «Порядок сортировки, установленный для баз данных, отличается от системного.

Чистим кэш в программе 1С:Предприятие

Чтобы не терять времени и не отслеживать неточности в самом коде, попробуем воспользоваться стандартными методами устранения ошибок в 1С. Для начала очистим кэш, который часто препятствует нормальному функционированию программы. И в то же время в нём находится достаточно много полезных для ПО файлов, таких как настройка окон, установленные цвета, настройка шрифтов, профили и многое другое.

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

Их можно найти как вручную на диске, который вы указали при установке, так и при помощи окна ввода команд в Windows. Чтобы запустить и открыть временные файлы 1C:

  1. Нажмите две клавиши вместе WIN+R;
  2. Появится строка ввода внизу в левой части экрана. Скопируйте одну из строк выше и вставьте в пустое поле. Проследите, чтобы каждая команда была написана только латинскими буквами;
  3. Нажмите ENTER, и система покажет вам нужную папку;
  4. В каждой папке нужно удалить всё содержимое, затем закрыть окна и запустить программу.

Читайте также: ошибка при выполнении запроса POST к ресурсу/e1cib/logForm.

Тестирование базы 1С.Предприятие в версии 8.3

В программном продукте 1С:Предприятие 8.3 есть специальная утилита, которая позволяет проверять базу данных на ошибки и автоматически исправлять их. Удобный инструмент для всех случаев. Вам стоит знать, где она находится и как её использовать даже в том случае, если нашей беде она не поможет. Для более эффективного применения наладчика вам нужно знать его разделы. Каждый нужно использовать в определенном случае.

  • Тестирование базы данных на ошибки — для устранения нашей ошибки — значение не является значением объектного типа 1С — этот пункт необходимо использовать в первую очередь. Он позволяет определять и устранять ошибки при создании новых объектов и таблиц соответствий базы;
  • Проверка ссылок базы данных — этот модуль нужно использовать при частых ошибках «Объект не найден». Он проверяет правильность пути к объекту и исправляет его в случае надобности. Модуль можно настроить, выбирая параметры: «Не изменять», «Создавать объекты», «Удалять» и так далее;
  • Переоформление таблиц БД — при запуске этого пункт, делается копия базы данных и заново создаются таблицы с данными. Процесс занимает длительно время;
  • Переиндексация таблиц БД — в базе данных есть основная таблица индексирования. Для более быстрой работы к основной таблице добавляются вспомогательные. В них данные сортируются по определенным параметрам, которые заданы в основной таблице. Утилита сканирует данные индексного файла и таблиц на ошибки;
  • Сжатие данных в БД — когда вы удаляете какой-нибудь объект из таблицы или в конфигурации, он исчезает только визуально. Удаленные объекты остаются в БД, хотя и не отображаются нигде. Чтобы уменьшить объем всего документа, рекомендуется перед сохранением использовать этот модуль;
  • Проверка актуальных данных — чтобы быстро отображать расчеты БД, в 1С есть специальный файл, в котором программа уже произвела необходимые расчеты для отображения итогового результата. Если с данным файлом пользователь нашел несоответствия или искаженные данные, нужно запустить этот пункт для проверки.

Эти разделы утилиты позволят вам исправить многие ошибки, которые встречаются при работе в 1С:Предприятия. Запустить их очень просто:

  1. Откройте программу;
  2. Выберите на панели инструментов вкладку «Администрирование»;
  3. Выберите из списка пункт «Тестирование и исправление»;

    Поиск утилиты «Тестирование и исправление» в 1С:Предприятие

  4. Определитесь с разделом и запустите сканирование.

Устраняем ошибку при формировании отчета

Если вы пытаетесь сформировать отчет в программе 1С:Предприятия, но в процессе появляется ошибка с неверным значением объектного типа, то устранить её можно следующем путём:

  1. В стандартных конфигурациях управляемых форм существует настройка, которая выводит подразделения разделов по иерархии. Чтобы активировать её, необходимо открыть пункт «Настройки». Найти его можно вверху на панели инструментов;

    Настройки программы 1С:Предприяте

  2. Среди перечня настроек в первом столбце выберите пункт «Дополнительные настройки»;
  3. Найдите пункт «Выводить полную иерархию…» и поставьте на нём галочку;

    Пункт настроек «Выводить полную иерархию подразделений» в 1С:Предприятие

  4. Просмотрите другие пункты настроек, возможно, они смогут пригодиться;
  5. Сохраните созданные настройки программы.

Необходимо знать, что каждое значение переменной должно иметь свои реквизиты. Если оставить одну из значений переменных без параметра, программа будет выдавать ошибку. Сбой возникает по той причине, что в каком-то участке кода подобный объект содержит значение, в котором нет никаких полей. Иначе говоря, оно не определено. Когда этот код будет запущен, обработчик попытается прочитать переменную и выдаст ошибку о неверном типе данных.

При обсуждении этой ошибки на тематических форумах, пользователь, который задает свой вопрос, чаще всего сам находит неточности и решает проблему. Поэтому проверьте несколько раз свой код на наличие ошибок. Если вы не смогли отыскать её, обратитесь на один из форумов, где есть разделы по теме 1С:Предприятие. Задайте вопрос и выложите код, который не удается наладить самостоятельно. На таких ресурсах пребывает достаточно много специалистов. Помогая другим устранять ошибки в данном продукте, они оттачивают своё умение. Поэтому они с радостью помогут вам найти огрехи.

Если вам вдруг не помогли инструкции из этой статьи, то в интернете есть специальные программы и онлайн-сервисы, которые отслеживают ошибки программы. Вы можете самостоятельно найти их через поисковые системы. За символическую плату можно связаться со специалистом по телефону или Skype, чтобы он помог вам устранить ошибку — значение не является значением объектного типа 1С.

Несоответствие свойства и элемента данных XDTO

Бывают случаи, когда на данном компьютере пользователя в рабочей базе была старая конфигурация, хотя на любом другом ПК и на сервере она обновилась. Так же может возникать ошибка потока данных. В этих и некоторых других случаях поможет очистка кеша.
В связи с тем, что 1С может быть установлена на различных операционных системах, папка, где хранится кэш, может быть различной.
Для Win XP:
%userprofile%\Local Settings\Application Data\1C\1Cv82
%userprofile%\Application Data\1C\1Cv82
Для Win 7:
%userprofile%\AppData\Roaming\1C\1Cv82
%userprofile%\AppData\Local\1C\1Cv82
А самый простой способ найти папки – это использовать поиск по системе(win + F) по ключевым словам «1сv81» и/или «1cv82». Нужные нам папки находятся в каталоге пользователя.
Напимер:
C:\Documents and Settings\%userprofile%\Local Settings\Application Data\1C\1Cv81
C:\Documents and Settings\%userprofile% \Local Settings\Application Data\1C\1Cv82
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv81\
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv82\
Важно:
1) Кэш хранится в двух папках. Чаще всего эти папки называются «LocalSettings» и «ApplicationData». Обе папки находятся в каталоге пользователя.
2) Формат кэш-файлов выглядит вот так: «0df525c2-1c3e-44be-b852-c7059f17c5aa» или «0f2c4d8f-cc84-4033-8744-1acfa6204474». Удалять необходимо только те папки, у которых такой же формат в названии.
3.) Не удаляйте файл ibases.v8i — он содержит список баз

Одним из самых популярных форматов данных, используемых практически в любой компании, является XML (расширяемый язык разметки). Разработчики 1С создали специальный объект XDTO для удобства своих клиентов и простого взаимодействия с файлами XML, поэтому программисту 1С важно работать с этими объектами платформы, так как обмен данными через XML встречается постоянно.

Преимущества механизма XDTO

Этот функционал создавался как удобный инструмент обмена данными между конфигурациями и другими приложениями. Также этот механизм используют для работы с web-сервисами и для обработки произвольных данных. Большое преимущество XDTO перед другими способами – в нем есть возможность обращаться к файлу XML, как к объекту 1С. То есть все реквизиты можно будет получить, описывая структуру через точку, не задумываясь о скобках, тегах и атрибутах.

Взаимодействие с файлами XML происходит по заранее установленным правилам, описанным в объекте структуры конфигурации – XDTO – пакеты в 1С 8.3. Суть этих элементов структуры в том, что они представляют собой схемы, по которым будут распознаваться данные из XML-файлов. В типовых конфигурациях уже присутствуют подобные объекты, но при работе с конкретными файлами понадобятся другие схемы.

Существует два способа добавить XDTO-пакет в конфигурацию:

  • Собственноручно создать. Этот вариант подойдет при самостоятельной работе с XML определенного формата. Зная, какие данные будут подаваться на вход для импорта с использованием XDTO, можно заранее создать в конфигурации нужный объект. Этот вариант хорош, если обмен данными налажен и никаких изменений не планируется;
    Работа с XDTO в 1С 8.3
  • Импорт присланной схемы. Когда нам присылают данные, их схема может оказаться какой угодно, особенно, если раньше мы не работали с источником. Сильно упростит ситуацию, если вместе с XML нам пришлют и файл формата xsd. В нем содержится выгрузка XDTO-пакета, который может разобрать конкретные XML. Нам останется лишь импортировать его.

Чтобы загрузить данные из присланной нам схемы, необходимо в режиме конфигуратор открыть раздел «Общие» и «XDTO-пакеты». Через контекстное меню выбрать пункт «Импорт XML-схемы…», выбрать файл и подтвердить пространство имен, взятое из файла. После этого необходимо обновить конфигурацию, и предварительные настройки сделаны.

Но на самом деле в последнем случае нам необязательно создавать XDTO-пакеты в конфигурации 1С 8.3. Существует возможность только использовать XSD-схему, присланную нам из отдельного файла, не внося изменения в структуру базы 1С. Для этого нужно воспользоваться кодом, объясняющим платформе 1С, какой тип объекта с какими параметрами будет загружаться.

Это происходит следующими командами:

ФайлXSD = Новый Массив(); ФайлXSD.Добавить(«D:\1\strust.xsd»); ФабрикаXDTOИзФайла = СоздатьФабрикуXDTO(ФайлXSD); Номенклатура = ФабрикаXDTOИзФайла.Тип(«http://www.1c.ru/products», «Номенклатура»);

Экспорт и импорт файла

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

  1. Заполняем URI-пространство имен в свойствах XDTO пакета. Среди разработчиков 1С принято заполнять этот реквизит адресом страницы, заполненной описанием тех данных, с которыми происходит работа. Это помогает в работе, но не всегда возможно. В иных случаях заполняют произвольным текстом;
  2. Задаем тип объекта и его свойства, используя контекстное меню. Задаем имя этих параметров и для свойств определяем тип, выбирая его из предложенных платформой.

Работа с XDTO в 1С 8.3

Следующим этапом будет написание процедуры для создания файла XML по описанной выше схеме. Код достаточно прост, поскольку создан XDTO-пакет, а у элемента всего 2 свойства – «Наименование» и «Артикул». Обращаться к конкретной схеме позволяет объект платформы «ФабрикаXDTO». Сама процедура состоит из:

Чтение XML-файлов с помощью конкретной фабрики XDTO по уже созданному в конфигурации пакету ничуть не сложнее. Алгоритм похож по структуре и отличается только операциями взаимодействия с XML-файлами. В данном случае нам нужно воспользоваться объектом платформы «ЧтениеXML» и прочитать содержимое в переменную. На выходе у нее будет тип «ОбъектXDTO», и вы сможете обращаться ко всем ее свойствам через точку.

ТипФабрики = ФабрикаXDTO.Тип(«http://www.primerXML.ru/Nomen»,»Номенклатура»); ИмяФайла = «D:\1\struct1.xml»; МойXML = Новый ЧтениеXML; МойXML.ОткрытьФайл(ИмяФайла); номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, ТипФабрики); МойXML.Закрыть();

Теперь попробуем прочитать файл, схемы которого нет в нашей конфигурации. Для этого экспортируем XDTO-пакет в файл формата xsd и удалим схему из конфигурации. После этого нам придется объяснить платформе, откуда ей брать схему читаемой XML-кодом, продемонстрированным ранее. Однако в простейших случаях 1С самостоятельно может распознать все свойства.

Работа с XDTO в 1С 8.3

Лучше все-таки не рассчитывать на понятливость платформы 1С, а использовать точную схему XML. Многие специалисты используют сторонний софт для их создания, но для этого необходим достаточно большой опыт и уровень подготовки. Работа с пакетами XDTO требует внимания и соблюдения точного соответствия файлов заданной схеме, чтобы минимизировать возможные ошибки.

Исправление ошибок

Одной из достаточно распространенных ошибок, связанных с работой с XDTO-пакетами, является «Ошибка преобразования данных XDTO». Ее суть заключается в том, что платформа не может разобрать данный ей XML-файл по заданной схеме. При получении подобной ошибки при импорте данных, необходимо проверить формат файлов – возможно, присутствуют незакрытые теги.

Зачастую проблема с ошибками преобразования данных возникает и по другим причинам:

  • Ошибки в обновлении платформы или конфигурации;
  • Обмен между базами разных версий;
  • Недочеты в алгоритме приема данных;
  • Проблемы с временной памятью конкретного компьютера.

Чтобы исправить эту ошибку, сначала почистите кэш или удалите, а также заново добавьте информационную базу в список баз. Затем внимательно проверьте файл XML – вдруг случайно сделали ошибку в его тексте, проверьте соответствие структуры пакету XDTO. Если ошибка появилась после обновления, сделайте тестирование и исправление ИБ, сохранив перед этим резервную копию базы. Если проблема не уйдет, вернитесь на предыдущую версию и подождите, пока разработчики 1С не разберутся с этой проблемой.

Работа с XDTO в 1С 8.3

Еще одна проблема, часто мучающая программистов 1С, работающих с XDTO, – ошибка проверки данных. Если при импорте вы видите подобный текст, то с высокой долей вероятности источник проблемы в несоответствии файла нужной схеме. Но проблема может быть не на вашей стороне, а в базе, из которой выгружали XML. Чтобы исправить эту оплошность, придется внимательно изучить всю последовательность действий и найти, после чего файл перестал соответствовать ожиданиям.

Работа с XDTO в 1С 8.3

Более сложная для анализа проблема, если при обмене информацией 1С выдает ошибку о несоответствии типов XDTO. В этом случае придется проверять все данные, находить ошибки и их причины. В некоторых случаях ошибки могут быть в коде, иногда – в данных информационной базы. Чтобы это понять, необходимо иметь доступ к базам причастным к обмену и четко понимать всю суть происходящего экспорта и импорта.

Работа с XDTO в 1С 8.3

На первый взгляд работа с XDTO достаточно сложна, поэтому на первое время рекомендуется добавлять XDTO-пакеты в 1С для большего порядка и учета. Конечно, все нюансы изучить сразу невозможно, но в процессе работы вы будете продолжать учиться. Но с уверенной теоретической базой намного удобнее начинать разбираться в этом вопросе.

XDTO — часть 3

XDTO — это просто, часть 3

Краткое содержание предыдущих серий

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

Собственно, статьи:

  1. Первая серия
  2. Вторая серия

При написании данной статьи, я столкнулся с небольшой дилеммой. Я планировал описать устройство объектов и их взаимодействие с теоретической точки зрения. Но в комментариях мне обоснованно пояснили, что лучшее объяснение — это пример. Языки программирования начинают учить с «hello world» и уже потом лезут в теоретические дебри. Я с этим согласен. Когда нет конкретного примера, который можно пощупать, то вникать в кучу слов неинтересно, да и трудно. Я попробую совместить в статье кусок теории, но подкрепить его небольшим примером кода, показывающим описанные в статье моменты. Возможно, получится сумбурно, т.к. я пока не до конца понимаю структуру будущей статьи.

И все-таки, начнем не с кода, а опять, с описания компонентов подсистемы XDTO.

Компоненты подсистемы XDTO

Нам не повезло с документированием подсистемы. Совершенно непонятно — откуда у нее растут ноги и с чего начинать работу с ней. Давайте попробуем разобраться.

Как я уже говорил ранее, в основе всего лежит модель данных — перечень прикладных типов, которыми мы будем оперировать при работе с XDTO. Каждый объект XDTO создается фабрикой, которая умеет создавать объекты тех типов, которые содержатся в модели данных фабрики. Итак, есть четко выделенные понятия — модель данных, фабрика, объект. Что в начале — курица или яйцо?

Пакет XDTO

Самый «первичный» объект во всей подсистеме, это пакет XDTO. Именно от него, растут все связи. С него и начнем. Почему он? Потому, что модель данных — это ни что иное, как массив пакетов XDTO. А модель, как я уже говорил — это наше все.

Что такое пакет и что такое ветка ПакетыXDTO

Все наверняка видели в дереве конфигурации ветку ПакетыXDTO. Что это и зачем оно нужно? Оказывается, оно в-общем-то и не нужно 🙂 Использовать XDTO можно и без описания пакетов в этой ветке. Наличие пакетов, зашитых в конфигурацию совсем не обязательно. Ветка эта нужна для совсем определенного круга прикладных задач. По большому счету — вспомогательное средство работы с XDTO.

Теперь, еще раз основной тезис:

Фабрика может создавать объекты только тех типов, которые входят в модель данных этой фабрики.

Каждая конфигурация уже содержит заботливо созданную платформой фабрику, которая умеет создавать все объекты, описанные в модели данных текущей конфигурации. Какие это объекты? Это все те, которые прошиты в платформе (о них потом) и те, которые создал разработчик конфигурации (XDTO-прообразы всех справочников, документов, перечислений и т.п.).

Данная автоматически созданная фабрика, доступна в коде, как глобальная переменная с именем ФабрикаXDTO.

Все пакеты, перечисленные в ветке «ПакетыXDTO» включаются в модель данных конфигурации. Это значит, что глобальная фабрика конфигурации может создавать объекты тех типов, которые описаны в данных пакетах. Например, это позволяет использовать наши собственные объекты совместно с платформенными — можно включать наши объекты в стандартные «СпискиЗначений» и «ТаблицыЗначений».

Устройство пакета

Рассмотрим пакет поближе: пакет представляет собой логически цельный набор типов. У этого набора типов обязательно есть пространство имен, позволяющее уникально идентифицировать пакет. Если вернуться к схемам XML, то пакет — это схема. С рядом допущений, конечно, но тем не менее, ближайший «не 1С-овский» аналог пакета — это схема XML.

Пакет включает в себя описания типов бизнес-объектов, которыми мы собираемся оперировать. Типы бывают простые и составные, об этом мы уже говорили ранее. Кроме того, пакет содержит вспомогательные средства трансляции имен переменных с языка XML на язык 1С:Предприятия и обратно (см. статью 2).

При разработке пакетов я не пользуюсь стандартным редактором, поэтому, наверное, не буду его описывать. Во-первых, боюсь чего-то напутать, во-вторых, он на 90% дублирует понятия из собственно схем XML. Если вы знаете, как в принципе сделать схему (например в Liquid), то работа со стандартным редактором, скорее всего, не вызовет сложных вопросов.

Что более важно, так это то, какие понятия пакет XDTO привносит в обиход программиста, использующего XDTO. Понятия следующие:

  1. ТипЗначенияXDTO
  2. ТипОбъектаXDTO
  3. ЗначениеXDTO
  4. ОбъектXDTO
  5. СписокXDTO

Со списком сложнее. Если какому-либо свойству в том или ином типе задана верхняя граница, отличная от единицы, то это значит, что данное свойство может повторяться в объекте несколько раз. Таким образом, СписокXDTO представляет собой способ манипулирования множеством объектов заданного типа.

Если мы посмотрим в стандартный редактор пакетов, то увидим строгое разделение на «Типы значений» и «Типы объектов».

Встраивание пакетов в конфигурацию

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

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

Процесс встраивания пакета описывался в предыдущей статье. Сейчас, хочется закрепить следующий момент: в глобальном контексте есть переменная с именем ФабрикаXDTO и типом ФабрикаXDTO. Эта фабрика — автоматически создается платформой и включает в себя все типы самой платформы, плюс типы прикладных объектов конфигурации, плюс те пакеты, которые добавлены в ветку «ПакетыXDTO» дерева метаданных. Эта фабрика ничем особенным не отличается, при желании вы всегда можете создать такую же вручную.

Масло масляное

Здесь, на мой взгляд, следует отметить, что подобная конструкция, очень неудачный ход со стороны разработчиков платформы. Скорее всего, преследовалась цель сделать XDTO более удобным (автоматически создать все нужные объекты), но получилось на мой взгляд, мешанина из непонятных (и к тому же одинаковых) названий.

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

Я очень не люблю, когда имена переменных совпадают с их типами. Звучит ужасно:

ТаблицаЗначений = Новый ТаблицаЗначений;
Массив = Новый Массив;

То же получилось и с фабрикой. Это такой объект, который нужен, мягко говоря, не каждую секунду работы программы. Люди годами пишут под 1С, даже не касаясь каких-то там фабрик. Зачем нужна семантика постоянно висящей переменной непонятно. Лучше и правильнее было бы, на мой взгляд создать метод, что-то вроде «ПолучитьФабрикуXDTOТекущейКонфигурации()». В результате имеется четкое понимание, что мы хотим использовать конкретную системную фабрику, но имя переменной, с которой мы будем работать мы придумаем сами. Да, тип этой переменной будет ФабрикаXDTO.

В результате, документация моментально становится проще, за счет исчезновения фраз «Глобальный объект «ФабрикаXDTO» с типом «ФабрикаXDTO»».

Что-то мы отвлеклись…. Имеем то, что имеем, а именно — глобальный объект, фабрику, которая умеет создавать объекты наших собственных типов. Поехали дальше!

Сериализация XDTO

Вот то, что призвано сделать нашу жизнь лучше, но, иногда, делает ее сложнее. Сериализация и десериализация, это сама цель создания вообще всей этой замороки с XDTO. Ведь что мы хотим делать? Мы хотим передавать объекты куда-либо и получать их обратно. Все объекты в конечном итоге превращаются в XML. Получается, что все, что нам нужно — это автоматическая запись некоторого бизнес-объекта в XML и чтение его обратно. Вот здесь, на этом самом месте, нужно провести жирную красную линию и разделить два отдельных механизма. Первый — это создание объектов XDTO и их сериализацию в/из XML. Второй — получение из XDTO объектов прикладного языка: строк, ссылок, дат и т.п.
Итак, жирная красная линия:

Механизм Что делает Название операции
ФабрикаXDTO Создает объекты XDTO и записывает их в XML. Читает XML и создает из него ОбъектыXDTO. XML-сериализация
СериализаторXDTO Читает ОбъектыXDTO и превращает их в объекты встроенного языка 1С. Выполняет обратную операцию преобразования объекта встроенного языка в ОбъектXDTO. XDTO-сериализация

Приведенной табличкой хотелось донести одну очень важную мысль: ФабрикаXDTO ничего не знает о метаданных конфигурации, и вообще о конфигурации. Для нее нет ни ссылок, ни таблиц значений, ничего, связанного с прикладными типами среды исполнения 1С. Фабрика оперирует только XML-типами. Эти типы похожи на «родные» и их легко спутать, т.к. они описывают те же самые объекты, но в терминах XML. Тем не менее, важно понимать, что это именно разные объекты. XML-документ, содержащий таблицу значений и универсальная коллекция ТаблицаЗначений — это разные вещи. Фабрика знает только про XML.

Сериализатор XDTO — это как раз связующее звено между средой исполнения языка и фабрикой. Он знает, как прочитать узлы XML (свойства объекта XDTO) и как их интерпретировать, превращая XML в объект среды исполнения.

Конечно, такое вот кричащее разделение с красными линиями, это немного лукавство. Один механизм не имеет смысла без другого, они тесно переплетены. Тем не менее, обратите внимание на колонку «Что делает». Разница в действиях принципиальна. Платформа же, пытается скрыть от нас, неразумных, данную принципиальность и автоматически выполняет XDTO-сериализацию тех типов, которые она умеет преобразовывать из языка в XDTO и обратно. Например, платформа знает, как превратить тип XDTO xs:string в Тип(«Строка»), а xs:dateTime в Тип(«Дата»). Платформа также знает, как превратить тип «{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Сотрудники» в Тип(«СправочникСсылка.Сотрудники»), при условии, что в конфигурации есть такой справочник.

Автоматическое преобразование возможно только для типов-значений. Иными словами, платформа автоматически выполняет XDTO-сериализацию простых типов, когда мы работаем с объектом XDTO. Рассмотрим пример:

Пусть есть пакет XDTO, в котором есть тип «КарточкаСотрудника». Этот тип имеет свойства:

  • Сотрудник ({http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Сотрудники)
  • ЛичныйНомер (xs:string)

Все свойства типа КарточкаСотрудника являются простыми, с точки зрения платформы. Поэтому, работая с объектом XDTO мы можем присваивать им значения напрямую из языка:

Для объектных типов все немного сложнее. Там нельзя присвоить объект языка напрямую в объект XDTO. Для такого превращения нужен Сериализатор. По сути — сериализатор — это алгоритм, который сможет превратить один объект в другой. Для платформенных объектов этим занимается глобальный СериализаторXDTO. Для наших собственных — такой алгоритм мы должны написать сами. Чудес не бывает. Если надо передать куда-то XML-документ определенного формата, то наполнять его данными мы будем самостоятельно, свойство за свойством, вручную.

Поскольку, автоматическая сериализация для типов-объектов не выполняется, то обращение «через точку» даст нам ОбъектXDTO, а не готовое значение платформы.

Чистый XDTO без сериализации

Если мы хотим получить из объекта xdtoКарточка само ЗначениеXDTO личного номера, а не значение, сериализованное в готовую «строку 1С», то необходимо вызвать метод «ПолучитьXDTO». В этом случае, будет возвращен запрошенный объект.

Список XDTO

Помимо классов ЗначениеXDTO и ОбъектXDTO существует также СписокXDTO. Список позволяет оперировать коллекциями из объектов первых двух классов.
Список получается, когда для какого-либо свойства объекта установлена верхняя граница, отличная от нуля. Число показывает максимально возможное количество элементов списка. Если граница равна -1, то количество не ограничено.
Списки тоже пытаются упрощать жизнь посредством автоматической XDTO-сериализации значений. Это очень хорошо, но надо знать, в каком случае она выполняется, а в каком — нет.
Во-первых, в синтакс-помощнике не написано, что список можно обходить с помощью итератора Для Каждого Из… На самом деле, это работает. При обходе через итератор, либо через метод СписокXDTO.Получить(Номер), получаемое значение будет сериализованным. Т.е. для списка ссылок будут получаться уже готовые ссылки 1С, а не объекты XDTO.
У списка есть также метод ПолучитьXDTO, который позволяет обойти список, получая сами значения XDTO, без выполнения сериализации.

ФабрикаXDTO

Класс ФабрикаXDTO представляет собой единственное средство превращения файлов XML в ОбъектыXDTO и обратно. При этом, фабрика следит за тем, чтобы создаваемые объекты строго соответствовали заявленной модели данных (схеме XML). Если мы попытаемся наполнить ОбъектXDTO чем-то не соответствующим схеме, то произойдет исключение времени выполнения.

Давайте взглянем на фабрику поближе:

Свойство «Пакеты»

В начале статьи мы говорили, что модель данных — это массив пакетов XDTO. А фабрика представляет собой «пользователя» модели. Поэтому, свойство «Пакеты» — это массив пакетов, которые составляют модель данных фабрики.

Обращение к коллекции пакетов возможно либо по числовому индексу, либо по URI пакета. Разумеется, возможен перебор с помощью Для Каждого Из…

Метод Тип()

Метод получает на вход полное имя типа (URI пакета + Имя типа в пакете) и возвращает объект ТипЗначенияXDTO или ТипОбъектаXDTO, для типов-значений и типов-объектов соответственно. Эти объекты сродни классу «Метаданные» в языке Предприятия. С их помощью можно узнать метаданные типа XDTO. Длину, маску, «списковость», перечень свойств и т.п.

Метод Создать()

Основной и любимый метод. Позволяет фабрике оправдывать свое название. Конструирует объект XDTO того типа, который ему передали.

Методы ЗаписатьXML()/ПрочитатьXML()

Позволяют отправить ОбъектXDTO в поток XML, и соответственно, прочитать поток XML и создать на его основании ОбъектXDTO. Методы чтения/записи имеют несколько особенностей.

Чтение XML

Как и в любом другом случае работы с XML, у нас всегда есть некоторый источник XML. Это может быть текстовый источник, документ DOM или поток FastInfoset. Что приятно, источник неважен, они взаимозаменяемы. Чтобы создать объект XDTO нужно спозиционировать источник XML на начало узла, который является объектом и вызвать метод ФабрикаXDTO.ПрочитатьXML().

И вот здесь, кстати, зарыта небольшая собачка. Пример:

// Переменная ЧтениеXML — некий источник XML
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

Перед Вами — самый простой способ считывания объекта. Объект гарантированно считывается и возвращается в виде ОбъектаXDTO. Проблема в том, что если в файле прямо не указан тип объекта с помощью атрибута «xsi:type» (~90% случаев), то объект получит тип anyType(). Свойства этого объекты будут нетипизованы, получить внятные метаданные объекта будет проблемно (хотя и можно). Тем не менее, мы получим полноценный объект XDTO. Если нам не нужно сильно «копаться» в нем, а например, просто передать еще куда-то, то лучше способа не найти. Не надо ни пакетов, ни схем, вообще ничего. Читаем XML, получаем Объект.

Для этого в методе ФабрикаXDTO.ПрочитатьXML есть второй параметр — тип объекта. В этом случае, при чтении, Фабрика проверит, что поток XML соответствует схеме данных и создаст новый объект, если XML корректен. В противном случае, создание не выполнится. Соответствие проверяется по всей строгости валидации схем XML. Если, скажем, длина какого-то реквизита не совпадает с требуемой, будет ошибка чтения.

После чтения, Фабрика передвигает позицию в потоке XML дальше, на следующий за объектом узел.

ЗаписьXML

Запись выполняется несложно:
ФабрикаXDTO.ЗаписатьXML(ПотокЗаписи, ОбъектXDTO);

Вот тут тоже есть пара нюансов. Во-первых, объект XDTO при записи в XML должен быть размещен в каком-то узле. По умолчанию, объект помещается в узел, с именем, соответствующем имени типа. Например, объект типа «Message» помещается в узел элемента «Message». Имя узла можно поменять, с помощью параметров «ЛокальноеИмя» и «URI» метода ЗаписатьXML().

Во-вторых, в разделе «чтение» я говорил, что в XML может быть записан специальный атрибут «xsi:type». В этом случае, тип объекта будет явно указан в XML и при чтении платформа сможет создать объект нужного типа, а не anyType. Для того, чтобы в файле было явно указано — к какому типу принадлежит объект — нужно задать последний параметр «УказаниеТипа» метода записи. Если тип не задать, то ничего страшного не будет. Корректно прочитать объект мы можем, указав ожидаемый тип в методе «ПрочитатьXML» (см. выше).

Собственная фабрика и модель данных XDTO

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

Как и любой другой объект языка 1С, фабрика создается вызовом конструктора с помощью оператора «Новый ФабрикаXDTO». Закавыка заключается в передаче правильных параметров конструктору.

Конструкторы

Конструкторов два. Оба сводятся к тому, что фабрике нужен массив пакетов, чтобы у нее была модель данных. Если мы посмотрим в синтакс-помощник на конструктор объекта ФабрикаXDTO, то мы увидим вариант «На основании модели типов». Там же читаем: «Модель представляется в виде объекта XDTO, имеющего тип XDTO {http://v8.1c.ru/8.1/xdto}:Model».

Ну хорошо, создавать объект нужного типа мы умеем:

Модель = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/xdto»,»Model»));

А дальше-то что делать? Не знаю, как вы, а я в документации ответ на этот вопрос не нашел. Зато, я нашел, как выгрузить из конфигурации массив пакетов в виде готовой модели. Этим-то мы и займемся.

Забегая вперед скажу, что этот объект Model просто описывает все то, что вы видите в Конфигураторе, когда создаете пакеты XDTO. Объект Model содержит перечень пакетов package, каждый пакет имеет перечень типов-значений, типов-объектов, словом все, что Вы видите в боковой панели «Свойства» конфигуратора — все отражается в этом объекте Model.

У ФабрикиXDTO есть замечательные методы «ЭкспортМоделиXDTO()» и «ЭкспортСхемыXML()». Методы замечательны тем, что возвращают готовые объекты, которые можно «скормить» конструкторам Фабрики.

Выгрузка модели данных

К статье приложена внешняя обработка «ВыгрузкаПроизвольнойМоделиДанных». Данная обработка показывает все-все пакеты XDTO, которые содержатся в стандартной глобальной фабрике. Можно увидеть там ряд интересных вещей. Например, пакеты управляемого приложения http://v8.1c.ru/8.2/managed-application/logform, и даже http://v8.1c.ru/8.2/managed-application/modules. В управляемом режиме платформа ведет обмен клиент-сервер с помощью механизма XDTO. Поэтому, все служебные типы, нужные для обмена, в фабрике представлены. Не спрашивайте только, что они делают — понятия не имею :). Давайте рассмотрим ее устройство.

1. Перечень пакетов

// Получаем список, в котором отметим флажками пакеты, которые нам нужны.
Для Каждого Пакет Из ФабрикаXDTO.Пакеты Цикл
ВыгружаемыеПакеты.Добавить(Пакет.URIПространстваИмен);
КонецЦикла;

2. Выгрузка нужных пакетов в файл

Теперь, у нас есть модель данных, а значит, мы можем создать собственную фабрику:

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
// Внимание. Второй параметр — ТипXDTO не указываем, т.к. перед этим явно записали его в файл. Все же рекомендуется ВСЕГДА указывать второй параметр, чтобы избежать некорректной трактовки XML файла. Нельзя гарантировать, что внутри файла тип указан.
ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);

А теперь все то же самое, но проще.

Как легко и просто создать свою фабрику XDTO не прибегая к созданию Model? Можно воспользоваться вторым конструктором и создать фабрику на основе схемы XML. Второй конструктор фабрики хочет получить НаборСхемXML на входе. Сделаем ему этот набор:

От автора

Я все-таки предпочитаю первый способ, т.к. он более родной и дает более гибкое управление создаваемой фабрикой. Вспоминаем отличия Схем XML от Пакетов (статья №2). Кроме того, мне кажется, что первый способ должен работать немножко, но быстрее, т.к. нет промежуточных преобразований из текста XML в модель через DOM и построитель схем. Специально быстродействие не замерял, так что могу и ошибаться.

Создавая собственные фабрики XDTO, делаю так:

  1. Создаю в Liquid нужные схемы
  2. Загружаю их в пустую конфигурацию-болванку
  3. Выгружаю пакеты приведенной выше обработкой
  4. Полученные файлы кладу в макет обработки, которой требуется создавать фабрику
  5. При выполнении обработки создаю схему:

Кстати, конфигурацию-болванку можно заменить кодом из второго способа создания фабрики.

  1. Создаем фабрику вторым конструктором (на основании НабораСхемXML)

  2. Из этой фабрики выгружаем Model методом ЭкспортМоделиXDTO().

  3. Получаем Model, для сохранения в макете и использования в боевом режиме.

Обещанный пример кода

К статье прилагается пример конфигурации, демонстрирующий все, что было описано в предыдущих (и текущей) статьях. Основные моменты расписаны в комментариях к коду.

Конфигурация представляет собой гипотетический пример обмена данными по зарплате сотрудников. В конфигурации демонстрируются способы применения всех упомянутых аспектов XDTO. Обратите внимание, что в коде идет обращение к объектам XDTO по русскоязычным именам. В файл же попадают англоязычные узлы XML. Это как раз демонстрирует возможность разного представления в XML виде и в XDTO виде.

Учебный пример поставляется за символическую цену. Стоимость в 2-3 раза ниже 1 часа работы специалиста по 1С. Информация, которую можно почерпнуть из примера является в каком-то роде уникальной, ее больше нет нигде в Сети. Сэкономленное время на изучение XDTO стоит намного больше.

Грабли метода ПрочитатьXML() объекта ФабрикаXDTO
Термин XDTO (XML Data Transfer Objects) — это не какой-то всемирно принятый стандарт, поддерживаемый платформой 1С, а наоборот, стандарт рожденный в недрах фирмы 1С, хотя очень похож на XML Schema, на недоделанный XML Schema.
При добавлении пакета XDTO в дерево конфигурации окно редактирования пакета открывается автоматически.

1. Окно редактирования XDTO-пакета

Для того, чтобы открыть окно редактирования пакета XDTO, следует выбрать нужный пакет и выполнить команду «Открыть пакет».

2. Контекстное меню XDTO-пакета

Окно редактирования пакета XDTO содержит иерархическую структуру, которая отображается в виде дерева. В корневом элементе расположен идентификатор пакета XDTO, который содержит URI пространства имен данного пакета.
На первом уровне иерархии могут располагаться следующие элементы пакета (см. рисунок 1):

  • Директивы импорта — перечень директив импорта, предназначены для импорта типов из внешнего именного пространства. При работе с данным пакетом XDTO средствами встроенного языка данный перечень директив импорта будет доступен в виде объекта КоллекцияПакетовXDTO, содержащегося в свойстве Зависимости пакета XDTO.
  • Типы значений — перечень типов значений XDTO, которые содержит пакет XDTO, предназначены для создания нового типа, используя существующие простые типы.
  • Типы объектов — перечень типов объектов XDTO, которые содержит пакет XDTO
  • Свойства — перечень свойств пакета XDTO. Представляет собой объявления объектов/значений, которые могут являться корневыми элементами документов XML, принадлежащих URI пространству имен пакета XDTO.

Каждый тип значения XDTO описывается иерархической структурой и может содержать в своем составе следующие элементы:

  • Образец — описывает один фасет XDTO типа Образец;
  • Перечисление — описывает один фасет XDTO типа Перечисление.

Каждый тип объекта XDTO описывается иерархической структурой, которая может содержать в своем составе набор свойств объекта (комплексный тип).

Свойства пакета XDTO

Редактирование свойств пакета XDTO выполняется в палитре свойств. Кроме основных свойств (показываются, если окно редактирования закрыто) требуется указать пространство имен импортируемого пакета.

3. Свойства XDTO-пакета

Свойства типа значения XDTO

Редактирование свойств типа значения XDTO выполняется в палитре свойств. Для типа значения XDTO палитра свойств содержит следующие свойства:

  • Имя — имя типа значения XDTO;
  • Базовый тип — базовый тип для данного типа значения XDTO;
  • Вариант — вариант простого типа (атомарный тип, список, объединение). Если значение установлено, то оно должно противоречить значениям Тип элемента и Типы объединения.
  • Тип элемента — тип элемента списка в случае, когда тип значения XDTO определяется списком. При этом все фасеты и свойство Типы подчиненных должны быть пустыми;
  • Типы объединения — список типов, образующих объединение в случае, когда тип значения XDTO определяется объединением. Объединяться могут только типы значений XDTO. При этом все фасеты и свойство Тип Элемента должны быть пустыми;
  • Длина — фасет длины;
  • Минимальная длина — фасет минимальной длины;
  • Максимальная длина — фасет максимальной длины;
  • Пробельные символы — фасет пробельных символов;
  • Минимум, включающий границу — фасет минимума, включающего границу;
  • Минимум, не включающий границу — фасет минимума, не включающего границу;
  • Максимум, включающий границу — фасет максимума, включающего границу;
  • Максимум, не включающий границу — фасет максимума, не включающего границу;
  • Общее количество цифр — фасет общего количества цифр;
  • Количество цифр дробной части — фасет количества цифр дробной части.

4. Свойства типа значения XDTO

Свойства типа объекта XDTO

Редактирование свойств типа объекта XDTO выполняется в палитре свойств. Для типа объекта XDTO палитра свойств содержит следующие свойства:

  • Имя — имя типа объекта XDTO;
  • Базовый тип — базовый тип для данного типа объекта XDTO, указывает на то, что новый тип создается путем расширения базового типа;
  • Открытый — признак, является ли тип объекта XDTO открытым. Данное свойство показывает, может ли экземпляр объекта XDTO содержать свойства, не определенные в его типе;
  • Абстрактный — признак, является ли тип объекта XDTO абстрактным;
  • Смешанный — показывает, имеет ли соответствующий объект XDTO смешанное содержание. Если значение свойства Истина, то значение Последовательный обязательно равно Истина, так как смешанное содержание невозможно смоделировать без применения последовательности XDTO;
  • Упорядоченный — признак, является ли порядок следования элементов, представляющих значения свойств, строго соответствующим порядку следования свойств в типе объекта XDTO. Если Ложь, то на входе порядок следования элементов XML не контролируется, а на выходе определяется порядком следования свойств, если только свойство Последовательный не имеет значение Истина;
  • Последовательный — показывает, содержит ли экземпляр соответствующего объекта XDTO последовательность XDTO. Истина в тех случаях, когда порядок следования вложенных элементов XML не может однозначно определяться порядком следования свойств в типе или соответствующий объект XDTO имеет смешанное содержание. Последовательность XDTO позволяет задать в явном виде порядок следования элементов, как они будут представлены в документе XML. Для объектов типов, у которых свойство Ложь, порядок вложенных элементов соответствует порядку следования свойств.

5. Свойства типа объекта XDTO

Свойства свойств типа объекта XDTO

Редактирование свойства свойств типа объекта XDTO выполняется в палитре свойств. Для свойства свойств типа объекта XDTO палитра свойств содержит следующие свойства:

  • Имя — имя свойства. В пределах одного типа объекта XDTO имена свойств должны быть уникальными;
  • Тип — тип свойства. Может быть как типом значения XDTO, так и типом объекта XDTO;
  • Минимальное количество — минимальное количество значений свойства. Минимальное количество значений свойства может принимать значения больше или равное 0; Свойство типа объекта XDTO может быть определено как содержащее одно или множество значений. Свойство считается содержащим одно значение, если данное свойство равно 1. Для значений свойства больше 1 считается, что свойство может принимать множество значений. Такое свойство в структуре объекта моделируется списком.
  • Максимальное количество — показывает максимальное количество значений свойства. Максимальное количество больше 1 может быть задано только для свойств, представленных в виде элемента XML;
  • Возможно пустое — показывает, может ли свойство принимать неопределенное значение. Истина может быть определено только для свойств с формой представления Элемент. Если Максимальное количество больше 1, неопределенное значение является допустимым для элемента списка значений свойства;
  • Фиксированное — указывает, является ли значение свойства фиксированным. Истина — само фиксированное значение можно получить через свойство По умолчанию;
  • По умолчанию — значение свойства по умолчанию. Тип значения по умолчанию может быть только типом значения XDTO. При этом, данное значение должно быть совместимо с типом свойства (быть того же типа, что и тип свойства или же унаследованного типа). При создании объекта XDTO свойство, если оно допускает единственное значение, принимает значение по умолчанию. Для свойств с множеством значений список значения пуст, независимо от того, определено или нет значение по умолчанию;
  • Форма — форма представления свойства в XML. Это может быть Текст, Элемент или Атрибут. Если формой представления является Атрибут или Текст, то значение свойства Максимальное количество не может быть больше 1. Если свойство принимает значение Текст, то значение свойства Максимальное количество также должно быть равным 1. У одного типа только одно свойство может иметь форму представления Текст, при этом все остальные свойства должны иметь форму представления Атрибут;
  • Локальное имя — локальное имя, используемое для представления свойства. Для свойств с формой представления Текст — пустая строка.

6. Свойства свойств типа объекта XDTO

Глобальное свойство

Редактирование свойств глобального свойства выполняется в палитре свойств. Для глобального свойства палитра свойств содержит следующие свойства:

  • Имя — имя глобального свойства. В пределах одного типа объекта XDTO имена глобальных свойств должны быть уникальными;
  • Ссылка — ссылка на корневое определение свойств пакета;
  • Тип — тип глобального свойства;
  • Минимальное количество — минимальное количество значений свойства. Если данное свойство = 0, то значение свойства может быть не установлено;
  • Максимальное количество — максимальное количество значений свойства. Если = -1, то количество значений свойства неограниченно;
  • Возможно пустое — показывает, может ли свойство принимать неопределенное значение;
  • Фиксированное — указывает, является ли значение свойства фиксированным;
  • По умолчанию — значение свойства по умолчанию. Лексическое представление значения свойства должно соответствовать правилам проверки типа данного свойства;
  • Форма — форма представления свойства в XML. Это может быть Текст, Элемент или Атрибут;
  • Локальное имя — локальное имя, используемое для представления свойства.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *