Книга: Настольная книга 1С:Эксперта по технологическим вопросам
Назад: 4.26.Измерение динамики производительности по журналу регистрации
Дальше: 4.28.Ловушка для получения стека вызовов, когда отладка недоступна

4.27.Про открытие модальных окон в транзакции

Модальным называется окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь это окно не закроет.

Открытие модальных окон в транзакции – это почти всегда грубая ошибка. Исключением является, пожалуй, лишь случай, когда окно открывается намеренно для целей гарантированного воспроизведения ошибок (конфликтов блокировок).

Если требуется использовать модальные окна для привлечения внимания пользователя к важному событию или критической ситуации, это все равно не повод открывать их в транзакции.

Модальные формы открываются методами:

Процедурами и функциями глобального контекста:

Разберем еще один пример ошибочного кода, который иллюстрирует, как работает механизм транзакций и как можно на ровном месте создать серьезные проблемы.

В режиме обычного приложения создадим обработку, с помощью которой выполним следующий код:

НачатьТранзакцию();

Форма = Документы.РасходныйКассовыйОрдер.ПолучитьФормуСписка().ОткрытьМодально();

В открывшейся форме списка последовательно откроем несколько документов РасходныйКассовыйОрдер, изменим им даты, перепроводя каждый из документов, пока не обратим внимания, что даты у документов в списке меняются только после нажатия кнопки Обновить (в конце концов мы могли бы менять и не отображаемые в форме списка реквизиты). Затем закроем модальную форму списка, а открыв ее еще раз, увидим, что даты вернулись в исходное состояние.

Откроем журнал регистрации (см. табл. 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, при следующем обращении к данным вся транзакция будет отменена с сообщением «В данной транзакции уже происходили ошибки!». То есть все введенные и измененные в ней документы вернутся в исходное состояние.

И, кроме того, это не отменяет факта блокировки ресурсов на неопределенное время.

Назад: 4.26.Измерение динамики производительности по журналу регистрации
Дальше: 4.28.Ловушка для получения стека вызовов, когда отладка недоступна