Доброго времени суток! Как мне программно определить, когда программный код выполняется в отчете, а когда во внешнем отчете. К примеру пишу процедуру которая должна во внешнем отчете работать по одному алгоритму, а если отчет помещаем в конфигурацию (т.е. он становится не внешним), то по другому алгоритму. Решения типа:

```1c
    Если Найти(Строка(ТипЗнч(ОбъектОтчета)), "Внешний отчет объект") = 0 Тогда
    Возврат;
    КонецЕсли;
```

не предлагать, т.к. на мой взгляд это "залепуха", потому что если будет другой язык платформы, то это "вылетит", да и разработчики могут изменить синоним типа при выходе новой платформы. Кто знает более красивое и технически правильное решение? Ну и аналогичное решение для обработок.
---
```1c
    Функция ЭтоВнешняяОбработкаОтчет() Экспорт
    ПолноеИмяМетаданных = ЭтотОбъект.Метаданные().ПолноеИмя();
    Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМетаданных) = Неопределено
    КонецФункции
```
---
frkbvfnjh, То есть внешний он или встроенный в конфигурацию? Или помещенный в справочник "ВнешниеОтчетыИОбработки"? Или все это вместе против файл-открыть?
---
frkbvfnjh, Есть мысль искать по ГУИД в конфигурации... Наверное самое оно
---
frkbvfnjh, ТипЗнчXML всегда будет возвращать на латинице.
---
Да, нужно определить внешний он или встроенный в конфигурацию.
---
Это как "по ГУИД в конфигурации"?
---
frkbvfnjh, Сейчас попробую...

Не, что то не то
---
Насколько вероятно то, что отчет запущен как внешний, но при этом он с таким же названием присутствует в конфигурации?

Если планируется что во всех конфигурациях в которых отчет будет как внешний он будет отсутствовать в структуре конфигурации, то он может просто искать свое название в метаданных и если его нет значит запуститься он мог только как внешний.
---
Наверное имели ввиду XMLТипЗнч. Кроме того
```1c
    XMLТипЗнч(ЭтотОбъект)
```
 возвращает
```1c
    неопределено
```
!
---
ЭтотОбъект.Метаданные().ПолноеИмя();

Вернет строку: Отчет/ВнешнийОтчет.ИмяОтчета

ЭтоВнешнийОтчет = Найти(ЭтотОбъект.Метаданные().ПолноеИмя() ,"ВнешнийОтчет.") > 0;

Думаю, что это более красивый вариант, а если у разработчиков вдруг дойдут руки менять базовые имена, то большая вероятность, что придется переписывать всю конфу под новую платформу))).
---
```1c
    Функция ЭтоВнешняяОбработкаОтчет() Экспорт
    ПолноеИмяМетаданных = ЭтотОбъект.Метаданные().ПолноеИмя();
    Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМетаданных) = Неопределено
    КонецФункции
```
---
Спасибо большое! Отличное решение. Уже и забыл, что когда то публиковал данный вопрос. Добавлю к себе в копилку.
---
у меня так взлетело:

```1c
    &НаСервере
    Функция ЭтоВнешняяОбработкаОтчет() Экспорт
    ИспользуемоеИмяФайла = РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
    Возврат СтрНайти(ИспользуемоеИмяФайла,"e1cib\tempstorage\") = 0
    КонецФункции
```

если для отладки открываем внешнюю, а рабочая уже загружена в доп.обработки, то (11) всегда вернет Истина
---
Вопрос темы - как отличить внешнюю отчет/обработку от встроенной в конфигурацию, и в рамках этого вопроса код из (11) и должен всегда возвращать Истина как для обработки, открытой через Файл - Открыть, так и для подключенной.
Ваш код, насколько я понял, определяет для внешней обработки/отчета открыта ли она через файл или через механизм подключаемых обработок.
---
```1c
    &НаСервере
    Функция ЭтоВнешняяОбработкаОтчет() Экспорт
    ПолноеИмяМетаданных = РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();
    Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМетаданных) = Неопределено
    КонецФункции
```

для управляемых форм рабочий вариант
---
а если копия есть в метаданных то что? :) и у внешнего отчета нет Метаданные() упадет же
---
Для встроенной обработки метод ПолноеИмя() вернет "Обработка.ИмяОбработки", для внешней – "ВнешняяОбработка.ИмяОбработки". Вы не правы, у объекта внешней обработки есть метод Метаданные().
---
ПриСозданииНаСервере()
Выполнил ЭтотОбъект.Метаданные().ПолноеИмя()

выпало в исключение :)
РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя() так работает :)

Хотя у автора не увидел УФ у него или нет.
---
Это все писалось во времена, когда обычные формы еще были в тренде и код не касался управляемых форм, но думаю Ваш код будет полезен
---
Сам сейчас пользуюсь таким способом:

```1c
    Функция ЭтоВнешняяОбработка(МетаданныеОбъекта) Экспорт
    Возврат Не Метаданные.Обработки.Содержит(МетаданныеОбъекта);
    КонецФункции
```

Хотелось бы узнать мнение окружающих, на сколько надежен данный метод?
---
Возможно кому-нибудь будет актуальным.
Я без серверного вызова в форме обработки проверял так:

```1c
    Если СтрНачинаетсяС(ИмяФормы, "ВнешнийОтчет.") Тогда
    Иначе
    КонецЕсли;
```
---
Плюсую, варианта лучше не нашел. Ради такой мелочи гонять контекст на сервер не правильно.