IE 2016

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

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

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

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

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

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

 

 

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

Файлы

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

См. также

Лучшие комментарии

40. mtv:) (файл скачал) 01.11.2011 20:40
(0), (27), For All. "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. (ВЕРСИЯ 3).
Приняв во внимание замечания (27) tormozit, доработал алгоритм из (25).
Теперь закрываются все открытые формы внешней обработки.

На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
		ТекФорма = ПолучитьФорму(МетаФорма);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Закрыть();
			Если ТекФорма = ЭтаФорма Тогда
				Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
					ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				Иначе
					ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть
В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Процедура работает как для внешних обработок, так и для внешних отчетов.
3. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
Ответили: (45) (48) (50) (68) (72) (84)
# Ответить
27. tormozit 31.10.2011 18:03
Нужно учесть, что у внешнего объекта может быть открыто одновременно несколько форм (с разными метаданными). Поэтому нужно все их закрыть, чтобы не получилось ситуации, когда открыта часть форм от нового объекта с новой версией файла и часть от старого объекта со старой версией файла.
ЭтотОбъект = ЭтаФорма.ЭтотОбъект;
ИмяФормы = "";
Для каждого МетаФорма Из ЭтотОбъект.Метаданные().Формы Цикл
	ТекФорма = ЭтотОбъект.ПолучитьФорму(МетаФорма.Имя);
	Если ТекФорма.Открыта() Тогда
		ТекФорма.Закрыть();
	КонецЕсли;
	Если ТекФорма = ЭтаФорма Тогда
		ИмяФормы = МетаФорма.Имя;
	КонецЕсли;
КонецЦикла;
Попытка
	Пустышка = ЭтотОбъект.СхемаКомпоновкиДанных;
	ЭтоОтчет = Истина;
Исключение
	ЭтоОтчет = Ложь;
КонецПопытки;
Если ЭтоОтчет Тогда
	МенеджерТипаОбъектов = ВнешниеОтчеты;
Иначе
	МенеджерТипаОбъектов = ВнешниеОбработки;
КонецЕсли;
МенеджерТипаОбъектов.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ИмяФормы).Открыть();
...Показать Скрыть


Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
Надежного решения задачи платформа не позволяет реализовать.
Ответили: (35) (40) (61)
# Ответить
3. mtv:) (файл скачал) 29.10.2011 01:13
(0) Хорошая и своевременная публикация. Давно себе хотел сделать подобный сервис, но всё руки не доходили...
Ваша публикация подтолкнула к действию. На основании Вашего кода сделал для себя универсальный шаблон (для обработок и для отчетов).
Кнопку "Переоткрыть" поместил в меню "Действия". Её можно там и оставить после отладки обработки. Не занимает места на командной панели, и глаза не мозолит.
Код для неуправляемой формы получился вот такой (компактней и, по-моему, универсальней):

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

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

, где Отладка_ФормаКОткрытию и Отладка_ИмяФайла - это реквизиты внешней обработки/отчета.
_
Ответили: (4) (6) (7) (71)
# Ответить

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
		ТекФорма = ПолучитьФорму(МетаФорма);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Закрыть();
			Если ТекФорма = ЭтаФорма Тогда
				Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
					ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				Иначе
					ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
...Показать Скрыть
В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Процедура работает как для внешних обработок, так и для внешних отчетов.
3. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
Ответили: (45) (48) (50) (68) (72) (84)
# Ответить
41. kea35 02.11.2011 18:03
Да, идея хороша!
# Ответить
42. ProkopyukIN 08.11.2011 10:48
идея не просто хорошая, а очень хорошая. коротко, ясно, и полезно.
# Ответить
43. Stepping1C 08.11.2011 22:04
Неплохо-неплохо.
# Ответить
44. cerg110 09.11.2011 07:57
Полезная вещь, немного экономит время)
# Ответить
45. ShantinTD 10.11.2011 13:35
(40) mtv:), нашел такой момент: если МетаФорма - управляемая, то в режиме обычного приложения она не может быть Открыта(), и происходит ошибка.

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

По ссылке был выложен вариант обработки только для управляемых форм, но просто закрыть обработку не получалось. Об этом меня спрашивает в (46) artbear.
Ответили: (50)
# Ответить
50. mtv:) (файл скачал) 10.11.2011 20:32
(49) ShantinTD, чтобы избежать ошибки при наличии в обработке управляемых форм, алгоритм из (40) можно дополнить условием (вставить перед строкой: "Если ТекФорма.Открыта() Тогда"):
Если ТекФорма = Неопределено Тогда
	Продолжить;
КонецЕсли;
# Ответить
51. Масянька 27.11.2011 05:25
Помоему столько багов что автор сам в шоке
Ответили: (52) (53)
− 1 [ artbear; ]
# Ответить
52. artbear (файл скачал) 29.11.2011 08:04
(51) Неправ/неправа, минусую
# Ответить
53. ShantinTD 29.11.2011 19:43
(51) Масянька, в споре - рождается истина. Выложен шаблон. Совместными усилиями - пришли к достаточно приемлемому варианту. Каждый в состоянии взять для себя ту часть, которая подойдет именно ему. Так что в этом отношении - я очень доволен. Я немного удивлен тем, что, по видимому, управляемые формы еще слишком мало вошли в нашу жизнь.
# Ответить
54. bkn_oktava (файл скачал) 02.12.2011 23:38
Спасибо от начинающих!!!
Кнопочка работает! На самом деле, пока отчет до ума доведешь, забодаешься перезапускать.
Очень полезная штука, конечно, плюс!!!
# Ответить
55. rom-x 09.01.2012 13:19
Никогда об этом не задумывался, + за идею. Сделал и для 7-ки.
Ответили: (56)
# Ответить
56. ShantinTD 09.01.2012 13:32
(55) rom-x, сделал сам - поделись с товарищем. Хотя я сам делал эту кнопку на основании семёрочной http://infostart.ru/public/86415/.
Ответили: (58)
# Ответить
57. Программулькин (файл скачал) 09.01.2012 13:32
покажи для 7ки ... тупо позырить...
Ответили: (58)
# Ответить
58. rom-x 09.01.2012 14:05
(56) ShantinTD, (57) Программулькин,
//*******************************************
Процедура Переоткрыть()
	Форма.Закрыть();
	ОткрытьФорму("Отчет#", , КаталогИБ()+"\Extforms\123.ert");	   
КонецПроцедуры	
...Показать Скрыть
Ответили: (59) (69)
# Ответить
59. Программулькин (файл скачал) 10.01.2012 03:08
(58) rom-x,
Спасибо.
# Ответить
60. MGraf 13.01.2012 16:59
Сделал немного по-другому на основе вашего кода - http://infostart.ru/public/104428/
# Ответить
61. artbear (файл скачал) 31.01.2012 16:54
(27)
>>Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
>>Надежного решения задачи платформа не позволяет реализовать
C помощью аддина "Список открытых форм" от chessman эту задачу уже можно решить :)
Ты уже в курсе вроде бы.
# Ответить
62. Rino 08.02.2012 12:03
немного корявая, но спасибо
Ответили: (63) (65)
# Ответить
63. ShantinTD 08.02.2012 13:26
(62) Rino, конструктивнее: что именно не понравилось?
# Ответить
64. AtheistFD 22.03.2012 13:53
Интересно. Спасибо.
# Ответить
65. kredko 06.06.2012 06:48
(62) Rino, Корявая или нет - субъективное мнение. Выложите свой вариант, мы все оценим. А так это пустой трёп. Идея хорошая. Мне понравилась.
# Ответить
66. electronik 02.08.2012 18:20
Интересно как глюки будут или нет
# Ответить
67. karakozov 09.07.2013 08:31
Отличная разработка, не уверен что найдет прикладной характер, но по сути, возможно найдутся потребности в таком решении.Плюс автору.
# Ответить
68. vladir 09.07.2013 09:12
ShantinTD, отличная публикация. Шаблон не качал. Для себя взял Процедуру из коммента (40), отдельное спасибо mtv:). То что надо! :)))
# Ответить
69. Abadonna 09.07.2013 14:17
(58) rom-x, в 7.7 есть оператор РасположениеФайла(Путь,Имя), где Путь, Имя - переменные, принимающие путь и имя в контексте данного отчета/обработки.
Поэтому писать КаталогИБ()+"\Extforms\123.ert" излишне и нерационально
+ 2 [ MarSeN; rom-x; ]
# Ответить
70. chmv 10.07.2013 13:38
Нужная обработка. Давно хотела такую
# Ответить
71. markgenuine 11.07.2013 10:54
(3) mtv:), только по моему нужно использовать процедура не ПриЗакрытии(), а ПередЗакрытием().
P.s. если я не прав то попровьте)
Ответили: (72) (73)
# Ответить
72. mtv:) (файл скачал) 11.07.2013 12:00
(71) markgenuine, ты смотрел начальный вариант (сырой и глюкавый).
Окончательный вариант смотри в комментарии (40). Там процедура ПриЗакрытии совсем не используется. :)
# Ответить
73. Stamper 12.07.2013 11:34
(71)так "при" от "перед" фактически отличается только возможностью предотвратить закрытие
# Ответить
74. kosmius (файл скачал) 30.07.2013 23:56
Класная штука.... правда написано универсально... и при наличие нескольких форм откривает все.... немножко подправляю под ситуацию... и отладка ускоряється в разы... Спасибо за идею
# Ответить
75. yuraskas 11.11.2013 14:41
действительно удобно, +.
# Ответить
76. Crush 21.05.2014 19:02
Я вот тоже такой темой заморочился для УФ
http://www.forum.mista.ru/topic.php?id=709041
# Ответить
77. Crush 23.05.2014 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.2014 18:51
1) УФ - внешняя обработка (отчет)
2) В УФ создаем команду формы и назначаем ей процедуру "Переоткрыть"
3) На УФ создаем кнопку формы и назначаем ей команду из п. 2

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

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


Всем хорошего настроения!
Ответили: (80) (84)
# Ответить
79. ShantinTD 23.10.2014 09:17
Всем привет!

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

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

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

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

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






IE 2016