1С 8.3.5.1186
Модуль УФ внешней обработки. Обычный в общем-то код клиент-серверной работы. По команде клиент вызывает несколько раз сервер. Главным образом для того, чтобы определить наличие нужных модулей БСП и не встроена ли обработка в конфигурацию. Обращения идут к Метаданным и РеквизитФормыВЗначение("Объект"). После определения всех необходимых параметров выбирается тот или иной способ дальнейшей обработки и вызывается то ли экспортная серверная процедура модуля обработки, то ли одна из процедур БСП.
Самый большой фокус в том, что первый запуск проходит отлично и без сбоев, а вот при попытке повторить обработку данных вываливается ошибка "Неизвестный идентификатор формы" на первой же попытке входа в серверную процедуру/функцию.
Типа того:

```1c
    &НаКлиенте
    Процедура ТестированиеОбучения(СтатистикаПроцесса)
    Перем ВозможноВыполнитьвФоне;
    ВызовСервера(); //Здесь ошибка не входя в процедуру
```

А это (если интересно) сама процедура ВызовСервера()

```1c
    &НаСервере
    Процедура ВызовСервера()
    КонецПроцедуры
```

Кто может помочь и подсказать в чем трабл?
---
dusha0020, это?
При одновременной работе с несколькими внешними отчетами и обработками, может возникать ошибка "Неизвестный идентификатор формы".
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
---
Продублирую решение:

В модуле формы в процедуру ПриОткрытии добавьте код:

```1c
    Процедура ПриОткрытии(Отказ)

    Если КлючУникальности = Неопределено Тогда
    ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];

    КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());

    КонецЕсли;

    КонецПроцедуры
```
---
$маней назначить забыл.
---
код что предоставлен, отработает без ошибок... это и так видно..

надо показать то, что выдает ошибку...
есть подозрение что после вот этого РеквизитФормыВЗначение("Объект") проблемы и начинаются...
---
caponid, У меня подозрение такое-же. Ну давайте попробуем разобраться...
Я модифицировал код и теперь направление обработки на сервере выполняется при открытии формы и сохраняется в ее (формы) реквизите. Следовательно, теперь На первом проходе выполняется всего одна серверная функция ЗапуститьВФонеВнешнююОбработку(). Вот ее текст:

```1c
    &НаСервере
    Функция ЗапуститьВФонеВнешнююОбработку(Статистика)

    ТекОбъект = РеквизитФормыВЗначение("Объект");
    ТекСсылка = НайтиВБазеТекущуюОбработку(); //Это тоже серверная процедура обрабатывает справочник дополнительных отчетов и обработок, надеюсь понятно как

    ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуПоРегламентномуЗаданию(ТекСсылка, "ОбучитьСервер");
    ЗначениеВРеквизитФормы(ТекОбъект, "Объект");
    ТекОбъект = Неопределено;

    Возврат Истина;//ЗаданиеЗапущено или вызовет исключение, пока не важно;
    КонецФункции
```

Есть подозрение, что НайтиВБазеТекущуюОбработку() также перегоняет Объект в реквизит, при уже имеющемся Объекте в реквизите. Сложновато вышло... Сейчас буду упрощать, но интересует скорее причина ошибки в принципе, а не оптимизация кода.
Так что вопрос открыт по прежнему.
---
dusha0020, это?
При одновременной работе с несколькими внешними отчетами и обработками, может возникать ошибка "Неизвестный идентификатор формы".
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
---
spacecraft, Может быть... Я вызываю метод данной обработки из модуля БСП. То есть создаю еще один экземпляр этой обработки. Но самый большой фокус-покус в том, что мне теоретически не нужно создавать второй экземпляр объекта в текущей сессии - вызов метода через одно место предназначен для запуска задания в фоне. Это пока отладка. Сейчас попробую штатный запуск и создание нового экземпляра в фоновой сессии. Если пройдет хорошо то на ошибку можно забить:)
---
dusha0020,
я получал у себя ошибку "Неизвестный идентификатор формы" когда при отладке было открыто несколько экземпляров одной и той же внешней обработки
---
запустил внешнюю ПФ из меню файл. Затем пытался ее запустить через внешние печатные формы. Словил ошибку. Перезапустил 1С и второе действия без выполнения первого сработало на ура!
---
Платформа 8.3.21 2022 г.
Воз и ныне там.

Открыто две одинаковые внешние обработки с разными идентификаторами форм, но с одинаковыми заголовками.

```1c
    Процедура НачатьПомещениеФайла(...)
    ...
    КонецПроцедуры

    Процедура ПомещениеФайлаЗавершение(...)
    ...
    Возврат; //ОШИБКА - Неизвестный идентификатор формы. Платформа не понимает, в какую форму ей нужно вернуться
    КонецПроцедуры
```

Вариант решения 1:
```1c
    Процедура НачатьПомещениеФайла(...)
    Заголовок = Заголовок + "0";
    ...
    КонецПроцедуры

    Процедура ПомещениеФайлаЗавершение(...)
    Заголовок = Лев(Заголовок, СтрДлина(Заголовок) - 1);
    ...
    Возврат; - Ошибок нет
    КонецПроцедуры
```

Вариант решения 2:
```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    ИзменитьЗаголовокФормыЕслиДубль();

    КонецПроцедуры

    &НаКлиенте
    Процедура ИзменитьЗаголовокФормыЕслиДубль()

    Окна = ПолучитьОкна();

    Пока Истина Цикл

    НайденДубль = Ложь;
    Для каждого выбОкно Из Окна Цикл
    выбОкноЗаголовок = выбОкно.Заголовок;

    Для каждого выбФормаОкна Из выбОкно.Содержимое Цикл
    Если выбФормаОкна.Заголовок = ЭтотОбъект.Заголовок Тогда
    ЭтотОбъект.Заголовок = ЭтотОбъект.Заголовок + " ";
    НайденДубль = Истина;
    КонецЕсли;
    КонецЦикла;

    КонецЦикла;

    Если НайденДубль = Ложь Тогда
    Прервать;
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Ошибся, нужно было менять не заголовок формы, а ключ уникальности формы

```1c
    Процедура ПриОткрытии(Отказ)

    Если КлючУникальности = Неопределено Тогда
    ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];

    КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());

    КонецЕсли;

    КонецПроцедуры
```
---
Спасибо, добрый человек!!! :)
---
ТекОбъект = Неопределено; - вот это убери
---
caponid, Убрал даже "ТекОбъект = РеквизитФормыВЗначение("Объект")" - не помогло.
---
ЭтотОбъект = Неопределено; может так?
---
Ошибка действительно из-за того, что создавался еще один экземпляр внешней обработки в той же сессии. Это была внештатная ситуация, так как я не мог отладить фоновое задание, которое запускалось из экземпляра внешней обработки, сохраненного в справочнике внешних отчетов и обработок. Так как предмет отладки появлялся уже в самой фоновой процедуре, то я никак не мог его подцепить отладчиком и пришлось отлаживать все на готовом экземпляре обработки. Чего мне стоила такая отладка - тема для отдельного разговора, но ровно один запуск (пока не был создан дубликат обработки) у меня был. Потом приходилось закрывать и открывать обработку, заново вводить данные и все по новой.
Но сейчас все отлажено, процедура переведена в фон. Все работает и вызов обработки в фоновой сессии никаких ошибок не вызывает.
Всем спасибо. Вознаграждение выдал тому, кто наиболее полно раскрыл суть проблемы.
---
У меня такая же ошибка стала возникать, когда попытался сделать внешнюю обработку с запуском метода объекта в фоне.

```1c
    &НаКлиенте
    Процедура Прочитать(Команда)

    ТипОперации = "ЧтениеДанных";

    Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли;

    Лог.Очистить();

    ОповещениеПослеПомещения = Новый ОписаниеОповещения("ПрочитатьПродолжение", ЭтотОбъект);

    МассивФайлов = Новый Массив;
    МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу));
    МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайлаОбработки()));

    НачатьПомещениеФайловНаСервер(
    Новый ОписаниеОповещения("ПослеПомещенияФайловНаСервер", ЭтотОбъект, Новый Структура("Оповещение", ОповещениеПослеПомещения)),
    ,
    ,
    МассивФайлов,
    УникальныйИдентификатор);

    КонецПроцедуры

    &НаКлиенте
    Процедура ПослеПомещенияФайловНаСервер(Результат, ДополнительныеПараметры) Экспорт

    Если Результат = Неопределено Тогда Возврат; КонецЕсли;

    АдресФайла = Результат[0].Адрес;
    РасширениеФайла = Результат[0].СсылкаНаФайл.Расширение;
    АдресФайлаОбработки = Результат[1].Адрес;

    ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение);

    КонецПроцедуры

    &НаКлиенте
    Процедура ПрочитатьПродолжение(Результат, ДополнительныеПараметры) Экспорт

    ДлительнаяОперация = ПрочитатьНаСервере();

    ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    ПараметрыОжидания.ТекстСообщения = "Чтение данных...";
    ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
    ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
    ПараметрыОжидания.ОповещениеОПрогрессеВыполнения = Неопределено;
    ПараметрыОжидания.Интервал = 5;

    ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);

    КонецПроцедуры

    &НаСервере
    Функция ПрочитатьНаСервере()

    ЭтоВнешняяОбработка = ЭтоВнешняяОбработка();
    ИмяОбработки = ?(ЭтоВнешняяОбработка, ЗаписьФайлаИзХранилища(АдресФайлаОбработки), РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя());

    ПараметрыВыполненияОбработки = Новый Структура;
    ПараметрыВыполненияОбработки.Вставить("ПутьКФайлу", ЗаписьФайлаИзХранилища(АдресФайла, РасширениеФайла));
    ПараметрыВыполненияОбработки.Вставить("ТипЗагрузки", ТипЗагрузки);
    ПараметрыВыполненияОбработки.Вставить("ЗагружатьПриОшибках", ЗагружатьПриОшибках);
    ПараметрыВыполненияОбработки.Вставить("ПерезаписыватьОбъекты", ПерезаписыватьОбъекты);
    ПараметрыВыполненияОбработки.Вставить("НомерСтроки", НомерСтрокиНачалаЗагрузки);

    ПараметрыЗадания = Новый Структура;
    ПараметрыЗадания.Вставить("ИмяОбработки", ИмяОбработки);
    ПараметрыЗадания.Вставить("ИмяМетода", "ПрочитатьДанные");
    ПараметрыЗадания.Вставить("ПараметрыВыполнения", ПараметрыВыполненияОбработки);
    ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", ЭтоВнешняяОбработка);

    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка данных из файлов'");
    ПараметрыВыполнения.ЗапуститьВФоне = Истина;
    ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор);

    ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
    Возврат ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);

    КонецФункции
```

Не пойму как исправить, саму логику брал откуда-то с ИС.
(11) Так как предмет отладки появлялся уже в самой фоновой процедуре, то я никак не мог его подцепить отладчиком и пришлось отлаживать все на готовом экземпляре обработки.
Звучит дико) Не расшифруешь подробнее?
ЗЫ: ошибка всегда возникнет после 20 минут (смены кеша), и ещё при каких-то специфических моментах.
А ещё помимо твоей описанной ошибки у меня периодически возникает

Ошибка при вызове метода контекста (НачатьПомещениеФайловНаСервер)
{ВнешняяОбработка.ЗагрузкаДанныхИзФайлов_УП.Форма.Форма.Форма(227)}: НачатьПомещениеФайловНаСервер(
по причине:
Каталог не обнаружен 'C:\Users\USR1CV8\AppData\Local\Temp\v8_6674_14'. 3(0x00000003): The system cannot find the path specified.
---
Мои 5 копеек:

Ошибка возникла при переносе ВПФ между разными конфигурациями:
- затерся реквизит "СсылкаНаОбъект", вернул на место заработало.
---
У меня возникла данная ошибка при выполнении отладки отчета, вот способ исправить данную ошибку: Удалил временно из "внешних отчетов и обработок" свой отчет и запустил через файл-открыть.
---
Условия возникновения:
Внешняя обработка открыта через файл-открыть. При вызове серверного метода еще одного экземпляра этой обработки, открытой параллельно через БСП из справочника ДополнительныеОтчетыИОбработки, экземпляр, открытый через файл-открыть, падает с вышеупомянутой ошибкой.

Решение:
Вместо открытия через файл запускать обработку из справочника ДополнительныеОтчетыИОбработки.

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

В модуле формы в процедуру ПриОткрытии добавьте код:

```1c
    Процедура ПриОткрытии(Отказ)

    Если КлючУникальности = Неопределено Тогда
    ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];

    КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());

    КонецЕсли;

    КонецПроцедуры
```
---
при "Ошибка при вызове метода контекста (ЗапуститьОтчетНаСервере)"

помогло
(21) Если КлючУникальности = Неопределено Тогда
        ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];

        КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());

    КонецЕсли;
---
спасибо дружище