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