Ошибка во время выполнения встроенного языка ошибка использования встроенного языка

Конструкция Попытка-Исключение-КонецПопытки Если в модуле на встроенном языке 1С будет ошибка времени выполнения, например деление на 0, то выполнение модуля будет прервано и на экран будет выведено сообщение об ошибке: &НаКлиенте Процедура Исключение(Команда) а = 5/0; КонецПроцедуры Ошибки времени…

Конструкция Попытка-Исключение-КонецПопытки

Если в модуле на встроенном языке 1С будет ошибка времени выполнения, например деление на 0, то выполнение модуля будет прервано и на экран будет выведено сообщение об ошибке:

&НаКлиенте Процедура Исключение(Команда) а = 5/0; КонецПроцедуры

Ошибки времени выполнения (run time) — это ошибки во время выполнения модуля. Еще есть ошибки времени компиляции (compile time) — это ошибки во время компиляции модуля.

Для обработки ошибок времени выполнения можно использовать исключения:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 5/0; Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры

Если в коде после ключевого слова Попытка будет ошибка времени выполнения, то выполнение программы перейдет на первую строку после ключевого слова Исключение. Если ошибок не будет, то код после ключевого слова Исключение даже не будет выполнен.

Конструкцию Попытка-Исключение-КонецПопытки нельзя использовать для обработки ошибок времени компиляции. Такой модуль все равно не будет скомпилирован:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 5/0;+ //здесь ошибка Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры

Вызовы процедур и функций внутри попытки тоже будут обработаны:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() а = 5/0; КонецПроцедуры

В 1С используется единый механизм для обработки всех исключений, как исключений платформы, так и исключений конфигураций. То есть при возникновении ошибки времени выполнения платформа начинает искать ближайший оператор Исключение, относящийся к данному блоку кода. Если ошибка произошла на строке, который не был обернут в конструкцию Попытка-Исключение, но после этой строки есть такая конструкция — ошибка не будет обработана этой конструкцией. Если такой оператор найден, то ошибка будет обработана им. Если не найден, то ошибка обрабатывается платформой, выполнение модуля останавливается.

Оператор ВызватьИсключение

Попытки могут быть вложенными:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() Попытка а = 5/0; Исключение Сообщить("Ошибка в процедуре"); КонецПопытки; КонецПроцедуры

Если выполнить данный код, то выйдет сообщение «Ошибка в процедуре», то есть код из первого исключения даже не будет выполнен. Чтобы выполнялся код из вышестоящего исключения нужно использовать оператор ВызватьИсключение:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() Попытка а = 5/0; Исключение ВызватьИсключение; КонецПопытки; КонецПроцедуры

В этом случае исключение будет проброшено вверх по стеку и обработано первым блоком Попытка-Исключение.

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

&НаКлиенте Процедура Исключение(Команда) ВызватьИсключение "Исключение вызванное из кода"; КонецПроцедуры

Информация об ошибке

В 1С нельзя использовать несколько блоков Исключений для разных типов ошибки. Какая бы ошибка не произошла всегда будет вызываться код после оператора Исключение. Для получения описания ошибки можно использовать метод ОписаниеОшибки():

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры

Пример с другим типом ошибки:

&НаКлиенте Процедура Исключение(Команда) Попытка а = ПредопределенноеЗначение("Справочник.Склады.ОсновнойСклад"); //при этом такого предопределенного элемента нет Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры

Но правильней использовать метод ИнформацияОбОшибке(), который вернет объект типа ИнформацияОбОшибке:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //объект типа ИнформацияОбОшибке передаем //в метод КраткоеПредставлениеОшибки() //для вывода сообщения на экран Сообщить(КраткоеПредставлениеОшибки(Инф)); КонецПопытки; КонецПроцедуры

Метод КраткоеПредставлениеОшибки() выведет более понятное для обычного пользователя сообщение: «Деление на 0» вместо «{Обработка.Обработка1.Форма.Форма.Форма(5)}: Деление на 0».

Для более полного описания ошибки можно использовать метод ПодробноеПредставлениеОшибки():

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //объект типа ИнформацияОбОшибке передаем //в метод ПодробноеПредставлениеОшибки() //для вывода подробного сообщения на экран Сообщить(ПодробноеПредставлениеОшибки(Инф)); КонецПопытки; КонецПроцедуры

Но правильней пользователю сообщать кратное представление, а в журнал регистрации записывать подробное представление ошибки:

&НаКлиенте Процедура Исключение(Команда) //ЗаписьЖурналаРегистрации доступно только на сервере Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура Команда1НаСервере() Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //сообщим пользователю Сообщить(КраткоеПредставлениеОшибки(Инф)); //и запишем в журнал регистрации ПодробнаяОшибка = ПодробноеПредставлениеОшибки(Инф); ЗаписьЖурналаРегистрации("Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробнаяОшибка); КонецПопытки; КонецПроцедуры

Приведение к нужному типу

При загрузке числовых данных из файла (например из текстового документа) в 1С часто применяется такой прием для получения числа из строки:

&НаКлиенте Процедура Исключение(Команда) //это строка с числом, допустим она была получена из файла ЧислоСтрокой = "123.45"; Попытка //пробуем перевести ее в число ЧислоЧислом = Число(ЧислоСтрокой); Исключение //если не получилось ЧислоЧислом = 0; КонецПопытки; //дальше работаем как с числом ЧислоЧислом = ЧислоЧислом + 1; Сообщить(ЧислоЧислом); КонецПроцедуры

С точки зрения производительности это не совсем корректно. Правильно использовать объект ОписаниеТипов:

&НаКлиенте Процедура Исключение(Команда) //это строка с числом, допустим она была получена из файла ЧислоСтрокой = "123.45"; //создаем объект типа ОписаниеТипов с типом Число ОписаниеТипа = Новый ОписаниеТипов("Число"); //приводим строку к числу, если не получится вернет значение по умолчанию //для числа это 0 ЧислоЧислом = ОписаниеТипа.ПривестиЗначение(ЧислоСтрокой); //дальше работаем как с числом ЧислоЧислом = ЧислоЧислом + 1; Сообщить(ЧислоЧислом); КонецПроцедуры

Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Разве вы не ненавидите, когда вы пытаетесь запустить программу и получаете сообщение об ошибке «Ошибка выполнения»? К сожалению, несмотря на то, что люди регулярно раздражают, ужасная ошибка времени выполнения не очень хорошо объясняет сама себя и то, что именно произошло.

Ошибки времени выполнения бывают разных форм и размеров, и они печально известны тем, что мешают вашему рабочему процессу. Таким образом, вот некоторые из наиболее распространенных ошибок времени выполнения, их причины и способы их устранения.

Что такое ошибки во время выполнения?

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

Различные типы ошибок времени выполнения

Во время выполнения могут возникать несколько различных типов ошибок, поэтому рекомендуется узнать, что они из себя представляют и что их вызывает. Таким образом, вы будете точно знать, что делать, когда кто-то поднимает свою уродливую голову.

1. Ошибка деления на ноль

Ваш компьютер выполняет много математических операций при обработке данных, а это означает, что ошибки могут возникать даже при выполнении простых арифметических действий. Например, одна распространенная ошибка времени выполнения называется ошибкой «Делить на ноль». Этот симпатичный на носу; это происходит, когда ваш компьютер производит вычисления и пытается разделить число на 0.

Когда вы пытаетесь разделить число на 0, вы получите неопределенное число. Когда компьютер делает это, он не знает, что делать с неопределенным числом, и вызывает сбой программы.

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

2. Ошибки, вызванные неполной установкой

Иногда в процессе установки что-то идет не так. Существует множество причин, по которым программа не устанавливается должным образом, и когда это происходит, это может привести к проблемам.

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

3. Логические ошибки в программировании программного обеспечения.

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

По теме: Типы ошибок программирования и как их избежать

Горячий ответ: кодирование — это довольно сложно. Существуют тысячи и тысячи символов, которые необходимо правильно ввести для правильной работы программы. Если в коде есть опечатки, это может привести к неожиданным результатам. Из-за этого программа может глючить или даже вообще вылетать.

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

4. Ошибки, вызванные утечками памяти.

Еще одна довольно распространенная ошибка времени выполнения — ошибка утечки памяти. Когда программа запущена, она использует часть оперативной памяти. Затем, когда программа завершается, она сообщает системе, что она завершена, и освобождает эту оперативную память, чтобы другие программы могли ее использовать. Однако иногда программа этого не делает, и программы продолжают использовать новую оперативную память, пока она не закончится.

Связанный: Как устранить нехватку оперативной памяти или утечки памяти в Windows

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

Утечка памяти может привести к проблемам с ОЗУ, снижению производительности и сбоям программы. В этом случае хорошим решением будет перезагрузка компьютера. Это полностью очистит всю оперативную память.

5. Ошибка ненулевого статуса выхода.

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

Одна такая ошибка называется ошибкой ненулевого статуса выхода. Для разных систем кодирования каждой строке кода присваивается статус выхода, который представляет собой число, указывающее, была ли она выполнена успешно или нет. Если компьютер успешно выполнил линию, он получает 0 в качестве статуса выхода. Если оно находится в диапазоне от 1 до 255, значит, это сбой. Хороший пример: если вы запустите строку, которая пытается получить доступ к файлу, которого нет на компьютере, она, скорее всего, получит код выхода 1.

Связанный: Способы проверить, существует ли файл с помощью Python

6. Ошибка переполнения

Когда дело доходит до кодирования, всегда есть ограничения. Например, когда вы пытаетесь поместить число в переменную (также известную как свойство), существует ограничение на то, насколько большим может быть это число. Если вы попытаетесь назначить большее число, чем этот предел, вы получите ошибку переполнения во время выполнения, что может привести к тому, что программа перестанет отвечать.

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

7. Ошибка ошибки сегментации

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

Ошибка сегментации может произойти несколькими способами. Вот некоторые общие причины:

  • когда программа пытается записать в постоянную память

  • когда программа пытается получить доступ к памяти, к которой ей не разрешен доступ

  • когда программа пытается разыменовать освобожденную память или указатели NULL

  • когда программа пытается получить доступ к большему количеству данных, чем разрешено

  • когда программа пытается записать место, которое ей не разрешено

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

Множество ошибок во время выполнения в дикой природе

Когда дело доходит до ошибок времени выполнения, это только верхушка айсберга. Этот список можно продолжить, так как существует множество ошибок и еще больше способов их вызвать. Лучшее, что можно сделать, — это изучить больше ошибок времени выполнения, как их идентифицировать и как их решать; это может помочь предотвратить множество неприятностей.

Обработка ошибочных ситуаций
во встроенном языке системы 1С:Предприятие 7.7

Во
встроенный язык системы 1С:Предприятие 7.7 внесена возможность обработки
ошибочных ситуаций. В предыдущих версиях системы 1С:Предприятие любая ошибка, происшедшая
при выполнении модулей встроенного языка приводила к завершению выполнения модуля
и выдаче в окно сообщений информации о характере ошибки и модуле, в котором она
произошла. При этом разработчик конфигурации не имел возможности вмешаться в
процесс обработки ошибочной ситуации и предусмотреть некоторые действия, которые
могут нейтрализовать последствия ошибки и позволить продолжить выполнение
модуля. Особенно неприятны ситуации, когда из-за несущественных поводов
прекращается выполнение длительных процедур, после чего их приходилось начинать
сначала. Примером такой ситуации может послужить обработка, выполняющая обход и
обновление некоторого реквизита большого числа элементов справочника в случае, если
в процессе работы будет произведена попытка обновить реквизит заблокированный
другим пользователем. Неприятны также ситуации, когда конфигурации, использующие
внешние по отношению к системе 1С:Предприятие программные средства через
механизмы OLE Automation не могли произвести проверку наличия установленных на
компьютере пользователя необходимых программных средств. Примером для такого случая
может послужить поведение отчета, выводящего результаты через OLE Automation в
таблицу MS Excel, в условиях, когда MS Excel на компьютере пользователя
отсутствует.

С
появлением системы 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С:Предприятие.
Примером использования метода Блокировка может послужить следующий фрагмент
модуля:

Спр
= СоздатьОбъект(«Справочник.Товары»);

Спр.ВыбратьЭлементы();

Пока
Спр.ПолучитьЭлемент() = 1 Цикл

Пока
Спр. Спр.Блокировка(1) = 0 Цикл

Если
Вопрос(«Элемент справочника заблокирован! Повторить попытку?»,

«Да+Нет»)
= «Нет» Тогда

Возврат;

КонецЕсли;

КонецЦикла;

//
Модифицируем реквизиты элемента справочника

Спр.Записать();
// Записываем измененный элемент справочника

КонецЦикла;

Следует
обратить внимание, что после записи модифицированного элемента справочника не
производится снятия блокировки в явном виде. В этом нет необходимости, так как
блокировка автоматически снимается при переходе к следующему элементу с помощью
метода ПолучитьЭлемент().

Механизм
«оптимистических» блокировок предназначен для обеспечения
непротиворечивости модификации объектов базы данных. Работают
«оптимистические» блокировки полностью автоматически. Отличие
«оптимистических» блокировок от «пессимистических» можно
пояснить на примере. Предположим имеется задача модификации справочника Товары
(например, пересчет цен). Для выполнения этой задачи может использоваться одна
из двух имеющихся специальных обработок. Каждая из них последовательно обходит
элементы справочника и модифицирует их. Однако первая, подобно тому, как это
было показано в приведенном выше примере перед модификацией блокирует элемент
справочника, а вторая такой блокировки не производит.

Теперь
представим себе, что модификация справочника Товары производится одновременно
двумя экземплярами системы 1С:Предприятие. При этом Экземпляр 1 пользуется
первым вариантом обработки, а Экземпляр 2 — вторым. При их взаимодействии может
наблюдаться следующий результат, если оба экземпляра «встретятся» на
модификации одного и того же элемента справочника:

Действия Экземпляра 1

Действия Экземпляра 2

Результат

ПолучитьЭлемент()

ОК

ПолучитьЭлемент()

ОК

Блокировка(1)

Записать()

 Ошибка!

Записать()

ОК

Из
приведенной таблицы видно, что Экземпляр 2 не смог произвести запись элемента
справочника, заблокированного Экземпляром 1. Сработал механизм
«пессимистической» блокировки. Аналогично, если бы оба экземпляра
системы 1С:Предприятие пользовались первым вариантом обработки, то Экземпляр 2
не смог бы заблокировать элемент справочника.

А
теперь представим, что оба экземпляра системы 1С:Предприятие пользуются вторым
вариантом обработки. Тогда «встреча» на одном и том же элементе
справочника может пройти следующим образом:

Действия Экземпляра 1

Действия Экземпляра 2

Результат

ПолучитьЭлемент()

ОК

ПолучитьЭлемент()

ОК

Записать()

 Ошибка!

Записать()

ОК

Ошибка,
которая происходит при записи элемента справочника Экземпляром 2 и является
следствием работы механизма «оптимистических» блокировок. Как было
упомянуто выше, задачей механизма «оптимистических» блокировок
является обеспечение непротиворечивости модификации объектов базы данных. В
данном же случае имеет место следующее. Экземпляр 2 считал элемент справочника
и приступил к его модификации. В это время Экземпляр 1 успел считать, модифицировать
и записать этот же элемент справочника. Когда Экземпляр 2 приступил к
выполнению операции записи, значения реквизитов элемента справочника уже
отличались от тех, которые были считаны перед модификацией. И в данной ситуации
запись элемента справочника может привести к некорректным результатам, так как
в общем случае, модификация реквизитов может производиться исходя из их
предшествующего состояния, которое оказалось изменившимся.

Таким
образом, можно сформулировать различия в логике функционирования двух
рассматриваемых механизмов блокировок. Логика механизма
«оптимистических» блокировок исходит из предположения
(оптимистического), что в промежутке между считыванием и записью измененного
состояния объекта вероятность того, что этот же объект будет изменен кем-то
другим невелика. Логика же механизма «пессимистических» блокировок в
соответствии с их названием исходит из того, что случиться может всякое и лучше,
если объект будет гарантированно защищен от посторонних изменений.

Список литературы

Для
подготовки данной работы были использованы материалы с сайта http://www.mista.ru/

Дата добавления: 10.09.2012

База рефератов на портале KM.RU существует с 1999 года. Она пополнялась не только готовыми рефератами, докладами, курсовыми, но и авторскими публикациями, чтобы учащиеся могли использовать их и цитировать при самостоятельном написании работ.

Это популяризирует авторские исследования и научные изыскания, что и является целью работы истинного ученого или публициста. Таким образом, наша база — электронная библиотека, созданная в помощь студентам и школьникам.

Уважаемые авторы! Если Вы все же возражаете против размещения Вашей публикации или хотите внести коррективы, напишите нам на почту info@corp.km.ru, мы незамедлительно выполним Вашу просьбу или требование.

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Runtime Errors:

    • A runtime error in a program is an error that occurs while the program is running after being successfully compiled.
    • Runtime errors are commonly called referred to as “bugs” and are often found during the debugging process before the software is released.
    • When runtime errors occur after a program has been distributed to the public, developers often release patches, or small updates designed to fix the errors.
    • Anyone can find the list of issues that they might face if they are a beginner in this article.
    • While solving problems on online platforms, many run time errors can be faced, which are not clearly specified in the message that comes with them. There are a variety of runtime errors that occur such as logical errors, Input/Output errors, undefined object errors, division by zero errors, and many more.

    Types of Runtime Errors:

    • SIGFPE: SIGFPE is a floating-point error. It is virtually always caused by a division by 0. There can be mainly three main causes of SIGFPE error described as follows:
      1. Division by Zero.
      2. Modulo Operation by Zero.
      3. Integer Overflow.

      Below is the program to illustrate the SIGFPE error:

      C++

      #include <iostream>

      using namespace std;

      int main()

      {

          int a = 5;

          cout << a / 0;

          return 0;

      }

      Output:

    • SIGABRT: It is an error itself is detected by the program then this signal is generated using call to abort() function. This signal is also used by standard library to report an internal error. assert() function in C++ also uses abort() to generate this signal.

      Below is the program to illustrate the SIGBRT error:

      C++

      #include <iostream>

      using namespace std;

      int main()

      {

          int a = 100000000000;

          int* arr = new int[a];

          return 0;

      }

      Output:

    • NZEC: This error denotes “Non-Zero Exit Code”. For C users, this error will be generated if the main() method does not have a return 0 statement. Java/C++ users could generate this error if they throw an exception. Below are the possible reasons of getting NZEC error:
      1. Infinite Recursion or if you run out of stack memory.
      2. Negative array index is accessed.
      3. ArrayIndexOutOfBounds Exception.
      4. StringIndexOutOfBounds Exception.

      Below is the program to illustrate the NZEC error:

      Python

      if __name__ == "__main__":

            arr = [1, 2]

          print(arr[2])

      Output:

    • SIGSEGV: This error is the most common error and is known as “Segmentation Fault“. It is generated when the program tries to access a memory that is not allowed to access or attempts to access a memory location in a way that is not allowed. List of some of the common reasons for segmentation faults are:
      1. Accessing an array out of bounds.
      2. Dereferencing NULL pointers.
      3. Dereferencing freed memory.
      4. Dereferencing uninitialized pointers.
      5. Incorrect use of the “&” (address of) and “*”(dereferencing) operators.
      6. Improper formatting specifiers in printf and scanf statements.
      7. Stack overflow.
      8. Writing to read-only memory.

      Below is the program to illustrate the SIGSEGV error:

      C++

      #include <bits/stdc++.h>

      using namespace std;

      void infiniteRecur(int a)

      {

          return infiniteRecur(a);

      }

      int main()

      {

          infiniteRecur(5);

      }

      Output:

    Ways to avoid Runtime Errors:

    • Avoid using variables that have not been initialized. These may be set to 0 on your system but not on the coding platform.
    • Check every single occurrence of an array element and ensure that it is not out of bounds.
    • Avoid declaring too much memory. Check for the memory limit specified in the question.
    • Avoid declaring too much Stack Memory. Large arrays should be declared globally outside the function.
    • Use return as the end statement.
    • Avoid referencing free memory or null pointers.

    Improve Article

    Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Runtime Errors:

    • A runtime error in a program is an error that occurs while the program is running after being successfully compiled.
    • Runtime errors are commonly called referred to as “bugs” and are often found during the debugging process before the software is released.
    • When runtime errors occur after a program has been distributed to the public, developers often release patches, or small updates designed to fix the errors.
    • Anyone can find the list of issues that they might face if they are a beginner in this article.
    • While solving problems on online platforms, many run time errors can be faced, which are not clearly specified in the message that comes with them. There are a variety of runtime errors that occur such as logical errors, Input/Output errors, undefined object errors, division by zero errors, and many more.

    Types of Runtime Errors:

    • SIGFPE: SIGFPE is a floating-point error. It is virtually always caused by a division by 0. There can be mainly three main causes of SIGFPE error described as follows:
      1. Division by Zero.
      2. Modulo Operation by Zero.
      3. Integer Overflow.

      Below is the program to illustrate the SIGFPE error:

      C++

      #include <iostream>

      using namespace std;

      int main()

      {

          int a = 5;

          cout << a / 0;

          return 0;

      }

      Output:

    • SIGABRT: It is an error itself is detected by the program then this signal is generated using call to abort() function. This signal is also used by standard library to report an internal error. assert() function in C++ also uses abort() to generate this signal.

      Below is the program to illustrate the SIGBRT error:

      C++

      #include <iostream>

      using namespace std;

      int main()

      {

          int a = 100000000000;

          int* arr = new int[a];

          return 0;

      }

      Output:

    • NZEC: This error denotes “Non-Zero Exit Code”. For C users, this error will be generated if the main() method does not have a return 0 statement. Java/C++ users could generate this error if they throw an exception. Below are the possible reasons of getting NZEC error:
      1. Infinite Recursion or if you run out of stack memory.
      2. Negative array index is accessed.
      3. ArrayIndexOutOfBounds Exception.
      4. StringIndexOutOfBounds Exception.

      Below is the program to illustrate the NZEC error:

      Python

      if __name__ == "__main__":

            arr = [1, 2]

          print(arr[2])

      Output:

    • SIGSEGV: This error is the most common error and is known as “Segmentation Fault“. It is generated when the program tries to access a memory that is not allowed to access or attempts to access a memory location in a way that is not allowed. List of some of the common reasons for segmentation faults are:
      1. Accessing an array out of bounds.
      2. Dereferencing NULL pointers.
      3. Dereferencing freed memory.
      4. Dereferencing uninitialized pointers.
      5. Incorrect use of the “&” (address of) and “*”(dereferencing) operators.
      6. Improper formatting specifiers in printf and scanf statements.
      7. Stack overflow.
      8. Writing to read-only memory.

      Below is the program to illustrate the SIGSEGV error:

      C++

      #include <bits/stdc++.h>

      using namespace std;

      void infiniteRecur(int a)

      {

          return infiniteRecur(a);

      }

      int main()

      {

          infiniteRecur(5);

      }

      Output:

    Ways to avoid Runtime Errors:

    • Avoid using variables that have not been initialized. These may be set to 0 on your system but not on the coding platform.
    • Check every single occurrence of an array element and ensure that it is not out of bounds.
    • Avoid declaring too much memory. Check for the memory limit specified in the question.
    • Avoid declaring too much Stack Memory. Large arrays should be declared globally outside the function.
    • Use return as the end statement.
    • Avoid referencing free memory or null pointers.

    Понравилась статья? Поделить с друзьями:
  • Ошибка во временной регистрации
  • Ошибка во времени назначенного визита 8 букв сканворд
  • Ошибка во времени исполнения яндекс контест
  • Ошибка во введенных данных вайлдберриз
  • Ошибка внутренняя ошибка сервера ржд