Получение массива реквизитов формы и ее основного реквизита
21Полезные технологии
Описание
Главные функции - ЛксПолучитьМассивИменРеквизитовФормы и ЛксПолучитьИмяОсновногоРеквизитаФормы. Функция ЛксСтрокаВнутрВХМЛТело взята отсюда http://infostart.ru/projects/1801.
Если будете применять в реальном времени, делайте кэширование ДокументDOM.
Если будете применять в реальном времени, делайте кэширование ДокументDOM.
[code]
Функция ЛксСтрокаВнутрВХМЛТело(вхСтрока, выхХМЛТело = Неопределено) Экспорт
//{ Получение одной длинной строки
выхХМЛТело = СтрЗаменить(вхСтрока,СИМВОЛЫ.ПС,"");
выхХМЛТело = СтрЗаменить(выхХМЛТело,СИМВОЛЫ.ВК,"");
//}
//{ Заменяем символы, критичные для XML
// & на &
// < на <
// > на >
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");
//}
//{ Замена одинарных символов
выхХМЛТело = СтрЗаменить(выхХМЛТело,",","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"{","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"}","");
//}
//{ Удаляем лишние блоки и
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
//}
//{ Добавляем перенос строки к и к для удобства поиска различий
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
//}
Возврат выхХМЛТело;
КонецФункции
Функция ЛксПолучитьДокументDOMФормы(Форма) Экспорт
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
XMLСтрокаФормы = ЛксСтрокаВнутрВХМЛТело(СтрокаФормы);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтрокаФормы);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
Возврат ДокументDOM;
КонецФункции // ЛксПолучитьДокументDOMФормы()
Функция ЛксПолучитьМассивИменРеквизитовФормы(Форма) Экспорт
ДокументDOM = ЛксПолучитьДокументDOMФормы(Форма);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/data[3]";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента + "/text()", ДокументDOM,
РазыменовательПИ, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
Массив = Новый Массив;
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Текст = Узел.ТекстовоеСодержимое;
Длина = СтрДлина(Текст);
Текст = Сред(Текст, 2, Длина - 2);
Массив.Добавить(Текст);
КонецЦикла;
Возврат Массив;
КонецФункции // ЛксПолучитьМассивИменРеквизитовФормы()
Функция ЛксПолучитьИмяОсновногоРеквизитаФормы(Форма) Экспорт
ДокументDOM = ЛксПолучитьДокументDOMФормы(Форма);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[1]/data[1]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
КлючОсновногоРеквизита = РезультатXPath.СтроковоеЗначение;
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/elem[1]/data[1]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ,
ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
Счетчик = 1;
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Если Узел.ТекстовоеСодержимое = КлючОсновногоРеквизита Тогда
Прервать;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Если Узел = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem[" + Счетчик + "]/data[3]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
Длина = СтрДлина(РезультатXPath.СтроковоеЗначение);
Возврат Сред(РезультатXPath.СтроковоеЗначение, 2, Длина - 2);
КонецФункции // ЛксПолучитьИмяОсновногоРеквизитаФормы()[/code]
Функция ЛксСтрокаВнутрВХМЛТело(вхСтрока, выхХМЛТело = Неопределено) Экспорт
//{ Получение одной длинной строки
выхХМЛТело = СтрЗаменить(вхСтрока,СИМВОЛЫ.ПС,"");
выхХМЛТело = СтрЗаменить(выхХМЛТело,СИМВОЛЫ.ВК,"");
//}
//{ Заменяем символы, критичные для XML
// & на &
// < на <
// > на >
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");
//}
//{ Замена одинарных символов
выхХМЛТело = СтрЗаменить(выхХМЛТело,",","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"{","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"}","");
//}
//{ Удаляем лишние блоки и
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
//}
//{ Добавляем перенос строки к и к для удобства поиска различий
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
//}
Возврат выхХМЛТело;
КонецФункции
Функция ЛксПолучитьДокументDOMФормы(Форма) Экспорт
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
XMLСтрокаФормы = ЛксСтрокаВнутрВХМЛТело(СтрокаФормы);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтрокаФормы);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
Возврат ДокументDOM;
КонецФункции // ЛксПолучитьДокументDOMФормы()
Функция ЛксПолучитьМассивИменРеквизитовФормы(Форма) Экспорт
ДокументDOM = ЛксПолучитьДокументDOMФормы(Форма);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/data[3]";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента + "/text()", ДокументDOM,
РазыменовательПИ, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
Массив = Новый Массив;
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Текст = Узел.ТекстовоеСодержимое;
Длина = СтрДлина(Текст);
Текст = Сред(Текст, 2, Длина - 2);
Массив.Добавить(Текст);
КонецЦикла;
Возврат Массив;
КонецФункции // ЛксПолучитьМассивИменРеквизитовФормы()
Функция ЛксПолучитьИмяОсновногоРеквизитаФормы(Форма) Экспорт
ДокументDOM = ЛксПолучитьДокументDOMФормы(Форма);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[1]/data[1]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
КлючОсновногоРеквизита = РезультатXPath.СтроковоеЗначение;
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/elem[1]/data[1]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ,
ТипРезультатаDOMXPath.УпорядоченныйИтераторУзлов);
Счетчик = 1;
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Если Узел.ТекстовоеСодержимое = КлючОсновногоРеквизита Тогда
Прервать;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Если Узел = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem[" + Счетчик + "]/data[3]/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(ИмяЭлемента, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
Длина = СтрДлина(РезультатXPath.СтроковоеЗначение);
Возврат Сред(РезультатXPath.СтроковоеЗначение, 2, Длина - 2);
КонецФункции // ЛксПолучитьИмяОсновногоРеквизитаФормы()[/code]
Оценка сообщества
|
Плюсы (+21):
, , , , , , , , , , , , , , , , , , , , |
Добавить плюс Добавить минус
Комментарии (12)
2.
German
23.11.2008 20:11:50
Потому и затеял эти дела. Форму теперь можно получить из двоичных данных (Как это сделать можно будет посмотреть в новой версии Ei ). Ну а когда есть форма.
У Брикса вся фишка в том что он не мог на основе двоичных данных(текстовых) получить форму.
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма); Форма=ЗначениеИзСтрокиВнутр(СтрокаФормы ); //ошибка
Потому и затеял эти дела. Форму теперь можно получить из двоичных данных (Как это сделать можно будет посмотреть в новой версии Ei ). Ну а когда есть форма.
Для каждого Элемент из Форма.Элементы.Формы Цикл Сообщить(Элемент.Имя); КонецЦикла;
3.
4.
5.
6.
7.
8.
Sol
30.11.2008 13:11:40
А в этой части не напутано?
> //{ Заменяем символы, критичные для XML
>// & на &
.........
Вроде в http://infostart.ru/profile/16971/blogs/344/ в (11) было правильно:
> //{ Заменяем символы, критичные для XML
>// & на &
.........
9.
10.
tormozit
01.12.2008 21:12:52
Теперь стало некрасиво, зато правильно) Не знаю как в новом форуме оформить код... =(
11.
Sol
01.12.2008 21:12:25
А я не пойму даже, как комментарии упорядочить, чтобы как раньше - новые были сверху.
Для добавления комментария необходимо зарегистрироваться.



Браво ...