Описание проблемы: в управляемых формах 1С: Предприятия 8.2. невозможно вызвать другую форму объекта (внешняя обработка, отчет и т.п.) привычным методом обычных форм (ПолучитьФорму(«ФормаОбработки», ЭтаФорма).ОткрытьМодально();), так как необходимо указывать полный путь к форме. Почему девелоперы 1С так сделали, выяснять бесполезно, ибо неисповедимы пути господни компании Нуралиева и Ко.
В сети предлагаются несколько решений. От примитивного ОткрытьФорму(«ВнешняяОбработка.ИмяОбработки.Форма.ИмяФормы»);, до навороченных с помещением обработки во временное хранилище с последующим подключением, вызовом WScript.Shell, и всё это с использованием кучи серверных процедур.
Предлагаю ещё один, на этот раз совсем простой и универсальный метод определения полного пути к форме объекта, полностью клиентский, основанный на замещении имени текущей формы переданным значением. Преимуществом метода является то, что при внедрении внешней обработки/отчёта в конфигурацию или переименовании объекта, не требуется изменять вызовы форм.
Данную функцию следует поместить в модуль вызывающей формы.
// Возвращает полный путь к форме внешней обработки, отчета или любого объекта метаданных в виде
// ВнешняяОбработка.ИмяВнешнейОбработки.Форма.ИмяФормы
// ВнешнийОтчет.ИмяВнешнегоОтчета.Форма.ИмяФормы
// Документ.ИмяОбъекта.Форма.ИмяФормы
//
// ** coded by Sergey (aka Porutchik) * 2012, http://forum.aeroion.ru/
//
// Параметры
// ИмяФормы — — имя формы объекта
//
// Возвращаемое значение:
// — полный путь к форме
//
&НаКлиенте
Функция ПолучитьПолноеИмяФормы(ИмяФормы)
СимволТочка = «.»;
ПозицияТочки = СтрДлина(ЭтаФорма.ИмяФормы);
Пока Сред(ЭтаФорма.ИмяФормы, ПозицияТочки, 1) <> СимволТочка Цикл ПозицияТочки = ПозицияТочки — 1; КонецЦикла; //
Возврат Лев(ЭтаФорма.ИмяФормы, ПозицияТочки) + ИмяФормы;
КонецФункции
Пример использования:
ПараметрыФормы = Новый Структура();
ОткрытьФормуМодально(ПолучитьПолноеИмяФормы(«ИмяФормыОбработки»), ПараметрыФормы, ЭтаФорма);
Использование функции в существующих работах:




Всё гениальное просто. Никогда бы не додумался, хотя вашими обработками пользуюсь.
Если бы в 1С Предприятии была функция поиска символов с конца строки, что-то типа НайтиСправа(), то эта функция состояла бы из одной строки.
(2) из одной строки говорите?
&НаКлиенте
Функция ПолучитьПолноеИмяФормы(ИмяФормы)
Возврат Лев(ЭтаФорма.ИмяФормы, СтрДлина(ЭтаФорма.ИмяФормы) — СтрДлина(СтрПолучитьСтроку(СтрЗаменить(ЭтаФорма.ИмяФормы, «.», Символы.ПС), СтрЧислоСтрок(СтрЗаменить(ЭтаФорма.ИмяФормы, «.», Символы.ПС))))) + ИмяФормы;
КонецФункции
(это шутка, так программировать не хорошо :-)(-:))(-::-)))) (это имитация хаоса из смайликов))
Спасибо тебе, хороший человек, за подсказку, а то я уже голову сломал, думая как это сделать 🙂
(3) absolutblohin , а вот так?
&НаКлиенте
Функция ПолучитьПолноеИмяФормы(ИмяФормы)
Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,».Форма.»)+6)+ ИмяФормы);
КонецФункции
(5) И это можно принять как вариант. Оригинальный алгоритм вообще состоял из парсинга имени формы на массив строк и замещения последнего элемента массива на переданное значение. В общей сложности десяток строк.
Забыл сказать, потом массив собирался обратно в строку.
&НаСервере
Функция ВернутьМакет(ИмяМакета)
ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
КонецФункции // ВернутьМакет()
&НаКлиенте
Процедура НадписьВариантыЗагрузкиНажатие(Элемент)
ПолноеИмяФормы = Лев(ИмяФормы, Найти(ИмяФормы,».Форма.»)+6)+ «Инструкции»;
Форма = ПолучитьФорму(ПолноеИмяФормы);
Форма.ПолеДокумента = ВернутьМакет(«ВариантыЗагрузкиДокументов»);
Форма.Открыть();
КонецПроцедуры
Спасибо. Действительно все просто и работает.
Класс! А я то думал …
%)
В типовой Бухгалтерии в общем модуле «ВариантыОтчетовПереопределяемый» — тема таже?
Функция ОбъектОтчета(ЭтаФормаИмя) Экспорт
Если Найти(ЭтаФормаИмя, «Внешний») > 0 Тогда
ФормаИмя = СтрЗаменить(ЭтаФормаИмя, «Внешний», «»);
Возврат ВнешниеОтчеты.Создать(Сред(Лев(ФормаИмя, Найти(ФормаИмя, «.Форма.») — 1), 7));
Иначе
Возврат Отчеты[Сред(Лев(ЭтаФормаИмя, Найти(ЭтаФормаИмя, «.Форма.») — 1), 7)].Создать();
КонецЕсли;
КонецФункции
(5) shage,
Возврат Лев(ЭтаФорма.ИмяФормы, Найти(ЭтаФорма.ИмяФормы,».Форма.»)+6)+ ИмяФормы)
…
лишняя скобка, должно быть так:
Да это же гениально! =) Спасибо!
Спасибо! Очень выручило!
Не получается открыть форму зарегистрированной внешней обработки((( Помогите пожалуйста!
Спасибо автору!