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

12.11.13

Разработка - Инструментарий разработчика

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
АвтоПереоткрытие
.epf 7,87Kb
151
151 Скачать (1 SM) Купить за 1 850 руб.
Шаблон обработки с переоткрытием
.epf 8,56Kb
105
105 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

 

 

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

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159339    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7755    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

9360 руб.

17.05.2024    23417    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8500 руб.

10.11.2023    10406    36    20    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 19980 руб.

06.10.2023    15385    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

4800 3120 руб.

14.01.2013    187964    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17298    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7692    8    35    

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

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

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

, где Отладка_ФормаКОткрытию и Отладка_ИмяФайла - это реквизиты внешней обработки/отчета.
_
Arkadiy_B; RustIG; anton.fly7; +3 Ответить
4. kapustinag 29.10.11 02:12 Сейчас в теме
Согласен, полезная вещь. Приведенный в (3) код, думаю, и в 8.1 будет работать.
6. ShantinTD 91 29.10.11 08:58 Сейчас в теме
Всем - пожалуйста. Пользуйтесь на здоровье. И спасибо за комментарии.
(3) mtv:), у меня приведен шаблон, поэтому кнопку можно смело двигать, чтоб "глаза не мозолила".
А такое сокращение кода для неуправляемой формы - накладывает еще одно ограничение: при переименовании редактируемой формы в моем варианте нужно всего лишь переоткрыть традиционным способом обработку, в вашем - придется в Кнопка.Пояснение не забыть прописать новое имя формы. И при копировании формы, кстати, тоже.
Для внешних отчетов отличия минимальны - сами видите. Опять же подчеркну слово шаблон.
RustIG; artbear; +2 Ответить
71. markgenuine 11.07.13 10:54 Сейчас в теме
(3) mtv:), только по моему нужно использовать процедура не ПриЗакрытии(), а ПередЗакрытием().
P.s. если я не прав то попровьте)
72. mtv:) 1028 11.07.13 12:00 Сейчас в теме
(71) markgenuine, ты смотрел начальный вариант (сырой и глюкавый).
Окончательный вариант смотри в комментарии (40). Там процедура ПриЗакрытии совсем не используется. :)
73. Stamper 43 12.07.13 11:34 Сейчас в теме
(71)так "при" от "перед" фактически отличается только возможностью предотвратить закрытие
5. Незнайка 207 29.10.11 02:57 Сейчас в теме
в 7.7 часто пользовался, в 8 руки не доходили, да и подзабыл. Спасибо автору.
Я еще на форме делаю кнопочку, цепляю на неё Ctrl+Z и становится ещё удобнее :-)
Автор - молодец. Спасибо.
7. artbear 1563 29.10.11 11:03 Сейчас в теме
(0) Ничего сложного на самом деле, сам юзаю такую кнопку.
У меня лично такая кнопка со времен 77 называется "Перезагрузить" :)
помнится, даже спец.скрипт для Опенконфа делал для автодобавления этой кнопки на форму прямо в конфигураторе.
(3) ты не прав, так не удобно, (6) более прав - весь вопрос в телодвижениях, хотя и к нему есть вопросы :)

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

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

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

А вот так работает:
При нажатии кнопки "Перезагрузить" сначала ЗАКРЫВАЕМ старую форму, а затем ОТКРЫВАЕМ новую форму для этого же файла.
11. artbear 1563 29.10.11 15:39 Сейчас в теме
(9) Приведи свой код, если совет из (10) не помог.
Юзаю код, аналогичный (7), со времен 8.0
13. mtv:) 1028 29.10.11 18:03 Сейчас в теме
(11) artbear, в сообщении (9) я говорил про твой код из (7).
Скопировал его один-в-один в тестовую обработку, запустил - форма закрывается... и всё...
Вывод - код не работает. Что-то не так.
При отладке видно, что новая форма создается и открывается. Но после Закрыть(), старая и новая формы закрываются. :-(
8. CaSH_2004 373 29.10.11 13:24 Сейчас в теме
Странно, наверно я не доганяю, а как у вас реквизиты заполнятся сами что ли? Я давно так делаю, но перед закрытием заполняю в новой обработке все реквизиты из старой, есть вероятность ошибки, но при правильном построении обработок она минимальна, к тому же заполнение опционально. А у вас как?
10. artbear 1563 29.10.11 15:33 Сейчас в теме
(8) Для отладочных целей не всегда нужно автозаполнение всех полей.
Я предпочитаю полностью штатную перезагрузку, когда нужные поля заполняются так же, как и при ручной перезагрузке.
(9) Случайно не юзаешь код (Форма = ПолучитьФорму()) ? я ведь специально указываю лФорма = ...
вообще разницы быть не должно, т.к. Закрыть(), как и в 77, не сразу закрывает форму, а только после выполнения текущего обработчика.
12. ARL 316 29.10.11 16:02 Сейчас в теме
Публикация из серии "Приятные мелочи".
Поскольку на вкус и цвет.... себе сделал внешнюю обработку с выбором пути к файлу. После выбора файла форму всмогательной обработки минимизирую и размещаю в уголке. Один клик и наслаждаюсь исправленной обработкой или отчетом. Автору за идею +.
14. Borisych 503 29.10.11 19:00 Сейчас в теме
я делал внешнюю обработку, с большой кнопкой "Выполнить", сохраняемым списком путей к отлаживаемым обработкам/отчетам, которая запускала текущую обработку
15. mtv:) 1028 29.10.11 22:45 Сейчас в теме
(0) При внимательном взгляде на процедуру "КоманднаяПанель1ОткрытьЕщеРаз" видно, что код будет работать некорректно в некоторых ситуациях. Эксперимент это подтверждает.
Вот пример, когда получается неожиданный результат:
В обработке имеем две неуправляемые формы "Форма01" и "Форма02". В списке форм они расположены именно в таком порядке. Открываем обе формы.
В форме "Форма02" нажимаем кнопку "Открыть еще раз". И видим, что "Форма02" просто закрывается, и затем открывается еще одна "Форма01".
Действительно неожиданный результат... :-(
То есть, при нескольких открытых формах, всегда открывается та, которая выше в списке форм.
26. ShantinTD 91 31.10.11 13:40 Сейчас в теме
Всем спасибо за положительные отзывы, а особенное спасибо - за конструктивную критику.

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

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

(12) ARL, задача стояла именно в том, чтобы избавиться от необходимости вручную указывать (в коде ли, в реквизитах ли - неважно) какую обработку открыть.
28. mtv:) 1028 31.10.11 18:48 Сейчас в теме
ShantinTD в (26) пишет:
...mtv:), у меня встречный вопрос: как открыть сразу несколько форм одной обработки?
Не хочу никого обижать, но я не понял... :-(
Это прикол такой? Или действительно имеются затруднения с открытием нескольких форм одной обработки?
29. ShantinTD 91 31.10.11 19:03 Сейчас в теме
(28) mtv:), это не прикол. Просто не сталкивался. И не только я не сталкивался.
30. mtv:) 1028 31.10.11 19:33 Сейчас в теме
(29) Ну, например, вставить следующий код в процедуру "ПриОткрытии", или повесить этот код на какую-нибудь кнопку:
	ЭтотОбъект.ПолучитьФорму("Форма1").Открыть();
	ЭтотОбъект.ПолучитьФорму("Форма2").Открыть();
	ЭтотОбъект.ПолучитьФорму("Форма3").Открыть();
Или не это имелось ввиду?...
31. ShantinTD 91 31.10.11 19:38 Сейчас в теме
(30) mtv:), понятно. Спасибо. Но это, так сказать, искусственное открытие нескольких форм. До него я докумекал. Я так понимаю, что штатного механизма открытия нескольких форм платформа не предоставляет?
32. mtv:) 1028 31.10.11 19:50 Сейчас в теме
(31), ShantinTD, ох чует мое сердце, что мы говорим о разных вещах...
Возможно, что ты имел ввиду: "Как открыть одну и ту же форму несколько раз (в разных окнах)?".
Тогда это делается по-другому... :)
34. ShantinTD 91 31.10.11 21:03 Сейчас в теме
(32), (33) mtv:), нет, мы говорим об одном и том же: именно как открыть несколько разных форм. Про УникальныйИдентификатор() я видел. Но это опять же искусственное открытие нескольких форм (хоть разных, хоть одинаковых). Может быть я немного неточно выразил свою мысль про штатный механизм: я имел ввиду некий штатный механизм интерактивного открытия нескольких форм.
33. mtv:) 1028 31.10.11 20:13 Сейчас в теме
(31) если требуется открыть одну и ту же форму несколько раз (в разных окнах), то можно использовать, например, следующий код:
ЭтотОбъект.ПолучитьФорму("Форма",,Новый УникальныйИдентификатор()).Открыть()
Это пример штатного механизма платформы для открытия новых экземпляров формы.
_
16. mtv:) 1028 29.10.11 23:02 Сейчас в теме
(0) Еще заметил один неприятный момент в работе алгоритма шаблона.
Нужно внимательно следить, что бы Синоним формы был без пробелов, и в точности соответствовал Имени формы. Попробуйте, например, задать следующие имена форме: "НеуправляемаяФорма" или "Форма_01".
В реквизите "ФормаКОткрытию" запоминается не Имя формы, а Синоним формы. А это не всегда одно и тоже.
17. Attest 3 29.10.11 23:52 Сейчас в теме
Прикольная штука,только сегодня хотел, что-нибудь такое сделать
18. mtv:) 1028 30.10.11 00:06 Сейчас в теме
(0) (7) С учетом ранее замеченных недостатков, и положительно реагируя на критику в свой адрес, а так же учитывая подсказку от artbear, допилил "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. Вроде получилось очень даже ничего.
На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого ТекФорма Из ЭтаФорма.Метаданные().Формы Цикл
		Если ПолучитьФорму(ТекФорма) = ЭтаФорма Тогда
			Закрыть();
			ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть(); //Для внешних обработок
			//ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(ТекФорма.Имя).Открыть(); //Для внешних отчетов
			Прервать;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать

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

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

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


Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
Надежного решения задачи платформа не позволяет реализовать.
vladir; mtv:); artbear; gaglo; ShantinTD; +5 Ответить
35. mtv:) 1028 31.10.11 21:27 Сейчас в теме
(27) tormozit, да, согласен, что нужно за собой прибирать - т.е. закрывать все открытые формы внешней обработки/отчета. Спасибо за подсказку.
Объясни, пожалуйста, смысл первой строки твоего кода: "ЭтотОбъект = ЭтаФорма.ЭтотОбъект;". Я не понял, зачем это. Тем более, что эта строка выдает ошибку, пришлось закомментировать.
И еще, если ты используешь оператор "Попытка Исключение", то не проще ли в нем и разместить код открытия новой формы? Тем самым сократив код на семь строк.
Я сам почему-то не люблю оператор "Попытка Исключение", использую его только в крайних случаях. :)
36. tormozit 7229 31.10.11 22:30 Сейчас в теме
(35) Мой код может выдавать ошибку при попытке присвоения "ЭтотОбъект = ..." только при выполнении из контекста формы. Я же очевидно писал его для выполнения в более изолированном контексте (например общего модуля).
В конструкцию Попытка Исключение разумно помещать минимальное число операций, чтобы не рисковать замаскировать непредвиденные ошибки.
37. mtv:) 1028 31.10.11 22:34 Сейчас в теме
(36) Спасибо за разьяснения, всё понял, согласен.
61. Модератор раздела 31.01.12 16:54 Сейчас в теме
(27)
>>Правда еще бывает КлючУникальности установлен у формы. Тогда можно обнаружить только основную форму.
>>Надежного решения задачи платформа не позволяет реализовать
C помощью аддина "Список открытых форм" от chessman эту задачу уже можно решить :)
Ты уже в курсе вроде бы.
38. bazcom 23 01.11.11 13:01 Сейчас в теме
Идея хороша, но есть уже и причем давно такие же. 5+
39. fomix 33 01.11.11 16:42 Сейчас в теме
Все работает чудесным образом. Давно мечтал о подобном свойстве при отладке. Спасибо!
40. mtv:) 1028 01.11.11 20:40 Сейчас в теме
(0), (27), For All. "Алгоритм переоткрытия внешней обработки/отчета" для обычных форм. (ВЕРСИЯ 3).
Приняв во внимание замечания (27) tormozit, доработал алгоритм из (25).
Теперь закрываются все открытые формы внешней обработки.

На кнопку "Перезапустить" вешаем следующую процедуру:
Процедура кнПерезапустить_Нажатие(Кнопка)
	Для каждого МетаФорма Из ЭтаФорма.Метаданные().Формы Цикл
		ТекФорма = ПолучитьФорму(МетаФорма);
		Если ТекФорма.Открыта() Тогда
			ТекФорма.Закрыть();
			Если ТекФорма = ЭтаФорма Тогда
				Если Найти(Строка(ТипЗнч(ЭтотОбъект)), "Внешняя обработка объект:") = 1 Тогда
					ВнешниеОбработки.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				Иначе
					ВнешниеОтчеты.Создать(ЭтотОбъект.ИспользуемоеИмяФайла).ПолучитьФорму(МетаФорма.Имя).Открыть();
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
В итоге совместных усилий имеем следующее:
1. Всего одна коротенькая процедура, вызываемая нажатием на кнопку.
2. Процедура работает как для внешних обработок, так и для внешних отчетов.
3. Очень легко вставляется в новые внешние обработки и отчеты (одна кнопка и одна процедура).
maxtomsk; odin-7610; DrBlack; LuxVeritatis; dj_serega; dour-dead; u_n_k_n_o_w_n; vladir; MGraf; SirYozha; +10 Ответить
45. ShantinTD 91 10.11.11 13:35 Сейчас в теме
(40) mtv:), нашел такой момент: если МетаФорма - управляемая, то в режиме обычного приложения она не может быть Открыта(), и происходит ошибка.

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

По ссылке был выложен вариант обработки только для управляемых форм, но просто закрыть обработку не получалось. Об этом меня спрашивает в (46) artbear.
50. mtv:) 1028 10.11.11 20:32 Сейчас в теме
(49) чтобы избежать ошибки при наличии в обработке управляемых форм, алгоритм из (40) можно дополнить условием (вставить перед строкой: "Если ТекФорма.Открыта() Тогда"):
Если ТекФорма = Неопределено Тогда
	Продолжить;
КонецЕсли;
68. vladir 114 09.07.13 09:12 Сейчас в теме
ShantinTD, отличная публикация. Шаблон не качал. Для себя взял Процедуру из коммента (40), отдельное спасибо mtv:). То что надо! :)))
41. kea35 02.11.11 18:03 Сейчас в теме
42. ProkopyukIN 17 08.11.11 10:48 Сейчас в теме
идея не просто хорошая, а очень хорошая. коротко, ясно, и полезно.
43. Stepping1C 08.11.11 22:04 Сейчас в теме
44. cerg110 3 09.11.11 07:57 Сейчас в теме
Полезная вещь, немного экономит время)
51. Масянька 27.11.11 05:25 Сейчас в теме
Помоему столько багов что автор сам в шоке
52. artbear 1563 29.11.11 08:04 Сейчас в теме
(51) Неправ/неправа, минусую
53. ShantinTD 91 29.11.11 19:43 Сейчас в теме
(51) Масянька, в споре - рождается истина. Выложен шаблон. Совместными усилиями - пришли к достаточно приемлемому варианту. Каждый в состоянии взять для себя ту часть, которая подойдет именно ему. Так что в этом отношении - я очень доволен. Я немного удивлен тем, что, по видимому, управляемые формы еще слишком мало вошли в нашу жизнь.
54. bkn_oktava 117 02.12.11 23:38 Сейчас в теме
Спасибо от начинающих!!!
Кнопочка работает! На самом деле, пока отчет до ума доведешь, забодаешься перезапускать.
Очень полезная штука, конечно, плюс!!!
55. rom-x 152 09.01.12 13:19 Сейчас в теме
Никогда об этом не задумывался, + за идею. Сделал и для 7-ки.
56. ShantinTD 91 09.01.12 13:32 Сейчас в теме
(55) rom-x, сделал сам - поделись с товарищем. Хотя я сам делал эту кнопку на основании семёрочной http://infostart.ru/public/86415/.
58. rom-x 152 09.01.12 14:05 Сейчас в теме
(56) (57) Программулькин,
//*******************************************
Процедура Переоткрыть()
	Форма.Закрыть();
	ОткрытьФорму("Отчет#", , КаталогИБ()+"\Extforms\123.ert");	   
КонецПроцедуры	
59. Программулькин 301 10.01.12 03:08 Сейчас в теме
69. Abadonna 3968 09.07.13 14:17 Сейчас в теме
(58) rom-x, в 7.7 есть оператор РасположениеФайла(Путь,Имя), где Путь, Имя - переменные, принимающие путь и имя в контексте данного отчета/обработки.
Поэтому писать КаталогИБ()+"\Extforms\123.ert" излишне и нерационально
MarSeN; rom-x; +2 Ответить
57. Программулькин 301 09.01.12 13:32 Сейчас в теме
покажи для 7ки ... тупо позырить...
60. MGraf 3 13.01.12 16:59 Сейчас в теме
Сделал немного по-другому на основе вашего кода - http://infostart.ru/public/104428/
62. Rino 08.02.12 12:03 Сейчас в теме
немного корявая, но спасибо
63. ShantinTD 91 08.02.12 13:26 Сейчас в теме
(62) Rino, конструктивнее: что именно не понравилось?
65. kredko 20 06.06.12 06:48 Сейчас в теме
(62) Rino, Корявая или нет - субъективное мнение. Выложите свой вариант, мы все оценим. А так это пустой трёп. Идея хорошая. Мне понравилась.
64. N_aix 22.03.12 13:53 Сейчас в теме
66. electronik 02.08.12 18:20 Сейчас в теме
Интересно как глюки будут или нет
67. karakozov 09.07.13 08:31 Сейчас в теме
Отличная разработка, не уверен что найдет прикладной характер, но по сути, возможно найдутся потребности в таком решении.Плюс автору.
70. chmv 10.07.13 13:38 Сейчас в теме
Нужная обработка. Давно хотела такую
74. kosmius 7 30.07.13 23:56 Сейчас в теме
Класная штука.... правда написано универсально... и при наличие нескольких форм откривает все.... немножко подправляю под ситуацию... и отладка ускоряється в разы... Спасибо за идею
75. yuraskas 177 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>


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

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

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


Всем хорошего настроения!
80. Arkadiy_B 66 05.03.15 15:30 Сейчас в теме
(78) Nuuq, что то ругается на
НачатьПомещениеФайла(,,СтруктураПереоткрыть.ИспользуемоеИмяФайла,Ложь,);
процедура или функция не найдены
79. ShantinTD 91 23.10.14 09:17 Сейчас в теме
Всем привет!

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

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

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

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

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

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

Также на время отладки рекомендую в Конфигураторе в настройках у пользователя снять флажок "Защита от опасных действий", чтобы каждый раз при переоткрытии обработки не выскакивало предупреждение безопасности.
Оставьте свое сообщение