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

18.09.15

Разработка - Универсальные функции

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

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

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

 

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

 

 

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

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

 

 

Вступайте в нашу телеграмм-группу Инфостарт

Перезапуск переоткрытие

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4534    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    8371    DeerCven    15    

62

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    55713    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7899    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    70181    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9883    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DoctorRoza 18.09.15 09:18 Сейчас в теме
Лови +, заслужил, код забираю в must have! :)
2. Rupert69 43 18.09.15 10:10 Сейчас в теме
Забыл указать в статье: Процедуру удобно вызывать при открытии формы. (ну может кто не догадается) =)
3. olbu 18.09.15 12:39 Сейчас в теме
Я правильно ее использую? В форме ПриОткрытии запускаю это процедуру?

Блин, сам не догадался, и уже после увидел сообщение...
4. movis08 23.06.16 13:55 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация