gifts2017

Ускорение отладки управляемых форм

Опубликовал Moolex.ru (moolex) в раздел Программирование - Практика программирования

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

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

1. В конфигурацию надо добавить:

1.1. Константа.РежимВнешнихФорм (тип Число 1.0)
1.2. Константа.КаталогИБ (тип Строка 0)

КаталогИБ нужен только для серверного варианта работы БД, в файловом варианте он не используется. В этой константе должен быть расшаренный сетевой каталог доступный как для программиста, так и для пользователя, который тестирует форму.

1.3. ОбщийМодуль.ВнешниеФормы (Сервер,Вызов сервера)
 

код общего модуля:

// Используется для запуска и отладки внешних форм

Функция КаталогИБ() Экспорт
	
	Результат = НСтр(СтрокаСоединенияИнформационнойБазы(), "File") + "\";
	Если (Результат="\") Тогда
		Результат = СокрЛП(Константы.КаталогИБ.Получить());
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

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

Функция ВернутьИмяФайлаВнешнейФормы(ПолноеИмяФормы) Экспорт
	
	// Преобразуем имя формы в полный путь к внешней обработке с формами
	// здесь ПолноеИмяФормы = Документ.АвансовыйОтчет.Форма.ФормаДокумента
	Результат = "";
	Если (РежимВнешнихФорм(ПолноеИмяФормы)=1) Тогда
		ИмяМетаданных = Лев(ПолноеИмяФормы,Найти(ПолноеИмяФормы,".Форма")-1);
		Префикс  = "";
		Если      (Найти(ИмяМетаданных,"Документ")=1)   Тогда Результат = "МФД\"; Префикс = "Документ.";
		ИначеЕсли (Найти(ИмяМетаданных,"Справочник")=1) Тогда Результат = "МФС\"; Префикс = "Справочник.";
		КонецЕсли;
		Если (Префикс<>"") Тогда
			Результат = КаталогИБ() + "Epfs\" + Результат + СтрЗаменить(ИмяМетаданных,Префикс,"") + ".epf";
		КонецЕсли;
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Функция ПодключитьВнешнююОбработку(мАдресХранилища,ПолноеИмяФормы) Экспорт
	
	Результат = ВнешниеОбработки.Подключить(мАдресХранилища,,Ложь);
	Стр       = Прав(ПолноеИмяФормы,СтрДлина(ПолноеИмяФормы) - Найти(ПолноеИмяФормы,".Форма.") + 1);
	Возврат "ВнешняяОбработка." + Результат + Стр;
	
КонецФункции

2. Открываем Форму элемента справочника (покажу на примере справочника Контрагенты) , и добавляем немного кода в начало двух процедур. Если процедур нет, то их надо создать.

В начало процедуры ПриСозданииНаСервере добавляем:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// вставка для режима отладки с помощью внешних форм
	Если (ВнешниеФормы.РежимВнешнихФорм(ИмяФормы)=1) Тогда Возврат; КонецЕсли;

В начало процедуры ПриОткрытии добавляем:

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// вставка для режима отладки с помощью внешних форм
	ИмяФайла = ВнешниеФормы.ВернутьИмяФайлаВнешнейФормы(ИмяФормы);
	Если (ИмяФайла<>"") Тогда
	    мАдресХранилища   = ""; ПоместитьФайл(мАдресХранилища, ИмяФайла, , Ложь, Новый УникальныйИдентификатор);
	    ПутьКВнешнейФорме = ВнешниеФормы.ПодключитьВнешнююОбработку(мАдресХранилища,ИмяФормы);
		ПараметрыФормы    = Новый Структура("Ключ", Объект.Ссылка);
		ОткрытьФорму(ПутьКВнешнейФорме, ПараметрыФормы,,Истина);
		Отказ = 1;
		Возврат;
	КонецЕсли;


3. Создаем новую внешнюю обработку, сохраняем ее так как изображено на первом рисунке к публикации.

Копируем форму элемента в обработку так как изображено на втором рисунке к публикации. Сохраняем обработку и конфигурацию.

4. Теперь программист с помощью константы РежимВнешнихФорм может подменять запуск формы для пользователя и для себя.

Если РежимВнешнихФорм=1 , то при открытии элемента справочника будет запускаться форма из внешней обработки.

После отладки внешней управляемой формы и урегулирования вопросов с заказчиком, можно просто скопировать форму назад в конфигурацию, выбрать ее основной и сохранить конфигурацию. При копировании из обработки в конфигурацию и обратно надо учитывать что форма будет иметь другое название, я просто удаляю старую форму и вставляю новую.
Данный подход удобен когда нововведения оказались не нужны, просто меняем РежимВнешнихФорм=0 и пользователь видит прежнюю форму.

5. Хочу обратить ваше внимание на работу с отладчиком при данном подходе. Отладчик не будет срабатывать, т.к. на клиенте запускается обработка из хранилища. Для решения данной проблемы я запускаю обработку через файл-открыть и точки останова работают. Но форма элемента будет запускаться как для нового объекта. Чтобы открытие формы сработало с тестируемым элементом справочника или определенным документм надо добавить такой код:

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

6. В ходе эксплуатации данного подхода выявлено два важных момента:


   а.) "РежимОткрытияОкна" должен быть равен "Независимый", иначе не будет открываться форма из внешней обработки.

   б.) Событие "ПриЧтенииНаСервере" не срабатывает при запуске формы из внешней обработке.

 

Вот и весь метод ускорения отладки управляемых форм.
Аналогично можно тестировать и формы списов и другие формы. Главное, чтобы имя формы в конфигурации совпадало именем формы в обработке.

Спасибо за внимание.

Надеюсь, данный метод поможет программистам 1С в наших рутинных делах. :)

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Константин Юрин (kostyaomsk) 25.05.15 07:49
Что-то новенькое и интересное. Все-таки хотелось бы спросить знающих людей имеет ли смысл на практическое применение подобной методики.
Пока вот ерундой занят, а не крупным проектом с использованием хранилища значений. УПП мельком попадалось, но там что-то встраивать, думаю, еще дороже по времени.
2. v p (vitaliy1911) 25.05.15 09:53
Если речь идет только о разработке, без обновления основной рабочей базы, то мне кажется удобнее использовать просто внешнюю обработку. Добавляем форму в обработку и в обработчике формы ПриСозданииНаСервере пишем:
ЗначениеВРеквизитФормы(Документы.Документ1.НайтиПоНомеру("<Номер>").ПолучитьОбъект(), "Объект");

Просто и сердито, без единой строки в самой конфигурации. Разрабатываем, тестируем, отлаживаем. Потом перед помещением формы в конфу главное не забыть эту строчку удалить :)
А предложенный метод хорошо подойдет если требуется проанализировать работу пользователей в новой форме. Например можно сделать AB тест - часть пользователей будет работать в новой форме, а часть - в старой (или в другой новой). Далее собирать статистику и принимать решение какую форму использовать
budunovmv; ffgnebel; Marik; sanja; 4rtehouse; +5 Ответить
3. Moolex.ru (moolex) 25.05.15 10:14
(1) kostyaomsk, У нас в одной компании все пользователи работают на внешних обработках в реальной базе (правда там 8.1 обычные формы, но зато даже проведение вынесено во внешние обработки). При таком подходе обновления проходит быстро, пользователю просто надо переоткрыть конкретную форму (что им удобно), изменения именно в конфигурации бывают редко, а вот изменения в формах (особенно отчетов) происходит постоянно.
А вообще работа с большим количество внешних файлов - так работают многие IDE.
Думаю и 1С наконец-то это скоро поймет при их планах скрещивания 1С с Eclipse.
4. Сергей Пшеничников (Зеленоград) 13.07.15 17:30
(1) kostyaomsk, в УПП (минимум на 90%) используются нормальные формы. УФ если и есть, то редко.