Опубликовано: 28.07.2022

Объект «XMLParser» компоненты V77plus

Глобальный объект "XMLParser" компоненты V7plus предназначен для расширения функциональности системы «1С:Предприятие 7.7» в части работы с XML-файлами. Данный интерфейс опосредует связь между системой «1С:Предприятие» и базовым анализатором Microsoft XML Parser, входящим в состав ОС Windows.

Чтобы начать работать с интерфейсом, необходимо загрузить компоненту V77plus:

// Выполняем инициализацию компоненты V77plus,
// учитываем то, что её местонахождение нам заранее неизвестно
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "ExtForms\" + "v7plus.dll") <> 1 Тогда
      Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда
         Предупреждение("Компонента v7plus.dll не найдена!");
         Возврат;
      КонецЕсли;
   КонецЕсли;    
КонецЕсли;

Далее можно заняться собственно работой с XML-документом. Для этого следует создать объект, который представляет собой анализатор XML-документа:

Анализатор = СоздатьОбъект("AddIn.XMLParser");

Объектная модель анализатора

В состав объектной модели анализатора входят объекты следующих типов:

  • Анализатор — базовый объект, позволяющий создавать новые объекты типа "ПоследовательноЗаписываемыйДокумент", "ПоследовательноСчитываемыйДокумент", "Документ", "КоллекцияСхем";
  • КоллекцияСхем — специальное средство, позволяющее при загрузке документа применить набор схем (пространств имён), или подменить определённый в документе набор;
  • ВыборкаУзлов — коллекция элементов и атрибутов, отобранных по совокупности признаков, заданных при создании.

Режим последовательной обработки файла реализуется с помощью объектов ПоследовательноСчитываемыйДокумент или ПоследовательноЗаписываемыйДокумент, в зависимости от того, что происходит — чтение или запись файла.

В режиме же, использующем DOM, анализатор предоставляет доступ к таким объектам, как:

  • Документ — объект, представляющий документ — корневой узел DOM;
  • Элемент — объект, представляющий элементы разметки документа;
  • Атрибут — объект, представляющий атрибуты элементов разметки документа.

Эти три объекты являются разновидностями абстрактного объекта типа "Узел", а потому имеют целый набор одинаковых атрибутов и методов, свойственных для любых узлов DOM.

Все входящие в данную модель объекты (кроме объекта Анализатор) расширяют или переопределяют состав свойств и методов объектов, входящих в состав DOM модели, реализованной в анализаторе XML-документов от фирмы Microsoft.

Атрибуты объекта "Анализатор"

Узнать версию интерфейса XMLParser компоненты V7plus позволяет атрибут ВерсияАнализатора (англоязычный синоним — ParserVersion) объекта "Анализатор". Возвращаемым значением атрибута является строковое значение.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
Сообщить("Версия интерфейса XMLParser - " + Анализатор.ВерсияАнализатора);

Примечание: В компоненте V7plus версии 7.70.0.11 реализован интерфейс XMLParser версии 2.0.

Узнать версию установленного в системе анализатора Microsoft XML Parser позволяет атрибут ВерсияБазовогоАнализатора (англоязычный синоним — BaseParserVersion) объекта "Анализатор". Возвращаемым значением атрибута является строковое значение.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
Сообщить("Версия установленного Microsoftв XML Parser - " + Анализатор.ВерсияБазовогоАнализатора);

Методы объекта "Анализатор"

Создать объект "Документ", представляющий корневой узел DOM, позволяет метод СоздатьДокумент() (англоязычный синоним — CreateDocument()). Возвращаемым значением метода является ссылка на объект. Параметры у метода отсутствуют.

Пример использования метода при обработке имеющегося XML-файла:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// Создаём объект "Документ"
XMLДокумент = Анализатор.СоздатьДокумент();
// Связываем созданный объект с конкретным XML-файлом
XMLДокумент.Загрузить(КаталогПрограммы() + "plan.xml");
// Начинаем обработку файла
 . . .

Пример использования метода при создании нового XML-файла:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// Создаём корневой узел DOM
XMLДокумент = Анализатор.СоздатьДокумент();
// Создаем новый узел для документа
ЭлСписок = XMLДокумент.СоздатьУзел(1, "Список");
// Добавляем созданный узел в документ
XMLДокумент.ДобавитьПодчиненный(ЭлСписок);
 . . .

Создать объект "КоллекцияСхем", дающий возможность при загрузке документа использовать набор схем (пространств имён), позволяет метод СоздатьКоллециюСхем() (англоязычный синоним — CreateSchemasCollection()). Возвращаемым значением метода является ссылка на объект. Параметры у метода отсутствуют.

Пример использования метода:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
 . . .
// Создаём коллекцию схем
КоллекцияСхемДляПроверки = Анализатор.СоздатьКоллециюСхем();
 . . .

Создать специальный объект, дающий возможность обрабатывать входящий XML-документ, не прибегая к построению DOM, позволяет метод СоздатьПоследовательноСчитываемыйДокумент(). Параметры у метода отсутствуют. Возвращаемым значением метода является ссылка на OLE-объект, представляющий собой узел документа.

Для дальнейшей работы с объектом "ПоследовательноСчитываемыйДокумент" необходимо применить один из следующих методов объекта: СвязатьСФайлом(), СвязатьСоСтрокой() или СвязатьСОбъектом(). Подробнее об этих методах поговорим далее.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
XMLДокумент.СвязатьСФайлом(КаталогПользователя() + "temp.xml");
 . . .

Создать специальный объект, дающий возможность обрабатывать выходящий XML-документ, не прибегая к построению DOM, позволяет метод СоздатьПоследовательноЗаписываемыйДокумент(). Параметры у метода отсутствуют. Возвращаемым значением метода является ссылка на OLE-объект, представляющий собой узел документа.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДокумент = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
XMLДокумент.ИмяФайла = КаталогПользователя() + "output.xml";
// Вставляем открывающий тег нового элемента
XMLДокумент.ОткрытьЭлемент("ФайлОбмена");

 . . .

// Вставляем закрывающий тег
XMLДокумент.ЗакрытьЭлемент();
// Сбрасываем построенную структуру тегов на диск и закрываем файл
XMLДокумент.Сбросить();
XMLДокумент.Завершить();

Атрибуты абстрактного объекта типа "Узел"

Примечание: Атрибуты, описываемые в данном разделе, являются общими для объектов "Документ", "Элемент", "Атрибут" и используются только при работе с DOM.

Узнать тип узла позволяет атрибут Тип (англоязычный синоним — NodeType), содержащий число, соответствующее типу узла в объектной модели документа (DOM). Возможные значения атрибута:

  • 1 — узел элемента;
  • 2 — узел атрибута;
  • 3 — текстовый узел;
  • 4 — узел секции CDATA;
  • 5 — узел ссылки на сущность (Entity Reference);
  • 6 — узел сущности (Entity);
  • 7 — узел инструкции обработки;
  • 8 — узел комментария;
  • 9 — узел документа;
  • 10 — узел описания типа документа (DTD);
  • 11 — узел фрагмента документа;
  • 12 — узел объявления XML (XML Declaration).

Получить строковое значение, соответствующее типу узла в объектной модели документа (DOM) позволяет атрибут ТипСтрока (англоязычный синоним — NodeTypeString). Возможные значения, возвращаемые атрибутом:

  • "element" — узел элемента;
  • "attribute" — узел атрибута;
  • "text" — текстовый узел;
  • "cdatasection" — узел секции CDATA;
  • "entityreference" — узел ссылки на сущность;
  • "entity" — узел сущности
  • "processinginstruction" — узел инструкции обработки;
  • "comment" — узел комментария;
  • "document" — узел документа;
  • "documenttype" — узел описания типа документа (DTD);
  • "documentfragment" — узел фрагмента документа;
  • "notation" — узел объявления XML (XML Declaration).

Получить наименование узла позволяет атрибут Наименование (англоязычный синоним — BaseName), значение которого зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "Элемент" или "Атрибут", для которых возвращается имя узла без префикса.

Получить префикс имени узла позволяет атрибут Префикс (англоязычный синоним — Prefix), значение которого зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "Элемент" или "Атрибут", для которых возвращается только префикс (без имени).

Получить наименование узла полностью позволяет атрибут ПолноеНаименование (англоязычный синоним — NodeName). Содержащееся в атрибуте значение зависит от типа узла. Чаще всего это значение приходится получать для узлов типа "Элемент" или "Атрибут", для которых возвращается префикс и имя узла, разделённые двоеточием.

Получить ссылку на родительский узел (то есть на объект типа "Документ" или "Элемент") позволяет атрибут Родитель (англоязычный синоним — ParentNode). Замечу, что узлы типа "Документ" и "Атрибут" родителя не имеют, и значение данного свойства для них всегда является пустым значением.

Пример использования:

ЭлПодразделение = ЭлСотрудник.Родитель;

Получить ссылку на узел типа "Документ", которому принадлежит данный узел, позволяет атрибут ДокументВладелец (англоязычный синоним — OwnerDocument).

Получить или установить тип данных узла позволяет атрибут ТипДанных (англоязычный синоним — DataType). Его содержимым является строка, соответствующая типу данных, который имеет значение узла. Значение данного атрибута влияет на допустимые значения, которые могут быть присвоены данному узлу, и позволяет определить тип возвращаемого значения при запросе свойства Значение.

Пример использования:

Если АтрЭлемента.Наименование = "Дата" Тогда
   АтрЭлемента.ТипДанных = "date";
   АтрЭлемента.Значение = ТекущаяДата();
КонецЕсли;

Получить или установить значение (содержимое) узла позволяет атрибут Значение (англоязычный синоним — NodeValue).

Пример использования:

Сообщить("Значение узла - " + Узел.Значение);

Другой пример:

ЭлВторогоУровня = ЭлПервогоУровня.СоздатьПодчиненныйЭлемент("Сотрудник");
ЭлВторогоУровня.Значение = СокрЛП(ТЗ.ПолучитьЗначение(НомПП, "ФИО"));

Получить или установить текстовое содержимое узла позволяет атрибут Текст (англоязычный синоним — Text).

Важно! Возвращаемая данным атрибутом строка, соответствует совокупному содержимому текущего узла и всех принадлежащих ему подчинённых узлов, если таковые имеются. При присвоении же этому атрибуту какого-то текстового значения полностью реорганизуется вся структура подчинённых узлов (если таковые имеются) — они заменяются одним узлом типа «text».

Получить или установить содержимое узла, являющееся представлением данного узла со всеми подчинёнными узлами в формате XML, позволяет атрибут ПредставлениеXML (англоязычный синоним – Xml).

Пример использования:

XMLДокумент = Анализатор.СоздатьДокумент();
XMLДокумент.ЗагрузитьИзСтроки(Узел.ПредставлениеXML);
 . . .

Другой пример:

XMLДокумент2 = Анализатор.СоздатьДокумент();
// создаем копию документа
XMLДокумент2.ЗагрузитьИзСтроки(XMLДокумент1.ПредставлениеXML);
 . . .

Методы абстрактного объекта типа "Узел"

Примечание: Методы, описываемые в данном разделе, являются общими для объектов "Документ", "Элемент", "Атрибут" и используются только при работе с DOM.

Получить количество узлов, подчинённых данному, позволяет метод КоличествоПодчиненных() (англоязычный синоним — NumberChilds()). Согласно последним требованиям спецификации DOM, в это количество не включаются узлы типа "Атрибут". Параметры у метода отсутствуют.

Пример использования:

Для Ном=0 По Узел.КоличествоПодчиненных() - 1 Цикл
   ПодчиненныйУзел = Узел.ПолучитьПодчиненныйПоНомеру(Ном);
    . . .

КонецЦикла;

Примечание: Нумерация узлов в списке подчинённых начинается с нуля.

Получить объект типа "Узел" по указанному порядковому номеру позволяет метод ПолучитьПодчиненныйПоНомеру() (англоязычный синоним — GetChildByNum()). Данный метод в совокупности с методом КоличествоПодчиненных() используется для обхода узлов, подчинённых данному узлу (см. пример выше).

Синтаксис метода:

ПолучитьПодчиненныйПоНомеру(<Номер>)

где <Номер> — порядковый номер узла в списке подчинённых. Нумерация узлов начинается с нуля.

Получить ссылку на коллекцию узлов, содержащую узлы элементов или атрибутов, которые удовлетворяют заданному критерию отбора, позволяет метод ВыбратьУзлы() (англоязычный синоним — SelectNodes()). Для дальнейшей работы с этой коллекцией используются атрибуты и методы объекта "ВыборкаУзлов" (см. раздел «Объект "ВыборкаУзлов"»).

Синтаксис метода:

ВыбратьУзлы(<КритерийОтбора>)

где <КритерийОтбора> — строковое выражение, содержащее критерии отбора узлов в создаваемую коллекцию. Запрос формулируется на языке запросов XSL.

Пример использования:

ВыборкаУзлов = УзелРСВ.ВыбратьУзлы("РасчетСтраховыхВзносов");
Если ПустоеЗначение(ВыборкаУзлов) = 0 Тогда
   Для СчУзлов = 0 По ВыборкаУзлов.КоличествоУзлов - 1 Цикл
       . . .

   КонецЦикла;
КонецЕсли;

Получить первый из узлов (объект "Элемент" или "Атрибут"), который удовлетворяет заданному критерию отбора, позволяет метод ВыбратьУзел() (англоязычный синоним — SelectSingleNode()).

Синтаксис метода:

ВыбратьУзел(<КритерийОтбора>)

где <КритерийОтбора> — строковое выражение, содержащее критерии выбора узла. Запрос формулируется на языке запросов XSL.

Пример использования:

УзелРегистрационныйНомер = УзелРСВ.ВыбратьУзел("РегистрационныйНомерПФР");

Добавить новый узел, созданный с помощью соответствующих методов объекта "Документ", в список подчинённых данному узлу позволяет метод ДобавитьПодчиненный() (англоязычный синоним — AppendChild()). Возвращаемого значения у метода нет.

Синтаксис метода:

ДобавитьПодчиненный(<НовыйУзел>, <ВставитьПеред>)

где

  • <НовыйУзел> — ранее созданный объект типа "Узел";
  • <ВставитьПеред> — имеющийся объект типа "Узел", перед которым необходимо вставить новый узел. Параметр является необязательным. Если параметр не указан, новый узел будет вставлен последним.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// создаём корневой узел DOM
XMLДокумент = Анализатор.СоздатьДокумент();
// создаем новый узел документа
ЭлСписок = XMLДокумент.СоздатьУзел(1, "Список");
// добавляем созданный узел в документ
XMLДокумент.ДобавитьПодчиненный(ЭлСписок);
 . . .

Создать подчинённый элемент позволяет метод СоздатьПодчиненныйЭлемент() (англоязычный синоним — CreateChildElement()). Метод предназначен для облегчения часто встречающейся операции — процесса создания подчинённого элемента. Он заменяет сразу два метода: СоздатьУзел() и ДобавитьПодчиненный().

Синтаксис метода:

СоздатьПодчиненныйЭлемент(<Имя>, <ВставитьПеред>, <ПространствоИмен>)

где

  • <Имя> — строковое выражение, задающее наименование создаваемому элементу;
  • <ВставитьПеред> — объект типа "Узел", перед которым следует вставить создаваемый узел элемента. Параметр является необязательным. Если параметр не используется, элемент будет вставлен в конец списка;
  • <ПространствоИмен> — строковое выражение, указывающее пространство имён, в контексте которого создаётся новый элемент. Параметр является необязательным. Если не указан, анализатор предпринимает попытку создать элемент в контексте пространства имён, определённого у стоящих выше по иерархии узлов документа с учётом префикса, указанного в параметре <Имя>.

Пример использования:

XMLДокумент = Анализатор.СоздатьДокумент();
ЭлЭОКС = XMLДокумент.СоздатьПодчиненныйЭлемент("ЭОКС");

Удалить указанный узел из списка узлов, подчинённых данному, позволяет метод УдалитьПодчиненный() (англоязычный синоним — RemoveChild()). Возвращаемого значения у метода нет.

Синтаксис метода:

УдалитьПодчиненный(<УдаляемыйУзел>)

где <УдаляемыйУзел> — объект типа "Узел", который следует удалить из списка подчинённых узлов.

Пример использования:

ПервыйПодчиненный = XMLДокумент.ЭлементДокумента.ПолучитьПоНомеру(0);
XMLДокумент.ЭлементДокумента.УдалитьПодчиненный(ПервыйПодчиненный);

Примечание: Нумерация узлов в списке подчинённых начинается с нуля.

