ОбъектМетаданных: Функция

Типы · MetadataObject: Function

Используется для обращения к метаданным объекта конфигурации - функция внешнего источника данных.

Полное описание, параметры и ограничения

ОбъектМетаданных: Функция (MetadataObject: Function)

ОбъектМетаданных: Функция (MetadataObject: Function)

Доступен, начиная с версии 8.3.4.

Свойства:
Имя (Name)
Комментарий (Comment)
ОбъектРасширяемойКонфигурации (ExtendedConfigurationObject)
ПринадлежностьОбъекта (ObjectBelonging)
Синоним (Synonym)
ВозвращаетЗначение (ReturnValue)
ВыражениеВИсточникеДанных (ExpressionInDataSource)
Тип (Type)

Методы:
ЕстьИзмененияРасширениямиКонфигурации (ChangedByConfigurationExtensions)
ПолноеИмя (FullName)
Представление (Presentation)
РасширениеКонфигурации (ConfigurationExtension)
Родитель (Parent)

Описание:

Используется для обращения к метаданным объекта конфигурации - функция внешнего источника данных.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.3.4.

Методическая информация

Практические примеры

Проверить контракт функций внешнего источника, не подключаясь к нему

Свой источник содержит определения числовой и строковой функций. Проверяем их родителя, возврат значения, описание типа и текст выражения, выводим понятный паспорт без SQL-вызовов.

Где и как запускать

Полный клиентский общий модуль УчебныеКонтракты85 обычного приложения. Только толстый клиент; Пульт отдельным модулем ниже. Не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с именем конфигурации УчебныеКонтрактыМетаданных85, совместимость НеИспользовать, обычное приложение и толстый клиент. Не рабочая база и не её копия. Код здесь не запускался: runtimeVerifiedScenarios=0.

  2. Общий модуль УчебныеКонтракты85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, остальные клиентские флаги=Нет, Привилегированный=Нет. Вставляйте полный модуль выбранного урока. Создайте обработку УчебныеКонтракты85 с обычной основной формой Пульт и кнопкой Выполнить, действие ВыполнитьНажатие; отдельный модуль формы дан ниже.

  3. Для урока внешнего источника: Внешние источники данных → УчебныйИсточник85, синоним Учебный источник, комментарий guide-owned-source-85. Режим управления блокировкой данных Автоматический. Не задавайте подключение, учётные данные, таблицы и кубы; сервер, ODBC и внешняя БД не используются.

  4. В УчебныйИсточник85 → Функции создайте Число85: синоним Учебное число, комментарий guide-owned-number-85, ВозвращаетЗначение=Да, Тип только Число(10,0), ВыражениеВИсточникеДанных=42. Вторую Приветствие85: синоним Учебное приветствие, комментарий guide-owned-text-85, ВозвращаетЗначение=Да, Тип только Строка(40), выражение SQL-литерала 'Привет' с одиночными кавычками. Параметры функций отсутствуют. Это два определения для аудита, функции не вызываются и SQL не исполняется.

  5. Для урока палитры: Общие → Цвета палитры, два собственных цвета УчебныйФон85 и УчебныйТекст85. Синонимы Учебный фон/Учебный текст, комментарии guide-owned-background-85/guide-owned-text-color-85. Задайте абсолютные RGB 240,248,255 и 0,80,120. Не меняйте системные цвета и стили рабочей конфигурации.

  6. Для WS-урока: полный XML файла metadata-study-85.wsdl встроен отдельным блоком ниже. Сохраните этот блок в UTF-8 как локальный .wsdl; рядом со справочником уже лежит такой же файл. В новой базе создайте WS-ссылку УчебныйСервис85 и импортируйте описание ИЗ ЛОКАЛЬНОГО ФАЙЛА, не по HTTP. Синоним Учебная WS-ссылка, комментарий guide-owned-ws-85. Файл не имеет импортов WSDL/XSD; сервис StudyService85, namespace urn:guide:metadata85, адрес 127.0.0.1:9 — неработающий учебный адрес, не настоящий сервер.

  7. Для каждого урока нужны только перечисленные для него объекты. Расширения, заимствование и изменения расширениями отсутствуют. Обновите конфигурацию собственной базы, проверьте F7, имена и все подготовленные свойства. Импорт WSDL в Конфигураторе и запуск в 1С здесь не выполнялись.

  8. Выводится новый табличный документ в память и своё окно без имени файла. Не печатайте и не сохраняйте через команды окна. WSПрокси/вызовы Echo/запрос к внешнему источнику не создаются. Статический паспорт метаданных не доказывает доступность внешнего сервиса или правильность его реализации.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Источник = Метаданные.ВнешниеИсточникиДанных.Найти("УчебныйИсточник85");
    Если Источник = Неопределено Тогда
        ВызватьИсключение "Не создан собственный внешний источник метаданных";
    КонецЕсли;
    Паспорт = СоздатьСвоюТаблицу();
    ДобавитьСвойПаспорт(Паспорт, Источник, "УчебныйИсточник85", Метаданные);
    Если Источник.Функции.Количество() <> 2 Или Источник.Таблицы.Количество() <> 0 Или Источник.Кубы.Количество() <> 0 Тогда
        ВызватьИсключение "Нужны только два собственных определения функций, без таблиц и кубов";
    КонецЕсли;
    Если Источник.РежимУправленияБлокировкойДанных <> Метаданные.СвойстваОбъектов.РежимУправленияБлокировкойДанныхПоУмолчанию.Автоматический Тогда
        ВызватьИсключение "Не совпал режим блокировок собственного источника";
    КонецЕсли;
    ДобавитьСтроку(Паспорт, Источник.ПолноеИмя(), "Режим блокировок", Источник.РежимУправленияБлокировкойДанных);
    Для Каждого МДФункции Из Источник.Функции Цикл
        Если МДФункции.Имя = "Число85" Тогда
            ОжидаемыйТип = Тип("Число");
            ОжидаемоеВыражение = "42";
        ИначеЕсли МДФункции.Имя = "Приветствие85" Тогда
            ОжидаемыйТип = Тип("Строка");
            ОжидаемоеВыражение = "'Привет'";
        Иначе
            ВызватьИсключение "В собственном источнике посторонняя функция";
        КонецЕсли;
        ДобавитьСвойПаспорт(Паспорт, МДФункции, МДФункции.Имя, Источник);
        Если Не МДФункции.ВозвращаетЗначение Тогда
            ВызватьИсключение "Сначала включите возврат значения; свойство Тип не читается для процедуры";
        КонецЕсли;
        ТипФункции = МДФункции.Тип;
        Если ТипЗнч(ТипФункции) <> Тип("ОписаниеТипов") Тогда
            ВызватьИсключение "Тип функции должен быть описанием типов, не строкой";
        КонецЕсли;
        Если ТипФункции.Типы().Количество() <> 1 Или Не ТипФункции.СодержитТип(ОжидаемыйТип)
            Или МДФункции.ВыражениеВИсточникеДанных <> ОжидаемоеВыражение Тогда
            ВызватьИсключение "Не совпали тип возвращаемого значения или текст выражения";
        КонецЕсли;
        ДобавитьСтроку(Паспорт, МДФункции.ПолноеИмя(), "Возвращает значение", МДФункции.ВозвращаетЗначение);
        ДобавитьСтроку(Паспорт, МДФункции.ПолноеИмя(), "Тип результата", ТипФункции);
        ДобавитьСтроку(Паспорт, МДФункции.ПолноеИмя(), "Выражение источника", МДФункции.ВыражениеВИсточникеДанных);
    КонецЦикла;
    ПоказатьСвойПаспорт(Паспорт, "Свой внешний источник: контракт двух функций");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебныеКонтрактыМетаданных85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьСвойПаспорт(Таблица, МД, ОжидаемоеИмя, ОжидаемыйРодитель)
    Если МД.Имя <> ОжидаемоеИмя Или МД.Родитель() <> ОжидаемыйРодитель Тогда
        ВызватьИсключение "Не совпало имя или родитель собственного объекта метаданных";
    КонецЕсли;
    Если МД.ПринадлежностьОбъекта <> Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный
        Или МД.РасширениеКонфигурации() <> Неопределено Или МД.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Опыт предназначен только для своих объектов без расширений";
    КонецЕсли;
    ПолноеИмя = МД.ПолноеИмя();
    Если ПустаяСтрока(ПолноеИмя) Или ПустаяСтрока(МД.Представление()) Тогда
        ВызватьИсключение "У собственного объекта нет полного имени или представления";
    КонецЕсли;
    ДобавитьСтроку(Таблица, ПолноеИмя, "Имя", МД.Имя);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Синоним", МД.Синоним);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Представление", МД.Представление());
    ДобавитьСтроку(Таблица, ПолноеИмя, "Комментарий", МД.Комментарий);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Принадлежность", МД.ПринадлежностьОбъекта);
    ДобавитьСтроку(Таблица, ПолноеИмя, "Привязка заимствованного объекта", МД.ОбъектРасширяемойКонфигурации);
КонецПроцедуры

Процедура ДобавитьСтроку(Таблица, Объект, Свойство, Значение)
    СтрокаПаспорта = Таблица.Добавить();
    СтрокаПаспорта.Объект = Объект;
    СтрокаПаспорта.Свойство = Свойство;
    СтрокаПаспорта.Значение = Строка(Значение);
КонецПроцедуры

Функция СоздатьСвоюТаблицу()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Объект");
    Таблица.Колонки.Добавить("Свойство");
    Таблица.Колонки.Добавить("Значение");
    Возврат Таблица;
КонецФункции

Процедура ПоказатьСвойПаспорт(Таблица, Заголовок)
    Если Таблица.Количество() = 0 Тогда
        ВызватьИсключение "Собственный паспорт пуст";
    КонецЕсли;
    Документ = Новый ТабличныйДокумент;
    Документ.Область("R1C1").Текст = "Объект";
    Документ.Область("R1C2").Текст = "Свойство";
    Документ.Область("R1C3").Текст = "Значение";
    Номер = 2;
    Для Каждого Запись Из Таблица Цикл
        Документ.Область(Номер, 1).Текст = Запись.Объект;
        Документ.Область(Номер, 2).Текст = Запись.Свойство;
        Документ.Область(Номер, 3).Текст = Запись.Значение;
        Номер = Номер + 1;
    КонецЦикла;
    Документ.Показать(Заголовок, "", Истина);
КонецПроцедуры
УчебныеКонтракты85.Пульт

УчебныеКонтрактыМетаданных85 → Обработки → УчебныеКонтракты85 → Формы → Пульт → Модуль

Полный отдельный модуль своей обычной формы; не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеКонтракты85.ВыполнитьПример();
КонецПроцедуры

Разбор по шагам

  1. Проверяется отсутствие чужой активной транзакции. Получаем описания из Метаданные, не бизнес-объекты и не внешний менеджер данных.

  2. Имя проверяется как программный идентификатор, Родитель — как реальный объект метаданных. Вложенная функция подчинена источнику, верхнеуровневые цвета и WS-ссылка — конфигурации.

  3. ПринадлежностьОбъекта, РасширениеКонфигурации и ЕстьИзмененияРасширениямиКонфигурации проверяются раздельно. Собственный объект, созданный расширением, не равен объекту основной конфигурации.

  4. ПолноеИмя используется для строк паспорта, Представление для подписи, Синоним и Комментарий выводятся отдельно. Привязка ОбъектРасширяемойКонфигурации относится к заимствованию: для собственного объекта её произвольное значение не объявляется доказательством отсутствия расширений.

  5. Функции источника — отдельная коллекция объектов метаданных. Требуем два подготовленных имени и отсутствие таблиц/кубов; настраивать драйвер для такого аудита не требуется.

  6. ВозвращаетЗначение читается раньше Тип. При Ложь останавливаемся до чтения свойства, которое по справке предназначено только для функций с возвратом.

  7. Тип — ОписаниеТипов, не строка Число. Проверяем один тип и его наличие через СодержитТип; это отдельно от квалификаторов числа/строки, которые подготовлены в Конфигураторе.

  8. ВыражениеВИсточникеДанных сравнивается как текст определения: 42 либо SQL-литерал Привет с кавычками. Не исполняем его как BSL, не склеиваем SQL с внешним вводом и не заявляем проверку результата в СУБД.

  9. РежимУправленияБлокировкойДанных показывает настройку по умолчанию для дочерних объектов, а не текущую блокировку соединения.

Как проверить результат

  1. Будущий тест: F7, запуск только в своём стенде, паспорт с фактическими именами, синонимами и комментариями. При неправильном имени или родителе успешный паспорт не выводится.

  2. В свойства метаданных код ничего не присваивает. Показ нового табличного документа не изменяет конфигурацию и не доказывает доступность внешних источников.

  3. В будущем паспорте Число85 имеет ВозвращаетЗначение=Истина, тип Число и выражение 42; Приветствие85 — тип Строка и выражение с кавычками. Родитель обеих функций именно УчебныйИсточник85.

  4. В собственной учебной конфигурации выключите ВозвращаетЗначение у Число85: должна возникнуть понятная ошибка до доступа к Тип. Верните флаг перед следующим опытом.

  5. Измените тип Число85 на Строка или выражение 42 на 43: аудит должен отказать. Это проверка согласованности определения, не успешности SQL-вызова.

Ожидаемый результат

Подготовлен полный собственный аудит метаданных и учебный вывод без подключения к внешним данным. runtimeVerifiedScenarios=0.

На что обратить внимание

  1. Метаданные — описания структуры, не таблицы бизнес-данных и не менеджеры подключения. Чтение ВозвращаетЗначение не вызывает внешнюю функцию.

  2. Readonly-свойства нельзя переназначать во встроенном языке. Изменения подготовки выполняются только в Конфигураторе своей новой базы; здесь они не выполнялись.

  3. Код не тестировался в 1С. Паспорт и статические проверки не являются доказательством работы внешнего сервиса, драйвера, SQL-диалекта или применённой темы интерфейса.

  4. Параметры подключения внешнего источника — другой уровень API. Режим блокировок метаданных не открывает и не блокирует внешнюю БД.

  5. Синоним можно менять, не переименовывая функцию. ПолноеИмя не заменяет проверку реального Родителя. В примере нет вызова функции или запроса к внешнему источнику.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.