1с получить метаданные по ссылке
Т.е есть ссылка на какой-то объект и надо получить, является он документом, справочником или еще чем-нить. Такое возможно?
чет не нашел такого. нужно как раз получить просто "СправочникСсылка", "ДокументСсылка", хотя наверное можно просто в строку преобразовать и дальше колбасить
Попробуй ПолноеИмя и Имя. СправочникСсылка.Номенклатура и Номенклатура получишь ну а СправочникСсылка Лев :)
Встроенные функции языка Строка (String) Синтаксис: Строка(<Значение>) Параметры: <Значение>(обязательный) Тип: Произвольный. Исходное значение. Возвращаемое значение: Тип: Строка. Полученное значение. Описание: Преобразует полученный параметр в значение типа Строка. При преобразовании к строке числа формируется его полное представление в стандартном виде, соответствующем национальным установкам. Преобразование значений типа Булево зависит от национальных установок и содержит строковое представление этих значений. При преобразовании к строке даты формируется ее полное представление в стандартном читабельном виде, соответствующем национальным установкам. Преобразование к строке значений остальных типов производится по мере возможности и обычно содержит читабельное представление значения. Пример:Значение>
Справочники.ТипВсеСсылки.СодержитТип(ТипЗнч(Ссылка)) - это справочник, аналогично для документов и пр.
пофиг: НСТР. НСтр (NStr) Синтаксис: НСтр(<Исходная строка>, ) Параметры: <Исходная строка>(обязательный) Тип: Строка. Строки на разных языках, разделенные символом ";" (точка с запятой). Строка на одном языке состоит из кода языка, указанного в метаданных, символа "=" (равно) и собственно строки текста на данном языке в одинарных кавычках, двойных кавычках или без кавычек (когда указывается только один язык). (необязательный) Тип: Строка. Указывается код языка, на котором нужно получить строку. Если значение не указано, то строка будет выдаваться на языке, определенного для текущего пользователя. Значение по умолчанию: Пустая строка Возвращаемое значение: Тип: Строка. Строка, соответствующая языку пользователя или основному языку конфигурации. Описание: Получает строку на языке текущего пользователя или указанном языке из набора строк на разных языках конфигурации. Пример: Текст = "ru = ""Добрый вечер!""; en = ""Good Evening!"""; Сообщить(НСтр(Текст));Исходная>
Иногда нужно в базе хранить ссылку на метаданные.
Примеры использования:
1. Корректировка движений регистра - чтобы знать какой регистр двигать.
2. Документ, который меняет значение периодического реквизита регистра сведений, чтобы сослаться на конкретный реквизит.
3. Универсальный отчет любой, при сохранении настроек нужно знать названия реквизитов. Можно хранить названия, но лучше - метаданные.
Казалось бы можно использовать тип "ОписаниеТипа", но увы, значения этого типа нельзя хранить в базе.
В 8.1 ссылка на метаданные не появилась, так что методика будет еще актуальна долго.
Эмуляция с помощью справочника
Поэтому наиболее разумный выход - использование служебного справочника, назовем его метаданными.
Справочник без кода, в поле наименование хранится полный путь к метаданным, например:
Справочники.Договоры.Реквизиты.Адрес
РегистрыСведений.Сотрудники.Измерения.Сотрудник
Там, где нужно использовать ссылку на метаданные производится вызов фунцкии СсылкаНаМетаданные(МД), которая проверяет, есть ли в справочнике ссылка на такое метаданное. Если ссылки есть, она возвращается, если нет, добавляется новый элемент справочника метаданных, прописывается путь к нему и возвращается ссылка.
Как видно, можно хранить не только ссылку на тип прикладного объекта, но и на конкретный реквизит этого объекта.
Эмуляция с помощью ПВХ
План видов характеристик позволяет хранить типы, т.е. в нем можно сохранять метаданные с точностью до типа.
Эмуляция с помощью строки
acsent: Храним строку - "РегистрыСведений.Сотрудники.Измерения.Сотрудник".
Для Получения используем конструкцию: МетаСсылка = Выполнить(СтрМетаданных);
Гений 1С: Недостатки подхода:
* Строка занимает больше места, чем ссылка, особенно это чувствительно в документах корректировки движений.
* Если переименовать объект метаданного, то все такие строки нужно менять.
Эмуляция с помощью хранилища значения
Neco: Ссылку на объект метаданных и вообще любой объект в конфигурации, будь то таблица значений, файл, список и т.д. можно хранить в реквизите с типом "Хранилище значения". Например:
получить менеджер справочника "Сотрудники" мы можем:
Этот метод избавлен от недостатков хранения ссылки в виде строки. И даже в случае если меняется наименование объекта метаданных, всеравно будет возвращен нужный объект.
Гений 1С: Недостатки подхода:
* Хранилище возможно занимает больше места, чем ссылка на справочник (актуально для большого количества ссылок на метаданные).
* Два значения типа хранилище нельзя сравнивать между собой, делать отборы и т.п., т.е. это черный ящик.
Работа во встроенном языке с объектами метаданных
Во встроенном языке "1С:Предприятия" предоставляется доступ к структуре метаданных конфигурации. Эта возможность предназначена в основном для создания универсальных алгоритмов, которые могли бы единообразно работать с различными объектами конфигурации. В этом разделе приводится информация об особенностях работы с метаданными во встроенном языке.
Доступ к метаданным предоставляется только на чтение. Программное изменение метаданных не поддерживается.
В документации по встроенному языку не приводится перечень свойств объектов метаданных и коллекций подчиненных объектов. Для ознакомления со структурой объектов и составом свойств необходимо использовать отчет по конфигурации (в режиме Конфигуратор меню Конфигурация – Отчет по конфигурации). Имена, отображаемые в этом отчете, соответствуют именам свойств и коллекций подчиненных объектов.
Структура метаданных в отчете и в программной модели не содержит ветки "Общие". Эта ветка используется только в дереве метаданных для удобства редактирования. В отчете по конфигурации и в программной модели все объекты, входящие в ветку "Общие", подчинены непосредственно корневому объекту.
Доступ к структуре метаданных осуществляется через свойство Метаданные глобального контекста. Это свойство предоставляет доступ к корневому объекту конфигурации и коллекциям объектов верхнего уровня. Каждый объект предоставляет соответственно доступ к своим свойствам и подчиненным объектам. Таким образом, можно получить доступ к любому объекту.
Например:
Кроме того, у некоторых типов предназначенных для работы с прикладными объектами, имеется метод Метаданные() , предназначенный для получения объекта метаданных, отвечающего за конкретный тип.
Например:
Однако такие методы есть не у всех типов, используемых для работы с прикладными объектами. Если необходимо получить объект метаданных, отвечающий за некоторый тип прикладного объекта, то можно использовать метод НайтиПоТипу() .
Например:
Объекты метаданных можно сравнивать на равенство. При этом проверяется идентичность объектов, а не совпадение значений свойств. То есть проверяется то, что сравнивается именно один и тот же объект конфигурации.
Например:
С помощью метода Родитель() можно получить вышестоящий объект метаданных.
Например:
Для представления объекта метаданных пользователю нужно использовать преобразование значения к строке или метод Представление() .
Например:
Объекты метаданных не могут быть сериализованы. Для получения строкового значения, соответствующего объекту метаданных, независимого от языка интерфейса пользователя нужно использовать метод ПолноеИмя() .
Например:
Для поиска объекта метаданных, соответствующего значению перечисления, можно использовать методику, описанную в разделе "Как получить имя значения перечисления, заданное в метаданных?".
Метаданные можно использовать, чтобы проверить, относится ли, например, значение к справочникам. Методика такой проверки описана в разделе "Как проверить, что тип значения относится к справочникам, документам и т. д.?".
Некоторые свойства объектов метаданных имеют перечислимый тип. Это специальные перечисления. Доступ к ним в языке выполняется через коллекцию СвойстваОбъектов , предоставляемую корневым объектом метаданных. Состав этих перечислений описан в документации, в разделе, описывающем работу с объектами метаданных.
Например:
Некоторые свойства объектов метаданных являются коллекциями значений и представляются типом КоллекцияЗначенийСвойстваОбъектаМетаданных .
Например:
В разделе документации, описывающем работу с объектами метаданных, приводятся также описания специфических типов свойств метаданных, например, таких как ПараметрыВводаПоСтроке .
Следует учитывать, что не все значения свойств метаданных могут быть получены из встроенного языка. Программный доступ к объектам метаданных не позволяет получать, например, значения свойств, хранящих формы, модули, макеты, разделы справочной информации, картинки, интерфейсы, стили, наборы предопределенных объектов, права.
Для получения форм и макетов используются специализированные методы.
Для получения значений, идентифицирующих стили и элементы стилей, а также картинок, используются специализированные коллекции.
Например:
Для проверки прав текущего пользователя используются специализированные методы глобального контекста ПравоДоступа() и ПараметрыДоступа() .
В результате её выполнения мы получим той ссылки которой является данная переменная.
Однако синоним в большинстве случаев не совпадает с наименованием объекта метаданных, кроме того не очевидно чем именно является данный объект, справочником, перечислением, документом или еще чем.
Когда нам нужно получить всю цепочку имени объекта метаданных, нам необходимо получить его полное имя: Метаданные.НайтиПоТипу(_Тип).ПолноеИмя();
Так например для ссылки _ДОГ на элемент справочника договоров, имеем следующее:
В приведенном фрагменте, обходим реквизиты объекта метаданных, получаем и выводим их полное имя, в том случае если тип составной просматриваем все типы реквизита .Типы()
Здесь стоит упомянуть о таком о объекте как ОписаниеТипов — это объект, который управляет ограничением допустимых типов значений, присваиваемых объектам системы. Этот объект используют в момент создания объектов, он определяет набор допустимых типов и используется как свойства создаваемых объектов.
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В тех случаях, когда известен тип объекта метаданного (справочник, документ, и т.п.), то получение метаданных объекта конфигурации следует выполнять с помощью метода Метаданные этого объекта (или ссылки для объектов ссылочного типа), а не путем обращения к свойству глобального контекста Метаданные , так как второй способ существенно более медленный.
2. В тех случаях, когда тип объекта метаданного заранее неизвестен, рекомендуется воспользоваться методом НайтиПоТипу , например:
// Получить полное имя объекта метаданных вида «Справочник.Номенклатура», «Документ.ПриходнаяНакладная» по переданной ссылке.
ИмяОбъектаМетаданного = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();
Для того чтобы получить имя объекта, следует воспользоваться свойством «Имя» объекта метаданных, который можно получить методом «Метаданные».
Например, если «Справ» — это ссылка на элемент справочника, тогда имя этого справочника, заданное в конфигураторе, можно получить следующим образом:
Для типов, не имеющих метода Метаданные() , можно использовать поиск в структуре метаданных конфигурации. Например, если переменная «ВыборкаНоменклатуры» имеет тип СправочникВыборка.Номенклатура, тогда:
Язык 1С сильно «завязан» на работу с данными. Действительно, основная задача — обработка данных, полученных из базы данных запросом или другими способами.
В других языках с данными, полученными из базы данных обычно работают «как с таблицей». В 1С такое тоже возможно – выполнить запрос, получить «в ответ» таблицу и работать с ней.
Однако более распространенный способ, одна из «фишек 1С» — это работа с данными как с объектами 1С. Например объект 1С Справочник.ИмяСправочника позволяет работать с конкретным справочником, при этом объект 1С имеет свойства (поля с данными) и стандартные методы.
Работа с объектом 1С ведется тогда, когда требуется создать объект 1С или изменить существующий. В остальных случаях (например поиск объекта 1С, использование его в другом объекте 1С) – используется ссылка 1С на объект 1С.
Создание объектов 1С
Объект 1С можно создать с помощью оператора Новый, при этом вызывается конструктор данного типа, если у типа несколько конструкторов – он выбирается по указанным параметрам:
Переменная1 = Новый СписокЗначений();
Менеджеры для получения объектов 1С из базы данных
Если требуется создать объект 1С, связанный с данными в базе данных (то есть фактически получить его из базы данных), вместо использования оператора Новый, используются менеджеры.
Почти для каждого вида метаданных (отображенного в дереве метаданных в окне конфигурации, см. выше) доступен одноименный менеджер, который позволяет получить значение из базы данных по признаку или создать новое для записи в базу данных.
Например:
Переменная1 = Справочники.ИмяСправочника.СоздатьЭлемент();
Переменная1 = Справочники.ИмяСправочника.НайтиПоНаименованию("Наименование");
Ссылки 1С и объекты 1С
Работа с объектами 1С, связанными с данными в базе данных может вестись двумя способами – с помощи «ссылки 1С на данные» и объекта 1С.
Ссылка 1С – это данные, доступные только для чтения. Объект 1С – это данные, доступные для чтения, изменения и записи. Работа со ссылкой 1С производится гораздо быстрее, чем с объектом 1С.
Ссылка 1С на данные получается с помощью функций вида:
СправочникСсылка = Справочники.ИмяСправочника.НайтиПоНаименованию()
Объект 1С можно получить из ссылки 1С или создать с нуля:
СправочникОбъект = СправочникСсылка.ПолучитьОбъект();
СправочникОбъект = Справочники.ИмяСправочника.СоздатьЭлемент();
Пустая ссылка 1С
Ссылка может быть пустой, это значит, что создан «пустой» экземпляр объекта 1С, который не связан с данными.
СправочникСсылкаПустая = Справочники.ИмяСправочника.ПустаяСсылка();
Также ссылку 1С можно проверить на заполненность:
Если СправочникСсылка.Пустая() Тогда
//…
КонецЕсли
Уникальный идентификатор (GUID)
Любой элемент справочника или документ хранится в базе данных. Для идентификации он имеет уникальный «номер» в рамках базы данных — GUID. В понятиях встроенного языка 1С, этот GUID – это ссылка 1С.
Узнать идентификатор можно с помощью универсального метода любого объекта 1С ссылочного типа:
СправочникСсылка = Справочники.ИмяСправочника.НайтиПоНаименованию("Наименование");
GUID = СправочникСсылка.УникальныйИдентификатор();
Возвращаемое значение данного метода имеет специальный тип. Если необходимо сравнивать значение со строкой, не забудьте преобразовать его к строке с помощью Строка(Параметр).
GUID назначается в момент первой записи объекта 1С. Уже до записи можно узнать GUID, который будет назначен объекту 1С при записи:
Также перед записью можно назначить свой GUID. Это бывает полезным, например, при обмене данными:
При работе со значениями, возможно столкнуться со следующими способами хранения и доступа к данным:
- Переменная – созданная в модуле программистом, нетипизированная
- Реквизит объекта 1С (справочника, документа), добавленный в конфигураторе – хранится в базе данных, строго типизирован
- Реквизит формы – поле на форме, строго типизирован.
Поле на форме показывает «какие-то данные». Данные могут быть напрямую связаны с реквизитом объекта 1С (указаны в свойстве поля формы ПутьКДанным).
Также форма может иметь свои реквизиты, они не записываются в базу данных, их устанавливает программист в процедурах и функциях модуля формы (обычно в процедуре обработчике ПриОткрытии формы).
Доступ к значениям именованных свойств объектов 1С
У многих объектов 1С есть свойства, которые имеют наименования.
Например:
- элемент справочника имеет реквизиты с наименованиями
- форма имеет реквизиты с наименованиями
- у таблицы есть колонки с наименованиями
- у строки таблицы есть поля с такими же наименованиями, как колонки у таблицы.
Если у объекта 1С есть свойства (реквизиты, колонки и т.п.), у которых есть наименования, то к ним можно обращаться двумя способами.
Если в наличии имеются два объекта 1С с именованными свойствами и нужно скопировать их значения, удобно использовать процедуру
ЗаполнитьЗначенияСвойств(КудаКопировать, ОткудаКопировать)
которая копирует значения всех свойств, имена которых совпадают, пример:
Читайте также:
- Notification manager for adobe acrobat нужен ли и как отключить
- Как убрать черные полосы по бокам видео в adobe premiere pro
- Как посмотреть историю браузера у сына
- Как оптимизировать сайт для поисковых систем яндекс браузера
- Обработчик запросов исчерпал внутренние ресурсы и ему не удалось предоставить план запроса 1с