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

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

```1c
    &НаСервере
    Процедура СоздатьДокументыНаСервереФормы(ДанныеФормы, НомерСтроки)

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

    КонецПроцедуры

    &НаКлиенте
    Процедура СоздатьДокументы(Команда)

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

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

    Строка.Ссылка = ЗаполнитьНайденныйДокумент(Строка.НомерСтроки);
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```
---
Открывайте полученную форму. В целом, принцип такой:
```1c
    &НаКлиенте
    Перем МассивСтрок;

    &НаКлиенте
    Процедура СоздатьДокументы(Команда)

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

    Если МассивСтрок.Количество() > 0 Тогда
    ОткрытьФормуДокумента(0);
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ОткрытьФормуДокумента(Сч)

    Строка = МассивСтрок[Сч];

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

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("Форма", ФормаОбъекта);
    ДополнительныеПараметры.Вставить("Сч", Сч);

    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект, ДополнительныеПараметры);
    ФормаОбъекта.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
    ФормаОбъекта.Открыть();

    КонецПроцедуры

    &НаКлиенте
    Процедура ПослеЗакрытияФормыДокумента(Результат, ДополнительныеПараметры) Экспорт

    Строка = МассивСтрок[ДополнительныеПараметры.Сч];

    СсылкаНаДокумент = ДополнительныеПараметры.Форма.Объект.Ссылка;
    Строка.Ссылка = СсылкаНаДокумент;

    Сч = ДополнительныеПараметры.Сч + 1;

    Если Сч < МассивСтрок.Количество() Тогда
    ОткрытьФормуДокумента(Сч)
    КонецЕсли;

    КонецПроцедуры
```
---
ФормаОбъекта.ОткрытьМодально();
Может тут написать простое открытие?
---
Откроется сразу 100500 окон. Очевидно, надо привязаться к оповещению о закрытии и в нем создавать и открывать очередную форму.
---
быть может у автора такая задумка)
---
Да, 100500 окон не нужно. Простое открытие работает.
---
Если убрать цикл перебора строк, то откроется первый документ, затем в оповещении о закрытии открывать следующую форму? Как перебрать строки тогда с учетом пометок?
---
Можно каждый раз получать первую строку с пометкой, после обработки пометку снимать. Главное не забыть обработать ситуацию, когда строк с пометкой больше нет.
---
ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");
---
Через параметр ОписаниеОповещенияОЗакрытии в ОткрытьФорму(). Но нужно будет переделать логику, чтобы следующий документ открывался именно в процедуре из оповещения о закрытии.
Например, вот так:

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

    Процедура ОбработатьДокумент_Завершение(РезультатЗакрытия, ДопПараметры) Экспорт
    // Переход к следующему документу
    ОбработатьДокумент(ДопПараметры.МассивДокументов, ДопПараметры.Сч + 1)
    КонецПроцедуры
```
---
В этом случае необходимо записывать документ перед открытием формы. ТС вроде бы хочет оставить решение о записи за пользователем.
---
```1c
    ДопПараметры = Новый Структура("НомерСтроки", Строка.НомерСтроки);
    ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ОбработатьДокумент_Завершение",ЭтотОбъект, ДопПараметры);

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

    Парам = Новый Структура("Ключ", ФормаОбъекта.Объект);
    ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары", Парам, , , , , ОписаниеОповещенияОЗакрытии);
```

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

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

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

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

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

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

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

Как можно через ОткрытьФорму открыть новый заполненный, но не записанный, документ?
---
Открывайте полученную форму. В целом, принцип такой:
```1c
    &НаКлиенте
    Перем МассивСтрок;

    &НаКлиенте
    Процедура СоздатьДокументы(Команда)

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

    Если МассивСтрок.Количество() > 0 Тогда
    ОткрытьФормуДокумента(0);
    КонецЕсли;

    КонецПроцедуры

    &НаКлиенте
    Процедура ОткрытьФормуДокумента(Сч)

    Строка = МассивСтрок[Сч];

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

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("Форма", ФормаОбъекта);
    ДополнительныеПараметры.Вставить("Сч", Сч);

    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыДокумента", ЭтотОбъект, ДополнительныеПараметры);
    ФормаОбъекта.ОписаниеОповещенияОЗакрытии = ОповещениеОЗакрытии;
    ФормаОбъекта.Открыть();

    КонецПроцедуры

    &НаКлиенте
    Процедура ПослеЗакрытияФормыДокумента(Результат, ДополнительныеПараметры) Экспорт

    Строка = МассивСтрок[ДополнительныеПараметры.Сч];

    СсылкаНаДокумент = ДополнительныеПараметры.Форма.Объект.Ссылка;
    Строка.Ссылка = СсылкаНаДокумент;

    Сч = ДополнительныеПараметры.Сч + 1;

    Если Сч < МассивСтрок.Количество() Тогда
    ОткрытьФормуДокумента(Сч)
    КонецЕсли;

    КонецПроцедуры
```