Обработка ошибочных ситуаций во встроенном языке системы 1С:Предприятие 7.7
С появлением системы 1С:Предприятие 7.7 положение дел изменилось. Теперь разработчики конфигураций могут предусматривать в алгоритмах модулей реакцию на все ошибочные ситуации, которые могут возникать при выполнении модулей встроенного языка. В целом средства обработки ошибочных (исключительных) ситуаций подобны аналогичным средствам предусмотренным в современных языках программирования.
Попытка
// Некоторые действия
Исключение
// Обработка исключительной (ошибочной) ситуации)
КонецПопытки
Суть в следующем: если при выполнении последовательности операторов происходит ошибка, то выполнение оператора прекращается и управление передается на первый оператор последовательности . После завершения выполнения данной последовательности управление получает первый оператор, следующий за КонецПопытки. В случае, если при выполнении ошибок не произошло, то управление, минуя также попадает на первый оператор, следующий за КонецПопытки. Конструкции Попытка…Иключение…КонецПопытки могут быть вложенными, при этом для передачи управления из более внутреннего обработчика исключительной ситуации в более внешний служит оператор ВызватьИсключение. В случае, если оператор ВызватьИсключение будет выполнен в самом внешнем обработчике ошибки, то выполнение модуля будет прекращено и сообщение об ошибке будет выдано в окно сообщений, как и в случае полного отсутствия обработчиков ошибок. Для получения текста описания ошибки внутри последовательности операторов служит встроенная функция ОписаниеОшибки(). Более подробно о механизме обработки исключительных ситуаций можно прочитать в книге "1С:Предприятие 7.7. Описание встроенного языка. Часть 1.".
В методической конфигурации приводится обработка ПересчетЦен, модуль которой содержит пример обработки ошибочной ситуации. Данная обработка изменяет значение реквизита Цена для всех элементов справочника Товары путем умножения на вводимый пользователем коэффициент. Предполагается, что справочник Товары может содержать несколько тысяч элементов. При этом значения реквизита для всех элементов должны быть изменены согласованно, не прерывая работы других пользователей. Для обеспечения согласованности изменения реквизитов всех элементов справочника все изменения выполняются в рамках одной транзакции.
Если в процессе записи какого-либо элемента справочника Товары произойдет ошибка, то управление будет передано в блок обработки исключительных ситуаций. Пользователю будет выдано сообщение об ошибке и запрос на повторение попытки записи элемента справочника. Если пользователь, выберет вариант "Да", то попытка записи будет повторена, а если нет, то все сделанные изменения в справочнике будут отменены и выполнение процедуры будет прекращено.
Блокировка объектов базы данных
В данном разделе рассматриваются различные стратегии и логика механизмов блокировок базы данных системы 1С:Предприятие 7.7, используемых для обеспечения многопользовательского режима работы. Как известно, все варианты системы 1С:Предприятие 7.7 способны работать с базами данных в формате .DBF/.CDX. Кроме того, имеются варианты поставки - 1С:Предприятие 7.7 для SQL, способные работать с базами данных, размещаемыми в среде серверов баз данных Microsoft SQL Server 6.5/7.0. Естественно, что для этих двух форматов баз данных используются совершенно разные механизмы доступа к данным. Но при этом логика работы с базой данных в общем остается неизменной. Соответственно, все, о чем будет рассказано в данном разделе является справедливым для обоих возможных форматов построения баз данных системы 1С:Предприятие 7.7.
Блокировки, осуществляемые в базе данных системы 1С:Предприятие 7.7 можно разделить на две группы:
Табличные (транзакционные) блокировки , как следует из названия выполняются на уровне таблиц и служат для обеспечения взаимодействия транзакций, выполняемых несколькими экземплярами системы 1С:Предприятие в одной информационной базе. Блокировки данного вида автоматически устанавливаются и снимаются программами системы 1С:Предприятие в процессе отработки транзакций и предназначены для обеспечения неизменности считанных данных в процессе выполнения транзакции. Имеются два уровня табличных блокировок "на чтение" и "на запись". Различаются эти два уровня тем, что "на чтение" одна и та же таблица может быть заблокирована более чем одним экземпляром системы 1С:Предприятие, в то время как блокировка "на запись" является исключительной, то есть "на запись" таблица может быть заблокирована только одним экземпляром системы.
Работают табличные блокировки следующим образом. Если в процессе выполнения транзакции производится чтение из какой-либо таблицы базы данных, то предпринимается попытка заблокировать данную таблицу "на чтение" (если она не была заблокирована ранее "на чтение" или "на запись"). Если попытка завершается успешно, то чтение завершается успешно и выполнение транзакции продолжается. При этом блокировка с таблицы не снимается до завершения выполнения транзакции. Другие же экземплярами системы 1С:Предприятие лишаются возможности выполнять операции записи в эту таблицу, так как это нарушит принцип неизменности данных, считанных в процессе выполнения транзакции.
Аналогично, если в процессе выполнения транзакции выполняется операция записи, то предпринимается попытка заблокировать таблицу, в которую выполняется запись (если, конечно, блокировка не была установлена ранее) . Если установка блокировки завершается успешно, то операция записи также успешно завершается и таблица остается заблокированной до завершения выполнения транзакции. При этом транзакции, выполняемые другими экземплярами системы 1С:Предприятие лишаются возможности производить чтение из заблокированной "на запись" таблицы, так как для них не может быть гарантирована неизменность считанных ими данных.
Установка табличных блокировок выполняются с таймаутом. Это означает, что в случае неудачной попытки установить блокировку таблицы сразу, попытки будут повторяться в течение некоторого интервала времени. Этот интервал может устанавливаться пользователем с помощью параметра "Время ожидания захвата таблиц Базы Данных", который доступен через диалог установки параметров системы 1С:Предприятие (пункт меню <Сервис/Параметры>, страница диалога <Общие>).
Блокировки отдельных объектов базы данных предназначены для обеспечения корректного взаимодействия между несколькими экземплярами системы 1С:Предприятие при изменении таких объектов как константа, элемент справочника, документ, счет бухгалтерского учета и т. п. Блокировки отдельных объектов бывают двух видов:
-
"Пессимистические"
-
"Оптимистические"
"Пессимистические" блокировки предназначены для обеспечения исключительного доступа для изменения к объектам базы данных системы 1С:Предприятие. Данный вид блокировок хорошо знаком пользователям системы 1С:Предприятие. В частности "пессимистическая" блокировка автоматически устанавливается системой 1С:Предприятие при начале редактирования в форме или списке констант, элементов справочников, документов и т. п. Установка "пессимистической" блокировки не позволяет никому (кроме того, кто заблокировал объект) модифицировать заблокированный объект. Только одна "пессимистическая" блокировка может быть установлена для одного объекта базы данных. Это означает, что если тот или иной объект открыт для редактирования одним экземпляром системы 1С:Предприятие, то не только другой экземпляр системы 1С:Предприятия не сможет открыть для редактирования или изменить этот объект, но и никакой модуль встроенного языка в рамках того же экземпляра не сможет его модифицировать.
В более ранних чем 7.7 версиях системы 1С:Предприятие механизм "пессимистических" блокировок использовался только при редактировании тех или иных объектов базы данных и никак не мог быть задействован из встроенного языка. В версии 7.7 введена возможность явной блокировки объектов из встроенного языка. Данная возможность доступна только для объектов, создаваемых посредством обращения к функции СоздатьОбъект() . Соответственно, таким способом могут быть заблокированы такие объекты базы данных как элементы справочника, счета бухгалтерского учета и документы. Блокировка отдельных объектов осуществляется с помощью обращения к методу Блокировка(ВклВыкл). Необязательный параметр <ВклВыкл> обозначает действие, которое надо выполнить: 1 - заблокировать объект базы данных, 0 - разблокировать. Метод возвращает значение, показывающее результат выполнения операции: 1 - операция выполнена успешно, 0 - операция не выполнена. Если параметр при обращении к методу не задан, то возвращается текущий статус блокировки объекта базы данных: 1 - заблокирован, 0 - "свободен". Следует понимать, что имеется в виду статус блокировки, установленной этим же объектом типа справочник, документ или счет, а не каким-либо другим объектом или другим экземпляром системы 1С:Предприятие. Примером использования метода Блокировка может послужить следующий фрагмент модуля:
Code
<DIV> </DIV>
<DIV>Спр = СоздатьОбъект("Справочник.Товары");</DIV>
<DIV>Спр.ВыбратьЭлементы();</DIV>
<DIV>Пока Спр.ПолучитьЭлемент() = 1 Цикл</DIV>
<DIV> Пока Спр. Спр.Блокировка(1) = 0 Цикл</DIV>
<DIV> Если Вопрос("Элемент справочника заблокирован! Повторить попытку?", "Да+Нет") = "Нет" Тогда</DIV>
<DIV> Возврат;</DIV>
<DIV> КонецЕсли;</DIV>
<DIV> КонецЦикла; // Модифицируем реквизиты элемента справочника</DIV>
<DIV> Спр.Записать(); // Записываем измененный элемент справочника</DIV>
<DIV>КонецЦикла;</DIV>