Идет бета-тестирование портала. Об ошибках пишите нам или на форуме.

Получение массива реквизитов формы и ее основного реквизита

21

Полезные технологии

23.11.2008 [01.12.2008]

Описание

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

Главные функции - ЛксПолучитьМассивИменРеквизитовФормы и ЛксПолучитьИмяОсновногоРеквизитаФормы. Функция ЛксСтрокаВнутрВХМЛТело взята отсюда http://infostart.ru/projects/1801.

Если будете применять в реальном времени, делайте кэширование Документ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]


Оценка сообщества

Плюсы (+21):

, , , , , , , , , , , , , , , , , , , ,


Добавить плюс Добавить минус

Комментарии (12)

1.
+ -
23.11.2008 19:11:29

Браво ...

2.
+ -
23.11.2008 20:11:50

У Брикса вся фишка в том что он не мог на основе двоичных данных(текстовых) получить форму.

СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
Форма=ЗначениеИзСтрокиВнутр(СтрокаФормы ); //ошибка 


Потому и затеял эти дела. Форму теперь можно получить из двоичных данных (Как это сделать можно будет посмотреть в новой версии Ei ). Ну а когда есть форма.
Для каждого Элемент из Форма.Элементы.Формы Цикл
Сообщить(Элемент.Имя);
КонецЦикла; 

3.
+ -
23.11.2008 21:11:02

Боюсь, я не смогу получить двоичные данные формы в общем случае. Поэтому данный способ - единственный.

[+]:
4.
+ -
24.11.2008 12:11:46

Ждите скорого появления функции для получения основного реквизита формы. Она уже есть, токо оформить надо.

5.
+ -
24.11.2008 12:11:56

Высший класс!!! +100 от меня!

6.
+ -
24.11.2008 12:11:27

+(5) Про основной реквизит тоже очень интересно посмотреть.

7.
+ -
26.11.2008 08:11:01

(6) Готово. Реквизиты формы покорены... )

8.
+ -
30.11.2008 13:11:40

А в этой части не напутано?
> //{ Заменяем символы, критичные для XML
>// & на &
.........

Вроде в http://infostart.ru/profile/16971/blogs/344/ в (11) было правильно:
> //{ Заменяем символы, критичные для XML
>// & на &amp;
.........

9.
+ -
01.12.2008 21:12:58

(8) Это движок форума постарался ;)

10.
+ -
01.12.2008 21:12:52

Теперь стало некрасиво, зато правильно) Не знаю как в новом форуме оформить код... =(

11.
+ -
01.12.2008 21:12:25

А я не пойму даже, как комментарии упорядочить, чтобы как раньше - новые были сверху.

12.
+ -
01.12.2008 22:12:37

(12) Согласен. Последние сверху - очень рульно было.

[+]:
Для добавления комментария необходимо зарегистрироваться.
Есть вопросы?
тел. (812) 309-06-46
support@infostart.ru
Обратная связь
Логин :
Пароль :
Забыли пароль?

Статистика

Пользователей: 43876

См. также