1с получить менеджер по объекту метаданных
Работа во встроенном языке с объектами метаданных
Во встроенном языке "1С:Предприятия" предоставляется доступ к структуре метаданных конфигурации. Эта возможность предназначена в основном для создания универсальных алгоритмов, которые могли бы единообразно работать с различными объектами конфигурации. В этом разделе приводится информация об особенностях работы с метаданными во встроенном языке.
Доступ к метаданным предоставляется только на чтение. Программное изменение метаданных не поддерживается.
В документации по встроенному языку не приводится перечень свойств объектов метаданных и коллекций подчиненных объектов. Для ознакомления со структурой объектов и составом свойств необходимо использовать отчет по конфигурации (в режиме Конфигуратор меню Конфигурация – Отчет по конфигурации). Имена, отображаемые в этом отчете, соответствуют именам свойств и коллекций подчиненных объектов.
Структура метаданных в отчете и в программной модели не содержит ветки "Общие". Эта ветка используется только в дереве метаданных для удобства редактирования. В отчете по конфигурации и в программной модели все объекты, входящие в ветку "Общие", подчинены непосредственно корневому объекту.
Доступ к структуре метаданных осуществляется через свойство Метаданные глобального контекста. Это свойство предоставляет доступ к корневому объекту конфигурации и коллекциям объектов верхнего уровня. Каждый объект предоставляет соответственно доступ к своим свойствам и подчиненным объектам. Таким образом, можно получить доступ к любому объекту.
Например:
Кроме того, у некоторых типов предназначенных для работы с прикладными объектами, имеется метод Метаданные() , предназначенный для получения объекта метаданных, отвечающего за конкретный тип.
Например:
Однако такие методы есть не у всех типов, используемых для работы с прикладными объектами. Если необходимо получить объект метаданных, отвечающий за некоторый тип прикладного объекта, то можно использовать метод НайтиПоТипу() .
Например:
Объекты метаданных можно сравнивать на равенство. При этом проверяется идентичность объектов, а не совпадение значений свойств. То есть проверяется то, что сравнивается именно один и тот же объект конфигурации.
Например:
С помощью метода Родитель() можно получить вышестоящий объект метаданных.
Например:
Для представления объекта метаданных пользователю нужно использовать преобразование значения к строке или метод Представление() .
Например:
Объекты метаданных не могут быть сериализованы. Для получения строкового значения, соответствующего объекту метаданных, независимого от языка интерфейса пользователя нужно использовать метод ПолноеИмя() .
Например:
Для поиска объекта метаданных, соответствующего значению перечисления, можно использовать методику, описанную в разделе "Как получить имя значения перечисления, заданное в метаданных?".
Метаданные можно использовать, чтобы проверить, относится ли, например, значение к справочникам. Методика такой проверки описана в разделе "Как проверить, что тип значения относится к справочникам, документам и т. д.?".
Некоторые свойства объектов метаданных имеют перечислимый тип. Это специальные перечисления. Доступ к ним в языке выполняется через коллекцию СвойстваОбъектов , предоставляемую корневым объектом метаданных. Состав этих перечислений описан в документации, в разделе, описывающем работу с объектами метаданных.
Например:
Некоторые свойства объектов метаданных являются коллекциями значений и представляются типом КоллекцияЗначенийСвойстваОбъектаМетаданных .
Например:
В разделе документации, описывающем работу с объектами метаданных, приводятся также описания специфических типов свойств метаданных, например, таких как ПараметрыВводаПоСтроке .
Следует учитывать, что не все значения свойств метаданных могут быть получены из встроенного языка. Программный доступ к объектам метаданных не позволяет получать, например, значения свойств, хранящих формы, модули, макеты, разделы справочной информации, картинки, интерфейсы, стили, наборы предопределенных объектов, права.
Для получения форм и макетов используются специализированные методы.
Для получения значений, идентифицирующих стили и элементы стилей, а также картинок, используются специализированные коллекции.
Например:
Для проверки прав текущего пользователя используются специализированные методы глобального контекста ПравоДоступа() и ПараметрыДоступа() .
База 1С при запуске уходит в дамп и вылетает 1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window Временные таблицы в отчетах СКД 0
Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой: Временные таблицы, что из себя представляют и как с ними работать? 7
Временные таблицы - хранятся на сервере и позволяют писать более простые запросы. Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц . Когда этот объект уничтожается, уничтожаются и временные таблицы. Чтобы создать временную таблицу Вывод (печать) таблицы значений в табличный документ 7
Пример кода быстрая Печать таблицы значений //ТПОтчета - Табличное поле с формы (Таблица значений) с данными ПострПечать = Новый ПостроительОтчета; ПострПечать.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТПОтчета); ПострПечать.МакетОформлени Горячие клавиши 1С Пользователю [ Предприятие] 5
Основные команды: Интерфейс: F6 - переключение между формами рабочего стола F10 - переход в главное меню окна Alt+1 - переход на панель Разделов Alt+2 - переход на панель Навигации Alt+3 - переход на панель Действий Alt+9 - переход Посмотреть все результаты поиска похожих
Еще в этой же категории
Полезные возможности редактора кода 1С 28
Мне частенько приходится взаимодействовать с 1С-разработчиками, и во время совместной работы над проектами замечаю, что далеко не все из них хорошо знают свой главный инструмент – «Конфигуратор». Причем это не относится к степени крутости девелопера Работа с буфером обмена средствами 1С 19
Копировать из 1С в буфер обмена( без ВК): ЭлементыФормы.Добавить(Тип(" ПолеHTMLДокумента" ), " Поле_HTML_Документа_acb123" , Ложь); Окно = ЭлементыФормы.Поле_HTML_Документа_acb123.Документ.ParentWindow; Окно.ClipboardData.SetData(" Text" , Текст Структура и название таблиц использыемых для хранения данных в БД 1С 8.х 17
Данные, которые определяют логику функционирования системы на базе 1С:Предприятия, относятся к информационной базе. Хранение информационной базы осуществляется в базе данных с виде набора таблиц, для чего 1С:Предприятие 8.1 может использовать одну из Программно получить список активных пользователей 12
Процедура ПолучениеСпискаАктивныхПользователей() ИтогСписокСоединений.Очистить(); СоединенияИнформационнойБазы = ПолучитьСоединенияИнформационнойБазы(); Для Каждого Соединение Из СоединенияИнформационнойБазы Цикл ТЗ=ИтогСпи Как получить ссылку на объект из навигационной ссылки? 7
Процедура ПолучитьСсылкуИзНавигационной(НС) ПерваяТочка = Найти(НС, " e1cib/data/" ); ВтораяТочка = Найти(НС, " ?ref icon-exclamation-sign"> Посмотреть все в категории Полезные, Универсальные Функции
Пожалуй, начнем сразу с практического примера.
В справочник Контрагенты нам необходимо заносить информацию о поставщиках, покупателях, банках, налоговых органах, различных фондах и пр. Для каждого вида контрагента нас интересует разная информация.
Создадим функцию, возвращающую список «важных» реквизитов в зависимости от вида контрагента:
Код 1C v 8.2 УП
Где же ее правильнее разместить?
Напрашивается вариант - в процедуре Модуля объекта «ПередЗаписью()». Тем самым мы на этапе записи будем контролировать правильность заполнения нужных нам реквизитов. С точки зрения создания, изменения элемента справочника, нас все устраивает. Но если нам необходимо, чтобы некоторые менеджеры заносились контрагентов в ИБ без контроля, а спустя какое-то время мы будем выполнять проверку на корректность заполнения данных в справочнике. Тогда нужно будет написать обработку. И в этой обработке, перебирая элементы, проверять заполнение реквизитов. Т.о. эту функцию придется разместить в коде обработки. А это получается дублирование кода, со всеми вытекающими проблемами. Можно получать объект каждого элемента, обращаться к функции, расположенной в его Модуле объекта. Но это будет дополнительные обращения к БД, тогда как в обработке нам достаточно только ссылок.
Можно выйти из этой ситуации создав Общий модуль «РаботаСКонтрагентами» и разместить в нем функцию возвращающую список реквизитов для проверки. В этом случае будем обращаться так «РаботаСКонтрагентами.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».
Но! На платформе 8.2 как раз для решения подобной задачи и был создан Модуль менежера. Там и разместим нашу функцию. А обращаться мы будем: «Справочники.Контрагенты.ПолучитьСписокВажныхРеквизитов(ВидКонтрагента)».
Т.о. на ряду с предопределенными методами, мы можем самостоятельно разработать свои процедуры и обращаться к ним как методам Менеджера объекта, через точку. У нас отпадает необходимость создавать «тематические» внешние модули такие как «Работа с Контрагентами», «Процедуры Номенклатуры».
Обратимся теперь к теории, чтобы «разложить все по полочкам».
Руководство разработчика дает нам следующее описание: «Модуль менеджера существует у всех прикладных объектов и предназначен для управления этим объектом как объектом конфигурации. Модуль менеджера позволяет расширить функциональность менеджеров за счет введения процедур и функций на встроенном языке. Фактически это позволяет описать методы для объекта конфигурации, которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации». Именно это мы и разобрали в нашем практическом примере.
Отобразим иерархию классов прикладных объектов на примере Справочников:
Т.е. мы видим, что появление «Модуля менеджера объекта» логично расширяет свойства класса СправочникМенеджер, так же как экспортные процедуры «Модуля объекта» расширяют методы класса СправочникОбъект. Нужно ли было создавать «Модуль прикладного объекта Справочники (Документы, Перечисления)». Наверное нет. Достаточно трудно придумать какие-либо задачи для единой обработки всех видов справочников.
Кроме возможности расширения методов класса, в модуле менеджера существует предопределенная процедура События Код 1C v 8.2 УП . Она возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе, а также при выполнении метода «ПолучитьДанныеВыбора()».
Так же хочу обратить внимание. При использовании конструктора печати прикладного объекта, платформа расположит процедуру формирования табличного документа непосредственно в Модуле менеджера. И это логично. Теперь, чтобы получить табличный документ элемента справочника нет необходимости получать объект. Достаточно кода: Код 1C v 8.2 УП .
Иногда нужно в базе хранить ссылку на метаданные.
Примеры использования:
1. Корректировка движений регистра - чтобы знать какой регистр двигать.
2. Документ, который меняет значение периодического реквизита регистра сведений, чтобы сослаться на конкретный реквизит.
3. Универсальный отчет любой, при сохранении настроек нужно знать названия реквизитов. Можно хранить названия, но лучше - метаданные.
Казалось бы можно использовать тип "ОписаниеТипа", но увы, значения этого типа нельзя хранить в базе.
В 8.1 ссылка на метаданные не появилась, так что методика будет еще актуальна долго.
Эмуляция с помощью справочника
Поэтому наиболее разумный выход - использование служебного справочника, назовем его метаданными.
Справочник без кода, в поле наименование хранится полный путь к метаданным, например:
Справочники.Договоры.Реквизиты.Адрес
РегистрыСведений.Сотрудники.Измерения.Сотрудник
Там, где нужно использовать ссылку на метаданные производится вызов фунцкии СсылкаНаМетаданные(МД), которая проверяет, есть ли в справочнике ссылка на такое метаданное. Если ссылки есть, она возвращается, если нет, добавляется новый элемент справочника метаданных, прописывается путь к нему и возвращается ссылка.
Как видно, можно хранить не только ссылку на тип прикладного объекта, но и на конкретный реквизит этого объекта.
Эмуляция с помощью ПВХ
План видов характеристик позволяет хранить типы, т.е. в нем можно сохранять метаданные с точностью до типа.
Эмуляция с помощью строки
acsent: Храним строку - "РегистрыСведений.Сотрудники.Измерения.Сотрудник".
Для Получения используем конструкцию: МетаСсылка = Выполнить(СтрМетаданных);
Гений 1С: Недостатки подхода:
* Строка занимает больше места, чем ссылка, особенно это чувствительно в документах корректировки движений.
* Если переименовать объект метаданного, то все такие строки нужно менять.
Эмуляция с помощью хранилища значения
Neco: Ссылку на объект метаданных и вообще любой объект в конфигурации, будь то таблица значений, файл, список и т.д. можно хранить в реквизите с типом "Хранилище значения". Например:
получить менеджер справочника "Сотрудники" мы можем:
Этот метод избавлен от недостатков хранения ссылки в виде строки. И даже в случае если меняется наименование объекта метаданных, всеравно будет возвращен нужный объект.
Гений 1С: Недостатки подхода:
* Хранилище возможно занимает больше места, чем ссылка на справочник (актуально для большого количества ссылок на метаданные).
* Два значения типа хранилище нельзя сравнивать между собой, делать отборы и т.п., т.е. это черный ящик.
всем привет
Задача - как получить менеджер объекта зная значение соответствующего типа?
вот к примеру у меня есть значение типа справочник ссылка контрагент.
а в общем случае общий тип справочник.
Как получить доступ к менеджеру объектов необходимого типа, зная значение экземпляра представителя типа в 1с?
Получить значение объекта своего типа через рефлексию
Доброго времени суток. Есть собственный тип с перегрузкой. public struct MyType < .
Как вывести значение переменной, не зная ее типа?
Необходимо написать универсальный скалярный тип, причем так, чтобы нам не нужно было знать тип.
Как из объекта класса TStringList взять первое по порядку значение, не зная его значения?
Как из объекта класса TStringList взять первое по порядку значение, не зная его значения :) и затем.
Как получить значение id, зная currentIndex().row()?
как получить значение id зная currentIndex().row() из первого столбца.
НЕ совсем верно сформулировал.
про справочник понятно, япро общий вариант имел ввиду.
ну типа есть реквизит метаданного и я знаю строковое наименование, например в тхт файле.
ну кароч смысл в том чтобы написать универссальный перегрузчик данных
"Универсальный перегрузчик данных" - это случаем не попытка построить свою "Конвертацию данных 2.0"? , кроме того можно посмотреть в обработке обмена данными между базами с одинаковой конфигурацией.
а что за обработка такая?
да это именно тот самый случай- написать свою конвертацию данных
Добавлено через 1 минуту
мне пришло на ум только перебор или прописка исходного типа при выгрузке.
чтобы потом его прочитать и через выполнить вставить.
эту настройку куда нить сохранить туда же в файл с выгрузкой.
Это обработка из варианта "конфигурации аналогичны" (они прекреплены для 8.3 и 8.2)
Где - то на ИТС есть статья, в общем случае есть два пути обмена "правилами через файл"
1) конфигурации не отличаются одна от другой нужно просто перегнать данные в таком случае используется "выгрузка загрузка данных XML"
2) использование конфигурации Конвертация данных посложнее будет
обработка выгрузки структуры 1К --- --- обработка выгрузки структуры 2К
. | |
Конф "конвертация данных" ( создание правил обмена) -> правила обмена
правила обмена правила обмена
| |
универсальный обмен XML(выгрузка) -> файл данных -> универсальный обмен XML(загрузка)
Читайте также: