gifts2017

Кнопка переоткрытия внешней обработки для 8.2

Опубликовал Тимофей Шантин (ShantinTD) в раздел Программирование - Инструментарий

При отладке часто нужно закрыть внешнюю обработку и открыть ее заново. В 77 все решалось легко и просто. В 8ке - не столь тривиально...

В прилагаемом шаблоне есть 2 формы: для обычного и управляемого приложения. Открывается именно та форма, которая была открыта до нажатия, не зависимо от того, какие выбраны дополнительные/основные, и какие им присвоены имена. Решения немного различаются, поэтому было решено разработать сразу обе формы.

На практике это позволяет редактировать модули и менять формы "на лету".

Переоткрывать файл обработки придется по старинке, если необходимо переименовать сам файл обработки или переназвать используемую форму.

 

 

Приняв во внимание все замечания и пожелания высказанные здесь и здесь, учтя все найденные ошибки, выкладываю версию 2. Основное отличие - отсутствие реквизитов обработки, код более компактен и универсален.

Скачать файлы

Наименование Файл Версия Размер
АвтоПереоткрытие 140
.epf 7,87Kb
12.11.13
140
.epf 7,87Kb Скачать
Шаблон обработки с переоткрытием 97
.epf 8,56Kb
12.11.13
97
.epf 8,56Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Vladimir (Boroda) 28.10.11 21:04
Я правильно понял: внешнюю обработку (если она изменена в конфигураторе) закрывать и открывать не надо, достаточно щёлкнуть по кнопке на форме, и она обновится? Тогда это здорово, а то порой подутомляешься с этими переоткрываниями...
2. Тимофей Шантин (ShantinTD) 28.10.11 23:31
(1) Boroda, именно так. Особенно намучаешься, если открыто поочередно несколько обработок.
3. Ю М (mtv:)) 29.10.11 01:13
(0) Хорошая и своевременная публикация. Давно себе хотел сделать подобный сервис, но всё руки не доходили...
Ваша публикация подтолкнула к действию. На основании Вашего кода сделал для себя универсальный шаблон (для обработок и для отчетов).
Кнопку "Переоткрыть" поместил в меню "Действия". Её можно там и оставить после отладки обработки. Не занимает места на командной панели, и глаза не мозолит.
Код для неуправляемой формы получился вот такой (компактней и, по-моему, универсальней):

Процедура КоманднаяПанель1_кнПереоткрыть(Кнопка)
// Имя формы, которую надо переоткрыть, нужно прописать в КНОПКА.ПОЯСНЕНИЕ
Отладка_ФормаКОткрытию = Кнопка.Пояснение;
Отладка_ИмяФайла = ЭтотОбъект.ИспользуемоеИмяФайла;
Закрыть();
КонецПроцедуры
//КоманднаяПанель1_кнПереоткрыть()

Процедура ПриЗакрытии()
Если НЕ
ПустаяСтрока(Отладка_ФормаКОткрытию) Тогда
ВнешниеОбработки.Создать(Отладка_ИмяФайла).ПолучитьФорму(Отладка_ФормаКОткрытию).Открыть();//Для обработок
//ВнешниеОтчеты.Создать(Отладка_ИмяФайла).ПолучитьФорму(Отладка_ФормаКОткрытию).Открыть(); //Для отчетов
КонецЕсли;
КонецПроцедуры

, где Отладка_ФормаКОткрытию и Отладка_ИмяФайла - это реквизиты внешней обработки/отчета.
_
Arkadiy_B; Rustig; anton.fly7; +3 Ответить 4
4. Александр Капустин (kapustinag) 29.10.11 02:12
Согласен, полезная вещь. Приведенный в (3) код, думаю, и в 8.1 будет работать.
5. Андрей Коляда (Незнайка) 29.10.11 02:57
в 7.7 часто пользовался, в 8 руки не доходили, да и подзабыл. Спасибо автору.
Я еще на форме делаю кнопочку, цепляю на неё Ctrl+Z и становится ещё удобнее :-)
Автор - молодец. Спасибо.
6. Тимофей Шантин (ShantinTD) 29.10.11 08:58
Всем - пожалуйста. Пользуйтесь на здоровье. И спасибо за комментарии.
(3) mtv:), у меня приведен шаблон, поэтому кнопку можно смело двигать, чтоб "глаза не мозолила".
А такое сокращение кода для неуправляемой формы - накладывает еще одно ограничение: при переименовании редактируемой формы в моем варианте нужно всего лишь переоткрыть традиционным способом обработку, в вашем - придется в Кнопка.Пояснение не забыть прописать новое имя формы. И при копировании формы, кстати, тоже.
Для внешних отчетов отличия минимальны - сами видите. Опять же подчеркну слово шаблон.
Rustig; artbear; +2 Ответить 1
7. Артур Аюханов (artbear) 29.10.11 11:03
(0) Ничего сложного на самом деле, сам юзаю такую кнопку.
У меня лично такая кнопка со времен 77 называется "Перезагрузить" :)
помнится, даже спец.скрипт для Опенконфа делал для автодобавления этой кнопки на форму прямо в конфигураторе.
(3) ты не прав, так не удобно, (6) более прав - весь вопрос в телодвижениях, хотя и к нему есть вопросы :)

(6) что-то как-то сложно и нерационально у тебя в неуправляемой форме :(
все можно и нужно уместить в одной процедуре, лично у меня так и сделано.
1. Зачем делить на КоманднаяПанель1ОткрытьЕщеРаз и ПриЗакрытии() ?
Нужно тупо в КоманднаяПанель1ОткрытьЕщеРаз вместо оператора Прервать вставить код из ПриЗакрытии.
2. Реквизиты ФормаКОткрытию и ИмяФайла совсем не нужны, имя файла можно узнать непосредственно в момент вызова кнопки.

Ведь в управляемой у тебя фактически так и сделано? :(
т.е. схема-то простейшая - при нажатии кнопки Перезагрузить открываем новую форму для этого же файла, а старую закрываем.
в итоге все что нужно - вот этот код
Процедура КоманднаяПанель1ОткрытьЕщеРаз(Кнопка)
	Для каждого ИмяФормы Из ЭтаФорма.Метаданные().Формы Цикл
		ПолученнаяФорма = ПолучитьФорму(ИмяФормы);
		Если СокрЛП(ИмяФормы.ТипФормы) = "Обычная" Тогда
			Если ПолученнаяФорма.Открыта() Тогда
				Обработка = ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла);
				лФорма = Обработка.ПолучитьФорму(ИмяФормы); // форма лучше не присваивать
				лФорма.Открыть();
				Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Закрыть();
КонецПроцедуры
...Показать Скрыть
Rustig; kompas-dm; +2 Ответить 5
8. Олег Шалимов (CaSH_2004) 29.10.11 13:24
Странно, наверно я не доганяю, а как у вас реквизиты заполнятся сами что ли? Я давно так делаю, но перед закрытием заполняю в новой обработке все реквизиты из старой, есть вероятность ошибки, но при правильном построении обработок она минимальна, к тому же заполнение опционально. А у вас как?
9. Ю М (mtv:)) 29.10.11 14:22
(7)
artbear пишет:
т.е. схема-то простейшая - при нажатии кнопки Перезагрузить открываем новую форму для этого же файла, а старую закрываем.

Уважаемый artbear, у меня так не работает (по крайней мере в файловом варианте), форма закрывается, а новая не появляется.

А вот так работает:
При нажатии кнопки "Перезагрузить" сначала ЗАКРЫВАЕМ старую форму, а затем ОТКРЫВАЕМ новую форму для этого же файла.
10. Артур Аюханов (artbear) 29.10.11 15:33
(8) Для отладочных целей не всегда нужно автозаполнение всех полей.
Я предпочитаю полностью штатную перезагрузку, когда нужные поля заполняются так же, как и при ручной перезагрузке.
(9) Случайно не юзаешь код (Форма = ПолучитьФорму()) ? я ведь специально указываю лФорма = ...
вообще разницы быть не должно, т.к. Закрыть(), как и в 77, не сразу закрывает форму, а только после выполнения текущего обработчика.
11. Артур Аюханов (artbear) 29.10.11 15:39
(9) Приведи свой код, если совет из (10) не помог.
Юзаю код, аналогичный (7), со времен 8.0
12. Владимир (ARL) 29.10.11 16:02
Публикация из серии "Приятные мелочи".
Поскольку на вкус и цвет.... себе сделал внешнюю обработку с выбором пути к файлу. После выбора файла форму всмогательной обработки минимизирую и размещаю в уголке. Один клик и наслаждаюсь исправленной обработкой или отчетом. Автору за идею +.
13. Ю М (mtv:)) 29.10.11 18:03
(11) artbear, в сообщении (9) я говорил про твой код из (7).
Скопировал его один-в-один в тестовую обработку, запустил - форма закрывается... и всё...
Вывод - код не работает. Что-то не так.
При отладке видно, что новая форма создается и открывается. Но после Закрыть(), старая и новая формы закрываются. :-(
14. Андрей Григорьев (Borisych) 29.10.11 19:00
я делал внешнюю обработку, с большой кнопкой "Выполнить", сохраняемым списком путей к отлаживаемым обработкам/отчетам, которая запускала текущую обработку
15. Ю М (mtv:)) 29.10.11 22:45
(0) При внимательном взгляде на процедуру "КоманднаяПанель1ОткрытьЕщеРаз" видно, что код будет работать некорректно в некоторых ситуациях. Эксперимент это подтверждает.
Вот пример, когда получается неожиданный результат:
В обработке имеем две неуправляемые формы "Форма01" и "Форма02". В списке форм они расположены именно в таком порядке. Открываем обе формы.
В форме "Форма02" нажимаем кнопку "Открыть еще раз". И видим, что "Форма02" просто закрывается, и затем открывается еще одна "Форма01".
Действительно неожиданный результат... :-(
То есть, при нескольких открытых формах, всегда открывается та, которая выше в списке форм.
16. Ю М (mtv:)) 29.10.11 23:02
(0) Еще заметил один неприятный момент в работе алгоритма шаблона.
Нужно внимательно следить, что бы Синоним формы был без пробелов, и в точности соответствовал Имени формы. Попробуйте, например, задать следующие имена форме: "НеуправляемаяФорма" или "Форма_01".
В реквизите "ФормаКОткрытию" запоминается не Имя формы, а Синоним формы. А это не всегда одно и тоже.
17. Антон Котов (Attest) 29.10.11 23:52
Прикольная штука,только сегодня хотел, что-нибудь такое сделать
18. Ю М (mtv:)) 30.10.11 00:06
(0) (7) С учетом ранее замеченных недостатков, и положительно реагируя на критику в свой адрес, а так же учитывая подсказку от artbear, допилил "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. Вроде получилось очень даже ничего.
На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого ТекФорма Из ЭтаФорма.Метаданные().Формы Цикл
		Если ПолучитьФорму(ТекФорма) = ЭтаФорма Тогда
			Закрыть();
			ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть(); //Для внешних обработок
			//ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть(); //Для внешних отчетов
			Прервать;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть

В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Не нужны дополнительные реквизиты. Так же не нужны вставки кода в процедуры событий формы.
3. Процедура работает как для внешних обработок, так и для внешних отчетов. Нужно только закомментировать/раскомментировать одну строку.
4. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
Arkadiy_B; Djun; +2 Ответить 5
19. Александр Журавлёв (Djun) 30.10.11 00:13
20. Артур Аюханов (artbear) 30.10.11 13:50
(18) Да, именно про такую процедуру я и говорил.
Странно, почему код в (7) не работает :(
Похоже, что ошибкой было сохранять форму в переменной :(
Вот простейший 100% рабочий код, которым пользуюсь со времен 8.0
Процедура ОсновныеДействияФормыПерезагрузить(Кнопка)
	ВнешниеОбработки.Создать(ОбработкаОбъект.ИспользуемоеИмяФайла).ПолучитьФорму().Открыть();
	Закрыть();
КонецПроцедуры
...Показать Скрыть

Только что проверил на всякий случай :)
21. Артур Аюханов (artbear) 30.10.11 13:55
(18) >>Процедура работает как для внешних обработок, так и для внешних отчетов
Я бы еще просто добавил проверку на тип, это несложно, чтобы сделать код полностью универсальным, без дополнительного комментирования/раскомментирования.
И для идеала - можно написать спец.процедуру, которая вставляет кнопку с вызовом сабжевого кода в командную панель. Это также несложно.
22. Ю М (mtv:)) 30.10.11 16:40
(20) Согласен, это простейший 100% рабочий код. Но он всегда открывает основную форму обработки.
А задача стояла - открывать форму, в которой была нажата кнопка "Перезапустить". Поэтому код в (18) получился чуть сложней. :-)
23. Ю М (mtv:)) 30.10.11 16:56
(20) Кстати, почему я поставил метод "Закрыть()" ПЕРЕД открытием нового окна.
Если метод "Закрыть()" поставить ПОСЛЕ открытия нового окна, как в (20), то наблюдается неприятный эффект.
Попробуй открыть форму. Затем измени размер окна формы, или просто максимизируй (распахни на полный экран). После этого понажимай на кнопку "Перезапустисть". Ты будешь приятно удивлен. :-)
Форма будет периодически открываться, с разными размерами окна... :-)
24. Ю М (mtv:)) 30.10.11 18:21
в (21) artbear пишет:
И для идеала - можно написать спец.процедуру, которая вставляет кнопку с вызовом сабжевого кода в командную панель. Это также несложно.

Думаю, что в данном случае это уже будет лишним. Хотя, действительно, написать такую процедуру несложно.
Если кому-то это будет необходимо, то может посмотреть, как подобное делается здесь или тут. :)
25. Ю М (mtv:)) 30.10.11 18:41
(0), (21), (18) "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. (ВЕРСИЯ 2).
Приняв во внимание замечание artbear, доработал алгоритм из (18), и вот что получилось:
На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого ТекФорма Из ЭтаФорма.Метаданные().Формы Цикл
		Если ПолучитьФорму(ТекФорма) = ЭтаФорма Тогда
			Закрыть();
			Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
				ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть();
			Иначе
				ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть();
			КонецЕсли;
			Прервать;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть
В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Не нужны дополнительные реквизиты. Так же не нужны вставки кода в процедуры событий формы.
3. Процедура работает как для внешних обработок, так и для внешних отчетов.
4. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
26. Тимофей Шантин (ShantinTD) 31.10.11 13:40
Всем спасибо за положительные отзывы, а особенное спасибо - за конструктивную критику.

Немного неожиданно (для меня) - бурная реакция на неуправляемые формы.

(15), (16) mtv:), у меня встречный вопрос: как открыть сразу несколько форм одной обработки?

(12) ARL, задача стояла именно в том, чтобы избавиться от необходимости вручную указывать (в коде ли, в реквизитах ли - неважно) какую обработку открыть.
27. Сергей Старых (tormozit) 31.10.11 18:03
Нужно учесть, что у внешнего объекта может быть открыто одновременно несколько форм (с разными метаданными). Поэтому нужно все их закрыть, чтобы не получилось ситуации, когда открыта часть форм от нового объекта с новой версией файла и часть от старого объекта со старой версией файла.
ЭтотОбъект = ЭтаФорма.ЭтотОбъект;
ИмяФормы = "";
Для каждого МетаФорма Из ЭтотОбъект.Метаданные().Формы Цикл
	ТекФорма = ЭтотОбъект.ПолучитьФорму(МетаФорма.Имя);
	Если ТекФорма.Открыта() Тогда
		ТекФорма.Закрыть();
	КонецЕсли;
	Если ТекФорма = ЭтаФорма Тогда
		ИмяФормы = МетаФорма.Имя;
	КонецЕсли;
КонецЦикла;
Попытка
	Пустышка = ЭтотОбъект.СхемаКомпоновкиДанных;
	ЭтоОтчет = Истина;
Исключение
	ЭтоОтчет = Ложь;
КонецПопытки;
Если ЭтоОтчет Тогда
	МенеджерТипаОбъектов = ВнешниеОтчеты;
Иначе
	МенеджерТипаОбъектов = ВнешниеОбработки;
КонецЕсли;
МенеджерТипаОбъектов.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ИмяФормы).Открыть();
...Показать Скрыть


Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
Надежного решения задачи платформа не позволяет реализовать.
vladir; mtv:); artbear; gaglo; ShantinTD; +5 Ответить 3
28. Ю М (mtv:)) 31.10.11 18:48
ShantinTD в (26) пишет:
...mtv:), у меня встречный вопрос: как открыть сразу несколько форм одной обработки?
Не хочу никого обижать, но я не понял... :-(
Это прикол такой? Или действительно имеются затруднения с открытием нескольких форм одной обработки?
29. Тимофей Шантин (ShantinTD) 31.10.11 19:03
(28) mtv:), это не прикол. Просто не сталкивался. И не только я не сталкивался.
30. Ю М (mtv:)) 31.10.11 19:33
(29) Ну, например, вставить следующий код в процедуру "ПриОткрытии", или повесить этот код на какую-нибудь кнопку:
	ЭтотОбъект.ПолучитьФорму("Форма1").Открыть();
	ЭтотОбъект.ПолучитьФорму("Форма2").Открыть();
	ЭтотОбъект.ПолучитьФорму("Форма3").Открыть();
Или не это имелось ввиду?...
31. Тимофей Шантин (ShantinTD) 31.10.11 19:38
(30) mtv:), понятно. Спасибо. Но это, так сказать, искусственное открытие нескольких форм. До него я докумекал. Я так понимаю, что штатного механизма открытия нескольких форм платформа не предоставляет?
32. Ю М (mtv:)) 31.10.11 19:50
(31), ShantinTD, ох чует мое сердце, что мы говорим о разных вещах...
Возможно, что ты имел ввиду: "Как открыть одну и ту же форму несколько раз (в разных окнах)?".
Тогда это делается по-другому... :)
33. Ю М (mtv:)) 31.10.11 20:13
(31) ShantinTD, если требуется открыть одну и ту же форму несколько раз (в разных окнах), то можно использовать, например, следующий код:
ЭтотОбъект.ПолучитьФорму("Форма",,Новый УникальныйИдентификатор()).Открыть()
Это пример штатного механизма платформы для открытия новых экземпляров формы.
_
34. Тимофей Шантин (ShantinTD) 31.10.11 21:03
(32), (33) mtv:), нет, мы говорим об одном и том же: именно как открыть несколько разных форм. Про УникальныйИдентификатор() я видел. Но это опять же искусственное открытие нескольких форм (хоть разных, хоть одинаковых). Может быть я немного неточно выразил свою мысль про штатный механизм: я имел ввиду некий штатный механизм интерактивного открытия нескольких форм.
35. Ю М (mtv:)) 31.10.11 21:27
(27) tormozit, да, согласен, что нужно за собой прибирать - т.е. закрывать все открытые формы внешней обработки/отчета. Спасибо за подсказку.
Объясни, пожалуйста, смысл первой строки твоего кода: "ЭтотОбъект = ЭтаФорма.ЭтотОбъект;". Я не понял, зачем это. Тем более, что эта строка выдает ошибку, пришлось закомментировать.
И еще, если ты используешь оператор "Попытка Исключение", то не проще ли в нем и разместить код открытия новой формы? Тем самым сократив код на семь строк.
Я сам почему-то не люблю оператор "Попытка Исключение", использую его только в крайних случаях. :)
36. Сергей Старых (tormozit) 31.10.11 22:30
(35) Мой код может выдавать ошибку при попытке присвоения "ЭтотОбъект = ..." только при выполнении из контекста формы. Я же очевидно писал его для выполнения в более изолированном контексте (например общего модуля).
В конструкцию Попытка Исключение разумно помещать минимальное число операций, чтобы не рисковать замаскировать непредвиденные ошибки.
37. Ю М (mtv:)) 31.10.11 22:34
(36) Спасибо за разьяснения, всё понял, согласен.
38. Jon bazcom (bazcom) 01.11.11 13:01
Идея хороша, но есть уже и причем давно такие же. 5+
39. Fomix (fomix) 01.11.11 16:42
Все работает чудесным образом. Давно мечтал о подобном свойстве при отладке. Спасибо!
40. Ю М (mtv:)) 01.11.11 20:40
(0), (27), For All. "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. (ВЕРСИЯ 3).
Приняв во внимание замечания (27) tormozit, доработал алгоритм из (25).
Теперь закрываются все открытые формы внешней обработки.

На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
		ТекФорма = ПолучитьФорму(МетаФорма);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Закрыть();
			Если ТекФорма = ЭтаФорма Тогда
				Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
					ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				Иначе
					ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть
В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Процедура работает как для внешних обработок, так и для внешних отчетов.
3. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
odin-7610; DrBlack; Obscurus; dj_serega; dour-dead; u_n_k_n_o_w_n; vladir; MGraf; SirYozha; +9 Ответить 6
41. Евгений Конищев (kea35) 02.11.11 18:03
42. Игорь (ProkopyukIN) 08.11.11 10:48
идея не просто хорошая, а очень хорошая. коротко, ясно, и полезно.
43. Иван Иванов (Stepping1C) 08.11.11 22:04
44. Сергей Семенов (cerg110) 09.11.11 07:57
Полезная вещь, немного экономит время)
45. Тимофей Шантин (ShantinTD) 10.11.11 13:35
(40) mtv:), нашел такой момент: если МетаФорма - управляемая, то в режиме обычного приложения она не может быть Открыта(), и происходит ошибка.

For All, учел все ваши пожелания и предложения, учел http://infostart.ru/public/97685/ и получился новый вариант обработки.
46. Артур Аюханов (artbear) 10.11.11 16:55
(45) Закрытие формы в управляемом режиме проверял? именно простое закрытие, а не переоткрытие?
47. Тимофей Шантин (ShantinTD) 10.11.11 16:59
(46) artbear, естественно. То, что мы видели по ссылке выше - натолкнуло в правильное русло. Из-за такой же ошибки у меня был сделан реквизит ФормаКОткрытию для обычной формы. Так что эти грабли - уже пройдены.
48. Ю М (mtv:)) 10.11.11 18:34
(45) ShantinTD, я писал в (40), что "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. Так что работоспособность для управляемых форм не тестировалась и, естесственно, не гарантируется.
А по ссылке, указанной в (45) http://infostart.ru/public/97685/, публикация к сожалению уже удалена... :(
Так и не узнать видимо никогда, что имелось ввиду... :)
49. Тимофей Шантин (ShantinTD) 10.11.11 19:08
(48) mtv:), вопрос в том, что код выполняется в обычной форме, но при наличии в обработке управляемых форм возникнет ошибка.

По ссылке был выложен вариант обработки только для управляемых форм, но просто закрыть обработку не получалось. Об этом меня спрашивает в (46) artbear.
50. Ю М (mtv:)) 10.11.11 20:32
(49) ShantinTD, чтобы избежать ошибки при наличии в обработке управляемых форм, алгоритм из (40) можно дополнить условием (вставить перед строкой: "Если ТекФорма.Открыта() Тогда"):
Если ТекФорма = Неопределено Тогда
	Продолжить;
КонецЕсли;
51. Татьяна Беляева (Масянька) 27.11.11 05:25
Помоему столько багов что автор сам в шоке
52. Артур Аюханов (artbear) 29.11.11 08:04
(51) Неправ/неправа, минусую
53. Тимофей Шантин (ShantinTD) 29.11.11 19:43
(51) Масянька, в споре - рождается истина. Выложен шаблон. Совместными усилиями - пришли к достаточно приемлемому варианту. Каждый в состоянии взять для себя ту часть, которая подойдет именно ему. Так что в этом отношении - я очень доволен. Я немного удивлен тем, что, по видимому, управляемые формы еще слишком мало вошли в нашу жизнь.
54. Кира Борисова (bkn_oktava) 02.12.11 23:38
Спасибо от начинающих!!!
Кнопочка работает! На самом деле, пока отчет до ума доведешь, забодаешься перезапускать.
Очень полезная штука, конечно, плюс!!!
55. Роман Хусяинов (rom-x) 09.01.12 13:19
Никогда об этом не задумывался, + за идею. Сделал и для 7-ки.
56. Тимофей Шантин (ShantinTD) 09.01.12 13:32
(55) rom-x, сделал сам - поделись с товарищем. Хотя я сам делал эту кнопку на основании семёрочной http://infostart.ru/public/86415/.
57. Программулькин (Программулькин) 09.01.12 13:32
покажи для 7ки ... тупо позырить...
58. Роман Хусяинов (rom-x) 09.01.12 14:05
(56) ShantinTD, (57) Программулькин,
//*******************************************
Процедура Переоткрыть()
	Форма.Закрыть();
	ОткрытьФорму("Отчет#", , КаталогИБ()+"\Extforms\123.ert");	   
КонецПроцедуры	
...Показать Скрыть
59. Программулькин (Программулькин) 10.01.12 03:08
60. Максим Гр. (MGraf) 13.01.12 16:59
Сделал немного по-другому на основе вашего кода - http://infostart.ru/public/104428/
61. Модератор раздела Артур Аюханов (artbear) 31.01.12 16:54
(27)
>>Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
>>Надежного решения задачи платформа не позволяет реализовать
C помощью аддина "Список открытых форм" от chessman эту задачу уже можно решить :)
Ты уже в курсе вроде бы.
62. Rino (Rino) 08.02.12 12:03
немного корявая, но спасибо
63. Тимофей Шантин (ShantinTD) 08.02.12 13:26
(62) Rino, конструктивнее: что именно не понравилось?
64. AtheistFD (N_aix) 22.03.12 13:53
65. Евгений Кредько (kredko) 06.06.12 06:48
(62) Rino, Корявая или нет - субъективное мнение. Выложите свой вариант, мы все оценим. А так это пустой трёп. Идея хорошая. Мне понравилась.
66. Andrey Dyak (electronik) 02.08.12 18:20
Интересно как глюки будут или нет
67. Владимир Каракозов (karakozov) 09.07.13 08:31
Отличная разработка, не уверен что найдет прикладной характер, но по сути, возможно найдутся потребности в таком решении.Плюс автору.
68. Владимир (vladir) 09.07.13 09:12
ShantinTD, отличная публикация. Шаблон не качал. Для себя взял Процедуру из коммента (40), отдельное спасибо mtv:). То что надо! :)))
69. Аркадий Кучер (Abadonna) 09.07.13 14:17
(58) rom-x, в 7.7 есть оператор РасположениеФайла(Путь,Имя), где Путь, Имя - переменные, принимающие путь и имя в контексте данного отчета/обработки.
Поэтому писать КаталогИБ()+"\Extforms\123.ert" излишне и нерационально
MarSeN; rom-x; +2 Ответить
70. Марина Чирина (chmv) 10.07.13 13:38
Нужная обработка. Давно хотела такую
71. Mark Genuine (markgenuine) 11.07.13 10:54
(3) mtv:), только по моему нужно использовать процедура не ПриЗакрытии(), а ПередЗакрытием().
P.s. если я не прав то попровьте)
72. Ю М (mtv:)) 11.07.13 12:00
(71) markgenuine, ты смотрел начальный вариант (сырой и глюкавый).
Окончательный вариант смотри в комментарии (40). Там процедура ПриЗакрытии совсем не используется. :)
73. Stamper (Stamper) 12.07.13 11:34
(71)так "при" от "перед" фактически отличается только возможностью предотвратить закрытие
74. Igor Kostenko (kosmius) 30.07.13 23:56
Класная штука.... правда написано универсально... и при наличие нескольких форм откривает все.... немножко подправляю под ситуацию... и отладка ускоряється в разы... Спасибо за идею
75. yuraskas Рупышев (yuraskas) 11.11.13 14:41
действительно удобно, +.
76. Илья Парамонов (Crush) 21.05.14 19:02
Я вот тоже такой темой заморочился для УФ
http://www.forum.mista.ru/topic.php?id=709041
77. Илья Парамонов (Crush) 23.05.14 12:11
Может кому пригодится.
Ничего писать во внешней обработке не надо. Решается добавлением только одной общей команды с хоткеем. У себя назвал глShiftF5
Модуль:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    текОкно    = АктивноеОкно();
    Если ТипЗнч(текОкно) = Тип("ОкноКлиентскогоПриложения") Тогда
        текФорма    = текОкно.ПолучитьСодержимое();
        Если ТипЗнч(текФорма) = Тип("УправляемаяФорма") Тогда
            ПолноеИмяФормы        = текФорма.ИмяФормы;
            позПервойТочки        = Найти(ПолноеИмяФормы,".");
            ТипОбъекта    = Лев(ПолноеИмяФормы,позПервойТочки-1);
            Если ТипОбъекта    = "ВнешняяОбработка" Тогда
                ИмяОбработки    = Сред(ПолноеИмяФормы,позПервойТочки+1);
                ИмяОбработки    = Лев(ИмяОбработки,Найти(ИмяОбработки,".")-1);
                ПерезагрузитьВнешнююОбработку(ИмяОбработки);
                текФорма.Закрыть();
                ОткрытьФорму(ПолноеИмяФормы);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПерезагрузитьВнешнююОбработку(ИмяОбработки) Экспорт
    #Если НЕ МобильноеПриложениеСервер Тогда

        ВнешниеОбработки.Создать(ВнешниеОбработки.Создать(ИмяОбработки).ИспользуемоеИмяФайла,Ложь);
    #КонецЕсли

КонецПроцедуры    
...Показать Скрыть

Свойства команды:
<Properties>
<Name>глShiftF5</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Глобальный Shift+F5</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Group>FormNavigationPanelImportant</Group>
<Representation>Auto</Representation>
<ToolTip/>
<Picture/>
<Shortcut>Shift+F5</Shortcut>
<IncludeHelpInContents>false</IncludeHelpInContents>
<CommandParameterType/>
<ParameterUseMode>Single</ParameterUseMode>
<ModifiesData>false</ModifiesData>
</Properties>


При открытии нескольких экземпляров внешней обработки перезагружается только текущая активная.
78. Андрей Лещанов (Nuuq) 20.10.14 18:51
1) УФ - внешняя обработка (отчет)
2) В УФ создаем команду формы и назначаем ей процедуру "Переоткрыть"
3) На УФ создаем кнопку формы и назначаем ей команду из п. 2

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

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


Всем хорошего настроения!
79. Тимофей Шантин (ShantinTD) 23.10.14 09:17
Всем привет!

Рад, что спустя три года такая мелочь все еще остается полезной, востребованной и не только скачивается, но и толкает других к написанию своего варианта, к тому, чтобы поделиться своим вариантом с остальными.
Всем СПАСИБО!
80. Аркадий (Arkadiy_B) 05.03.15 15:30
(78) Nuuq, что то ругается на
НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
процедура или функция не найдены
81. М Б (Obscurus) 28.05.15 08:56
Интересно :) Прекрасная замена Файл-открыть последний (или Alt, ф, стрелка вниз, 1)
82. Evgeniy Nikolaenko (DrBlack) 07.10.15 13:14
Мне понадобилось запускать обработку сначала в режиме мастера настройки (для первоначальной настройки), а потом переходить в обычный режим.
Проблема в том, что у обработки использовались разные формы, т.е. в "ПередОткрытием" я переопределял основную форму.
После завершения работы мастера, самым простым способом оказалось просто перезапустить обработку ПРОГРАММНО, так что спасибо автору за готовое решение! :)
83. Антон Батыркин (batyrkin) 25.12.15 14:20
В предпоследней платформе (8.3.7.1790) как ни бился, не смог сделать переоткрытие внешнего отчета в толстом клиенте с НЕ файловой базой.
Может у кого есть работающий код? Хочется посмотреть до чего же я не додумался...
84. Сергей Рыбаков (Knych) 29.04.16 00:40
(83) batyrkin, Даже интересно стало. Хотя и, вероятно, уже не актуально, поставил именно эту версию платформуы, не файловый вариант, запустился в толстом клиенте - все работает, как написано например в (78)
Для личного удобства использовал программное добавление кнопки, полный листинг модуля формы ниже
&НаСервере
Процедура ДобавитьКнопкуПерезапуска()
	Если Не РольДоступна("Администратор") Тогда
		Возврат;
	КонецЕсли;
	НоваяКоманда = ЭтаФорма.Команды.Добавить("кфПерезапуск");
	НоваяКоманда.Действие= "кфПерезапустить";
	НовыйЭлемент = Элементы.Добавить("кфПерезапустить", Тип("КнопкаФормы"),Элементы.ФормаКоманднаяПанель);
	НовыйЭлемент.ИмяКоманды = "кфПерезапуск";
	НовыйЭлемент.Заголовок = "Перезапустить ["+ТекущаяУниверсальнаяДата()+"]";
КонецПроцедуры

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
		ДобавитьКнопкуПерезапуска();
КонецПроцедуры
...Показать Скрыть

Для обычных форм на этой же платформе прекрасно отрабатывает код (40)
85. Сергей Рыбаков (Knych) 29.04.16 09:26
(83) batyrkin, Я кажется понял, в чем проблема. Может кому-то пригодится. Вот измененный код процедуры
&НаКлиенте
Процедура кфПерезапустить(Команда)
	
	СтруктураПереоткрыть = Новый Структура();
	ПереоткрытьНаСервере("Поместить", СтруктураПереоткрыть);
	Если СтруктураПереоткрыть.ФункцияПомещения = "НачатьПомещениеФайла" Тогда
		НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
	Иначе
		ПоместитьФайл(,СтруктураПереоткрыть.ИспользуемоеИмяФайла,,Ложь,);
	КонецЕсли;
	#Если Не ТолстыйКлиентУправляемоеПриложение Тогда
		ПереоткрытьНаСервере("Создать", СтруктураПереоткрыть);
	#Иначе
		ВнешниеОбработки.Создать(СтруктураПереоткрыть.ИспользуемоеИмяФайла);
	#КонецЕсли
	ЭтаФорма.Закрыть();
	ОткрытьФорму(СтруктураПереоткрыть.ПолныйПутьИмениФормы);
	
КонецПроцедуры
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа