Как найти программно нужное окно?

1. AlexeyPapanov 460 21.01.16 13:54 Сейчас в теме
Перестал работать код. Мне кажется платформа обновилась и что-то пошло не так...

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


	Для Каждого ОбъектНазначенияСсылка Из Параметры.ОбъектыНазначения Цикл	
		ОбъектОбработки = ОбъектНазначенияСсылка;

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


проблема в строке
			Если не окно.Основное и найти(Окно.Заголовок,ОбъектОбработки) Тогда

заголовки у всех не основных окон одинаковые, поэтому не могу найти нужное окно с моим документом.

1С:Предприятие 8.3 (8.3.7.1845)
Бухгалтерия предприятия, редакция 3.0 (3.0.42.90)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ЧерныйКот 21.01.16 14:38 Сейчас в теме
Искать по Окно.Содержимое ?
3. AlexeyPapanov 460 21.01.16 15:04 Сейчас в теме
Я думаю, что проблема в том, что когда запускается моя ЗТЧ, открывается форма с выбором счетов (которые используются как параметры запроса).
Счета выбрали, нажали заполнить, заполняется документ, форма с выбором счетов закрывается, и мы попадаем в наш уже заполненный документ.

Я сейчас нашел ЗТЧ для другого документа.http://infostart.ru/public/287060/
Там реализовано без формы выбора параметров.
Хотя форма обработки присутствует и в модуле формы есть код.
Но там все просто - в документе жмешь Заполнить, данные заполняются. Никаких параметров юзер выбрать не может.

Я могу так сделать, но мне надо получить данные в зависимости от параметров, которые задаст пользователь.
4. AlexeyPapanov 460 21.01.16 15:06 Сейчас в теме
вот весь код процедуры:
&НаКлиенте
Процедура ЗаполнитьДокумент(ИдентификаторКоманды)
	
	ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;
	
        //начнем перебирать все документы, у которых мы планируем заполнить табличную часть
        Для каждого Элемент из ОбъектыНазначенияМассив Цикл

            //Зададим ключ поиска документа, из которого вызвана данная обработка,
            //чтобы получить ссылку на редактирумый документ в удобном виде для
            //функции ОткрытьФорму()
            КлючПоиска = Новый Структура("Ключ", Элемент);

            //Но нам не надо открывать новую форму (окно) для изменяемого документа, а
            //Нам надо все изменения показать в уже открытых у клиента окнах
            Окна = ПолучитьОкна();
            Для каждого Окно из Окна Цикл

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

                    //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
                    //В объекте содержатся все реквизиты (элементы) формы
                    НовыйОбъект = Форма.Объект;

                    //Мы помещаем объект формы в переменную,
                    //так как должны передать её в процедуру на сервере,
                    //где нельзя изменять объект формы, зато можно править переменную содержащую его
                    ЗаполнитьДокументНаСервере(НовыйОбъект,ФильтрСписокСчетов);

                    //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,
                    //которую необходимо передать в уже полученную нами форму
                    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
                КонецЕсли;
			КонецЦикла;
			
		ЭтаФорма.Закрыть();
        КонецЦикла;

КонецПроцедуры
Показать
Lapitskiy; +1 Ответить
5. Chamomile 26.02.16 11:50 Сейчас в теме
Если еще не разобрались - вот решение проблемы:
https://partners.v8.1c.ru/forum/topic/1457879
Окно - это не локальная переменная, а свойство формы, появилось в 8.3.7, нужно просто переименовать.
unknown181538; dim369; dage; fominov.a; +4 Ответить
6. sultbec 9 08.11.16 11:08 Сейчас в теме
то есть переименовать переменную окно
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот