Перезапуск обработки или отчета с сохранением введенных данных (Обычные формы) !

Отлично выручает, когда в обработке много заполняемых реквизитов, и нужно постоянно её перезапускать для отладки.

Приведенная ниже функция перезапускает внешнюю обработку или отчет с сохранением введенных на форме данных. Таких как:

  • Реквизиты
  • Табличные части
  • Таблицы значений
  • Дерево значений
  • Отбор компоновщикаСКД
  • Выбранные поля компоновщикаСКД
  • Список значений

 

Процедура ПерезапуститьВнешнююОбработку()

ЭтоФайл = Найти(ТипЗнч(ЭтотОбъект),"Внешн")=1;
КоманднаяПанель = ЭтаФорма.ЭлементыФормы.Найти("ОсновныеДействияФормы");

Если КоманднаяПанель = Неопределено Тогда
КоманднаяПанель = ЭтаФорма.ЭлементыФормы.Найти("ДействияФормы");
КонецЕсли;

Если (НЕ ЭтоФайл) ИЛИ (КоманднаяПанель = Неопределено) Тогда
Возврат;
КонецЕсли;

КнопкаПерезапустить_УжеСуществует = КоманднаяПанель.Кнопки.Найти("Перезапустить") <> Неопределено;
Если КнопкаПерезапустить_УжеСуществует Тогда

СохранятьЗначенияРеквизитов = Истина;

// Перезапустить обработку
Для Каждого Форма Из ЭтаФорма.Метаданные().Формы Цикл

ТекущаяФорма = ПолучитьФорму(Форма);
Если НЕ ТекущаяФорма = ЭтаФорма Тогда
Продолжить;
КонецЕсли;

// Сохранить значения реквизитов
СписокСохраняемыхРеквизитов = Новый Структура();
СписокСохраняемыхТабЧастей = Новый Структура();
Если СохранятьЗначенияРеквизитов Тогда
Для Каждого итЭлемент Из ТекущаяФорма.ЭлементыФормы Цикл
Если ТипЗнч(итЭлемент) = Тип("ПолеВвода")
ИЛИ ТипЗнч(итЭлемент) = Тип("ПолеВыбора")
ИЛИ ТипЗнч(итЭлемент) = Тип("Флажок")
ИЛИ ТипЗнч(итЭлемент) = Тип("Переключатель")Тогда
СписокСохраняемыхРеквизитов.Вставить(итЭлемент.Имя, итЭлемент.Значение);
ИначеЕсли ТипЗнч(итЭлемент) = Тип("ТабличноеПоле") Тогда
СписокСохраняемыхТабЧастей.Вставить(итЭлемент.Имя, итЭлемент.Значение);
КонецЕсли;
КонецЦикла; // Элементы формы
КонецЕсли;

ЭтаФорма.Закрыть();
ЭтоОбработка = Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1;

Если ЭтоОбработка Тогда
Форма = ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(Форма.Имя);
Иначе
Форма = ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(Форма.Имя);
КонецЕсли;



// Восстанавить значения реквизитов
Для каждого итЭлемент Из СписокСохраняемыхРеквизитов Цикл
Попытка
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение = итЭлемент.Значение;
Исключение
КонецПопытки;
КонецЦикла;


// Восстанавить значения ТабЧастей
ВосстановитьПослеОткрытия = Новый Структура();
Для каждого итЭлемент Из СписокСохраняемыхТабЧастей Цикл
Попытка
Если ТипЗнч(итЭлемент.Значение) = Тип("СписокЗначений") Тогда
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.ЗагрузитьЗначения(итЭлемент.Значение.ВыгрузитьЗначения())

ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ОтборКомпоновкиДанных") Тогда
ВосстановитьПослеОткрытия.Вставить(итЭлемент.Ключ,итЭлемент.Значение);
ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда
ВосстановитьПослеОткрытия.Вставить(итЭлемент.Ключ,итЭлемент.Значение);

ИначеЕсли ТипЗнч(итЭлемент.Значение) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(итЭлемент.Значение) = Тип("ДеревоЗначений") Тогда
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение = итЭлемент.Значение;
Форма.ЭлементыФормы[итЭлемент.Ключ].СоздатьКолонки();
Иначе // пока для всех остальных
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Загрузить(итЭлемент.Значение.Выгрузить());
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;

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

//Восстановить значния табличных частей после открытия формы
//
Для каждого итЭлемент Из ВосстановитьПослеОткрытия Цикл

Если ТипЗнч(итЭлемент.Значение) = Тип("ОтборКомпоновкиДанных") Тогда
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Очистить();
Для Каждого ЭлементОтбора Из итЭлемент.Значение.Элементы Цикл
ЗаполнитьЗначенияСвойств(Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")), ЭлементОтбора);
КонецЦикла;
КонецЕсли;

Если ТипЗнч(итЭлемент.Значение) = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда
Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Очистить();
Для Каждого ЭлементВыбранноеПоле Из итЭлемент.Значение.Элементы Цикл
ЗаполнитьЗначенияСвойств(Форма.ЭлементыФормы[итЭлемент.Ключ].Значение.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")), ЭлементВыбранноеПоле);
КонецЦикла;
КонецЕсли;

КонецЦикла;

КонецЦикла;

Иначе

КоманднаяПанель.Кнопки.Добавить("РазделительПерезапустить", ТипКнопкиКоманднойПанели.Разделитель);

// Добавить кнопку
Действие = Новый Действие("ПерезапуститьВнешнююОбработку");
НоваяКнопка = КоманднаяПанель.Кнопки.Добавить("Перезапустить", ТипКнопкиКоманднойПанели.Действие, "Перезапустить", Действие);
НоваяКнопка.Картинка = БиблиотекаКартинок.Обновить;
НоваяКнопка.Отображение = ОтображениеКнопкиКоманднойПанели.НадписьКартинка;
НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша.F4, , , Истина); // Shift-F4

КонецЕсли;

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

 

 

Обработку легко дорабатывать и связывать с другим функционалом, например, перед перезапуском открывать форму, где можно выбрать, что перезаполнить, но это уже другие заморочки.  

Практически везде пишут только код перезапуска. Пользуйтесь на здоровье. Wink

 

 

4 Comments

  1. DoctorRoza

    Лови +, заслужил, код забираю в must have! 🙂

    Reply
  2. Rupert69

    Забыл указать в статье: Процедуру удобно вызывать при открытии формы. (ну может кто не догадается) =)

    Reply
  3. olbu

    Я правильно ее использую? В форме ПриОткрытии запускаю это процедуру?

    Блин, сам не догадался, и уже после увидел сообщение…

    Reply
  4. movis08

    Отлично)

    Reply

Leave a Comment

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