СписокXDTO.ПолучитьXDTO

Методы · GetXDTO

Получает элемент списка по индексу.

Синтаксис

ПолучитьXDTO(<Индекс>)
Полное описание, параметры и ограничения

СписокXDTO.ПолучитьXDTO (XDTOList.GetXDTO)

СписокXDTO (XDTOList)

ПолучитьXDTO (GetXDTO)

Доступен, начиная с версии 8.1.

Синтаксис:
ПолучитьXDTO(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Индекс элемента списка.
Возвращаемое значение:
Тип: ЗначениеXDTO, ОбъектXDTO.

Описание:

Получает элемент списка по индексу.

Доступность:

Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Создать список трёх товаров по собственной схеме XDTO

Повторяющееся свойство item выдаёт СписокXDTO. Добавить/Вставить принимают типизированные элементы XDTO, а не произвольные строки.

Где и как запускать

Полный серверный общий модуль собственной учебной конфигурации.

Подготовка

  1. В собственной отдельной конфигурации УчебнаяКонфигурацияСинтаксиса создайте серверный общий модуль УчебныеКоллекцииXDTO с флагом Сервер. Вставьте полный код выбранного урока.

  2. Из серверной команды собственной учебной обработки вызовите УчебныеКоллекцииXDTO.ВыполнитьПример(). Метаданные справочников и документы не нужны.

  3. В код встроена маленькая собственная XSD: Order содержит повторяющиеся строки item, Note — смешанный текст с числовыми элементами amount. Не подменяйте схему или XML данными неизвестного сервиса.

  4. URI urn:guide:collections — идентификатор пространства имён, не адрес сервера. Схема не содержит import/include, DTD или внешних ссылок.

  5. Все объекты и XML создаются в памяти. Нет файлов, сети, выполнения внешнего кода, записи базы или изменений пакетов XDTO конфигурации.

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:collections"" targetNamespace=""urn:guide:collections"" elementFormDefault=""qualified"">
    |<xs:complexType name=""Order""><xs:sequence><xs:element name=""item"" type=""xs:string"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:complexType name=""Note"" mixed=""true""><xs:sequence><xs:element name=""amount"" type=""xs:decimal"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:element name=""order"" type=""g:Order""/><xs:element name=""note"" type=""g:Note""/>
    |</xs:schema>";
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема коллекций";
    КонецЕсли;
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    Если НЕ НаборСхем.Проверить() Тогда
        ВызватьИсключение "Собственная схема не прошла проверку";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(НаборСхем);
    ТипЗаказа = Фабрика.Тип("urn:guide:collections", "Order");
    Если ТипЗаказа = Неопределено Тогда
        ВызватьИсключение "В собственной фабрике не найден Order";
    КонецЕсли;
    Заказ = Фабрика.Создать(ТипЗаказа);
    СвойствоТоваров = Заказ.Свойства().Получить("item");
    Если СвойствоТоваров = Неопределено Тогда
        ВызватьИсключение "Не найдено собственное повторяющееся свойство item";
    КонецЕсли;
    Товары = Заказ.ПолучитьСписок(СвойствоТоваров);
    Если Товары = Неопределено Тогда
        ВызватьИсключение "Не получен список собственного заказа";
    КонецЕсли;
    Книга = Товары.Добавить(Фабрика.Создать(СвойствоТоваров.Тип, "Книга"));
    Товары.Добавить(Фабрика.Создать(СвойствоТоваров.Тип, "Коробка"));
    Ручка = Товары.Вставить(1, Фабрика.Создать(СвойствоТоваров.Тип, "Ручка"));
    Заказ.Проверить();
    Сообщить(Товары.Количество() = 3);
    Сообщить(Товары.Владелец = Заказ);
    Сообщить(Товары.ВладеющееСвойство = СвойствоТоваров);
    Сообщить(Товары.Получить(0) = "Книга");
    Сообщить(Товары.Получить(1) = "Ручка");
    Сообщить(Товары.Получить(2) = "Коробка");
    Сообщить(Книга.Значение = "Книга");
    Сообщить(Ручка.Значение = "Ручка");
    Сообщить(Товары.ПолучитьXDTO(1).Значение = "Ручка");
КонецПроцедуры

Разбор по шагам

  1. Построить собственную XSD и фабрику, создать Order. Получить описатель повторяющегося item и его список.

  2. Создавать каждое строковое значение через Фабрика.Создать с типом именно свойства item.

  3. Добавить Книгу и Коробку, вставить Ручку между ними по индексу 1. Возвращённые элементы действительно относятся к созданному списку.

  4. Проверить модель целиком. Получить выдаёт простое значение, ПолучитьXDTO — обёртку с типом и свойством Значение.

  5. Прочитать два владельческих свойства списка: родительский объект и описатель item. Не присваивать их.

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

  1. Девять булевых сообщений Истина. Порядок списка Книга, Ручка, Коробка.

  2. Список получен из реальной собственной модели, не создан несуществующим конструктором.

Ожидаемый результат

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

На что обратить внимание

  1. У СписокXDTO нет конструктора. Повторяемость задаётся maxOccurs в схеме, не массивом неизвестного типа.

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

  3. Эти элементы не являются ссылками на товары 1С и не создают записи справочника.

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

Записать собственный заказ в XDTO-JSON и прочитать независимую копию

Используется именно фабрика своей схемы, с явным ожидаемым типом Order при чтении. Формат XDTO-JSON не объявляется контрактом Avito или любого другого бизнес-API.

Где и как запускать

Полный серверный общий модуль собственной отдельной учебной конфигурации.

Подготовка

  1. Создайте отдельную собственную конфигурацию с именем УчебнаяКонфигурацияСинтаксиса. Не используйте рабочую КА2, УНФ, УТ или БП.

  2. Создайте неглобальный общий модуль УчебнаяМодельXDTO85 с флагом Сервер. Вставьте весь выбранный пример, включая вспомогательные функции, если они присутствуют.

  3. Из серверной команды своей учебной обработки вызовите УчебнаяМодельXDTO85.ВыполнитьПример(). Передавать неизвестный объект или реквизиты чужой конфигурации не нужно.

  4. XSD целиком встроена в код: артикул Sku, цвет Color, список артикулов, объединение, абстрактный Base, строка Item, производный Order и смешанный Note.

  5. Справочники, документы и пакеты XDTO метаданных создавать не нужно. Схема и фабрика принадлежат только этому выполнению в памяти.

  6. urn:guide:model85 и URI стандартной XML Schema — идентификаторы пространств имён. Код не загружает их из Интернета; import/include, DTD и внешних файлов нет.

  7. Проверки Истина относятся к приведённой неизменённой учебной XSD. После её изменения сначала пересмотрите ожидаемые типы, границы и обязательность.

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

Процедура ВыполнитьПример() Экспорт
    XSD = "<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:g=""urn:guide:model85"" targetNamespace=""urn:guide:model85"" elementFormDefault=""qualified"" attributeFormDefault=""unqualified"">
    |<xs:simpleType name=""Sku""><xs:restriction base=""xs:string""><xs:length value=""4""/><xs:pattern value=""[A-Z][0-9]{3}""/></xs:restriction></xs:simpleType>
    |<xs:simpleType name=""Color""><xs:restriction base=""xs:string""><xs:enumeration value=""red""/><xs:enumeration value=""blue""/></xs:restriction></xs:simpleType>
    |<xs:simpleType name=""SkuList""><xs:list itemType=""g:Sku""/></xs:simpleType>
    |<xs:simpleType name=""QuantityOrCode""><xs:union memberTypes=""xs:positiveInteger g:Sku""/></xs:simpleType>
    |<xs:complexType name=""Base"" abstract=""true""><xs:attribute name=""code"" type=""g:Sku"" use=""required""/></xs:complexType>
    |<xs:complexType name=""Item""><xs:sequence><xs:element name=""name"" type=""xs:string""/><xs:element name=""quantity"" type=""xs:nonNegativeInteger""/></xs:sequence></xs:complexType>
    |<xs:complexType name=""Order""><xs:complexContent><xs:extension base=""g:Base""><xs:sequence><xs:element name=""item"" type=""g:Item"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:extension></xs:complexContent></xs:complexType>
    |<xs:complexType name=""Note"" mixed=""true""><xs:sequence><xs:element name=""amount"" type=""xs:decimal"" minOccurs=""0"" maxOccurs=""unbounded""/></xs:sequence></xs:complexType>
    |<xs:element name=""order"" type=""g:Order""/><xs:element name=""note"" type=""g:Note""/>
    |</xs:schema>";
    ЧтениеСхемы = Новый ЧтениеXML;
    ЧтениеСхемы.УстановитьСтроку(XSD);
    Попытка
        Дерево = Новый ПостроительDOM;
        ДокументСхемы = Дерево.Прочитать(ЧтениеСхемы);
    Исключение
        ОшибкаСхемы = ОписаниеОшибки();
        Попытка
            ЧтениеСхемы.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаСхемы + Символы.ПС + "Закрытие: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаСхемы;
    КонецПопытки;
    ЧтениеСхемы.Закрыть();
    ПостроительСхем = Новый ПостроительСхемXML;
    Схема = ПостроительСхем.СоздатьСхемуXML(ДокументСхемы.ЭлементДокумента);
    Если Схема = Неопределено Тогда
        ВызватьИсключение "Не построена собственная схема коллекций";
    КонецЕсли;
    НаборСхем = Новый НаборСхемXML;
    НаборСхем.Добавить(Схема);
    Если НЕ НаборСхем.Проверить() Тогда
        ВызватьИсключение "Собственная схема не прошла проверку";
    КонецЕсли;
    Фабрика = Новый ФабрикаXDTO(НаборСхем);
    ТипЗаказа = Фабрика.Тип("urn:guide:model85", "Order");
    ТипСтроки = Фабрика.Тип("urn:guide:model85", "Item");
    Если ТипЗаказа = Неопределено ИЛИ ТипСтроки = Неопределено Тогда
        ВызватьИсключение "В собственной модели не найдены Order и Item";
    КонецЕсли;
    Заказ = Фабрика.Создать(ТипЗаказа);
    СвойствоКода = Заказ.Свойства().Получить("code");
    СвойствоСтрок = Заказ.Свойства().Получить("item");
    СвойствоИмени = ТипСтроки.Свойства.Получить("name");
    СвойствоКоличества = ТипСтроки.Свойства.Получить("quantity");
    Если СвойствоКода = Неопределено ИЛИ СвойствоСтрок = Неопределено
        ИЛИ СвойствоИмени = Неопределено ИЛИ СвойствоКоличества = Неопределено Тогда
        ВызватьИсключение "В собственной модели не найдены четыре описателя";
    КонецЕсли;
    Заказ.Установить(СвойствоКода, Фабрика.Создать(СвойствоКода.Тип, "A001"));
    СтрокиЗаказа = Заказ.ПолучитьСписок(СвойствоСтрок);
    Книга = Фабрика.Создать(ТипСтроки);
    Книга.Установить(СвойствоИмени, Фабрика.Создать(СвойствоИмени.Тип, "Книга"));
    Книга.Установить(СвойствоКоличества, Фабрика.Создать(СвойствоКоличества.Тип, "3"));
    Книга = СтрокиЗаказа.Добавить(Книга);
    Если ТипЗнч(Книга) <> Тип("ОбъектXDTO") Тогда
        ВызватьИсключение "Добавленная строка должна быть составным объектом";
    КонецЕсли;
    Заказ.Проверить();
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Попытка
        Фабрика.ЗаписатьJSON(Запись, Заказ);
    Исключение
        ОшибкаЗаписи = ОписаниеОшибки();
        Попытка
            Запись.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЗаписи + Символы.ПС + "Закрытие записи: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЗаписи;
    КонецПопытки;
    JSON = Запись.Закрыть();
    Сообщить(JSON);
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(JSON);
    Попытка
        Копия = Фабрика.ПрочитатьJSON(Чтение, ТипЗаказа);
    Исключение
        ОшибкаЧтения = ОписаниеОшибки();
        Попытка
            Чтение.Закрыть();
        Исключение
            ВызватьИсключение ОшибкаЧтения + Символы.ПС + "Закрытие чтения: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаЧтения;
    КонецПопытки;
    Чтение.Закрыть();
    Если ТипЗнч(Копия) <> Тип("ОбъектXDTO") Тогда
        ВызватьИсключение "Ожидалась составная копия собственного Order";
    КонецЕсли;
    Копия.Проверить();
    Сообщить(Копия.Тип() = ТипЗаказа);
    Сообщить(Копия.Получить(СвойствоКода) = "A001");
    КопияСтрок = Копия.ПолучитьСписок(СвойствоСтрок);
    Сообщить(КопияСтрок.Количество() = 1);
    КопияКниги = КопияСтрок.ПолучитьXDTO(0);
    Сообщить(КопияКниги.Получить(СвойствоИмени) = "Книга");
    Сообщить(КопияКниги.Получить(СвойствоКоличества) = 3);
    Книга.Установить(СвойствоКоличества, Фабрика.Создать(СвойствоКоличества.Тип, "4"));
    Заказ.Проверить();
    Сообщить(Книга.Получить(СвойствоКоличества) = 4);
    Сообщить(КопияКниги.Получить(СвойствоКоличества) = 3);
КонецПроцедуры

Разбор по шагам

  1. Создать свою фабрику и заполненный Order. Сериализация не исправляет незаполненные обязательные поля, поэтому сначала Проверить.

  2. Установить строковый приёмник ЗаписьJSON. Фабрика.ЗаписатьJSON получает именно свой Заказ, не обычную структуру внешнего сервиса.

  3. Закрыть запись и получить готовую строку JSON. При ошибке закрытие тоже выполняется, а ошибка не подавляется.

  4. Открыть ЧтениеJSON на только что полученной строке. Явно передать собственный ТипЗаказа, не рассчитывая на угадывание типа.

  5. Закрыть чтение при успехе и ошибке. Перед использованием копии проверить платформенный тип и полную модель объекта.

  6. Сравнить артикул, количество строк, название и количество Книги. Не сравнивать JSON посимвольно или порядок полей.

  7. Изменить исходную Книгу с 3 на 4 и убедиться, что прочитанная копия сохранила 3.

  8. Строка остаётся в памяти; отправки Avito, HTTP или записи документа нет. Для реальной интеграции нужен отдельный согласованный JSON-контракт.

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

  1. Показана строка XDTO-JSON, затем семь булевых сообщений Истина.

  2. Копия имеет тип Order, артикул A001, одну строку Книга с количеством 3.

  3. После изменения оригинала его количество 4, количество копии 3. Чтение и запись закрыты.

Ожидаемый результат

Собственная модель прошла круг XDTO → JSON → XDTO с проверкой полей и независимости копии.

На что обратить внимание

  1. ФабрикаXDTO.ЗаписатьJSON и глобальный ЗаписатьJSON не являются взаимозаменяемыми API.

  2. XDTO-JSON не обещает форму {id, title, price}, которую ожидает внешний бизнес-сервис.

  3. Не читайте неизвестный большой JSON без проверки размера, глубины, контракта и разрешённых типов. Здесь строка создана только своим кодом.

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

  5. Успешная статическая проверка источника не является доказательством выполнения сериализации в 1С.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.