Как открыть или получить форму внешней обработки/отчета из другой формы обработки/отчета (Управляемые формы). Очередной пример

Описание проблемы: в управляемых формах 1С: Предприятия 8.2. невозможно вызвать другую форму объекта (внешняя обработка, отчет и т.п.) привычным методом обычных форм.

Описание проблемы: в управляемых формах 1С: Предприятия 8.2. невозможно вызвать другую форму объекта (внешняя обработка, отчет и т.п.) привычным методом обычных форм (ПолучитьФорму(«ФормаОбработки», ЭтаФорма).ОткрытьМодально();), так как необходимо указывать полный путь к форме. Почему девелоперы 1С так сделали, выяснять бесполезно, ибо неисповедимы пути господни компании Нуралиева и Ко.
В сети предлагаются несколько решений. От примитивного ОткрытьФорму(«ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы»);, до навороченных с помещением обработки во временное хранилище с последующим подключением, вызовом WScript.Shell, и всё это с использованием кучи серверных процедур.

Предлагаю ещё один, на этот раз совсем простой и универсальный метод определения полного пути к форме объекта, полностью клиентский, основанный на замещении имени текущей формы переданным значением. Преимуществом  метода является то, что при внедрении внешней обработки/отчёта в конфигурацию или переименовании объекта, не требуется изменять вызовы форм. 

Данную функцию следует поместить в модуль вызывающей формы.

 

// Возвращает полный путь к форме внешней обработки, отчета или любого объекта метаданных в виде
// ВнешняяОбработка.ИмяВнешнейОбработки.Форма.ИмяФормы
// ВнешнийОтчет.ИмяВнешнегоОтчета.Форма.ИмяФормы
// Документ.ИмяОбъекта.Форма.ИмяФормы
//
// ** coded by Sergey (aka Porutchik) * 2012, http://forum.aeroion.ru/
//
// Параметры
//  ИмяФормы  — — имя формы объекта
//
// Возвращаемое значение:
//      — полный путь к форме
//
&НаКлиенте
Функция ПолучитьПолноеИмяФормы(ИмяФормы)

    СимволТочка = «.»;
   
ПозицияТочки = СтрДлина(ЭтаФорма.ИмяФормы);
    Пока
Сред(ЭтаФорма.ИмяФормы, ПозицияТочки, 1) <> СимволТочка Цикл ПозицияТочки = ПозицияТочки 1; КонецЦикла; //
   
Возврат Лев(ЭтаФорма.ИмяФормы, ПозицияТочки) + ИмяФормы;

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

Пример использования:

        ПараметрыФормы = Новый Структура(); 
        ОткрытьФормуМодально(ПолучитьПолноеИмяФормы(«ИмяФормыОбработки»), ПараметрыФормы, ЭтаФорма);

 

Использование функции в существующих работах:

//infostart.ru/public/122215/

//infostart.ru/public/121248/

//infostart.ru/public/88286/

//infostart.ru/public/85228/

16 Comments

  1. alexandr1972_1

    Всё гениальное просто. Никогда бы не додумался, хотя вашими обработками пользуюсь.

    Reply
  2. Поручик

    Если бы в 1С Предприятии была функция поиска символов с конца строки, что-то типа НайтиСправа(), то эта функция состояла бы из одной строки.

    Reply
  3. absolutblohin

    (2) из одной строки говорите?

    &НаКлиенте

    Функция ПолучитьПолноеИмяФормы(ИмяФормы)

    Возврат Лев(ЭтаФорма.ИмяФормы, СтрДлина(ЭтаФорма.ИмяФормы) — СтрДлина(СтрПолучитьСтроку(СтрЗаменить(ЭтаФорма.ИмяФормы, «.», Символы.ПС), СтрЧислоСтрок(СтрЗаменить(ЭтаФорма.ИмяФормы, «.», Символы.ПС))))) + ИмяФормы;

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

    (это шутка, так программировать не хорошо :-)(-:))(-::-)))) (это имитация хаоса из смайликов))

    Reply
  4. alex_davydov

    Спасибо тебе, хороший человек, за подсказку, а то я уже голову сломал, думая как это сделать 🙂

    Reply
  5. DrSender

    (3) absolutblohin , а вот так?

    &НаКлиенте

    Функция ПолучитьПолноеИмяФормы(ИмяФормы)

    Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,».Форма.»)+6)+ ИмяФормы);

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

    Reply
  6. Поручик

    (5) И это можно принять как вариант. Оригинальный алгоритм вообще состоял из парсинга имени формы на массив строк и замещения последнего элемента массива на переданное значение. В общей сложности десяток строк.

    Reply
  7. Поручик

    Забыл сказать, потом массив собирался обратно в строку.

    Reply
  8. maikl007

    &НаСервере

    Функция ВернутьМакет(ИмяМакета)

    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);

    Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);

    КонецФункции // ВернутьМакет()

    &НаКлиенте

    Процедура НадписьВариантыЗагрузкиНажатие(Элемент)

    ПолноеИмяФормы = Лев(ИмяФормы, Найти(ИмяФормы,».Форма.»)+6)+ «Инструкции»;

    Форма = ПолучитьФорму(ПолноеИмяФормы);

    Форма.ПолеДокумента = ВернутьМакет(«ВариантыЗагрузкиДокументов»);

    Форма.Открыть();

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

    Reply
  9. Tavalik

    Спасибо. Действительно все просто и работает.

    Reply
  10. shoy

    Класс! А я то думал …

    %)

    Reply
  11. AndrewVVS

    В типовой Бухгалтерии в общем модуле «ВариантыОтчетовПереопределяемый» — тема таже?

    Функция ОбъектОтчета(ЭтаФормаИмя) Экспорт

    Если Найти(ЭтаФормаИмя, «Внешний») > 0 Тогда

    ФормаИмя = СтрЗаменить(ЭтаФормаИмя, «Внешний», «»);

    Возврат ВнешниеОтчеты.Создать(Сред(Лев(ФормаИмя, Найти(ФормаИмя, «.Форма.») — 1), 7));

    Иначе

    Возврат Отчеты[Сред(Лев(ЭтаФормаИмя, Найти(ЭтаФормаИмя, «.Форма.») — 1), 7)].Создать();

    КонецЕсли;

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

    Reply
  12. AlexO

    (5) shage,

    &НаКлиенте

    Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,».Форма.»)+6)+ ИмяФормы)

    лишняя скобка, должно быть так:

    &НаКлиенте
    
    Функция ПолучитьПолноеИмяФормы(ИмяФормы)
    
    Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,».Форма.»)+6) + ИмяФормы;
    
    КонецФункции
    Reply
  13. pereligins

    Да это же гениально! =) Спасибо!

    Reply
  14. alexvbard

    Спасибо! Очень выручило!

    Reply
  15. CoSting

    Не получается открыть форму зарегистрированной внешней обработки((( Помогите пожалуйста!

    Reply
  16. vis_tmp

    Спасибо автору!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *