Обычные формы

 Если Док.Товары.Количество() > 0 Тогда

```1c
    ФормаДок = Док.ПолучитьФорму("ФормаДокумента");
    ФормаДок.Открытьмодально();
    // ФормаДок.Открыть();
    сообщить("ДОК.Ссылка.Пустая() " + ДОК.Ссылка.Пустая() + док.ЭтоНовый()) ;
    Иначе
    Предупреждение("Нет позиций для заполнения документа "Заказ поставщику"");
    КонецЕсли;
```

проверяю записан или нет документ - если ФормаДок.Открытьмодально(); то все замечательно
а вот если ФормаДок.Открыть(); то проскакивает.
Каким образом можно реализовать проверку без модальности?
---
```1c
    Перем ФормаДок;

    Процедура ОткрытиеФормыДокумента()
    ФормаДок = Док.ПолучитьФорму("ФормаДокумента", ЭтаФорма);
    ФормаДок.Открыть();
    ПодключитьОбработчикОжидания("ПроверитьЗакрытиеФормы", 5);
    КонецПроцедуры

    Процедура ПроверитьЗакрытиеФормы() Экспорт
    Если ФормаДок = Неопределено Тогда
    ОтключитьОбработчикОжидания("ПроверитьЗакрытиеФормы");
    Возврат;
    КонецЕсли;
    Если Не ФормаДок.Открыта() Тогда
    Сообщить("Форма: "+ФормаДок.Заголовок+" закрыта");
    ФормаДок = Неопределено;
    ОтключитьОбработчикОжидания("ПроверитьЗакрытиеФормы");
    КонецЕсли;
    КонецПроцедуры
```
---
```1c
    ФормаДок.ДокументОбъект.ЭтоНовый();
    ФормаДок.ДокументОбъект.Ссылка.Пустая();
```
---
В ОткрытьФорму() одним из параметров можно указать обработчик оповещения о закрытии (с какого-то там релиза добавили такую возможность).
ЗЫ. А не, так не получится.
---
Не совсем понятно, зачем обращаться к форме при проверке документа? можно же проверить сам объект, обратившись к переменной Док.
---
Правильно, к форме обращаться не зачем.
Достаточно обратиться к объекту

Не совсем понятно откуда Вы запускаете этот код...
Если из обработки создаете и заполняете документ Док то достаточно
проверить Док.ЭтоНовый()=Истина

Если у Док проверить УникальныйИдентификатор
у не записаного объекта он будет равен
Док.Ссылка.УникальныйИдентификатор() = "00000000-0000-0000-0000-000000000000"

Если из модуля объект Док то тогда

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

Док.Открыть() не ждет реакции пользователя сохранил он документ или закрыл без сохранения.
Док.Открытьмодально() как раз ждет не не продолжает выполнение кода 1С пока пользователь не закроет Док с сохранением или без.

К примеру Вы создаете 10 документов в обработке.
У вас 1С на экране сразу откроет 10 форм новых документов если использовать Док.Открыть()
И обработка закончит выполнение.

Поэтому без Модального режима Вы не унаете о реакции пользователя.

Не зная полного замысла этой обработки тяжело что то посоветовать
---
Не записанный документ, не имеет сохраненной ссылки в базе данных. Попробуйте
Если ЭтотОбъект.Ссылка.Пустая() Тогда

                  Документ не записан

КонецЕсли;
---
документ создается из обработки , именно создается
как проверить правильно был ли он записан или нет, потому что если нет
то надо подчистить хвосты - удалить промежуточные файлы
---
Так заполняйте его правильно в обработке, не пользователь же заполняет документ ?
---
проблема не в этом - все что надо заполняется в обработке
но документ может быть не записан и мне надо отследить этот момент
---
По какой причине не может быть записан ?
Сделайте через попытку:

```1c
    Попытка
    Док.Записать();
    Исключение
    Сообщить("Что-то пошло не так!");
    КонецПопытки
```
---
объясняю - я пишу в документ инфу, открываю форму чтобы посмотреть все нормально или нет, добить оставшиеся параметры
но могу записать документ а могу не записать
и мне надо этот момент отследить
в модальном варианте все работает
можно ли сделать проверку при ФормаДок.Открыть(); и каким образом?
---
видимо в документе прописать такое, и отлавливать обработкой оповещения где-то в обработке

```1c
    Процедура ПослеЗаписи()

    Если ВладелецФормы <> Неопределено Тогда

    ОповеститьОЗаписиНовогоОбъекта(Ссылка);

    КонецЕсли;

    КонецПроцедуры
```
---
Не пробовал (6)?
Выбор у тебя небольшой. Если в синхронном сценарии ты просто ждешь закрытия формы, то в асинхронном сценарии тебе надо это событие "ловить".
---
вроде как можно подписаться на событие закрытия открываемой формы через УстановитьДействие()
если я правильно помню, то процедура выполнения должна быть размещена в самой открываемой форме.
---
Думаю, ты прав. Обработчик передается просто именем процедуры, т.е. очевидно предполагается контекст формы.
Жаль.
---
Когда вызывается ФормаДок.Открыть() то отрабатывается код в ПередОткрытием и в ПриОткрытии в открываемой форме, далее отрабатывается Ваш код, написанный после вызова ФормаДок.Открыть() не дожидаясь каких-либо действий с Вашей стороны с открытой формой. Далее, в открытой форме, пользователь может что-то сделать (записать или не записать) и Вы хотите, чтобы в обработке, открывшей немодально форму произошла проверка? Как вариант, можно повесить обработку ожидания, которая будет проверять наличие открытой формы, а по необнаружению выключит себя и запустит нужную процедурку.
---
попытался я так сдеалать в лоб - в цикле форма.открыта
подвисло все
обработку ожидания, которая будет проверять наличие открытой формы,
каким образом?
---
Переменную с формой сделать глобальной для модуля, открытость проверять методом .Открыта()
Форма (Form)
Открыта (IsOpen)
Синтаксис:

Открыта()
Возвращаемое значение:

Тип: Булево.
Истина - открыта; Ложь - не открыта.
Описание:

Определяет, открыта ли данная форма.

Доступность:

Толстый клиент.
Пример:

Если Не Форма.Открыта() Тогда
    Форма.Открыть();
КонецЕсли;

--------------------------------------------------------------------------------

     Методическая информация
---
Тогда без доработки самой формы вариантов вроде нет.
---
```1c
    Если Не Форма.Открыта() Тогда
    Форма.Открыть();
    КонецЕсли;
```

смысл - у нас есть уже

```1c
    Форма.Открыть();
```

надо отловить чем все дело закончилось
---
```1c
    Перем ФормаДок;

    Процедура ОткрытиеФормыДокумента()
    ФормаДок = Док.ПолучитьФорму("ФормаДокумента", ЭтаФорма);
    ФормаДок.Открыть();
    ПодключитьОбработчикОжидания("ПроверитьЗакрытиеФормы", 5);
    КонецПроцедуры

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

если док. Модифицированность тогда
удалить что-то (те документ не записан)
иначе
записан
конецесли;
---
модифицированность тут мало чем поможет.
Вот так нужно:

```1c
    Перем ФормаДок, ВерсияДок;

    Процедура КоманднаяПанель1Действие1(Кнопка)
    ФормаДок = Док.ПолучитьФорму("ФормаДокумента", ЭтаФорма);
    ВерсияДок = Док.ВерсияДанных;
    ФормаДок.Открыть();

    ПодключитьОбработчикОжидания("ПроверитьЗакрытиеФормы", 5);
    КонецПроцедуры

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

    Изменение объекта, являющимся значением основного реквизита формы. Это изменение может быть произведено интерактивно с помощью элемента управления связанным с реквизитом объекта или программно.
    При изменении данных или отработке события элемента управления, у которого взведен флаг "изменяет данные".

Признак модифицированности формы сбрасывается системой при наступлении одного из следующих событий:

    Измененный объект, являющийся значением основного реквизита формы, был успешно записан.
    При открытии формы после события ПередОткрытием() формы, но перед событием ПриОткрытии().

Флаг модифицированности сбрасывается после события ПередОткрытием() формы, но перед событием ПриОткрытии(), так как при открытии формы нового объекта или уже записанного пользователь ожидает, что состояние данных не являются измененными. Если для нового объекта нужно дополнительная его инициализация перед редактированием в форме, то ее можно произвести в обработчике события формы ПередОткрытием(). В этом случае признак модифицированности не будет взведен у формы, как того и ожидает пользователь. Если же нужно внести исправления в объект при открытии формы, которые должны отразиться на признаке модифицированности, то это следует произвести в обработчике события формы ПриОткрытии().

Кроме автоматического взведения и сброса флага модифицированности системой, разработчик может управлять признаком модифицированности формы посредством свойства формы Модифицированность. Данная модель, с одной стороны, не требует от разработчика дополнительных усилий для поддержки стандартной функциональности редактирования объекта с помощью формы, с другой стороны, предоставляет полный контроль над признаком модифицированности формы.