Привести переданную строку к виду, который допустим для присвоения атрибуту id, позволяет метод ПреобразоватьВ_ИД() (англоязычный синоним — ConvertToID()). Возвращаемым значением метода является преобразованная строка, допустимая с точки зрения допустимых значений атрибута, имеющего тип id.

Синтаксис метода:

ПреобразоватьВ_ИД(<СтрИД>)

где <СтрИД> — строковое выражение — строка, которую надо преобразовать.

Пример использования:

СтрИД = ЗначениеВСтрокуВнутр(СпрТовары);
ЭлТовар.УстановитьАтрибут("ИДТовара", ЭлТовар.ПреобразоватьВ_ИД(СтрИД));

Чтобы лучше усвоить, как и где используются описанные выше атрибуты и методы, рассмотрим исходный код процедуры, формирующей XML-файл, который передаётся в Сбербанк для зачисления сумм зарплаты на пластиковые карты сотрудников:

// Пытаемся создать объект типа "XMLParser"
Попытка
   Анализатор = СоздатьОбъект("AddIn.XMLParser");
Исключение
   Сообщить(ОписаниеОшибки());
   Возврат;
КонецПопытки;

// Начинаем формирование выходного XML-файла
XMLДокумент = Анализатор.СоздатьДокумент();

// Создаем корневой элемент "СчетаПК" и заполняем его атрибуты
ЭлСчетаПК = XMLДокумент.СоздатьПодчиненныйЭлемент("СчетаПК");
ЭлСчетаПК.УстановитьАтрибут("РасчетныйСчетОрганизации", СокрЛП(РасчСчет.Номер));
ЭлСчетаПК.УстановитьАтрибут("ИНН", СокрЛП(Константа.ИННОрганизации));
// Предварительно в названии организации заменяем двойные кавычки на одинарные
НаименованиеОрганизации = СтрЗаменить(СокрЛП(Константа.НаименованиеОрганизации), """", "'");
ЭлСчетаПК.УстановитьАтрибут("НаименованиеОрганизации", НаименованиеОрганизации);
ЭлСчетаПК.УстановитьАтрибут("НомерДоговора", СокрЛП(НомерДоговора));
// Предварительно приводим дату документа к формату ГГГГ-ММ-ДД
ДатаФормирования = ""+ДатаГод(ДатаДок)+"-"+Прав("0"+ДатаМесяц(ДатаДок),2)+"-"+Прав("0"+ДатаЧисло(ДатаДок),2);
ЭлСчетаПК.УстановитьАтрибут("ДатаФормирования", ДатаФормирования);

// Вставляем элемент комментария, отделяющий "заголовочную часть" документа от элементов с данными
ЭлКомментария = XMLДокумент.СоздатьУзел(8);
ЭлКомментария.Значение = "СчетаПК";
XMLДокумент.ДобавитьПодчиненный(ЭлКомментария);

// Создаем подчиненный элемент "ЗачислениеЗарплаты"
ЭлЗачислениеЗарплаты = ЭлСчетаПК.СоздатьПодчиненныйЭлемент("ЗачислениеЗарплаты");
КоличествоЗаписей = 0;
СуммаИтого = 0;

// Создаем подчиненные элементы "Сотрудник" для каждого сотрудника из списка.
// Здесь ТЗ – элемент формы "Таблица значений"
Для ПорНом=1 По ТЗ.КоличествоСтрок() Цикл
   ЭлСотрудник = ЭлЗачислениеЗарплаты.СоздатьПодчиненныйЭлемент("Сотрудник");
   ЭлСотрудник.УстановитьАтрибут("Нпп", ПорНом);

   // Для каждого сотруднка в элементе "Сотрудник" создаем подчиненные элементы "Фамилия", "Имя",
   // "Отчество", "ОтделениеБанка", "ФилиалОтделенияБанка", "ЛицевойСчет", "Сумма"
   // и устанавливаем их значения

   ЭлФамилия = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Фамилия");
   ФИОПолностью = СокрЛП(ТЗ.ПолучитьЗначение(ПорНом,"ФИО"));
   ПозицияПервогоПробела = Найти(ФИОПолностью, " ");
   ЭлФамилия.Значение = Лев(ФИОПолностью, ПозицияПервогоПробела - 1);

   ЭлИмя = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Имя");
   ИмяОтчество = СокрЛ(Сред(ФИОПолностью, ПозицияПервогоПробела + 1));
   ПозицияВторогоПробела = Найти(ИмяОтчество, " ");
   ЭлИмя.Значение = Лев(ИмяОтчество, ПозицияВторогоПробела - 1);

   ЭлОтчество = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Отчество");
   ЭлОтчество.Значение = СокрЛП(Сред(ИмяОтчество, ПозицияВторогоПробела + 1));

   ЭлОтделениеБанка = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ОтделениеБанка");
   ЭлОтделениеБанка.Значение = СокрЛП(ОтделениеБанка);

   ЭлФилиалОтделенияБанка = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ФилиалОтделенияБанка");
   ЭлФилиалОтделенияБанка.Значение = СокрЛП(ФилиалОтделенияБанка);

   ЭлЛицевойСчет = ЭлСотрудник.СоздатьПодчиненныйЭлемент("ЛицевойСчет");
   ЭлЛицевойСчет.Значение = СокрЛП(ТЗ.ПолучитьЗначение(ПорНом,"ЛС"));

   ЭлСумма = ЭлСотрудник.СоздатьПодчиненныйЭлемент("Сумма");
   СуммаКЗачислению = ТЗ.ПолучитьЗначение(ПорНом,"Сумма");
   ЭлСумма.Значение = СуммаКЗачислению;

   // Суммируем итоги
   КоличествоЗаписей = КоличествоЗаписей + 1;
   СуммаИтого = СуммаИтого + СуммаКЗачислению; 
КонецЦикла;

// Создаем в узле "СчетаПК" подчиненный узел "КонтрольныеСуммы"
ЭлКонтрольныеСуммы = ЭлСчетаПК.СоздатьПодчиненныйЭлемент("КонтрольныеСуммы");
// в котором, в свою очередь, создаем подчиненные узлы "КоличествоЗаписей" и "СуммаИтого"
// и устанавливаем их значения
ЭлКоличествоЗаписей = ЭлКонтрольныеСуммы.СоздатьПодчиненныйЭлемент("КоличествоЗаписей");
ЭлКоличествоЗаписей.Значение = КоличествоЗаписей;
ЭлСуммаИтого = ЭлКонтрольныеСуммы.СоздатьПодчиненныйЭлемент("СуммаИтого");
ЭлСуммаИтого.Значение = СуммаИтого;

// Записываем файл на диск
ИмяФайлаВыгрузки = Прав("0000"+ВРег(СокрЛП(ОтделениеБанка)), 4) + Прав("000"+СокрЛП(НомЗаявки), 3) + "z.xml";
XMLДокумент.Записать(КаталогПользователя() + ИмяФайлаВыгрузки);
Анализатор = 0;

В результате выполнения вышеприведённого кода формируется XML-файл со следующим содержимым:

XML-файл

Атрибуты объекта "Документ"

Примечание: Атрибуты, описываемые в данном разделе, являются специфичными для объекта "Документ" и используются при работе с объектной моделью документа (DOM).

Установить/считать кодировку, в которой сохраняется документ позволяет атрибут Кодировка (англоязычный синоним — Encode). Значение задаётся строкой в соответствии стандартными наименованиями наборов символов для использования в Интернете. По умолчанию установлена кодировка «windows-1251». Для России обычно используются следующие кодировки:

  • windows-1251
  • KOI8-R
  • Cp866
  • ISO-8859-5

Пример записи атрибута:

XMLДокумент.Кодировка = "KOI8-R";

Получить доступ к коллекции схем, установленных документу для проверки состоятельности во время загрузки или проверки состоятельности с помощью метода Проверить(), позволяет атрибут Схемы (англоязычный синоним — Schemas).

Пример использования:

XMLДокумент.Схемы = СхемыДляПроверки;
XMLДокумент.Проверить();

Получить доступ к использованным в документе пространствам имён позволяет атрибут ПространстваИмен (англоязычный синоним — NameSpaces). Значение атрибута имеет тип "коллекция схем".

Пример использования:

Стр = "Количество использованных в документе пространств имен - ";
Стр = Стр + XMLДокумент.ПространстваИмен.КоличествоСхем;
Сообщить(Стр);

Получить/установить режим разрешения внешних ссылок при загрузке или проверке состоятельности позволяет атрибут РазрешатьВнешниеСсылки (англоязычный синоним — ResolveExternals).

Получить корневой элемент (root) документа позволяет атрибут ЭлементДокумента (англоязычный синоним — DocumentElement).

Пример использования:

Сообщить(XMLДокумент.ЭлементДокумента.Наименование);

Методы объекта "Документ"

Примечание: Методы, описываемые в данном разделе, являются специфичными для объекта "Документ" и используются при работе с объектной моделью документа (DOM).

Связать новый документ, созданный методом СоздатьДокумент(), с указанным файлом или OLE-объектом позволяет метод Загрузить() (англоязычный синоним — Load()). При возникновении ошибочной ситуации во время загрузки или разбора источника генерируется ошибка исполнения.

Синтаксис метода:

Загрузить(<Откуда>)

где <Откуда> — аргумент, являющийся строкой или объектом OLE Automation, созданным с помощью системной функции СоздатьОбъект() и имплементирующим интерфейс IStream или IPersistStream. В случае, если аргумент является строкой, её содержимое интерпретируется, как путь к файлу, содержащему XML-документ. В случае, если аргумент является объектом OLE Automation, документ загружается из потока, представленного интерфейсом IStream или IPersistStream.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// создаём корневой узел DOM
XMLДокумент = Анализатор.СоздатьДокумент();
// связываем созданный объект с конкретным XML-файлом
XMLДокумент.Загрузить(КаталогПрограммы() + "plan.xml");
// начинаем обработку файла
 . . .

Связать новый документ, созданный методом СоздатьДокумент(), со строкой в XML-формате позволяет метод ЗагрузитьИзСтроки() (англоязычный синоним — LoadXML()). При возникновении ошибочной ситуации во время разбора строки генерируется ошибка исполнения.

Синтаксис метода:

ЗагрузитьИзСтроки(<СтрокаИсточник>)

где <СтрокаИсточник> — строка, содержащая XML-документ.

Пример использования:

XMLДокумент = Анализатор.СоздатьДокумент();
XMLДокумент.ЗагрузитьИзСтроки(Узел.ПредставлениеXML);
 . . .

Другой пример:

XMLДокумент2 = Анализатор.СоздатьДокумент();
// создаем копию документа
XMLДокумент2.ЗагрузитьИзСтроки(XMLДокумент1.ПредставлениеXML);
 . . .

Получить элемент, атрибут с типом id которого имеет значение, совпадающее с заданным, позволяет метод НайтиПоИД() (англоязычный синоним — NodeFromID()). Возвращаемым значением метода является узел найденного элемента.

Синтаксис метода:

НайтиПоИД(<ИД>)

где <ИД> — строковое выражение, содержащее искомое поле идентификатора.

Пример записи метода:

ИскомыйЭлемент = XMLДокумент.НайтиПоИД("А0001");

Создать новый узел указанного типа позволяет метод СоздатьУзел() (англоязычный синоним — CreateNode()). Возвращаемым значением метода является ссылка на созданный узел.

Примечание: Новый узел после создания ещё не включён в документ, так как не имеет родительского узла, то есть не является частью иерархической структуры документа (DOM). Чтобы узел был включён в документ, нужно воспользоваться методом ДобавитьПодчиненный() объекта типа "Узел".

Синтаксис метода:

СоздатьУзел(<ТипУзла>, <Наименование>, <ПространствоИмен>)

где

  • <ТипУзла> — числовое или строковое выражение, определяющее тип создаваемого узла. Возможные значения:
    • 1 (или "element") — узел элемента;
    • 2 (или "attribute") — узел атрибута;
    • 3 (или "text") — текстовый узел;
    • 4 (или "cdatasection") — узел секции CDATA;
    • 5 (или "entityreference") — узел ссылки на сущность;
    • 6 (или "entity") — узел сущности;
    • 7 (или "processinginstruction") — узел инструкции обработки;
    • 8 (или "comment") — узел комментария;
    • 9 (или "document") — узел документа;
    • 10 (или "documenttype") — узел описания типа документа DTD;
    • 11 (или "documentfragment") — узел фрагмента документа;
    • 12 (или "notation") — узел объявления XML.
  • <Наименование> — строковое выражение. Для элемента или атрибута — это полное наименование, включающее префикс; для инструкции обработки — это имя приложения. Для узлов, у которых наименование не имеет смысла, параметр опускается или задаётся равным пустой строке ("");
  • <ПространствоИмен> — строковое выражение. Параметр является необязательным. Если этот параметр задан, узел создаётся в контексте указанного пространства имён с учётом префикса, указанного в наименовании. Если в наименовании префикс отсутствует, данное пространство имён интерпретируется как пространство имён по умолчанию.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// создаём корневой узел DOM
Корень = Анализатор.СоздатьДокумент();
// Создаем новый узел документа
ЭлПервогоУровня = Корень.СоздатьУзел(1, "Список");
// Добавляем созданный узел в документ
Корень.ДобавитьПодчиненный(ЭлПервогоУровня);
 . . .

Метод СоздатьУзел() следует использовать, например, для вставки в XML-документ узла комментария (метод СоздатьПодчиненныйЭлемент() объекта типа "Узел" для этого не подойдёт). Следующий код добавит в XML-документ тег <!--Тело документа-->.

ЭлКомментария = XMLДокумент.СоздатьУзел(8);
ЭлКомментария.Значение = "Тело документа";
<ЭлементРодитель>.ДобавитьПодчиненный(ЭлКомментария);

Примечание: При работе со старыми версиями компоненты V77plus, создание структуры нового файла XML начиналось с создания объявления XML (XML Declaration), то есть инструкции обработки <?xml version ="1.0"?>:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
// Создаём корневой узел DOM
XMLДокумент = Анализатор.СоздатьДокумент();
// Создаем объявление XML
ИнструкцияОбработки = XMLДокумент.СоздатьУзел(7, "xml");
ИнструкцияОбработки.Данные = "version='1.0'";
// Добавляем созданное объявление XML в документ
XMLДокумент.ДобавитьПодчиненный(ИнструкцияОбработки);
 . . .

В настоящее время создавать объявление XML «вручную» не требуется, так как оно создаётся автоматически. В связи с этим атрибут Данные объекта "Узел" (см. пример выше), предназначенный для узлов типа "XMLDeclaration", потерял свою актуальность (потому и был изъят из документации и синтаксис-помощника).

Осуществить проверку состоятельности документа позволяет метод Проверить() (англоязычный синоним — Validate()). Если документ не состоятелен, генерируется ошибка исполнения. Параметры у метода отсутствуют.

Пример использования:

XMLДокумент.Схемы = СхемыДляПроверки;
XMLДокумент.Проверить();

Сохранить XML-документ в файл или выгрузить в поток, представленный интерфейсом IStream или IPersistStream, позволяет метод Записать() (англоязычный синоним — Save()). Возвращаемого значения у метода нет. При возникновении ошибочной ситуации во время загрузки или разбора источника генерируется ошибка исполнения.

Синтаксис метода:

Записать(<Куда>)

где <Куда> — если аргумент является строкой, её содержимое интерпретируется, как путь к файлу, в котором следует сохранить XML-документ. В случае, если аргумент является COM-объектом, документ выгружается в поток, представленный интерфейсом IStream или IPersistStream.

Пример использования:

XMLДокумент.Записать("C:\XMLDocuments\SrcDocument.xml");

Атрибуты объекта "Элемент"

Объект "Элемент" имеет лишь один специфичный атрибут — ИмяТега (англ. синоним — TagName). Атрибут используется при работе с объектной моделью документа (DOM). Значением атрибута является наименование тега элемента.

Сообщить("Тег элемента - " + Элемент.ИмяТега);

Методы объекта "Элемент"

Примечание: Методы, описываемые в данном разделе, являются специфичными для объекта "Элемент" и используются при работе с объектной моделью документа (DOM).

Узнать количество атрибутов у данного элемента позволяет метод КоличествоАтрибутов() (англоязычный синоним — AttributesNumber()). Параметры у метода отсутствуют.

Пример использования:

Для Ном = 0 По Элемент.КоличествоАтрибутов() - 1 Цикл
   УзелАтрибута = Элемент.ПолучитьУзелАтрибута(Ном);
    . . .

КонецЦикла;

Примечание: Нумерация атрибутов в списке атрибутов элемента начинается с нуля.

Получить объект узла атрибута по номеру или по наименованию позволяет метод ПолучитьУзелАтрибута() (англоязычный синоним — GetAttributeNode()). Возвращаемым значением метода является ссылка на узел атрибута.

Синтаксис метода:

ПолучитьУзелАтрибута(<НомерИлиНаименование>)

где <НомерИлиНаименование> — строковое или числовое выражение — наименование узла атрибута или номер требуемого узла атрибута (см. пример выше) из списка принадлежащих элементу атрибутов. Нумерация атрибутов в списке атрибутов элемента начинается с нуля.

Пример использования:

АтрДатаПриема = ЭлСотрудник.ПолучитьУзелАтрибута("ДатаПриема");

Получить значение указанного атрибута позволяет метод ПолучитьАтрибут() (англоязычный синоним — GetAttribute()). Если атрибуту установлен тип данных, то возвращаемое значение приводится к соответствующему типу, в противном случае возвращается строка.

Синтаксис метода:

ПолучитьАтрибут(>НаименованиеАтрибута>)

где <НаименованиеАтрибута> — строковое выражение – наименование атрибута, значение которого требуется получить.

Пример использования:

ДатаПриемаНаРаботу = ЭлСотрудник.ПолучитьАтрибут("ДатаПриема");

Добавить элементу новый атрибут позволяет метод ДобавитьАтрибут() (англоязычный синоним — AddAttribute()). Возвращаемым значением метода является ссылка на добавленный атрибут.

Синтаксис метода:

ДобавитьАтрибут(<НаименованиеАтрибута>)

где <НаименованиеАтрибута> — строковое выражение — наименование добавляемого атрибута.

Пример использования:

АтрДатаСоздания = Документ.ЭлементДокумента.ДобавитьАтрибут("ДатаСоздания");
АтрДатаСоздания.Значение = ТекущаяДата();

Установить значение для указанного атрибута позволяет метод УстановитьАтрибут() (англоязычный синоним — SetAttribute()). Если указанный атрибут отсутствует, метод добавляет его. Возвращаемого значения у метода нет.

Синтаксис метода:

УстановитьАтрибут(<НаименованиеАтрибута>, <Значение>)

где

  • <НаименованиеАтрибута> — строковое выражение — наименование атрибута, значение которого устанавливается;
  • <Значение> — значение, которое следует присвоить атрибуту. Если атрибуту присвоен определённый тип, выполняется попытка преобразования.

Пример использования:

ЭлСотрудник.УстановитьАтрибут("Нпп", СчетчикВыгруженныхОбъектов);

Удалить указанный атрибут из списка принадлежащих данному элементу позволяет метод УдалитьАтрибут() (англоязычный синоним — RemoveAttribute()). Возвращаемого значения у метода нет.

Синтаксис метода:

УдалитьАтрибут(<УзелАтрибута>)

где <УзелАтрибута> — объект узла атрибута, который требуется удалить.

Пример использования:

ЭлСотрудник.УдалитьАтрибут(ЭлСотрудник.ПолучитьУзелАтрибута("ДатаПриема");

Установить соответствие префикса в полных наименованиях элементов и атрибутов некоторому пространству имён для элементов, починённых данному, позволяет метод УстановитьПространствоИмен() (англоязычный синоним — SetNamespace()). Если в вызове отсутствует параметр <Префикс>, то устанавливается пространство имён для элементов и атрибутов без префикса, то есть пространство имён «по умолчанию».

Данный метод не может применяться для установки контекста пространства имён для данного элемента, то есть префикс в имени данного элемента и параметр <Префикс> не должны совпадать или не должны быть оба пустыми. Контекст пространства имён может быть присвоен элементу только при его создании.

Синтаксис метода:

УстановитьПространствоИмен(<ПространствоИмен>, <Префикс>)

где

  • <ПространствоИмен> — строковое выражение — наименование пространства имён;
  • <Префикс> — строковое выражение — префикс, ставящийся в соответствие пространству имён.

Пример использования:

Док.Элем.УстановитьПространствоИмен(''urn:schemas-msoft-com:datatypes'', ''dt'');

Атрибуты и методы объекта "Атрибут"

Собственных (специфичных) свойств и методов у объекта "Атрибут" нет. Все свойства и методы наследуются от базового объекта "Узел". А ещё для узлов этого типа имеется одна особенность — значение свойства Родитель у них всегда пустое.

Атрибуты специального объекта "КоллекцияСхем"

Объект "КоллекцияСхем" имеет всего лишь один атрибут — КоличествоСхем (англоязычный синоним — Length), значением которого является число — количество схем в коллекции.

Пример использования:

Для Ном = 0 По XMLДокумент.Схемы.КоличествоСхем - 1 Цикл
   ЭлСхемы = XMLДокумент.Схемы.ПолучитьСхему(Ном);
    . . .
КонецЦикла;

Примечание: Нумерация схем в коллекции начинается с нуля.

Методы специального объекта "КоллекцияСхем"

Добавить новую схему в коллекцию схем и связать уникальный идентификатор ресурса пространства имён с указанной схемой позволяет метод ДобавитьСхему() (англоязычный синоним — Add()). Возвращаемого значения у метода нет.

Синтаксис метода:

ДобавитьСхему(<УникальныйИДРесурсаПространстваИмен>, <СпецификаторСхемы>)

где

  • <УникальныйИДРесурсаПространстваИмен> — строковое выражение — пространство имен;
  • <СпецификаторСхемы> — строковое выражение или объект документа с загруженной схемой (схема также является XML документом, отвечающим определённым требованиям). Если этот параметр является строкой, то она интерпретируется как путь к файлу, содержащему схему, и схема загружается из указанного файла.

Пример использования:

КоллекцияСхем.ДобавитьСхему(''http://server/schemas/Sc1.xml'', ''C:/Schemas/Sc1.xml'');

Получить корневой элемент схемы, затребованной по номеру или пространству имён, позволяет метод ПолучитьСхему() (англоязычный синоним — Get()). Возвращаемым значением метода является узел элемента Schema из документа схемы, связанной с затребованным пространством имён или номером схемы в коллекции (см. описание атрибута КоличествоСхем).

Синтаксис метода:

ПолучитьСхему(<УникальныйИДРесурсаПространстваИменИлиНомер>)

где <УникальныйИДРесурсаПространстваИменИлиНомер> — строковое или числовое выражение, содержащее пространство имён или номер схемы в коллекции. Нумерация схем в коллекции начинается с нуля.

Пример использования:

ЭлСхемы = XMLДокумент.Схемы.ПолучитьСхему("http://server/schemas/Sc1.xml");

Удалить из коллекции схему, связанную с указанным пространством имён, позволяет метод УдалитьСхему() (англоязычный синоним — Remove()). Возвращаемого значения у метода нет.

Синтаксис метода:

УдалитьСхему(<УникальныйИДРесурсаПространстваИмен>)

где <УникальныйИДРесурсаПространстваИмен> — строковое выражение, содержащее пространство имён.

Пример использования:

КоллекцияСхем.УдалитьСхему("http://server/schemas/Sc1.xml");

Получить по номеру схемы уникальные идентификаторы ресурсов пространств имён, входящие в коллекцию, позволяет метод УникальныйИДРесурсаПространстваИмен() (англоязычный синоним — NamespaceURI()).

Синтаксис метода:

УникальныйИДРесурсаПространстваИмен(<НомерВКоллекции>)

где <НомерВКоллекции> — числовое выражение — номер схемы в коллекции. Нумерация схем в коллекции начинается с нуля.

Пример использования:

Сообщить(XMLДокумент.ПространстваИмен.УникальныйИДРесурсаПространстваИмен(0));

Атрибуты и методы объекта "ВыборкаУзлов"

Специальный объект "ВыборкаУзлов" представляет собой коллекцию элементов и атрибутов, отобранных по совокупности признаков, заданных при создании. Получить количество элементов или атрибутов в коллекции позволяет атрибут КоличествоУзлов (англоязычный синоним — Length) объекта "ВыборкаУзлов", а получить доступ к узлу по номеру — метод ПолучитьУзел() (англоязычный синоним — Item()):

ВыборкаУзлов = УзелРСВ.ВыбратьУзлы("РасчетСтраховыхВзносов");
Если ПустоеЗначение(ВыборкаУзлов) = 0 Тогда
   Для Ном = 0 По ВыборкаУзлов.КоличествоУзлов - 1 Цикл
      ЭлРасчет = ВыборкаУзлов.ПолучитьУзел(Ном);
       . . .
   КонецЦикла;
КонецЕсли;

Примечание: Нумерация узлов в выборке начинается с нуля.

Объект "ПоследовательноСчитываемыйДокумент"

Объект "ПоследовательноСчитываемыйДокумент" предназначен для последовательной обработки существующего XML-документа без создания объектной модели документа (DOM).

Атрибуты объекта "ПоследовательноСчитываемыйДокумент"

Атрибут СвойстваТекущегоУзла объекта "ПоследовательноСчитываемыйДокумент" возвращает одноимённый OLE-объект, атрибуты и методы которого позволяют получить доступ к различным свойствам узлов обрабатываемого документа (см. далее «Атрибуты объекта «СвойстваТекущегоУзла»», «Методы объекта «СвойстваТекущегоУзла»»).

Методы объекта "ПоследовательноСчитываемыйДокумент"

Установить связь последовательно считываемого документа с указанным XML-файлом (то есть ассоциировать объект "ПоследовательноСчитываемыйДокумент" с указанным именем файла) позволяет метод СвязатьСФайлом().

Синтаксис метода:

СвязатьСФайлом(<ПолноеИмяФайла>)

где <ПолноеИмяФайла> — строка, содержащая имя XML-файла и путь к нему.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "otchet.xml");
 . . .

Установить связь последовательно считываемого документа с указанной строкой XML-данных (то есть ассоциировать объект "ПоследовательноСчитываемыйДокумент" с указанным источником XML-данных)позволяет метод СвязатьСоСтрокой().

Синтаксис метода:

СвязатьСоСтрокой(<CтрокаXML>)

где <CтрокаXML> — строка XML-данных.

Установить связь последовательно считываемого документа с XML-объектом (то есть ассоциировать объект "ПоследовательноСчитываемыйДокумент" с указанным источником XML-данных) позволяет метод СвязатьСОбъектом().

Синтаксис метода:

СвязатьСОбъектом(<Объект>)

где <Объект> — XML-узел.

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

  • 1 — начало нового элемента;
  • 2 — инструкция обработки;
  • 3 — конец уровня;
  • 4 — конец документа.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "temp.xml");
ДостигнутыйУровень = XMLДокумент.Спуститься();
Пока ДостигнутыйУровень <> 4 Цикл   // пока не достигнут конец файла

   Если ДостигнутыйУровень <> 1 Тогда  // пропускаем концы уровней и инструкции
      // Переходим к следующему узлу того же уровня
      ДостигнутыйУровень = XMLДокумент.Следующий();
      Продолжить;
   КонецЕсли;

   ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
   Если ИмяТега = "ОбъектСправочника" Тогда
      ЗагрузитьОбъектСправочника();
   ИначеЕсли ИмяТега = "Документ" Тогда
      ЗагрузитьДокумент();
   Иначе
      // Переходим на уровень ниже
      ДостигнутыйУровень = XMLДокумент.Спуститься();
      Продолжить;
   КонецЕсли;
   // Переходим к следующему узлу того же уровня
   ДостигнутыйУровень = XMLДокумент.Следующий();
КонецЦикла;
 . . .

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

  • 1 — начало нового элемента;
  • 2 — инструкция обработки;
  • 3 — конец уровня;
  • 4 — конец документа.

Пример использования:

. . .
Пока ДостигнутыйУровень < 3 Цикл
   ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
   КолАтрибутов = КолАтрибутов + 1;
   Если ИмяТега = "НомерПачки" Тогда
      ДостигнутыйУровень = XMLДокумент.Спуститься();
      ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
      Если ИмяТега = "Основной" Тогда
         НомерПачки = ПолучитьЗначениеУзлаИзXML();
         НазваниеОтчета = "Анкеты, пачка №" + НомерПачки;
         XMLДокумент.Подняться();
      КонецЕсли;	
   КонецЕсли;
   ДостигнутыйУровень = XMLДокумент.Следующий();
КонецЦикла;
 . . .

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

  • 1 — начало нового элемента;
  • 2 — инструкция обработки;
  • 3 — конец уровня;
  • 4 — конец документа.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
XMLДокумент.СвязатьСФайлом(КаталогПрограммы() + "temp.xml");
ДостигнутыйУровень = XMLДокумент.Спуститься();
Пока ДостигнутыйУровень <> 4 Цикл   // пока не достигнут конец файла

   Если ДостигнутыйУровень <> 1 Тогда  // пропускаем концы уровней и инструкции
      // Переходим к следующему узлу того же уровня
      ДостигнутыйУровень = XMLДокумент.Следующий();
      Продолжить;
   КонецЕсли;

   ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
   Если ИмяТега = "ОбъектСправочника" Тогда
      ЗагрузитьОбъектСправочника();
   ИначеЕсли ИмяТега = "Документ" Тогда
      ЗагрузитьДокумент();
   Иначе
      // Переходим на уровень ниже
      ДостигнутыйУровень = XMLДокумент.Спуститься();
      Продолжить;
   КонецЕсли;
   // Переходим к следующему узлу того же уровня
   ДостигнутыйУровень = XMLДокумент.Следующий();
КонецЦикла;
 . . .

Получить доступ к текущему элементу в обходе, как к объекту DOM-модели, позволяет метод ТекущийЭлементВВидеОбъекта(). Возвращаемым значением метода является XML-узел как объект DOM-модели, к которому можно применить методы объекта "Узел" и др. Параметры у описываемого метода отсутствуют.

Пример использования:

Узел = ХМЛФайлДанных.ТекущийЭлементВВидеОбъекта();
ПачкаВходящихДокументов = Узел.ВыбратьУзел("ПачкаВходящихДокументов");

Получить текущий элемент в обходе в виде строки позволяет метод ТекущийЭлементВВидеСтроки(). Возвращаемым значением метода является представление XML-объекта в виде строки. Параметры у описываемого метода отсутствуют.

Пример использования:

XMLСтрока = ХМЛФайлДанных.ТекущийЭлементВВидеСтроки();

Атрибуты объекта "СвойстваТекущегоУзла"

Получить информацию о типе объекта "СвойстваТекущегоУзла" позволяет атрибут Тип. Он возвращает число 1, если это узел является элементом, или 7, если узел является инструкцией обработки.

Получить имя элемента без префикса позволяет атрибут Имя. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Элемент".

Пример использования:

. . .
Пока ДостигнутыйУровень < 3 Цикл
   ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
   КолАтрибутов = КолАтрибутов + 1;
   Если ИмяТега = "НомерПачки" Тогда
      ДостигнутыйУровень = XMLДокумент.Спуститься();
      ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
      Если ИмяТега = "Основной" Тогда
         НомерПачки = ПолучитьЗначениеУзлаИзXML();
         НазваниеОтчета = "Анкеты, пачка №" + НомерПачки;
         XMLДокумент.Подняться();
      КонецЕсли;	
   КонецЕсли;
   ДостигнутыйУровень = XMLДокумент.Следующий();
КонецЦикла;
 . . .

Получить имя элемента с префиксом позволяет атрибут ПолноеИмя. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Элемент".

Получить префикс без имени позволяет атрибут Префикс. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Элемент".

Получить идентификатор пространства имён узла позволяет атрибут ПространствоИмен. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Элемент".

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

Получить текст инструкции обработки позволяет атрибут Данные. Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Инструкция обработки".

Получить текущий уровень вложенности узла позволяет атрибут Уровень. Возвращаемым значением атрибута является число.

Узнать количество атрибутов элемента позволяет атрибут КоличествоАтрибутов объекта "СвойстваТекущегоУзла". Значение атрибута имеет смысл, если текущий узел принадлежит к типу "Элемент". Возвращаемым значением атрибута в этом случае будет число.

Пример использования:

ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений");
ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла");
ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу");
ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла");  //для НДС всегда =1

ДостигнутыйУровень = XMLДокумент.Спуститься();
ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;

 . . .

Если ИмяТега = "КнигаПрод" Тогда
   Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл
      ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); 
      Если ИмяАтриб = "НаимКнПрод" Тогда
         ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном);
         ТаблицаФайловКомплекта.НоваяСтрока();
         ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп;
         // в основном файле выгрузки декларации НДС имена файлов указаны
         // без каталога, поскольку выгружаются не в отдельный каталог,
         // а туда же, куда и основной файл
         ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп;
         ТаблицаФайловКомплекта.ТипФайла = 1;
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Примечание: Нумерация атрибутов в списке атрибутов элемента начинается с нуля.

Методы объекта "СвойстваТекущегоУзла"

Получить наименование атрибута текущего узла по его номеру в списке атрибутов позволяет метод НаименованиеАтрибута() объекта "СвойстваТекущегоУзла". Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "Элемент".

Синтаксис метода:

НаименованиеАтрибута(<Номер>)

где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.

Пример использования:

ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений");
ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла");
ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу");
ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла");  //для НДС всегда =1

ДостигнутыйУровень = XMLДокумент.Спуститься();
ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;

 . . .

Если ИмяТега = "КнигаПрод" Тогда
   Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл
      ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); 
      Если ИмяАтриб = "НаимКнПрод" Тогда
         ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном);
         ТаблицаФайловКомплекта.НоваяСтрока();
         ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп;
         // в основном файле выгрузки декларации НДС имена файлов указаны
         // без каталога, поскольку выгружаются не в отдельный каталог,
         // а туда же, куда и основной файл
         ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп;
         ТаблицаФайловКомплекта.ТипФайла = 1;
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Получить полное наименование (включая префикс) атрибута текущего узла по его номеру в списке атрибутов позволяет метод ПолноеНаименованиеАтрибута() объекта "СвойстваТекущегоУзла". Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "Элемент".

Синтаксис метода:

ПолноеНаименованиеАтрибута(<Номер>)

где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.

Получить идентификатор пространства имён атрибута текущего узла по номеру атрибута в списке позволяет метод ПространствоИменАтрибута() объекта "СвойстваТекущегоУзла". Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "Элемент".

Синтаксис метода:

ПространствоИменАтрибута(<Номер>)

где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.

Получить значение атрибута текущего узла по номеру атрибута в списке позволяет метод ЗначениеАтрибута() объекта "СвойстваТекущегоУзла". Возвращаемым значением метода является строковое значение. Метод имеет смысл только в том случае, если текущий узел принадлежит к типу "Элемент".

Синтаксис метода:

ЗначениеАтрибута(<Номер>)

где <Номер> — порядковый номер атрибута в списке атрибутов элемента. Нумерация атрибутов начинается с нуля.

Пример использования:

ТаблицаФайловКомплекта = СоздатьОбъект("ТаблицаЗначений");
ТаблицаФайловКомплекта.НоваяКолонка("ИмяФайла");
ТаблицаФайловКомплекта.НоваяКолонка("ПутьКФайлу");
ТаблицаФайловКомплекта.НоваяКолонка("ТипФайла");  //для НДС всегда =1

ДостигнутыйУровень = XMLДокумент.Спуститься();
ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;

 . . .

Если ИмяТега = "КнигаПрод" Тогда
   Для Ном=0 По XMLДокумент.СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл
      ИмяАтриб = XMLДокумент.СвойстваТекущегоУзла.НаименованиеАтрибута(Ном); 
      Если ИмяАтриб = "НаимКнПрод" Тогда
         ИмяФайлаКомп = XMLДокумент.СвойстваТекущегоУзла.ЗначениеАтрибута(Ном);
         ТаблицаФайловКомплекта.НоваяСтрока();
         ТаблицаФайловКомплекта.ИмяФайла = ИмяФайлаКомп;
         // в основном файле выгрузки декларации НДС имена файлов указаны
         // без каталога, поскольку выгружаются не в отдельный каталог,
         // а туда же, куда и основной файл
         ТаблицаФайловКомплекта.ПутьКФайлу = КаталогФайла + ИмяФайлаКомп;
         ТаблицаФайловКомплекта.ТипФайла = 1;
      КонецЕсли;
   КонецЦикла;
КонецЕсли;

Чтобы лучше усвоить, как и где используются описанные выше атрибуты и методы, рассмотрим исходный код процедуры. Данная процедура формирует отчёт следующего вида:

Шаблон табличной формы

считывая информацию из уже знакомого нам файла:

XML-файл

Исходный код процедуры:

Процедура ПечатьФайла()

   Если ФС.СуществуетФайл(СокрЛП(ПутьКФайлуВыгрузки) + ИмяФайлаВыгрузки)=0 Тогда
      Предупреждение("Выходной файл не найден!");
      Возврат;
   КонецЕсли;

   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("ПечатьЛС");

   Анализатор = СоздатьОбъект("AddIn.XMLParser");
   XMLДокумент = Анализатор.СоздатьПоследовательноСчитываемыйДокумент();
   XMLДокумент.СвязатьСФайлом(СокрЛП(ПутьКФайлуВыгрузки) + ИмяФайлаВыгрузки);

   // Начинаем чтение XML-документа
   ДостигнутыйУровень = XMLДокумент.Спуститься();
   СвойстваТекущегоУзла = XMLДокумент.СвойстваТекущегоУзла;
   ИмяТега = СвойстваТекущегоУзла.Имя;

   Если ИмяТега = "СчетаПК" Тогда
      // Перебираем атрибуты узла "СчетаПК" (нумерация атрибутов начинается с 0)
      Для ИндексАтрибута=0 По СвойстваТекущегоУзла.КоличествоАтрибутов - 1 Цикл
         ИмяАтрибута = СвойстваТекущегоУзла.НаименованиеАтрибута(ИндексАтрибута);
         Если ИмяАтрибута = "ДатаФормирования" Тогда
            ДатаФормирования = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута);
         ИначеЕсли ИмяАтрибута = "НомерДоговора" Тогда
            НомерДоговора = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута);
         ИначеЕсли ИмяАтрибута = "НаименованиеОрганизации" Тогда
            НаименованиеОрганизации = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута);
         ИначеЕсли ИмяАтрибута = "РасчетныйСчетОрганизации" Тогда
            РасчетныйСчетОрганизации = СвойстваТекущегоУзла.ЗначениеАтрибута(ИндексАтрибута);
         КонецЕсли;
      КонецЦикла;
      // Выводим шапку документа
      Таб.ВывестиСекцию("Шапка");

      ПродолжитьОбработку = 0;
      Пока ДостигнутыйУровень<>4 Цикл   // пока не достигнут конец файла

         Если ДостигнутыйУровень<>1 Тогда
            // Пропускаем концы уровней и инструкции
            ДостигнутыйУровень = XMLДокумент.Следующий();
            Продолжить;
         КонецЕсли;

         ИмяТега = XMLДокумент.СвойстваТекущегоУзла.Имя;
         Если ПродолжитьОбработку=0 Тогда
            Если ИмяТега = "ЗачислениеЗарплаты" Тогда
               ПродолжитьОбработку = 1;
            Иначе
               ДостигнутыйУровень = XMLДокумент.Спуститься();
               Продолжить;
            КонецЕсли;
         КонецЕсли;

         Если ПродолжитьОбработку = 1 Тогда
            Если ИмяТега = "Сотрудник" Тогда
               ОбъектDOM = XMLДокумент.ТекущийЭлементВВидеОбъекта();

               // Выбираем из подчиненных узлов сведения о сотруднике
               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Фамилия");
               ФИОСотрудника = "" + ПодчиненныйУзел.Значение;

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Имя");
               ФИОСотрудника = ФИОСотрудника + " " + ПодчиненныйУзел.Значение;

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Отчество");
               ФИОСотрудника = ФИОСотрудника + " " + ПодчиненныйУзел.Значение;

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ЛицевойСчет");
               ЛицевойСчет = ПодчиненныйУзел.Значение;

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("Сумма");
               Сумма = Число(ПодчиненныйУзел.Значение);

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ОтделениеБанка");
               ОБ = ПодчиненныйУзел.Значение;

               ПодчиненныйУзел = ОбъектDOM.ВыбратьУзел("ФилиалОтделенияБанка");
               ФОБ = ПодчиненныйУзел.Значение;

               // Выводим строку документа
               Таб.ВывестиСекцию("Строка");
            Иначе
               ДостигнутыйУровень = XMLДокумент.Спуститься();
               Продолжить;
            КонецЕсли;
         КонецЕсли;
         ДостигнутыйУровень = XMLДокумент.Следующий();
      КонецЦикла;
   КонецЕсли;

   Таб.Опции(0,0,5,0);
   Таб.Показать("Список на перечисление зарплаты на лицевые счета сотрудников");

КонецПроцедуры

Объект "ПоследовательноЗаписываемыйДокумент"

Объект "ПоследовательноЗаписываемыйДокумент" предназначен для последовательной обработки вновь создаваемого XML-документа без создания объектной модели документа (DOM).

Атрибуты объекта "ПоследовательноЗаписываемыйДокумент"

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

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
Док.ИмяФайла = ИмяФайлаДанных;
// Вставляем открывающий тег нового элемента
Док.ОткрытьЭлемент("ФайлОбмена");
 . . .

Получить доступ к части документа, не записанной после команды Сбросить(), позволяет атрибут Содержание объекта "ПоследовательноЗаписываемыйДокумент".

Получить ссылку на объект "АтрибутыЭлемента", методы которого могут быть использованы для доступа к атрибутам элемента, создаваемого командами ОткрытьЭлемент() и ВключитьЭлемент(), позволяет атрибут АтрибутыЭлемента. Описания методов объекта "АтрибутыЭлемента" приведены далее.

Методы объекта "ПоследовательноЗаписываемыйДокумент"

Создать открывающий тег с указанным именем и вставить указанное значение элемента позволяет метод ОткрытьЭлемент() объекта "ПоследовательноЗаписываемыйДокумент". Пространство имён при этом берётся из текущих установок мапирования. Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ОткрытьЭлемент(<ПолноеИмя>, <Значение>)

где

  • <ПолноеИмя> — строка — полное имя тега с префиксом;
  • <Значение> — строка — значение элемента. Параметр является необязательным.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
Док.ИмяФайла = ИмяФайлаДанных;
// Вставляем открывающий тег нового элемента
Док.ОткрытьЭлемент("ФайлОбмена");
 . . .

Создать закрывающий тег элемента позволяет метод ЗакрытьЭлемент() объекта "ПоследовательноЗаписываемыйДокумент". Параметры и возвращаемое значение у метода отсутствуют.

Пример использования:

Анализатор = СоздатьОбъект("AddIn.XMLParser");
Док = Анализатор.СоздатьПоследовательноЗаписываемыйДокумент();
Док.ИмяФайла = ИмяФайлаДанных;
// Вставляем открывающий тег нового элемента
Док.ОткрытьЭлемент("ФайлОбмена");

 . . .

Док.ЗакрытьЭлемент();
// Сбрасываем построенную структуру тегов на диск и закрываем файл
Док.Сбросить();
Док.Завершить();

Создать открывающий тег с указанным именем, вставить указанное значение элемента и добавить закрывающий тег позволяет метод ВключитьЭлемент() объекта "ПоследовательноЗаписываемыйДокумент". Вызов данного метода аналогичен последовательному вызову методов ОткрытьЭлемент() и ЗакрытьЭлемент(). Пространство имён при этом берётся из текущих установок мапирования. Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ВключитьЭлемент(<ПолноеИмя>, <Значение>)

где

  • <ПолноеИмя> — строка — полное имя тега с префиксом;
  • <Значение> — строка — значение элемента. Параметр является необязательным.

У данного метода есть и другой синтаксис, позволяющий добавить новый элемент (возможно, с подчинёнными узлами), переданный методу в качестве аргумента.

ВключитьЭлемент(<DOMобъект>)

где <DOMобъект> – узел, который нужно целиком включить в содержание.

Пример использования:

ПравилаОбмена = глПравила.ВыбратьУзел("ПравилаОбмена");
 . . .
Док.ВключитьЭлемент(ПравилаОбмена);
Док.Сбросить();

Вставить узел инструкции обработки позволяет метод ВключитьИнструкциюОбработки() объекта "ПоследовательноЗаписываемыйДокумент". Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ВключитьИнструкциюОбработки(<Приложение>, <Данные>)

где

  • <Приложение> — строка — наименование приложения;
  • <Данные> — строка — текст инструкции обработки.

Установить указанное пространство имён для узла элемента и подчинённых ему узлов и атрибутов с указанным префиксом позволяет метод ОткрытьСвязываниеПрефикса() объекта "ПоследовательноЗаписываемыйДокумент". Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ОткрытьСвязываниеПрефикса(<Префикс>, <ПространствоИмен>)

где

  • <Префикс> — строка — префикс;
  • <ПространствоИмен> — строка — идентификатор пространства имён.

Закончить действие последнего вызова метода ОткрытьСвязываниеПрефикса() с указанным префиксом позволяет метод ЗакрытьСвязываниеПрефикса() объекта "ПоследовательноЗаписываемыйДокумент". Эта конструкция может быть вложенной, в этом случае продолжается действие метода ОткрытьСвязываниеПрефикса() с указанным префиксом более верхнего уровня. Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ЗакрытьСвязываниеПрефикса(<Префикс>)

где <Префикс> — строка — префикс.

Записать содержимое документа в выходной файл и очистить оперативную память компьютера позволяет метод Сбросить() объекта "ПоследовательноЗаписываемыйДокумент". Использование метода имеет смысл только, если установлен атрибут ИмяФайла вышеназванного объекта. Параметры и возвращаемое значение у метода отсутствует.

Пример использования:

Док.ЗакрытьЭлемент();
Док.Сбросить();
Док.Завершить();

Примечание: Метод Сбросить() может быть вызван неоднократно. При каждом его вызове очередная порция XML-кода будет добавляться в конец файла. Окончательное закрытие файла происходит после вызова метода Завершить().

Очистить содержимое документа без записи в файл позволяет метод Очистить() объекта "ПоследовательноЗаписываемыйДокумент". Параметры и возвращаемое значение у метода отсутствуют.

Закрыть сформированный XML-файл позволяет метод Завершить() объекта "ПоследовательноЗаписываемыйДокумент". Параметры и возвращаемое значение у метода отсутствуют.

Пример использования:

Док.ЗакрытьЭлемент();
Док.Сбросить();
Док.Завершить();

Методы объекта "АтрибутыЭлемента"

OLE-объект "АтрибутыЭлемента", возвращаемый одноимённым свойством объекта "ПоследовательноЗаписываемыйДокумент", позволяет получить доступ к атрибутам XML-элемента, создаваемого с помощью команд ОткрытьЭлемент() и ВключитьЭлемент().

Установить значение для указанного атрибута позволяет метод УстановитьАтрибут() объекта "АтрибутыЭлемента". Если указанный атрибут отсутствует, метод добавляет его. Возвращаемого значения у метода нет.

Синтаксис метода:

УстановитьАтрибут(<НаименованиеАтрибута>, <Значение>, <Режим>)

где

  • <НаименованиеАтрибута> — строковое выражение — наименование атрибута, значение которого устанавливается;
  • <Значение> — значение, которое следует присвоить атрибуту. Если атрибуту присвоен определённый тип, выполняется попытка преобразования;
  • <Режим> — необязательный параметр числового типа. Если установлен в 0, то выполняется проверка на пустое значение. Если значение пустое — атрибут не устанавливается.

Установить имя (без префикса) атрибуту с указанным порядковым номером позволяет метод НаименованиеАтрибута(). Возвращаемое значение у метода отсутствует.

Синтаксис метода:

НаименованиеАтрибута(<НомерАтрибута>, <ИмяАтрибута>)

где

  • <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
  • <ИмяАтрибута> — строка, содержащая имя (без префикса), которое необходимо установить.

Установить полное наименование (с префиксом) атрибуту с указанным порядковым номером позволяет метод ПолноеНаименованиеАтрибута(). Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ПолноеНаименованиеАтрибута(<НомерАтрибута>, <ПолноеИмяАтрибута>)

где

  • <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
  • <ПолноеИмяАтрибута> — строка, содержащая имя атрибута с префиксом, которое необходимо установить.

Установить пространство имён атрибуту с указанным порядковым номером позволяет метод ПространствоИменАтрибута(). Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ПространствоИменАтрибута(<НомерАтрибута>, <ПространствоИмен>)

где

  • <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
  • <ПространствоИмен> — строка, содержащая идентификатор пространства имён, которое необходимо установить.

Установить значение атрибута с указанным порядковым номером позволяет метод ЗначениеАтрибута(). Возвращаемое значение у метода отсутствует.

Синтаксис метода:

ЗначениеАтрибута(<НомерАтрибута>, <Значение>)

где

  • <НомерАтрибута> — число — номер атрибута в списке атрибутов. Нумерация атрибутов ведётся с нуля;
  • <Значение> — строка, содержащая значение атрибута, которое необходимо установить.

Удалить атрибут с указанным порядковым номером в списке позволяет метод Удалить(). Возвращаемое значение у метода отсутствует.

Синтаксис метода:

Удалить(<НомерАтрибута>)

где <НомерАтрибута> — число — номер атрибута в списке. Нумерация атрибутов ведётся с нуля.

Удалить все атрибуты текущего элемента позволяет метод УдалитьВсе(). Параметры и возвращаемое значение у метода отсутствуют.

Другие статьи по схожей тематике