gifts2017

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

Опубликовал Сергей Ожерельев (Поручик) в раздел Программирование - Практика программирования

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

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

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

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

 

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

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

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

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

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

 

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

http://infostart.ru/public/122215/

http://infostart.ru/public/121248/

http://infostart.ru/public/88286/

http://infostart.ru/public/85228/

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Романов (alexandr1972_1) 29.07.12 01:14
Всё гениальное просто. Никогда бы не додумался, хотя вашими обработками пользуюсь.
2. Сергей Ожерельев (Поручик) 29.07.12 03:12
Если бы в 1С Предприятии была функция поиска символов с конца строки, что-то типа НайтиСправа(), то эта функция состояла бы из одной строки.
3. absolutblohin (absolutblohin) 03.08.12 19:44
(2) Поручик, из одной строки говорите?

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

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

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

(это шутка, так программировать не хорошо :-)(-:))(-::-)))) (это имитация хаоса из смайликов))
DrSender; dour-dead; +2 Ответить 1
4. Алексей Давыдов (alex_davydov) 25.01.13 17:00
Спасибо тебе, хороший человек, за подсказку, а то я уже голову сломал, думая как это сделать :)
5. shage (DrSender) 23.06.13 13:41
(3) absolutblohin , а вот так?

&НаКлиенте

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

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

КонецФункции
AlexO; gigabyte-leha@yandex.ru; Поручик; +3 Ответить 2
6. Сергей Ожерельев (Поручик) 23.06.13 14:00
(5) И это можно принять как вариант. Оригинальный алгоритм вообще состоял из парсинга имени формы на массив строк и замещения последнего элемента массива на переданное значение. В общей сложности десяток строк.
7. Сергей Ожерельев (Поручик) 23.06.13 14:07
Забыл сказать, потом массив собирался обратно в строку.
8. Евгений Сидилев (maikl007) 26.09.13 05:53
&НаСервере
Функция ВернутьМакет(ИмяМакета)

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);

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

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

ПолноеИмяФормы = Лев(ИмяФормы, Найти(ИмяФормы,".Форма.")+6)+ "Инструкции";
Форма = ПолучитьФорму(ПолноеИмяФормы);
Форма.ПолеДокумента = ВернутьМакет("ВариантыЗагрузкиДокументов");
Форма.Открыть();

КонецПроцедуры
9. Виталий Онянов (Tavalik) 14.08.14 11:30
Спасибо. Действительно все просто и работает.
10. shoy Андрей ais (shoy) 22.08.14 15:28
11. Андрей Ро (AndrewVVS) 12.12.14 15:54
В типовой Бухгалтерии в общем модуле "ВариантыОтчетовПереопределяемый" - тема таже?

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

Если Найти(ЭтаФормаИмя, "Внешний") > 0 Тогда
ФормаИмя = СтрЗаменить(ЭтаФормаИмя, "Внешний", "");
Возврат ВнешниеОтчеты.Создать(Сред(Лев(ФормаИмя, Найти(ФормаИмя, ".Форма.") - 1), 7));
Иначе
Возврат Отчеты[Сред(Лев(ЭтаФормаИмя, Найти(ЭтаФормаИмя, ".Форма.") - 1), 7)].Создать();
КонецЕсли;

КонецФункции
12. Алекс Ю (AlexO) 23.02.15 20:06
(5) shage,
&НаКлиенте

Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,".Форма.")+6)+ ИмяФормы)
...
лишняя скобка, должно быть так:
&НаКлиенте 

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

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

КонецФункции
...Показать Скрыть
13. Алексей Перелыгин (pereligins) 17.11.16 15:50
Да это же гениально! =) Спасибо!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа