Как определить, существует ли метод объекта?
Всем привет.
Вопрос следующий: есть подписка на событие, которая вызывает метод объекта. Но этот метод у объекта может быть не всегда. Например, подписка на все справочники или документы.
Сейчас это работает в конструкции попытка-исключение, что мешает отладке.
Подскажите, есть ли какой-то способ проверить наличие метода у объекта? Гугление по проблеме особо ничего не дало.
Вопрос следующий: есть подписка на событие, которая вызывает метод объекта. Но этот метод у объекта может быть не всегда. Например, подписка на все справочники или документы.
Сейчас это работает в конструкции попытка-исключение, что мешает отладке.
Подскажите, есть ли какой-то способ проверить наличие метода у объекта? Гугление по проблеме особо ничего не дало.
По теме из базы знаний
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Методология i3 как основа новой экономики. Индустрия 5.0
- Самые используемые методы БСП 3.1.9
- Выживаем или растём? Влияние кризисов на реализацию портфеля проектов
- Экспертный кейс. Недостаточно памяти для получения результата запроса: что это такое и как с этим бороться?
Найденные решения
Готовая реализация в ИР - ирОбщий.МетодРеализованЛкс()
Функция МетодРеализованЛкс(Объект, ИмяМетода) Экспорт
Если Объект = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Выражение = "Объект." + ИмяМетода + "(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)";
Попытка
Выполнить(Выражение);
Исключение
Инфо = ИнформацияОбОшибке();
Описание = Инфо.Описание;
КонецПопытки;
Результат = Найти(НРег(Описание), "(" + НРег(ИмяМетода) + ")") = 0;
Возврат Результат;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) вероятно следовало разделить справочники и документы на 2 разные подписки. Из доступных вариантов - проверять тип
или же документы, но это более точечно выбирать.
Можно проверить через например через имя ( Метаданные.Документы.Найти(Источник.Метаданные().Имя))
Если ТипЗнч(Источник) = Тип("СправочникОбъект.Сотрудники") Тогда
Можно проверить через
Источник.Метаданные()
(1)
Но есть засада - ТипВсеСсылки() не работает с объектами, добавленными в расширениях.
Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда
// Это справочник и его можно просто записать
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Объект.Ссылка)) Тогда
// Это документ, и его можно записывать с проведением
ИначеЕсли...
....
КонецЕсли;
Но есть засада - ТипВсеСсылки() не работает с объектами, добавленными в расширениях.
(20) Качество дешевым не бывает. Ну а раз нет времени на качественную разработку - то нет и смысла жаловать на отладку через попытку-исключение.
Хотя что тут страшного - в самом начале подписки определить вид объекта а одну переменную, а потом по тексту подставить в нужных местах условие (проверку этой переменной) перед вызовом спорных методов. Очень трудоёмко, согласен. Недели на две задачка.
Хотя что тут страшного - в самом начале подписки определить вид объекта а одну переменную, а потом по тексту подставить в нужных местах условие (проверку этой переменной) перед вызовом спорных методов. Очень трудоёмко, согласен. Недели на две задачка.
(21) Попытка/исключение не есть зло само по себе - а вот разработчик сующий её во все части кода вместо проработки качественного кода - есть зло непосредственное и абсолютное.
У вас один конфигуратор на всю групповую разработку? Или что значит "трудно настраивать отладчик каждый раз при групповой разработке"?
У вас один конфигуратор на всю групповую разработку? Или что значит "трудно настраивать отладчик каждый раз при групповой разработке"?
(24)
именно поэтому сия ветка и создана, чтобы от такого кода избавиться. Спойлер: не избавиться.
(24)
Это значит следующее: каждому разработчику придется заполнять и редактировать таблицу "Останавливать только на ошибках включающих текст", когда он захочет остановиться перед какой-то ошибкой. Плюс это ещё значит принципиальную невозможность отловить ошибки с текстом "Метод объекта не обнаружен". А если ещё представить, что такие ошибки могут вывалиться где-нибудь в транзакции, то вообще шик и блеск.
а вот разработчик сующий её во все части кода вместо проработки качественного кода - есть зло непосредственное и абсолютное
именно поэтому сия ветка и создана, чтобы от такого кода избавиться. Спойлер: не избавиться.
(24)
У вас один конфигуратор на всю групповую разработку? Или что значит "трудно настраивать отладчик каждый раз при групповой разработке"?
Это значит следующее: каждому разработчику придется заполнять и редактировать таблицу "Останавливать только на ошибках включающих текст", когда он захочет остановиться перед какой-то ошибкой. Плюс это ещё значит принципиальную невозможность отловить ошибки с текстом "Метод объекта не обнаружен". А если ещё представить, что такие ошибки могут вывалиться где-нибудь в транзакции, то вообще шик и блеск.
(1) нашел вот такое
но как работает проверка ? кто-то может объяснить?
Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт
// Проверка имени метода на корректность.
Попытка
Тест = Новый Структура(ИмяМетода, ИмяМетода);
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Некорректное значение параметра ИмяМетода (%1) в ОбщегоНазначения.ВыполнитьМетодОбъекта';uk='Некоректне значення параметра ИмяМетода (%1) у ОбщегоНазначения.ВыполнитьМетодОбъекта'"), ИмяМетода);
КонецПопытки;
Показатьно как работает проверка ? кто-то может объяснить?
(15) нет. Вот полный код
// Параметры:
// Объект - Произвольный - объект встроенного языка, содержащий методы (например, ОбработкаОбъект).
// ИмяМетода - Строка - имя экспортной процедуры модуля объекта обработки.
// Параметры - Массив - параметры передаются в процедуру <ИмяПроцедуры>
// в порядке расположения элементов массива.
//
Процедура ВыполнитьМетодОбъекта(Знач Объект, Знач ИмяМетода, Знач Параметры = Неопределено) Экспорт
// Проверка имени метода на корректность.
Попытка
Тест = Новый Структура(ИмяМетода, ИмяМетода);
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru='Некорректное значение параметра ИмяМетода (%1) в ОбщегоНазначения.ВыполнитьМетодОбъекта';uk='Некоректне значення параметра ИмяМетода (%1) у ОбщегоНазначения.ВыполнитьМетодОбъекта'"), ИмяМетода);
КонецПопытки;
Если ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");
Если МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности()
И Не МодульРаботаВБезопасномРежиме.УстановленБезопасныйРежим() Тогда
МодульРаботаВБезопасномРежиме = ОбщийМодуль("РаботаВБезопасномРежиме");
ПрофильИнформационнойБазы = МодульРаботаВБезопасномРежиме.ПрофильБезопасностиИнформационнойБазы();
Если ЗначениеЗаполнено(ПрофильИнформационнойБазы) Тогда
УстановитьБезопасныйРежим(ПрофильИнформационнойБазы);
Если БезопасныйРежим() = Истина Тогда
УстановитьБезопасныйРежим(Ложь);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ПараметрыСтрока = "";
Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
Для Индекс = 0 По Параметры.ВГраница() Цикл
ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],";
КонецЦикла;
ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
КонецЕсли;
Выполнить "Объект." + ИмяМетода + "(" + ПараметрыСтрока + ")";
КонецПроцедуры
Показать
(16)
Например
И даже не спорьте - я наугад ткнул в пять мест этого методы в коде БСП
ВыполнитьМетодОбъекта
И он всегда вызывается в попытке...
Например
Процедура Раз()
Попытка
Два();
Исключение
КонецПопытки;
КонецПроцедуры
Процедура Два()
ВыполнитьМетодОбъекта();
КонецПроцедуры;
Процедура ВыполнитьМетодОбъекта()
КонецПроцедуры;
Показать
Готовая реализация в ИР - ирОбщий.МетодРеализованЛкс()
Функция МетодРеализованЛкс(Объект, ИмяМетода) Экспорт
Если Объект = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Выражение = "Объект." + ИмяМетода + "(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)";
Попытка
Выполнить(Выражение);
Исключение
Инфо = ИнформацияОбОшибке();
Описание = Инфо.Описание;
КонецПопытки;
Результат = Найти(НРег(Описание), "(" + НРег(ИмяМетода) + ")") = 0;
Возврат Результат;
КонецФункции
Показать
(8) Насколько я понимаю, вы проверяете наличие метода в модуле объекта. А автору, опять же насколько я понимаю, необходимы методы самого объекта, т.е. встроенные платформенные методы ДокументаОбъект, СправочникаОбъект и т.д. Это раз.
Второе. Проверять наличие метода его исполнением - ну так себе затея: фиг его знает, что он там себе исполняет в базе...
Второе. Проверять наличие метода его исполнением - ну так себе затея: фиг его знает, что он там себе исполняет в базе...
Придумал, как сделать, чтобы в попытке не мешало отладке. Но только на клиенте!
// Есть экспортный метод
//
// Параметры:
// Объект - Форма, ОбщийМодуль -
// ИмяМетода - Строка -
//
// Возвращаемое значение:
// - Булево
//
Функция ЕстьЭкспортныйМетод(Объект, ИмяМетода = "Подключаемый_ПродолжитьВыполнениеКомандыНаСервере") Экспорт
Попытка
ОписаниеОповещения = Новый ОписаниеОповещения(ИмяМетода, Объект);
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот