Переделать модальное открытие формы

1. Asenka 103 16.02.21 12:01 Сейчас в теме
Дано:
Внешняя обработка с табличной частью. При нажатии на кнопку выполнить идет перебор строк табличной части и последовательно открывается форма заполненного, но не записанного документа. Пользователь может записать документ, может не записать. После закрытия формы документа открывается следующий.
Все прекрасно работает за исключение того, что это модальный режим.
Конфигурация Бухгалтерия 3.0 типовая, изменения закрыты.

Как переделать этот код без использования модального режима?

&НаСервере
Процедура СоздатьДокументыНаСервереФормы(ДанныеФормы, НомерСтроки)
	
	Документ = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
	Обработка = РеквизитФормыВЗначение("Объект");
	Обработка.СоздатьПоступлениеТоваров(Документ, НомерСтроки);
	ЗначениеВРеквизитФормы(Обработка,"Объект");
	ЗначениеВДанныеФормы(Документ,ДанныеФормы); 
	
КонецПроцедуры

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

			        Строка.Ссылка = ЗаполнитьНайденныйДокумент(Строка.НомерСтроки);
		КонецЕсли;
	КонецЦикла;
	
	
КонецПроцедуры
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
14. SlavaKron 16.02.21 17:50 Сейчас в теме +1 $m
(13) Открывайте полученную форму. В целом, принцип такой:
&НаКлиенте
Перем МассивСтрок;

&НаКлиенте
Процедура СоздатьДокументы(Команда)	
	
	МассивСтрок = Новый Массив;
	Для Каждого Строка Из Объект.Накладные Цикл
		Если Строка.Пометка Тогда			
			МассивСтрок.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	Если МассивСтрок.Количество() > 0 Тогда
		ОткрытьФормуДокумента(0);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуДокумента(Сч)
	
	Строка = МассивСтрок[Сч];
	
	ФормаОбъекта = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");            
	ДанныеФормы = ФормаОбъекта.Объект;
	СоздатьДокументыНаСервереФормы(ДанныеФормы, Строка.НомерСтроки);
	КопироватьДанныеФормы(ДанныеФормы, ФормаОбъекта.Объект);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Форма", ФормаОбъекта);
	ДополнительныеПараметры.Вставить("Сч", Сч);	
	
	ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект, ДополнительныеПараметры);
	ФормаОбъекта.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
	ФормаОбъекта.Открыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыДокумента(Результат, ДополнительныеПараметры) Экспорт
	
	Строка = МассивСтрок[ДополнительныеПараметры.Сч];
	
	СсылкаНаДокумент = ДополнительныеПараметры.Форма.Объект.Ссылка;
	Строка.Ссылка = СсылкаНаДокумент;
	
	Сч = ДополнительныеПараметры.Сч + 1;
	
	Если Сч < МассивСтрок.Количество() Тогда
		ОткрытьФормуДокумента(Сч)
	КонецЕсли;
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ZergKRSK 129 16.02.21 12:18 Сейчас в теме
(1)
ФормаОбъекта.ОткрытьМодально();

Может тут написать простое открытие?
4. SlavaKron 16.02.21 12:28 Сейчас в теме
(2) Откроется сразу 100500 окон. Очевидно, надо привязаться к оповещению о закрытии и в нем создавать и открывать очередную форму.
5. stein13 9 16.02.21 12:34 Сейчас в теме
(4) быть может у автора такая задумка)
8. Asenka 103 16.02.21 12:49 Сейчас в теме
(4) Да, 100500 окон не нужно. Простое открытие работает.
9. Asenka 103 16.02.21 13:05 Сейчас в теме
(4) Если убрать цикл перебора строк, то откроется первый документ, затем в оповещении о закрытии открывать следующую форму? Как перебрать строки тогда с учетом пометок?
10. comptr 31 16.02.21 13:37 Сейчас в теме
(9) Можно каждый раз получать первую строку с пометкой, после обработки пометку снимать. Главное не забыть обработать ситуацию, когда строк с пометкой больше нет.
3. stein13 9 16.02.21 12:19 Сейчас в теме
ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");
6. comptr 31 16.02.21 12:36 Сейчас в теме
Через параметр ОписаниеОповещенияОЗакрытии в ОткрытьФорму(). Но нужно будет переделать логику, чтобы следующий документ открывался именно в процедуре из оповещения о закрытии.
Например, вот так:
Процедура ОбработатьДокумент(МассивДокументов, Сч)
    // Выход за границу - обработали все документы
    Если Сч = МассивДокументов.Количество() Тогда
        Возврат;
    КонецЕсли;
    ДопПараметры = Новый Структура("МассивДокументов, Сч", МассивДокументов, Сч)
    ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения(ЭтотОбъект, "ОбработатьДокумент_Завершение", ДопПараметры);
    // Открываем текущий документ
    П = Новый Структура("Ключ", МассивДокументов[Сч]);
    ОткрытьФорму(ИмяФормы, П, , , , , ОписаниеОповещенияОЗакрытии);
КонецПроцедуры

Процедура ОбработатьДокумент_Завершение(РезультатЗакрытия, ДопПараметры) Экспорт
    // Переход к следующему документу
    ОбработатьДокумент(ДопПараметры.МассивДокументов, ДопПараметры.Сч + 1)
КонецПроцедуры
Показать
7. SlavaKron 16.02.21 12:42 Сейчас в теме
(6) В этом случае необходимо записывать документ перед открытием формы. ТС вроде бы хочет оставить решение о записи за пользователем.
11. Asenka 103 16.02.21 15:08 Сейчас в теме
(6)
			ДопПараметры = Новый Структура("НомерСтроки", Строка.НомерСтроки);
			ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ОбработатьДокумент_Завершение",ЭтотОбъект, ДопПараметры);
			
			ФормаОбъекта    = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");			
			ДанныеФормы     = ФормаОбъекта.Объект;
			СоздатьДокументыНаСервереФормы(ДанныеФормы, Строка.НомерСтроки);
			КопироватьДанныеФормы(ДанныеФормы, ФормаОбъекта.Объект);
			ЗаполнениеРеквизитовФормыДокумента(ФормаОбъекта, Строка);
			
			Парам = Новый Структура("Ключ", ФормаОбъекта.Объект);
			ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары", Парам, , , , , ОписаниеОповещенияОЗакрытии);
Показать


Пустая форма открывается. Что не так?
12. 1cmailru 4 16.02.21 16:05 Сейчас в теме
Если я правильно понял, то происходит следующее:
На форме табличная часть, в которой есть колонка "Пометка". Пользователь ставит в ней отметки и потом нажимает некую кнопку "Создать документы". В процедуре организуется цикл по табличной части и делается попытка создать документы в этом цикле.
Надо так:
добавить еще одну пометку (возможно скрытую от пользователя) "документ создан". Тогда при нажатии на кнопку, мы ищем первую строку в табличной части у которой стоит Пометка и не документ создан, создаем документ, взводим флаг "Документ создан" и открываем его форму передавая описание оповещения о закрытии:

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)


и выходим из процедуры. Таким образом в процедуре "Создать документы" не будет организован цикл, она просто будет обрабатывать один документ (первый по списку).

В описании оповещения о закрытии опять вызываем Создать документы. Таким образом будет организован цикл с последовательной обработкой строк таблицы и не модальным открытием форм документов.
13. Asenka 103 16.02.21 16:14 Сейчас в теме
(12) С пометками все понятно. Проблема в том, что здесь

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>)

в параметры нужно ссылку передавать, а у меня к моменту открытия формы документ еще не записан. Это пользователь решает записать его или нет.

Чуть выше я привела пример кода, но открывается пустой документ.

Как можно через ОткрытьФорму открыть новый заполненный, но не записанный, документ?
14. SlavaKron 16.02.21 17:50 Сейчас в теме +1 $m
(13) Открывайте полученную форму. В целом, принцип такой:
&НаКлиенте
Перем МассивСтрок;

&НаКлиенте
Процедура СоздатьДокументы(Команда)	
	
	МассивСтрок = Новый Массив;
	Для Каждого Строка Из Объект.Накладные Цикл
		Если Строка.Пометка Тогда			
			МассивСтрок.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	Если МассивСтрок.Количество() > 0 Тогда
		ОткрытьФормуДокумента(0);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуДокумента(Сч)
	
	Строка = МассивСтрок[Сч];
	
	ФормаОбъекта = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");            
	ДанныеФормы = ФормаОбъекта.Объект;
	СоздатьДокументыНаСервереФормы(ДанныеФормы, Строка.НомерСтроки);
	КопироватьДанныеФормы(ДанныеФормы, ФормаОбъекта.Объект);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Форма", ФормаОбъекта);
	ДополнительныеПараметры.Вставить("Сч", Сч);	
	
	ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект, ДополнительныеПараметры);
	ФормаОбъекта.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
	ФормаОбъекта.Открыть();
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыДокумента(Результат, ДополнительныеПараметры) Экспорт
	
	Строка = МассивСтрок[ДополнительныеПараметры.Сч];
	
	СсылкаНаДокумент = ДополнительныеПараметры.Форма.Объект.Ссылка;
	Строка.Ссылка = СсылкаНаДокумент;
	
	Сч = ДополнительныеПараметры.Сч + 1;
	
	Если Сч < МассивСтрок.Количество() Тогда
		ОткрытьФормуДокумента(Сч)
	КонецЕсли;
	
КонецПроцедуры
Показать
Оставьте свое сообщение

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