Приведенная ниже функция перезапускает внешнюю обработку или отчет с сохранением введенных на форме данных. Таких как:
- Реквизиты
- Табличные части
- Таблицы значений
- Дерево значений
- Отбор компоновщикаСКД
- Выбранные поля компоновщикаСКД
- Список значений
Процедура ПерезапуститьВнешнююОбработку() ЭтоФайл = Найти(ТипЗнч(ЭтотОбъект),"Внешн")=1; КоманднаяПанель = ЭтаФорма.ЭлементыФормы.Найти("ОсновныеДействияФормы"); Если КоманднаяПанель = Неопределено Тогда КоманднаяПанель = ЭтаФорма.ЭлементыФормы.Найти("ДействияФормы"); КонецЕсли; Если (НЕ ЭтоФайл) ИЛИ (КоманднаяПанель = Неопределено) Тогда Возврат; КонецЕсли; КнопкаПерезапустить_УжеСуществует = КоманднаяПанель.Кнопки.Найти("Перезапустить") <> Неопределено; Если КнопкаПерезапустить_УжеСуществует Тогда СохранятьЗначенияРеквизитов = Истина; // Перезапустить обработку Для Каждого Форма Из ЭтаФорма.Метаданные().Формы Цикл ТекущаяФорма = ПолучитьФорму(Форма); Если НЕ ТекущаяФорма = ЭтаФорма Тогда Продолжить; КонецЕсли; // Сохранить значения реквизитов СписокСохраняемыхРеквизитов = Новый Структура(); СписокСохраняемыхТабЧастей = Новый Структура(); Если СохранятьЗначенияРеквизитов Тогда Для Каждого итЭлемент Из ТекущаяФорма.ЭлементыФормы Цикл Если ТипЗнч(итЭлемент) = Тип("ПолеВвода") ИЛИ ТипЗнч(итЭлемент) = Тип("ПолеВыбора") ИЛИ ТипЗнч(итЭлемент) = Тип("Флажок") ИЛИ ТипЗнч(итЭлемент) = Тип("Переключатель")Тогда СписокСохраняемыхРеквизитов.Вставить(итЭлемент.Имя, итЭлемент.Значение); ИначеЕсли ТипЗнч(итЭлемент) = Тип("ТабличноеПоле") Тогда СписокСохраняемыхТабЧастей.Вставить(итЭлемент.Имя, итЭлемент.Значение); КонецЕсли; КонецЦикла; // Элементы формы КонецЕсли; ЭтаФорма.Закрыть(); ЭтоОбработка = Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1; Если ЭтоОбработка Тогда Форма = ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(Форма.Имя); Иначе Форма = ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(Форма.Имя); КонецЕсли; // Восстанавить значения реквизитов Для каждого итЭлемент Из СписокСохраняемыхРеквизитов Цикл Попытка Форма.ЭлементыФормы[итЭлемент.Ключ].Значение = итЭлемент.Значение; Исключение КонецПопытки; КонецЦикла; // Восстанавить значения ТабЧастей ВосстановитьПослеОткрытия = Новый Структура(); Для каждого итЭлемент Из СписокСохраняемыхТабЧастей Цикл Попытка Если ТипЗнч(итЭлемент.Значение) = Тип("СписокЗначений") Тогда Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.ЗагрузитьЗначения(итЭлемент.Значение.ВыгрузитьЗначения()) ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ОтборКомпоновкиДанных") Тогда ВосстановитьПослеОткрытия.Вставить(итЭлемент.Ключ,итЭлемент.Значение); ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда ВосстановитьПослеОткрытия.Вставить(итЭлемент.Ключ,итЭлемент.Значение); ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(итЭлемент.Значение) = Тип("ДеревоЗначений") Тогда Форма.ЭлементыФормы[итЭлемент.Ключ].Значение = итЭлемент.Значение; Форма.ЭлементыФормы[итЭлемент.Ключ].СоздатьКолонки(); Иначе // пока для всех остальных Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Загрузить(итЭлемент.Значение.Выгрузить()); КонецЕсли; Исключение КонецПопытки; КонецЦикла; Форма.Открыть(); //Восстановить значния табличных частей после открытия формы // Для каждого итЭлемент Из ВосстановитьПослеОткрытия Цикл Если ТипЗнч(итЭлемент.Значение) = Тип("ОтборКомпоновкиДанных") Тогда Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Очистить(); Для Каждого ЭлементОтбора Из итЭлемент.Значение.Элементы Цикл ЗаполнитьЗначенияСвойств(Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")), ЭлементОтбора); КонецЦикла; КонецЕсли; Если ТипЗнч(итЭлемент.Значение) = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Очистить(); Для Каждого ЭлементВыбранноеПоле Из итЭлемент.Значение.Элементы Цикл ЗаполнитьЗначенияСвойств(Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")), ЭлементВыбранноеПоле); КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; Иначе КоманднаяПанель.Кнопки.Добавить("РазделительПерезапустить", ТипКнопкиКоманднойПанели.Разделитель); // Добавить кнопку Действие = Новый Действие("ПерезапуститьВнешнююОбработку"); НоваяКнопка = КоманднаяПанель.Кнопки.Добавить("Перезапустить", ТипКнопкиКоманднойПанели.Действие, "Перезапустить", Действие); НоваяКнопка.Картинка = БиблиотекаКартинок.Обновить; НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка; НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.F4, , , Истина); // Shift-F4 КонецЕсли; КонецПроцедуры
Обработку легко дорабатывать и связывать с другим функционалом, например, перед перезапуском открывать форму, где можно выбрать, что перезаполнить, но это уже другие заморочки.
Практически везде пишут только код перезапуска. Пользуйтесь на здоровье.