Получение массива имен реквизитов обычной формы и имя ее основного реквизита
Разработка - Универсальные функции
Если будете применять в реальном времени, делайте кэширование ДокументDOM.
Функция ЛксСтрокаВнутрВХМЛТело(вхСтрока, выхХМЛТело = Неопределено) Экспорт
//{ Получение одной длинной строки
выхХМЛТело = СтрЗаменить(вхСтрока,СИМВОЛЫ.ПС,"");
выхХМЛТело = СтрЗаменить(выхХМЛТело,СИМВОЛЫ.ВК,"");
//}
//{ Заменяем символы, критичные для XML
// & на &
// < на <
// > на >
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");
//{ Замена одинарных символов
выхХМЛТело = СтрЗаменить(выхХМЛТело,",","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"{","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"}","");
//}
//{ Удаляем лишние блоки и
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"","");
//}
//{ Добавляем перенос строки к и к для удобства поиска различий
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
выхХМЛТело = СтрЗаменить(выхХМЛТело,"",""+СИМВОЛЫ.ПС);
//}
Возврат выхХМЛТело;
КонецФункции
Функция ЛксПолучитьДокументDOMФормы(Форма) Экспорт
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
XMLСтрокаФормы = ЛксСтрокаВнутрВХМЛТело(СтрокаФормы);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтрокаФормы);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
Возврат ДокументDOM;
КонецФункции // ЛксПолучитьДокументDOMФормы()
Функция ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита(ИДВерсииПлатформы = "81")
Если ИДВерсииПлатформы = "81" Тогда
Результат = "/data[3]";
ИначеЕсли ИДВерсииПлатформы = "82" Тогда
Результат = "/data[4]";
КонецЕсли;
Возврат Результат;
КонецФункции // ПолучитьXPathИмениРеквизитаВОписанииРеквизита()
Функция ЛксПолучитьМассивИменРеквизитовФормы(Форма, ИДВерсииПлатформы = "81") Экспорт
Массив = Новый Массив;
ДокументDOM = ЛксПолучитьДокументDOMФормы(Форма);
РазыменовательПИ = Новый РазыменовательПространствИменDOM(ДокументDOM);
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem" + ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита(ИДВерсииПлатформы) + "/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(СтрокаXPath, ДокументDOM,
РазыменовательПИ, ТипРезультатаDOMXPath.НеупорядоченныйИтераторУзлов);
Пока 1 = 1 Цикл
Узел = РезультатXPath.ПолучитьСледующий();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Текст = Узел.ТекстовоеСодержимое;
Длина = СтрДлина(Текст);
Текст = Сред(Текст, 2, Длина - 2);
Массив.Добавить(Текст);
КонецЦикла;
Возврат Массив;
КонецФункции // ЛксПолучитьМассивИменРеквизитовФормы()
Функция ЛксПолучитьИмяОсновногоРеквизитаФормы(Форма, ИДВерсииПлатформы = "81") Экспорт
Документ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;
КонецЦикла;
Если Узел = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem[" + Счетчик + "]" + ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита(ИДВерсииПлатформы) + "/text()";
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(СтрокаXPath, ДокументDOM, РазыменовательПИ, ТипРезультатаDOMXPath.Строка);
Длина = СтрДлина(РезультатXPath.СтроковоеЗначение);
Возврат Сред(РезультатXPath.СтроковоеЗначение, 2, Длина - 2);
КонецФункции // ЛксПолучитьИмяОсновногоРеквизитаФормы()
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1425 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8778 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14533 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11973 278 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68823 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9301 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85885 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13498 ke.92@mail.ru 18
| Код |
|---|
СтрокаФормы = ЗначениеВСтрокуВнутр(Форма);
Форма=ЗначениеИзСтрокиВнутр(СтрокаФормы ); //ошибка Показать полностью |
Потому и затеял эти дела. Форму теперь можно получить из двоичных данных (Как это сделать можно будет посмотреть в новой версии Ei ). Ну а когда есть форма.
| Код |
|---|
Для каждого Элемент из Форма.Элементы.Формы Цикл
Сообщить(Элемент.Имя);
КонецЦикла; Показать полностью |
ПолученнаяФорма = ЛксПолучитьИмяОсновногоРеквизитаФормы(ФормаОбъекта);
Хочу в текст кнопки Месяц вставить:
ТекущаяКнопка = Формат(ДатаМесяца, "ДФ=""ММММ гггг""");
ПолученнаяФорма.КоманднаяПанельКалендаря.Кнопки.Месяц.Текст = ТекущаяКнопка;
Или это я глючу?
Только у меня (8.2.12.80 + ЗУП 2.5.27.6) выдаёт ошибку:
Ошибка при вызове метода контекста (Прочитать): Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Document is empty
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Document is empty
В чём может быть причина? Вызываю из модуля формы при открытии, в качестве параметра ЭтаФорма,"82". Сама строка XMLСтрокаФормы заполнена
Функция ЛксСтрокаВнутрВХМЛТело(вхСтрока, выхХМЛТело = Неопределено) Экспорт
//{ Получение одной длинной строки
выхХМЛТело = СтрЗаменить(вхСтрока,СИМВОЛЫ.ПС,"");
выхХМЛТело = СтрЗаменить(выхХМЛТело,СИМВОЛЫ.ВК,"");
//}
//{ Заменяем символы, критичные для XML
// & на "&"
// < на "<"
// > на ">"
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");
//{ Замена одинарных символов
выхХМЛТело = СтрЗаменить(выхХМЛТело,",","</data><data>");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"{","<elem><data>");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"}","</data></elem>");
//}
//{ Удаляем лишние блоки и
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<data><elem>","<elem>");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"</elem></data>","</elem>");
//}
//{ Добавляем перенос строки к и к для удобства поиска различий
выхХМЛТело = СтрЗаменить(выхХМЛТело,"</elem>","</elem>"+СИМВОЛЫ.ПС);
выхХМЛТело = СтрЗаменить(выхХМЛТело,"</data>","</data>"+СИМВОЛЫ.ПС);
//}
Возврат выхХМЛТело;
КонецФункции
ПоказатьНа тот вопрос вы и не ответили :)
Вот ошибка так и возникает:
в
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);{ОбщийМодуль.эрФункцииОбщегоНазначения.Модуль(354)}: Ошибка при вызове метода контекста (Прочитать)
по причине:
{ОбщийМодуль.эрФункцииОбщегоНазначения.Модуль(354)}: Ошибка при вызове метода контекста (Прочитать)
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Document is empty
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");на
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","&");
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","<");
выхХМЛТело = СтрЗаменить(выхХМЛТело,">",">");
Спасибо за наводку Сергею Чуяну (Собеседник)
вызов функции
Процедура ДополнительныеДействияСФормой(ФормаОбъекта) Экспорт
ИмяОсновногоРеквизита = ЛксПолучитьИмяОсновногоРеквизитаФормы(ФормаОбъекта);
ОсновнойРеквизит = ФормаОбъекта[ИмяОсновногоРеквизита];
Если ТипЗнч(ОсновнойРеквизит) = Тип("СправочникОбъект.Контрагенты") Тогда
Сообщить(ОсновнойРеквизит);
КонецЕсли;
КонецПроцедурыВсе хорошо работает, но наблюдается потеря времени при открытии форм.
Например функция УстановитьДоступностьПоляВводаНомера, которая вызывается ПриОткрытии() многих форм документов или элементов справочников затрачивает времени 0,003-004 сек. без проверки основного реквизита. А с проверкой 0,35 – 0,6 и больше в зависимости от сложности формы. Визуально заметна разница во времени. Придется мириться с задержкой примерно в половину секунды при открытии любой из форм.
выхХМЛТело = СтрЗаменить(выхХМЛТело,"&","& amp;"); // пробел убрать между & и amp
выхХМЛТело = СтрЗаменить(выхХМЛТело,"<","& lt;"); // пробел убрать между & и lt
выхХМЛТело = СтрЗаменить(выхХМЛТело,">","& gt;"); // пробел убрать между & gt
ПостроительDOM.Прочитать(ЧтениеXML)Всем советую сразу брать этот вариант т.к. тут поддерживается версия платформы 8.3 (в статье только 8.1/8.2) причем происходит ее авто-определение (а не нужно вручную указывать как в статье)
Так и не понял из статьи и комментариев что такое "кэширование ДокументDOM"
Только из комментариев и кода понятна идея, но понятно что статья старая, хотя идея интересная и требует развернутого описания не только для тех "кто в курсе", например я даже не знаю про "ДокументDOM" и что он позволяет, ну да ладно, главное работает!
От себя добавлю (дополнительно к сказанному другими) тем, кто такое не практикует, для чего этот функционал нужен: для разных универсальных механизмов которые не предполагают чтобы разработчик знал с какой формой код работает в конкретный момент, и не прописывать в каждой форме что это такое. И самое важное - обойтись без угадываний перебором через Попытка/Исключение возможных реквизитов. Например я у себя это использую чтобы вместо любой типовой формы (как списка так и объекта) открывать внешнюю что позволяет многократно ускорить разработку ну и добавляет гибкости.
Т.к. метод применим только к обычным формам то я добавил бы еще проверку переданной формы в "ЛксПолучитьИмяОсновногоРеквизитаФормы":
Если ТипЗнч(ЭтаФорма) <> Тип("Форма") Тогда
Возврат Неопределено;
КонецЕсли;Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 57431
Создание 23.11.08 13:03
Обновление 20.12.11 13:23
Просмотры 44719
Загрузки 0
Рейтинг
71
Комментарии 50
Код открыт Не указано
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)