Имя: Пароль:
1C
 
БСП и внешние обработки
0 Вуглускр1991
 
04.05.11
13:59
".. тебе, сестрица, Только быль - не небылицу: Расскажу ..."
Выпадает ошибка в работе:
"Неизвестный идентификатор формы"
Почему:
использую в тонком клиенте внешнюю форму и из неё вызываю внешнюю форму подключенную по всем правилам БСП.
Оказывается две разные внешние обработки, имеющие открытые в клиенте формы и разные метаданные (ну понятно обработки-то разные), регистрируются системой 1С как ВнешняяОбработка1 (тип объект метаданных). Метаданные разные - регистрация одна. После этого серверные процедуры формы обработки, первой (зарегистрированной), теряют идентификаторы метаданных и вообще вся форма на сервере "теряется" в дереве метаданных. Вот и возникает эта ошибка.
БСП : Общий модуль "ДополнительныеОтчетыИОбработки" : Процедура ПолучитьОбъектВнешнейОбработки(ВнешняяОбработкаСсылка, БезопасныйРежим)
Код:
   ВнешняяОбработкаОбъект = ВнешняяОбработкаСсылка.ПолучитьОбъект(); // объект справочник
   
   ДвоичныеДанныеОбработки = ВнешняяОбработкаОбъект.ХранилищеОбработки.Получить(); // Обработка
   
   ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf"); // файл
   
   ДвоичныеДанныеОбработки.Записать(ИмяВременногоФайла);
   
   Если ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
    ИЛИ ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
       Возврат ВнешниеОтчеты.Создать(ИмяВременногоФайла, БезопасныйРежим); // И вот она ошибка в коде
   Иначе
       Возврат ВнешниеОбработки.Создать(ИмяВременногоФайла, БезопасныйРежим); // И вот она ошибка в коде
   КонецЕсли;
Нужно заботиться об имени Внешней обработки в дереве метаданных.
Из СП:
ВнешниеОбработкиМенеджер (ExternalDataProcessorsManager)
Подключить (Connect)
Синтаксис:

Подключить(<Путь>, <Имя>, <БезопасныйРежим>)
Параметры:

<Путь> (обязательный)

Тип: Строка. Ссылка на реквизит объекта конфигурации, который содержит данные внешней обработки. Ссылка может быть получена методом ПолучитьНавигационнуюСсылку.
<Имя> (необязательный)

Тип: Строка. Имя внешней обработки, с которым она будет зарегистрирована в системе.
Наличие одинаковых имен в процессе работы сеанса не допускается. Если имя не указано, будет использовано имя, содержащееся в самой обработке.
<БезопасныйРежим> (необязательный)

Тип: Булево. Признак подключения внешней обработки в безопасном режиме. Если параметр не указан, подключение будет осуществлено в безопасном режиме.
Значение по умолчанию: Истина
Возвращаемое значение:

Тип: Строка.
Описание:

Выполняет подключение внешней обработки по указанному пути.
Возвращает имя подключенной внешней обработки.

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

Сервер, внешнее соединение.
1 Mitriy
 
04.05.11
14:08
а по-русски?
2 Вуглускр1991
 
04.05.11
14:12
(1) Какое место перевести? Уж как мог
3 Вуглускр1991
 
04.05.11
14:23
А вот и патч:

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


   //// На сервере подключаем обработку из созданного ранее
   //// временного хранилища.
   //ИмяОбработки = ВнешниеОбработки.Подключить(АдресВременногоХранилища);
   
   ИмяОбработки = Строка(ВнешняяОбработкаОбъект.Ссылка.УникальныйИдентификатор());
   
   Пысы = "";
   Если ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
    ИЛИ ВнешняяОбработкаОбъект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
       Пысы = ВнешниеОтчеты.Подключить(АдресХранилища, ИмяОбработки , БезопасныйРежим);
       Возврат ВнешниеОтчеты.Создать(Пысы);
   Иначе
       Пысы = ВнешниеОбработки.Подключить(АдресХранилища, ИмяОбработки , БезопасныйРежим);
       Возврат ВнешниеОбработки.Создать(Пысы);
   КонецЕсли;
4 Leksus
 
04.05.11
14:24
(2) тоже по коду не понял где же тут две обработки?
5 Leksus
 
04.05.11
14:24
теперь понял :)
6 Вуглускр1991
 
04.05.11
14:33
(4) Одну я вызываю с команды формы:
&НаСервере
Функция ТмпВнешОбр()
   мояВнешняяОбработка     = ВнешниеОбработки.Создать("C:\TEMP\Bases\ner\SYSLOG\бпро.epf");
   Возврат мояВнешняяОбработка.Метаданные().Имя;
КонецФункции

&НаКлиенте
Процедура Подключаемый_ОткрытьПроцесс(Команда)
   
   ПараметрКоманды = Новый Массив;
   ПараметрКоманды.Добавить(МыслиОПроцессе);
   
   ОбработОмен = ТмпВнешОбр();
   Фо = ПолучитьФорму("ВнешняяОбработка."+ ОбработОмен +".Форма",Новый Структура("ИдентификаторКоманды,ОбъектыНазначения","глСканерЛГПроцесс",ПараметрКоманды),ЭтаФорма,МыслиОПроцессе);
   Фо.ЗакрыватьПриЗакрытииВладельца = Истина;
   Фо.Открыть();
КонецПроцедуры
А вторую средствами БСП
&НаКлиенте
Процедура эфНаличие(Команда)
   
   ПараметрыВыполненияКоманды = Новый Структура("Источник",ЭтаФорма);
   
   МассиПар = Новый Массив;
   МассиПар.Добавить(Элементы.тбТоварыПроц.ТекущиеДанные.Номенклатура);
   СтруктураВнОтчета = СервИнформ.ПолучитьДанныеВнешнегоОО("глНаличиеНаСкладах");
   
   ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОбработку(
                   СтруктураВнОтчета.Ссылка,
                   СтруктураВнОтчета.ВидОбработокСтрока,
                   СтруктураВнОтчета.Идентификатор,
                   СтруктураВнОтчета.БезопасныйРежим,
                   СтруктураВнОтчета.ВариантЗапуска,
                   СтруктураВнОтчета.ПоказыватьОповещение,
                   СтруктураВнОтчета.Модификатор,
                   МассиПар,
                   ПараметрыВыполненияКоманды);

КонецПроцедуры
Эту тоже потом через БСП буду, но пока отлаживаю да делаю...
Закон Брукера: Даже маленькая практика стоит большой теории.