Модальным называется окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь это окно не закроет.
Открытие модальных окон в транзакции – это почти всегда грубая ошибка. Исключением является, пожалуй, лишь случай, когда окно открывается намеренно для целей гарантированного воспроизведения ошибок (конфликтов блокировок).
Если требуется использовать модальные окна для привлечения внимания пользователя к важному событию или критической ситуации, это все равно не повод открывать их в транзакции.
Модальные формы открываются методами:
Процедурами и функциями глобального контекста:
Разберем еще один пример ошибочного кода, который иллюстрирует, как работает механизм транзакций и как можно на ровном месте создать серьезные проблемы.
В режиме обычного приложения создадим обработку, с помощью которой выполним следующий код:
НачатьТранзакцию();
Форма = Документы.РасходныйКассовыйОрдер.ПолучитьФормуСписка().ОткрытьМодально();
В открывшейся форме списка последовательно откроем несколько документов РасходныйКассовыйОрдер, изменим им даты, перепроводя каждый из документов, пока не обратим внимания, что даты у документов в списке меняются только после нажатия кнопки Обновить (в конце концов мы могли бы менять и не отображаемые в форме списка реквизиты). Затем закроем модальную форму списка, а открыв ее еще раз, увидим, что даты вернулись в исходное состояние.
Откроем журнал регистрации (см. табл. 4.27.1).
Табл. 4.27.1. Фрагмент журнала регистрации
| Дата, время | Пользователь | Событие | Статус транзакции | Метаданные | |
|---|---|---|---|---|---|
| Компьютер | Комментарий | Транзакция | Данные | ||
| 28.11.2014 12:29:44 | Данные. Изменение | Отменена | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:29:39 (10473) | ||||
| Толстый клиент | 2 | Расходный кассовый ордер 00000000071 от 20.08.2013 0:00:00 | |||
| 28.11.2014 12:29:44 | Данные. Проведение | Отменена | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:29:39 (10473) | ||||
| Толстый клиент | 2 | Расходный кассовый ордер 00000000071 от 20.08.2013 0:00:00 | |||
| 28.11.2014 12:29:50 | Данные. Изменение | Отменена | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:29:39 (10473) | ||||
| Толстый клиент | 2 | Расходный кассовый ордер 00000000075 от 30.08.2013 0:00:00 | |||
| 28.11.2014 12:29:50 | Данные. Проведение | Отменена | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:29:39 (10473) | ||||
| Толстый клиент | 2 | Расходный кассовый ордер 00000000075 от 30.08.2013 0:00:00  |       |||
Видим, что все происходило в одной транзакции (колонка Транзакция), несмотря на то, что номера кассовых ордеров разные и время фиксации события разное.
Последствия оказались весьма серьезные:
Код может быть вызван из внешней обработки, т. е. в случае с рабочей базой написать и вызвать такое может кто угодно и откуда угодно. Как можно попробовать поймать такой код, см. раздел 4.28 «Ловушка для получения стека вызовов».
Конечно, скорее всего, в родительской обработке предполагался следующий код:
НачатьТранзакцию();
Форма = Документы.РасходныйКассовыйОрдер.ПолучитьФормуСписка().ОткрытьМодально();
ЗафиксироватьТранзакцию();
И внесенные изменения сохранятся (см. табл. 4.27.2).
Табл. 4.27.2. Фрагмент 2 журнала регистрации
| Дата, время | Пользователь | Событие | Статус транзакции | Метаданные | |
|---|---|---|---|---|---|
| Компьютер | Комментарий | Транзакция | Данные | ||
| 28.11.2014 12:43:59 | Данные. Изменение | Зафиксирована | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:42:48 (16755) | ||||
| Толстый клиент | 5 | Расходный кассовый ордер 00000000002 от 22.08.2014 0:00:00 | |||
| 28.11.2014 12:43:59 | Данные. Проведение | Зафиксирована | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:42:48 (16755) | ||||
| Толстый клиент | 5 | Расходный кассовый ордер 00000000002 от 22.08.2014 0:00:00 | |||
| 28.11.2014 12:44:07 | Данные. Изменение | Зафиксирована | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:42:48 (16755) | ||||
| Толстый клиент | 5 | Расходный кассовый ордер 00000000003 от 25.08.2014 0:00:00 | |||
| 28.11.2014 12:44:07 | Данные. Проведение | Зафиксирована | Документ. Расходный кассовый ордер | ||
| SRV-PRL-EXP-01 | 28.11.2014 12:42:48 (16755) | ||||
| Толстый клиент | 5 | Расходный кассовый ордер 00000000003 от 25.08.2014 0:00:00 | |||
Однако если при проведении любого из документов возникнет исключительная ситуация, которая будет признана невосстановимой (т. е. после нее нельзя продолжать транзакцию), как говорилось в разделе 3.6, при следующем обращении к данным вся транзакция будет отменена с сообщением «В данной транзакции уже происходили ошибки!». То есть все введенные и измененные в ней документы вернутся в исходное состояние.
И, кроме того, это не отменяет факта блокировки ресурсов на неопределенное время.