"Неизвестный идентификатор формы". Что за зверь?
1С 8.3.5.1186
Модуль УФ внешней обработки. Обычный в общем-то код клиент-серверной работы. По команде клиент вызывает несколько раз сервер. Главным образом для того, чтобы определить наличие нужных модулей БСП и не встроена ли обработка в конфигурацию. Обращения идут к Метаданным и РеквизитФормыВЗначение("Объект"). После определения всех необходимых параметров выбирается тот или иной способ дальнейшей обработки и вызывается то ли экспортная серверная процедура модуля обработки, то ли одна из процедур БСП.
Самый большой фокус в том, что первый запуск проходит отлично и без сбоев, а вот при попытке повторить обработку данных вываливается ошибка "Неизвестный идентификатор формы" на первой же попытке входа в серверную процедуру/функцию.
Типа того:
А это (если интересно) сама процедура ВызовСервера()
Кто может помочь и подсказать в чем трабл?
Модуль УФ внешней обработки. Обычный в общем-то код клиент-серверной работы. По команде клиент вызывает несколько раз сервер. Главным образом для того, чтобы определить наличие нужных модулей БСП и не встроена ли обработка в конфигурацию. Обращения идут к Метаданным и РеквизитФормыВЗначение("Объект"). После определения всех необходимых параметров выбирается тот или иной способ дальнейшей обработки и вызывается то ли экспортная серверная процедура модуля обработки, то ли одна из процедур БСП.
Самый большой фокус в том, что первый запуск проходит отлично и без сбоев, а вот при попытке повторить обработку данных вываливается ошибка "Неизвестный идентификатор формы" на первой же попытке входа в серверную процедуру/функцию.
Типа того:
&НаКлиенте
Процедура ТестированиеОбучения(СтатистикаПроцесса)
Перем ВозможноВыполнитьвФоне;
ВызовСервера(); //Здесь ошибка не входя в процедуру
А это (если интересно) сама процедура ВызовСервера()
&НаСервере
Процедура ВызовСервера()
КонецПроцедуры
Кто может помочь и подсказать в чем трабл?
Найденные решения
(4) dusha0020, это?
При одновременной работе с несколькими внешними отчетами и обработками, может возникать ошибка "Неизвестный идентификатор формы".
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
yurowski; simgo83; aleksey2; AleksandrLeshkov; zko_it; DrAku1a; warrior1985; MLap; plevakin; user1257876; maksa2005; adhocprog; Innuil; cinex; jaroslav.h; EugeneMIPT; Мах; user811769; wowik; V_Izzy; A_Max; Summer_13; titoff; r71rustem; hartman620; Xershi; alex25ru; Denis211990; Fe9_min; Marvel805; TrofimovOK; bow; dusha0020;
+33
–
Ответить
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) caponid, У меня подозрение такое-же. Ну давайте попробуем разобраться...
Я модифицировал код и теперь направление обработки на сервере выполняется при открытии формы и сохраняется в ее (формы) реквизите. Следовательно, теперь На первом проходе выполняется всего одна серверная функция ЗапуститьВФонеВнешнююОбработку(). Вот ее текст:
Есть подозрение, что НайтиВБазеТекущуюОбработку() также перегоняет Объект в реквизит, при уже имеющемся Объекте в реквизите. Сложновато вышло... Сейчас буду упрощать, но интересует скорее причина ошибки в принципе, а не оптимизация кода.
Так что вопрос открыт по прежнему.
Я модифицировал код и теперь направление обработки на сервере выполняется при открытии формы и сохраняется в ее (формы) реквизите. Следовательно, теперь На первом проходе выполняется всего одна серверная функция ЗапуститьВФонеВнешнююОбработку(). Вот ее текст:
&НаСервере
Функция ЗапуститьВФонеВнешнююОбработку(Статистика)
ТекОбъект = РеквизитФормыВЗначение("Объект");
ТекСсылка = НайтиВБазеТекущуюОбработку(); //Это тоже серверная процедура обрабатывает справочник дополнительных отчетов и обработок, надеюсь понятно как
ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуПоРегламентномуЗаданию(ТекСсылка, "ОбучитьСервер");
ЗначениеВРеквизитФормы(ТекОбъект, "Объект");
ТекОбъект = Неопределено;
Возврат Истина;//ЗаданиеЗапущено или вызовет исключение, пока не важно;
КонецФункции
ПоказатьЕсть подозрение, что НайтиВБазеТекущуюОбработку() также перегоняет Объект в реквизит, при уже имеющемся Объекте в реквизите. Сложновато вышло... Сейчас буду упрощать, но интересует скорее причина ошибки в принципе, а не оптимизация кода.
Так что вопрос открыт по прежнему.
(4) dusha0020, это?
При одновременной работе с несколькими внешними отчетами и обработками, может возникать ошибка "Неизвестный идентификатор формы".
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
Способ воспроизведения:
Возникает, когда внешние объекты имеют одинаковое имя объекта метаданных.
Причина неисправления:
Ошибка платформы.
yurowski; simgo83; aleksey2; AleksandrLeshkov; zko_it; DrAku1a; warrior1985; MLap; plevakin; user1257876; maksa2005; adhocprog; Innuil; cinex; jaroslav.h; EugeneMIPT; Мах; user811769; wowik; V_Izzy; A_Max; Summer_13; titoff; r71rustem; hartman620; Xershi; alex25ru; Denis211990; Fe9_min; Marvel805; TrofimovOK; bow; dusha0020;
+33
–
Ответить
(5) spacecraft, Может быть... Я вызываю метод данной обработки из модуля БСП. То есть создаю еще один экземпляр этой обработки. Но самый большой фокус-покус в том, что мне теоретически не нужно создавать второй экземпляр объекта в текущей сессии - вызов метода через одно место предназначен для запуска задания в фоне. Это пока отладка. Сейчас попробую штатный запуск и создание нового экземпляра в фоновой сессии. Если пройдет хорошо то на ошибку можно забить:)
(5) Платформа 8.3.21 2022 г.
Воз и ныне там.
Открыто две одинаковые внешние обработки с разными идентификаторами форм, но с одинаковыми заголовками.
Воз и ныне там.
Открыто две одинаковые внешние обработки с разными идентификаторами форм, но с одинаковыми заголовками.
Процедура НачатьПомещениеФайла(...)
...
КонецПроцедуры
Процедура ПомещениеФайлаЗавершение(...)
...
Возврат; //ОШИБКА - Неизвестный идентификатор формы. Платформа не понимает, в какую форму ей нужно вернуться
КонецПроцедуры
Вариант решения 1: |
---|
Процедура НачатьПомещениеФайла(...)
Заголовок = Заголовок + "0";
...
КонецПроцедуры
Процедура ПомещениеФайлаЗавершение(...)
Заголовок = Лев(Заголовок, СтрДлина(Заголовок) - 1);
...
Возврат; - Ошибок нет
КонецПроцедуры Показать |
Вариант решения 2: |
---|
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИзменитьЗаголовокФормыЕслиДубль();
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьЗаголовокФормыЕслиДубль()
Окна = ПолучитьОкна();
Пока Истина Цикл
НайденДубль = Ложь;
Для каждого выбОкно Из Окна Цикл
выбОкноЗаголовок = выбОкно.Заголовок;
Для каждого выбФормаОкна Из выбОкно.Содержимое Цикл
Если выбФормаОкна.Заголовок = ЭтотОбъект.Заголовок Тогда
ЭтотОбъект.Заголовок = ЭтотОбъект.Заголовок + " ";
НайденДубль = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если НайденДубль = Ложь Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры Показать |
(17) Ошибся, нужно было менять не заголовок формы, а ключ уникальности формы
Процедура ПриОткрытии(Отказ)
Если КлючУникальности = Неопределено Тогда
ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];
КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());
КонецЕсли;
КонецПроцедуры
Показать
Ошибка действительно из-за того, что создавался еще один экземпляр внешней обработки в той же сессии. Это была внештатная ситуация, так как я не мог отладить фоновое задание, которое запускалось из экземпляра внешней обработки, сохраненного в справочнике внешних отчетов и обработок. Так как предмет отладки появлялся уже в самой фоновой процедуре, то я никак не мог его подцепить отладчиком и пришлось отлаживать все на готовом экземпляре обработки. Чего мне стоила такая отладка - тема для отдельного разговора, но ровно один запуск (пока не был создан дубликат обработки) у меня был. Потом приходилось закрывать и открывать обработку, заново вводить данные и все по новой.
Но сейчас все отлажено, процедура переведена в фон. Все работает и вызов обработки в фоновой сессии никаких ошибок не вызывает.
Всем спасибо. Вознаграждение выдал тому, кто наиболее полно раскрыл суть проблемы.
Но сейчас все отлажено, процедура переведена в фон. Все работает и вызов обработки в фоновой сессии никаких ошибок не вызывает.
Всем спасибо. Вознаграждение выдал тому, кто наиболее полно раскрыл суть проблемы.
(11) У меня такая же ошибка стала возникать, когда попытался сделать внешнюю обработку с запуском метода объекта в фоне.
Не пойму как исправить, саму логику брал откуда-то с ИС.
(11)
Звучит дико) Не расшифруешь подробнее?
ЗЫ: ошибка всегда возникнет после 20 минут (смены кеша), и ещё при каких-то специфических моментах.
А ещё помимо твоей описанной ошибки у меня периодически возникает
Ошибка при вызове метода контекста (НачатьПомещениеФайловНаСервер)
{ВнешняяОбработка.ЗагрузкаДанныхИзФайлов_УП.Форма.Форма.Форма(227)}: НачатьПомещениеФайловНаСервер(
по причине:
Каталог не обнаружен 'C:\Users\USR1CV8\AppData\Local\Temp\v8_6674_14'. 3(0x00000003): The system cannot find the path specified.
&НаКлиенте
Процедура Прочитать(Команда)
ТипОперации = "ЧтениеДанных";
Если Не ПроверитьЗаполнение() Тогда Возврат; КонецЕсли;
Лог.Очистить();
ОповещениеПослеПомещения = Новый ОписаниеОповещения("ПрочитатьПродолжение", ЭтотОбъект);
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу));
МассивФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайлаОбработки()));
НачатьПомещениеФайловНаСервер(
Новый ОписаниеОповещения("ПослеПомещенияФайловНаСервер", ЭтотОбъект, Новый Структура("Оповещение", ОповещениеПослеПомещения)),
,
,
МассивФайлов,
УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайловНаСервер(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда Возврат; КонецЕсли;
АдресФайла = Результат[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.
Условия возникновения:
Внешняя обработка открыта через файл-открыть. При вызове серверного метода еще одного экземпляра этой обработки, открытой параллельно через БСП из справочника ДополнительныеОтчетыИОбработки, экземпляр, открытый через файл-открыть, падает с вышеупомянутой ошибкой.
Решение:
Вместо открытия через файл запускать обработку из справочника ДополнительныеОтчетыИОбработки.
Для отладки, конечно, такое себе, но для готового постоянно используемого решения - вполне рабочий вариант.
Внешняя обработка открыта через файл-открыть. При вызове серверного метода еще одного экземпляра этой обработки, открытой параллельно через БСП из справочника ДополнительныеОтчетыИОбработки, экземпляр, открытый через файл-открыть, падает с вышеупомянутой ошибкой.
Решение:
Вместо открытия через файл запускать обработку из справочника ДополнительныеОтчетыИОбработки.
Для отладки, конечно, такое себе, но для готового постоянно используемого решения - вполне рабочий вариант.
Продублирую решение:
В модуле формы в процедуру ПриОткрытии добавьте код:
В модуле формы в процедуру ПриОткрытии добавьте код:
Процедура ПриОткрытии(Отказ)
Если КлючУникальности = Неопределено Тогда
ИмяОбработки = СтрРазделить(ЭтотОбъект.ИмяФормы, ".")[1];
КлючУникальности = ИмяОбработки + XMLСтрока(ТекущаяДата());
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот