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

Обработка ошибочных ситуаций
во встроенном языке системы 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

Обработка ошибочных ситуаций
во встроенном языке системы 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

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

Если в модуле на встроенном языке 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.      Что такое стек в конфигурации программы 1С?

2.      Для чего нужен стек и откуда появляется ошибка переполнения стека?

3.      Причины, вызывающие переполнение стека в системе программы 1С: Предприятие  

1.      Что такое стек в конфигурации программы 1С?

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

Переполнение стека возникает, когда в стек помещается больше элементов, чем он может вместить.

Стек – это по сути стопка элементов, в которой эти элементы «укладываются» один поверх другого. Работает этот механизм по принципу LIFO (Last In, First Out – последним вошел/первым вышел). Поэтому добраться мы можем в первую очередь до того элемента, который положили последним, потом предпоследним, и т.д.  

2.      Для чего нужен стек и откуда появляется ошибка переполнения стека?

Главное назначение стека — чтобы организовать команду вызова подпрограмм удобным образом. Например, вызывается «функция1» с определенными переменными, и которая при этом передает определенные параметры и вызывает «функцию2» со своими переменными. В свою очередь «функция2» передает свои параметры и вызывает «функцию3», и т.д. Все эти параметры и переменные нужно сохранять (куда-то складывать), и затем по порядку вызывать. Для этого как раз удобно использовать стек.

Если рассматривать стек абстрактно – это «безразмерный склад» для 1С хранения информации. Но фактически – это не так.

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

3.      Причины, вызывающие переполнение стека в системе программы 1С: Предприятие

1. Самый распространенный вариант – это рекурсия. И если происходит бесконечная рекурсия, то прерывается она таким образом.

Выглядит это условно так:

Процедура ИмяПроцедурыВызываемойРекурсивно()

 ИмяПроцедурыВызываемойРекурсивно();

КонецПроцедуры

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

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

1.      Если есть возможность – не используем в работе рекурсию.

2.      Не выполнять вручную ту работу, которую может выполнить компилятор. 

Специалист компании «Кодерлайн»
Марина Анапольская

Переполнение стека встроенного языка на сервере

Я

Анастасия_85

09.07.21 — 08:10

Доброго дня.

При создании/копировании прав доступа пользователя возникает такая ошибка.

Переполнение стека встроенного языка на сервере

{Справочник.Пользователи.Форма.ФормаЭлемента.Форма(1713)}:    Записать(ПараметрыЗаписи);

{mngcore/MessageBox.clf(4)}:    Close(-100);

по причине:

Переполнение стека встроенного языка на сервере

по причине:

Справочник.Пользователи.Форма.ФормаЭлемента.Форма : 403 : МодульУправлениеДоступомСлужебный.ПриКопированииПравНовомуПользователю(Источник, Приемник);

ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 1964 : УправлениеДоступом.ВключитьПрофильПользователю(Приемник, Выборка.Профиль);

ОбщийМодуль.УправлениеДоступом.Модуль : 562 : ВключитьОтключитьПрофильПользователя(Пользователь, Профиль, Истина);

ОбщийМодуль.УправлениеДоступом.Модуль : 3105 : ГруппаДоступаОбъект.Записать();

ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);

ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1044 : Если Не ПроверятьИспользованиеУдаляемыхОбъектов() Тогда

ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 1533 : ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено();

ОбщийМодуль.ОбщегоНазначения.Модуль : 0

по причине:

Переполнение стека встроенного языка на сервере

Подскажите пожалуйста, может быть кто-то сталкивался с такой ошибкой и как исправить.

Я пробовала.

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

-Пробовала обновить конфигурацию, может из более старой версии стоит попробовать обновить.

-Также пробовала делать тестирование конфигурации

пока что нет результата.

ДенисЧ

1 — 09.07.21 — 08:14

Данные кривые, где-то циклическая ссылка.

WhiteDragon93

2 — 09.07.21 — 08:20

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

Анастасия_85

3 — 09.07.21 — 08:21

(1)

Денис, а каким образом её найти??

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

youalex

4 — 09.07.21 — 08:24

замер производительности — и смотреть в каком участке кода дикое количество проходов

Анастасия_85

5 — 09.07.21 — 08:32

(4)

Подскажите пожалуйста, а если ошибка всё же в данных- замер производительности поможет или нет? И поможет ли в таком случае перенос данных в справочник.ГруппыДоступа или в РегистрыСведений.ТаблицыГруппДоступа??

youalex

6 — 09.07.21 — 08:38

(5) Замер покажет только в каком участке кода возможно происходит сваливание  в бесконечную рекурсию

Анастасия_85

7 — 09.07.21 — 09:26

(6)

Я сделала замер производительности.

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

Как найти то, что уходит в рекурсию??

Анастасия_85

8 — 09.07.21 — 09:40

(4) это колонка кол.??

А если 8 или 9, то это много или может быть??

youalex

9 — 09.07.21 — 09:47

(7) Косвенно, по количеству проходов (колонка «Кол» в Замере)

(8) Не похоже. У меня ошибка на 937 проходах (каких-то конкретных значений я не знаю)

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

Анастасия_85

10 — 09.07.21 — 10:23

(9)

А как добавить что-либо в стек вызовов??

youalex

11 — 09.07.21 — 10:29

(10) что значит добавить? Оно само добавляется при новом вызове функции/процедуры. Через стек можно наглядно увидеть, что если одна и та же процедура повторяется — то это рекурсивный вызов.

Анастасия_85

12 — 09.07.21 — 10:40

не добавляется ничего в стек вызовов

стек пустой, в замере производительности не изменилось количество

youalex

13 — 09.07.21 — 11:13

(12) Ну просто отладчиком пройдись и смотри когда отвалится

1Сергей

14 — 09.07.21 — 11:21

Думаю, тут без программиста не обойтись

Анастасия_85

15 — 09.07.21 — 11:33

(14)

Форум для того и существует, если люди не знают чего-то, то они спрашивают.

И с некоторыми вещами люди сталкиваются впервые.

1Сергей

16 — 09.07.21 — 11:35

(15) Извините, просто по вопросу показалось что Вы просто пользователь

rozer76

17 — 09.07.21 — 11:37

Анастасия_85

18 — 09.07.21 — 11:37

(15)

я работала с отладчиком в конкретной процедуре и форме, там, где у меня были ошибки. Я смотрела в табло значения переменных.

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

youalex

19 — 09.07.21 — 11:46

(18) ну видимо, где то здесь

ОбщийМодуль.УдалениеПомеченныхОбъектовСлужебный.Модуль : 225 : ЗапретитьИспользованиеУдаляемыхОбъектов(Источник, Отказ);

А у тебя назначенные группы профилей, кстати, не помечены, случайно?

Анастасия_85

20 — 09.07.21 — 11:54

(19)

нет, они не помечены на удаление.

А вот кстати перенести права пользователей с помощью обработки переноса данных получилось и они всталив нужном (новом) пользователе. Я выгрузила нужные данные из регистра сведений ТаблицаГруппДоступа и загрузила для того пользователя, у кого не было.

Только это конечно же не вариант.Знаю об этом, что нужно исправлять в базе

Анастасия_85

21 — 09.07.21 — 11:57

(19)

Благодарю Вас за подсказку, сейчас попробую в этом месте сделать отладку.

Анастасия_85

22 — 09.07.21 — 13:36

(20) не получилось перенести. Права просто у старого пользователя затёрлись

Анастасия_85

23 — 09.07.21 — 16:49

Поняла свою ошибку.

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

  

Анастасия_85

24 — 16.07.21 — 08:12

Доброго утра.

Мне помогли найти ошибку.

Было дело в расширениях- при помощи отладки и обработки ОбновлениеВспомогательныхДанных.epf мы нашли, что ошибка была в расширениях. Возможно, что произошли изменения в ролях пользователей, которые конфликтуют с основной конфигурацией

Владислаучык

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

1

Переполнение стека встроенного языка на сервере

21.09.2017, 17:00. Показов 15415. Ответов 6

Метки нет (Все метки)


Добрый день, вот такая ошибка

Переполнение стека встроенного языка на сервере

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    ЗначениеПараметраПодразделение = ЭтотОбъект.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Подразделение"));
    Если ЗначениеПараметраПодразделение <> Неопределено Тогда
        ЗначениеПараметраПодразделение.Значение = Подразделение;
        ЗначениеПараметраПодразделение.Использование = Истина;
    КонецЕсли;
    
    //ТиповыеОтчеты.ОбновитьПараметрыПериодаПоФорме(КомпоновщикНастроек, ЭтаФорма);
    табДокумент = Новый ТабличныйДокумент;
    ЭтотОбъект.СкомпоноватьРезультат(табДокумент);
    
    МакетЗаголовокПодвал = ПолучитьМакет("Макет");
    ОбластьЗаголовок = МакетЗаголовокПодвал.ПолучитьОбласть("Заголовок");
    ОбластьЗаголовок.Параметры.Организация = Справочники.Организации.НайтиПоКоду("000000001");
    ОбластьЗаголовок.Параметры.Период = ПредставлениеПериода(НачалоПериода, КонецДня(КонецПериода));
    
    ОбластьПодразделение = МакетЗаголовокПодвал.ПолучитьОбласть("Подразделение");
    ОбластьПодразделение.Параметры.Подразделение = Подразделение;
    
        
    
    ДокументРезультат.Очистить();
    ДокументРезультат.АвтоМасштаб = Истина;
    ДокументРезультат.Вывести(ОбластьЗаголовок);
      Если ЗначениеЗаполнено(Подразделение) Тогда        
        ДокументРезультат.Вывести(ОбластьПодразделение);
    КонецЕсли;          
    
    ДокументРезультат.Вывести(табДокумент);
КонецПроцедуры

Подскажите плз, в чем проблема может быть?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

21.09.2017, 17:05

2

При вызове метода СкомпоноватьРезультат выполняется обработчик события ПриКомпоновкеРезультата. Получается бесконечная рекурсия.

0

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

21.09.2017, 17:26

 [ТС]

3

Tklwegsd, Так а как это обойти?

0

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

21.09.2017, 17:29

4

Очень просто. Не надо вызывать метод СкомпоноватьРезультат() внутри обработчика события ПриКомпоновкеРезультата.

0

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

21.09.2017, 17:40

 [ТС]

5

Tklwegsd, Вот убрал это, и просто ничего не выводится, одна оболочка таблицы

Добавлено через 36 секунд
Tklwegsd, Хотя должно, при тех-же данных в обычной форме все выводится

Добавлено через 9 минут
ДокументРезультат — Это как я понимаю, мой Результат, который на форме создался?

0

Эксперт 1С

434 / 305 / 92

Регистрация: 28.05.2014

Сообщений: 1,247

21.09.2017, 17:50

6

Документ Результат это реквизит отчета с типом Табличный Документ

0

3 / 3 / 7

Регистрация: 21.03.2013

Сообщений: 637

21.09.2017, 17:53

 [ТС]

7

Да, это у уточнял.

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

21.09.2017, 17:53

Помогаю со студенческими работами здесь

Переполнение стека
Всем привет. Помогите, пожалуйста с решением одной проблемы. Мне нужно в программе обрабатывать…

переполнение стека!
вот кодprocedure TForm1.CheckBox7Click(Sender: TObject);
begin
if checkbox7.Checked=false then…

Переполнение стека
Всем привет!

пишу программу, в ней достаточно много массивов, процедур и есть рекурсия….

Переполнение стека
Всем привет. Вобщем почему-то пишет переполнение стека, в чем проблема воот листинг:

uses graph;…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

7

Коллеги, добрый день! Ошибка возникает при открытии пакета «СФ (на авнс)», на вкладке «Для отправки».
Подскажите в чем может быть проблема?


Переполнение стека встроенного языка на сервере
{(1)}:ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, , , , ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)
{ВнешняяОбработка.КонтурЭДО.Форма.Модуль_СинхронныеМодальныеВызовы.Форма(392)}: Выполнить(«ОткрытьФорму(ИмяФормы, ПараметрыФормы, Владелец, , , , ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна)»);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(347)}: смв().смв_ОткрытьФорму(ПутьКФормам + мИмяФормы, ПараметрыФормы, мВладелецФормы, , , , ОписаниеОповещения, РежимБлокирования);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(2114)}: ОткрытьФормуДиадокМодально(«ФормаПакетаУправляемая», ЭтаФорма, ПараметрыФормы);
{ВнешняяОбработка.КонтурЭДО.Форма.ФормаУправляемая.Форма(2083)}: ОткрытьФормуПакета(ВыбраннаяСтрока);

по причине:
Переполнение стека встроенного языка на сервере
по причине:

ВнешняяОбработка.КонтурЭДО.Форма.ФормаПакетаУправляемая.Форма : 220 : Пакет = Модуль_ЯдроНаСервере().Пакеты_ПодготовитьПакет(СтрокаСписка, Ложь);
по причине:
Переполнение стека встроенного языка на сервере

Обработка ошибочных ситуаций
во встроенном языке системы 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, мы незамедлительно выполним Вашу просьбу или требование.

Если (If)

Описание:
Оператор Если управляет выполнением программы, основываясь на результаты одного или более логических выражений. Оператор может содержать любое количество групп операторов, возглавляемых конструкциями ИначеЕсли – Тогда.
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;
Англоязычный синтаксис:
If <Логическое выражение> Then
// Операторы
[ElsIf <Логическое выражение> Then]
// Операторы

[Else]
// Операторы
EndIf;
Параметры:

<Логическое выражение>  – Логическое выражение.

Тогда – Операторы, следующие за Тогда, выполняются, если результатом логического выражения является значение Истина.

// Операторы – Исполняемый оператор или последовательность таких операторов

ИначеЕсли – Логическое выражение, следующее за ключевым словом ИначеЕсли, вычисляется только тогда, когда условия в Если и всех предшествующих ИначеЕсли
оказались равны Ложь. Операторы, следующие за конструкцией ИначеЕсли – Тогда, выполняются, если результат логического выражения в данном
ИначеЕсли равен Истина.

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

КонецЕсли–  Ключевое слово, которое завершает структуру оператора условного выполнения.

Пример:

Если ДеньНедели(ТекущаяДата()) = 6 Тогда
Сообщить(“Сегодня суббота.”);
ИначеЕсли ДеньНедели(ТекущаяДата()) = 7 Тогда
Сообщить(“Сегодня воскресенье.”);
Иначе
Сообщить(“Сегодня рабочий день.”);
КонецЕсли;

Новый (New)

Описание:
Оператор позволяет создать значение указанного типа. Допустим только для тех типов, для которых разрешено создание новых значений. Для прикладных объектов необходимо использовать функциональную форму оператора Новый (вариант 2), так как при проверке модулей в конфигураторе  не определены типы для прикладных объектов.
При работе с функциональной формой оператора Новый следует помнить, что операция разыменования непосредственно к результату работы оператора не может быть применена. Вначале следует присвоить результат работы оператора Новый какой-либо переменной, а затем использовать уже эту переменную.
Синтаксис (вариант 1):
Новый <Имя типа>[(<Парам 1>, …, <Парам N>)]
Параметры:

Имя типа – Указывается имя типа, значение которого создается.

<Парам 1>, …, <Парам N> –  После имени типа в скобках могут указываться параметры, если они определены в конструкторах для данного типа. Допустимое количество параметров
и их назначение указываются в описании конструкторов объекта.

Пример:
// Пример создания массива из трех элементов.
Массив = Новый Массив(3);

Синтаксис (вариант 2):
Новый (<Тип>[, <Параметры конструктора>])
Параметры:

Тип – Имя типа или значение типа Тип.
<Параметры конструктора> Массив параметров конструктора.
Пример:

ТипЗначения = Тип(“КвалификаторыСтроки”);
Параметры = Новый Массив(2);
Параметры[0] = 20;
Параметры[1] = ДопустимаяДлина.Переменная;
КвалифСтр = Новый(ТипЗначения, Параметры);

Перейти (Goto)

Описание:
Безусловная передача управления на другой оператор программы. Передает управление от одного оператора к другому.
Область действия оператора ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции.
Примечание 1. Метка в этом операторе не должна быть меткой перехода на оператор Процедура или Функция.
Примечание 2. Оператор безусловного перехода не может быть использован для передачи управления на операторы, находящиеся внутри конструкций:
Пока – КонецЦикла, Для – КонецЦикла, Для каждого – КонецЦикла, Если – КонецЕсли, Попытка – Исключение – КонецПопытки извне этих конструкций.
Синтаксис:
Перейти <Метка>;
Пример:

Перейти ~Метка1;

~ Метка1: Сообщить(“Осуществлен переход по метке.”);

Перем (Var)

Описание:
Позволяет в явном виде объявить переменную.
Синтаксис:
Перем <Имя переменной 1> [Экспорт] [, <Имя переменной 2>, …];
Англоязычный синтаксис:
Var <Имя переменной 1> [Export] [, <Имя переменной 2>, …];
Параметры:

<Имя переменной 1>[, <Имя переменной 2>, …] – Задается имя или имена объявляемых переменных
Экспорт – Необязательное ключевое слово. Указывает, что данная переменная доступна при обращении к контексту этого модуля из других модулей. Данное ключевое слово необходимо указывать для каждой объявляемой переменной отдельно. Не имеет смысла при объявлении переменных отдельных процедур или функций.
Пример:

// Пример объявления одной переменной
Перем А Экспорт;
Перем Б;
// Пример объявления нескольких переменных одним оператором
Перем А, Б Экспорт;
Неявное объявление переменных:
В языке необязательно объявлять переменные в явном виде. Неявным определением переменной является первое ее появление в левой части
оператора присваивания. Тип переменной определяется типом присвоенного ей значения. Не допускается использование в выражениях переменных, не
объявленных ранее в явном или неявном виде.
Область использования переменной:
Область использования переменных зависит от места их определения в конфигурации. Существует три области, в которых можно объявить
переменные:
● В разделе определения переменных программного модуля управляемого приложения. Это глобальные переменные.
● В разделе определения переменных модуля. Это переменные модуля.
● В процедуре или функции. Это локальные переменные.
Глобальные переменные, объявленные с ключевым словом Экспорт, доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции любого клиентского программного модуля конфигурации.
Переменные модуля доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции того программного модуля, в пределах которого они объявлены. Если они объявлены с ключевым словом Экспорт, то они доступны из других модулей через контекст модуля, в котором они объявлены.
Локальные переменные доступны в пределах той процедуры или функции, в которой они объявлены.
Если переменная определена как глобальная, то она видна из всех процедур и функций любого клиентского программного модуля конфигурации. Если же переменная определена внутри процедуры, то ее областью видимости является данная процедура или функция.

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

Пока (While)

Описание:
Оператор цикла Пока предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла. Цикл выполняется,
пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
Синтаксис:
Пока <Логическое выражение> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла
Англоязычный синтаксис:
While <Логическое выражение> Do
// Операторы
[Break;]
// Операторы
[Continue;]
// Операторы
EndDo;
Параметры:

огическое выражение> -Логическое выражение
Цикл– Операторы, следующие за ключевым словом Цикл, выполняются, пока результат логического выражения равен Истина.
// Операторы – Исполняемый оператор или последовательность таких операторов.
Прервать – Позволяет прервать выполнение цикла в любой точке. После выполнения этого оператора управление передается оператору, следующему за ключевым
словом КонецЦикла.
Продолжить –  Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле
цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла –  Ключевое слово, которое завершает структуру оператора цикла.
Пример:

ВыборкаДок = Документы.РасходнаяНакладная.Выбрать();
// Цикл по всем документам
Пока ВыборкаДок.Следующий() Цикл
// Отобразим Документ в панели состояния
Состояние(“Обрабатывается документ №” + ВыборкаДок.Номер);
// Операторы выполнения действий над документом
КонецЦикла;

Попытка (Try)

Описание:
Оператор Попытка управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях,
и определяет обработку этих ситуаций.
В качестве ошибочных (исключительных) ситуаций воспринимаются ошибки времени выполнения модуля. Не предусмотрено определяемых пользователем исключений.
КонецПопытки оператор. Если же последовательность операторов попытки выполнилась без ошибок, то последовательность операторов исключения будет пропущена и управление также будет продолжено с оператора, следующего за ключевым словом КонецПопытки.
Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения этого обработчика выполняется оператор ВызватьИсключение, выполнение передается вышестоящему обработчику исключения и так далее. Если вышестоящего обработчика нет, исключительная ситуация обрабатывается системно с прекращением выполнения программного модуля.
В выдаче диагностики помощь могут оказать встроенные функции ОписаниеОшибки() и ИнформацияОбОшибке() (см. описание функций встроенного языка). Также следует учитывать, что попадание во вложенный обработчик исключения приводит к тому, что информация о «родительском» исключении теряется.
С помощью конструкции Попытка – Исключение – КонецПопытки не могут быть перехвачены следующие ошибки:
● Ошибки компиляции модулей встроенного языка во время исполнения.
● Ошибки времени исполнения, возникающие в обработчиках ПередЗакрытием() и ПриЗакрытии() управляемой формы.
Такие ошибки всегда будет отображаться системой «1С:Предприятие» и приводить к прекращению выполнения встроенного языка.
Синтаксис:
Попытка
// Операторы попытки
Исключение
// Операторы исключения
[ВызватьИсключение;]
// Операторы исключения
КонецПопытки;
Англоязычный синтаксис:
Try
// Операторы попытки
Except
// Операторы исключения
[Raise;]
// Операторы исключения
EndTry;
Параметры:

// Операторы попытки – Исполняемый оператор или последовательность таких операторов.

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

// Операторы исключения – Исполняемый оператор или последовательность операторов, которые обрабатывают исключительную ситуацию.

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

КонецПопытки–  Ключевое слово, которое завершает структуру оператора обработки исключительных ситуаций.
Пример:

Процедура СформироватьВExcel()
Попытка
// Пытаемся обратиться к программе MS Excel
Табл = Новый ComObject(“Excel.Application”);
Исключение
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
// Операторы формирования отчета

КонецПроцедуры

Процедура (Procedure)

Описание:
Ключевое слово Процедура начинает секцию исходного текста, выполнение которого можно инициировать из любой точки программного модуля, просто указав ИмяПроцедуры() со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания процедуры использовано ключевое слово Экспорт, то это означает, что данная процедура является доступной из всех других программных модулей конфигурации.
При выполнении оператора Возврат процедура заканчивается и возвращает управление в точку вызова. Если в тексте процедуры не встретился оператор Возврат, то после выполнения последнего исполняемого оператора происходит выполнение неявного оператора Возврат. Конец программной секции процедуры определяется по оператору КонецПроцедуры.
Переменные, объявленные в теле процедуры в разделе Объявления локальных переменных, являются локальными переменными данной процедуры, поэтому доступны только в этой процедуре (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
ПРИМЕЧАНИЕ. Ключевые слова Процедура, КонецПроцедуры являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).

Синтаксис:
Процедура <ИмяПроцедуры>([[Знач] <Парам 1> [=<ДефЗнач>], … ,[Знач] <Парам N> [=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;

[Возврат;]
// Операторы;

КонецПроцедуры
Англоязычный синтаксис:
Procedure <ИмяПроцедуры>([[Val] <Парам 1> [=<ДефЗнач>], … ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;

[Return;]
// Операторы;

EndProcedure

Пример:

Перем Глоб;
// Описание процедуры
Процедура МояПроцедура(Пар1, Пар2, Пар3) Экспорт
Глоб = Глоб + Пар1 + Пар2 + Пар3;
Возврат;
КонецПроцедуры
Глоб = 123;
МояПроцедура(5, 6, 7); // Вызов процедуры

УдалитьОбработчик (RemoveHandler)

Описание:
Удаляет обработчик события.
При удалении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначенного в качестве
обработчика.
Синтаксис:
УдалитьОбработчик <Событие>, <ОбработчикСобытия>;
Англоязычный синтаксис:
RemoveHandler <Событие>, <ОбработчикСобытия>;
Параметры:

<Событие> – Событие, обработчик которого удаляется.
Событие задается в форме <Выражение>.<ИмяСобытия>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, обработчик события которого удаляется.
● <ИмяСобытия> – идентификатор (имя) события.

<ОбработчикСобытия> – Процедура/функция-обработчик события.
Обработчиком события может являться метод объекта встроенного языка. Тогда <ОбработчикСобытия> задается как <Выражение>.<ИмяОбработчика>,
где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, метод которого служит обработчиком события.
● <ИмяОбработчика> – имя метода обработчика события.
Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события
задается как имя процедуры/функции.
Пример:

УдалитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;

Функция (Function)

Описание:
Ключевое слово Функция начинает секцию исходного текста функции, выполнение которой можно инициировать из любой точки программного модуля,
просто указав ИмяФункции со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания функции использовано ключевое слово Экспорт, то это означает, что данная функция является доступной из всех других программных модулей конфигурации.
Выполнение функции заканчивается оператором Возврат. Функции отличаются от процедур только тем, что возвращают ВозвращаемоеЗначение. Конец
программной секции функции определяется по оператору КонецФункции.
Вызов любой функции в тексте программного модуля можно записывать как вызов процедуры, т. е. в языке допускается не принимать от функции
возвращаемое значение.
Если ключевое слово Возврат в теле функции не указано или строка модуля, его содержащая, не выполнена, то функция возвращает значение типа Неопределено.
Переменные, объявленные в теле функции в разделе Объявления локальных переменных, являются локальными переменными данной функции, поэтому доступны только в этой функции (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
ПРИМЕЧАНИЕ. Ключевые слова Функция, КонецФункции являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).
Синтаксис:

Функция <ИмяФункции>([[Знач] <Парам 1>[=<ДефЗнач>], … ,[Знач] <Парам N>[=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;

Возврат <Возвращаемое значение>;
// Операторы;

КонецФункции

Англоязычный синтаксис:
Function <ИмяФункции>([[Val] <Парам 1>[=<ДефЗнач>], … ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;

Return <Возвращаемое значение>;
// Операторы;

EndFunction

Пример:
Перем Глоб;
// Описание функции
Функция МояФункция(Пар1, Пар2, Пар3) Экспорт
Глоб = Глоб + Пар1 + Пар2 + Пар3;
Возврат Глоб;
КонецФункции
Глоб = 123;
Рез = МояФункция(5, 6, 7); // Вызов функции

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

Если в модуле на встроенном языке 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-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Переполнение стека втроенного языка при обмене ☑ 0

lite777

22.07.22

16:12

Здравствуйте , Синхронизация УТ10- Розн, ошибка на стороне УТ10 пр обмене-выгрузке , зарегистровааных объектов для обмена- нет

{Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма(515)}: Ошибка при вызове метода контекста (ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации)

    ОбычнаяВыгрузкаДанных_ОбработкаДлительнойОперации(Отказ, УзелИнформационнойБазы, ВидТранспортаСообщений);

по причине:

Переполнение стека встроенного языка на сервере

по причине:

Обработка.ВыполнениеОбменаДанными.Форма.Форма.Форма : 527 : ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(

ОбщийМодуль.ОбменДаннымиСервер.Модуль : 528 : ВыполнитьДействиеОбменаДляУзлаИнформационнойБазы(Отказ,

ОбщийМодуль.ОбменДаннымиСервер.Модуль : 1275 : ВыполнитьОбменДаннымиЧерезФайловыйРесурс(СтруктураНастроекОбмена);

ОбщийМодуль.ОбменДаннымиСервер.Модуль : 1780 : ЗаписатьСообщениеСИзменениямиДляУзла(СтруктураНастроекОбмена, СтруктураНастроекОбмена.ОбработкаТранспортаСообщенийОбмена.ИмяФайлаСообщенияОбмена());



Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 2050 : ВыгрузитьСвойства(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ПКО, ПКО.СвойстваПоиска,

Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 10880 : СоздатьСложнуюИнформациюДляЗаписиВXML(СтруктураУзлаСвойств, УзелСвойства, ПКС.НуженУзелXMLПриВыгрузке, ПКС.Приемник, ПКС.ИмяПараметраДляПередачи);

Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 10617 : СоздатьОбъектыДляЗаписиДанныхВXML(СтруктураДанных, УзелСвойства, НуженУзелXML, ИмяПриемника, «Свойство»);

Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта : 0

по причине:

Переполнение стека встроенного языка на сервере

1

lite777

22.07.22

16:22

КЭш чистил

2

shuhard

22.07.22

16:23

(0) хвалишься ?

3

lubitelxml

22.07.22

16:25

(0) в яндексе уже читал? например по кнопке 1 справа в первой ссылке описаны варианты, из-за чего такое происходит

4

Kassern

22.07.22

16:27

(0) бесконечный цикл где-то словили скорее всего

5

lite777

22.07.22

16:28

(4) Дэк объекто для выгрузки нет

6

unenu

22.07.22

16:33

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

7

Kassern

22.07.22

16:35

(5) отладку в руки и смотреть, что и как там грузится, может действительно какая-то логика заложена и пытается бесконечно выполнить кусок кода

8

Garykom

22.07.22

16:42

(0) 1. Выкинь уже типовой обмен, он говно.

2. Напиши свой на JSON

3. Радуйся

9

Kassern

22.07.22

16:44

(8) а если свой напишет на xml то не будет радоваться?)

10

lite777

22.07.22

16:49

(6) (8) Чем Джон луше ХМЛ- Модно-молодежно ?

11

lite777

22.07.22

16:50

(8) И за сколько ты напишеть типовой обмен в обе стороны ?

12

unenu

22.07.22

16:52

(8) вам наверное 20 лет и вы оптимистно целеустреммленно пишише «убийцу 1С»

теорему БЖ никак подзабыли?

13

lite777

22.07.22

16:53

одно название чего стоит JSON всего лишь текстовый файл с полями в ковычках и запятыми -разделителями,

14

unenu

22.07.22

17:02

(13) вы идеальный клиенте маркетолога. пожалуй пора писать нетленку «JSON-обмен все по всем 100% успех».

ну и рекламку-аватар в сеть: девушка в мини с буферами на которых мигает JSON.

думаю, настало время когда взлетит)

15

Garykom

22.07.22

17:04

(9) xml тороза

(10) быстрей, проще

(11) смотря сколько разных сущностей надо, если все что можно то неделя писать и еще неделя на отладку

(12) https://www.youtube.com/watch?v=vy-I7ybkH-c

16

Garykom

22.07.22

17:05

(13) лучше чем текстовый (свой формат) потому что поддержка в платформе 1С встроенная и шустро пашет

17

Garykom

22.07.22

17:07

теоретически похрен какую сериализацию использовать

но фактически в json самая удобная/быстрая

18

lubitelxml

22.07.22

17:11

(17) + 1

19

hawksib

22.07.22

20:43

(0) а розница какой версии?

20

ДедМорроз

22.07.22

20:56

Срыв стека,это когда при выгрузке А аыгружается Б,а при выгрузке Б выгружается А.

И json тут ни чем не поможет,так как проблема не в формате,а в добавлении объектов в список выгрузки.

21

ДедМорроз

22.07.22

20:59

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

22

hawksib

22.07.22

21:08

(21) я тоже хотел написать, что в (8) не хватает 4. использовать rabbit (зачеркнуто) kafka

23

ДедМорроз

22.07.22

21:47

(22) тут нужно понимать,что может быть ситуация,когда Объект А имеет поле со значением Ссылка на Объект Б, а Объект Б имеет другое поле,которое содержит Ссылка на Объект А.

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

Если (If)

Описание:
Оператор Если управляет выполнением программы, основываясь на результаты одного или более логических выражений. Оператор может содержать любое количество групп операторов, возглавляемых конструкциями ИначеЕсли – Тогда.
Синтаксис:
Если <Логическое выражение> Тогда
// Операторы
[ИначеЕсли <Логическое выражение> Тогда]
// Операторы
[Иначе]
// Операторы
КонецЕсли;
Англоязычный синтаксис:
If <Логическое выражение> Then
// Операторы
[ElsIf <Логическое выражение> Then]
// Операторы

[Else]
// Операторы
EndIf;
Параметры:

<Логическое выражение>  – Логическое выражение.

Тогда – Операторы, следующие за Тогда, выполняются, если результатом логического выражения является значение Истина.

// Операторы – Исполняемый оператор или последовательность таких операторов

ИначеЕсли – Логическое выражение, следующее за ключевым словом ИначеЕсли, вычисляется только тогда, когда условия в Если и всех предшествующих ИначеЕсли
оказались равны Ложь. Операторы, следующие за конструкцией ИначеЕсли – Тогда, выполняются, если результат логического выражения в данном
ИначеЕсли равен Истина.

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

КонецЕсли–  Ключевое слово, которое завершает структуру оператора условного выполнения.

Пример:

Если ДеньНедели(ТекущаяДата()) = 6 Тогда
Сообщить(“Сегодня суббота.”);
ИначеЕсли ДеньНедели(ТекущаяДата()) = 7 Тогда
Сообщить(“Сегодня воскресенье.”);
Иначе
Сообщить(“Сегодня рабочий день.”);
КонецЕсли;

Новый (New)

Описание:
Оператор позволяет создать значение указанного типа. Допустим только для тех типов, для которых разрешено создание новых значений. Для прикладных объектов необходимо использовать функциональную форму оператора Новый (вариант 2), так как при проверке модулей в конфигураторе  не определены типы для прикладных объектов.
При работе с функциональной формой оператора Новый следует помнить, что операция разыменования непосредственно к результату работы оператора не может быть применена. Вначале следует присвоить результат работы оператора Новый какой-либо переменной, а затем использовать уже эту переменную.
Синтаксис (вариант 1):
Новый <Имя типа>[(<Парам 1>, …, <Парам N>)]
Параметры:

Имя типа – Указывается имя типа, значение которого создается.

<Парам 1>, …, <Парам N> –  После имени типа в скобках могут указываться параметры, если они определены в конструкторах для данного типа. Допустимое количество параметров
и их назначение указываются в описании конструкторов объекта.

Пример:
// Пример создания массива из трех элементов.
Массив = Новый Массив(3);

Синтаксис (вариант 2):
Новый (<Тип>[, <Параметры конструктора>])
Параметры:

Тип – Имя типа или значение типа Тип.
<Параметры конструктора> Массив параметров конструктора.
Пример:

ТипЗначения = Тип(“КвалификаторыСтроки”);
Параметры = Новый Массив(2);
Параметры[0] = 20;
Параметры[1] = ДопустимаяДлина.Переменная;
КвалифСтр = Новый(ТипЗначения, Параметры);

Перейти (Goto)

Описание:
Безусловная передача управления на другой оператор программы. Передает управление от одного оператора к другому.
Область действия оператора ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции.
Примечание 1. Метка в этом операторе не должна быть меткой перехода на оператор Процедура или Функция.
Примечание 2. Оператор безусловного перехода не может быть использован для передачи управления на операторы, находящиеся внутри конструкций:
Пока – КонецЦикла, Для – КонецЦикла, Для каждого – КонецЦикла, Если – КонецЕсли, Попытка – Исключение – КонецПопытки извне этих конструкций.
Синтаксис:
Перейти <Метка>;
Пример:

Перейти ~Метка1;

~ Метка1: Сообщить(“Осуществлен переход по метке.”);

Перем (Var)

Описание:
Позволяет в явном виде объявить переменную.
Синтаксис:
Перем <Имя переменной 1> [Экспорт] [, <Имя переменной 2>, …];
Англоязычный синтаксис:
Var <Имя переменной 1> [Export] [, <Имя переменной 2>, …];
Параметры:

<Имя переменной 1>[, <Имя переменной 2>, …] – Задается имя или имена объявляемых переменных
Экспорт – Необязательное ключевое слово. Указывает, что данная переменная доступна при обращении к контексту этого модуля из других модулей. Данное ключевое слово необходимо указывать для каждой объявляемой переменной отдельно. Не имеет смысла при объявлении переменных отдельных процедур или функций.
Пример:

// Пример объявления одной переменной
Перем А Экспорт;
Перем Б;
// Пример объявления нескольких переменных одним оператором
Перем А, Б Экспорт;
Неявное объявление переменных:
В языке необязательно объявлять переменные в явном виде. Неявным определением переменной является первое ее появление в левой части
оператора присваивания. Тип переменной определяется типом присвоенного ей значения. Не допускается использование в выражениях переменных, не
объявленных ранее в явном или неявном виде.
Область использования переменной:
Область использования переменных зависит от места их определения в конфигурации. Существует три области, в которых можно объявить
переменные:
● В разделе определения переменных программного модуля управляемого приложения. Это глобальные переменные.
● В разделе определения переменных модуля. Это переменные модуля.
● В процедуре или функции. Это локальные переменные.
Глобальные переменные, объявленные с ключевым словом Экспорт, доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции любого клиентского программного модуля конфигурации.
Переменные модуля доступны для использования в исполняемых операторах, выражениях, в любой процедуре и функции того программного модуля, в пределах которого они объявлены. Если они объявлены с ключевым словом Экспорт, то они доступны из других модулей через контекст модуля, в котором они объявлены.
Локальные переменные доступны в пределах той процедуры или функции, в которой они объявлены.
Если переменная определена как глобальная, то она видна из всех процедур и функций любого клиентского программного модуля конфигурации. Если же переменная определена внутри процедуры, то ее областью видимости является данная процедура или функция.

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

Пока (While)

Описание:
Оператор цикла Пока предназначен для циклического повторения операторов, находящихся внутри конструкции Цикл – КонецЦикла. Цикл выполняется,
пока логическое выражение равно Истина. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла.
Синтаксис:
Пока <Логическое выражение> Цикл
// Операторы
[Прервать;]
// Операторы
[Продолжить;]
// Операторы
КонецЦикла
Англоязычный синтаксис:
While <Логическое выражение> Do
// Операторы
[Break;]
// Операторы
[Continue;]
// Операторы
EndDo;
Параметры:

огическое выражение> -Логическое выражение
Цикл– Операторы, следующие за ключевым словом Цикл, выполняются, пока результат логического выражения равен Истина.
// Операторы – Исполняемый оператор или последовательность таких операторов.
Прервать – Позволяет прервать выполнение цикла в любой точке. После выполнения этого оператора управление передается оператору, следующему за ключевым
словом КонецЦикла.
Продолжить –  Немедленно передает управление в начало цикла, где производится вычисление и проверка условий выполнения цикла. Операторы, следующие в теле
цикла за ним, на данной итерации обхода не выполняются.
КонецЦикла –  Ключевое слово, которое завершает структуру оператора цикла.
Пример:

ВыборкаДок = Документы.РасходнаяНакладная.Выбрать();
// Цикл по всем документам
Пока ВыборкаДок.Следующий() Цикл
// Отобразим Документ в панели состояния
Состояние(“Обрабатывается документ №” + ВыборкаДок.Номер);
// Операторы выполнения действий над документом
КонецЦикла;

Попытка (Try)

Описание:
Оператор Попытка управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях,
и определяет обработку этих ситуаций.
В качестве ошибочных (исключительных) ситуаций воспринимаются ошибки времени выполнения модуля. Не предусмотрено определяемых пользователем исключений.
КонецПопытки оператор. Если же последовательность операторов попытки выполнилась без ошибок, то последовательность операторов исключения будет пропущена и управление также будет продолжено с оператора, следующего за ключевым словом КонецПопытки.
Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения этого обработчика выполняется оператор ВызватьИсключение, выполнение передается вышестоящему обработчику исключения и так далее. Если вышестоящего обработчика нет, исключительная ситуация обрабатывается системно с прекращением выполнения программного модуля.
В выдаче диагностики помощь могут оказать встроенные функции ОписаниеОшибки() и ИнформацияОбОшибке() (см. описание функций встроенного языка). Также следует учитывать, что попадание во вложенный обработчик исключения приводит к тому, что информация о «родительском» исключении теряется.
С помощью конструкции Попытка – Исключение – КонецПопытки не могут быть перехвачены следующие ошибки:
● Ошибки компиляции модулей встроенного языка во время исполнения.
● Ошибки времени исполнения, возникающие в обработчиках ПередЗакрытием() и ПриЗакрытии() управляемой формы.
Такие ошибки всегда будет отображаться системой «1С:Предприятие» и приводить к прекращению выполнения встроенного языка.
Синтаксис:
Попытка
// Операторы попытки
Исключение
// Операторы исключения
[ВызватьИсключение;]
// Операторы исключения
КонецПопытки;
Англоязычный синтаксис:
Try
// Операторы попытки
Except
// Операторы исключения
[Raise;]
// Операторы исключения
EndTry;
Параметры:

// Операторы попытки – Исполняемый оператор или последовательность таких операторов.

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

// Операторы исключения – Исполняемый оператор или последовательность операторов, которые обрабатывают исключительную ситуацию.

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

КонецПопытки–  Ключевое слово, которое завершает структуру оператора обработки исключительных ситуаций.
Пример:

Процедура СформироватьВExcel()
Попытка
// Пытаемся обратиться к программе MS Excel
Табл = Новый ComObject(“Excel.Application”);
Исключение
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
// Операторы формирования отчета

КонецПроцедуры

Процедура (Procedure)

Описание:
Ключевое слово Процедура начинает секцию исходного текста, выполнение которого можно инициировать из любой точки программного модуля, просто указав ИмяПроцедуры() со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания процедуры использовано ключевое слово Экспорт, то это означает, что данная процедура является доступной из всех других программных модулей конфигурации.
При выполнении оператора Возврат процедура заканчивается и возвращает управление в точку вызова. Если в тексте процедуры не встретился оператор Возврат, то после выполнения последнего исполняемого оператора происходит выполнение неявного оператора Возврат. Конец программной секции процедуры определяется по оператору КонецПроцедуры.
Переменные, объявленные в теле процедуры в разделе Объявления локальных переменных, являются локальными переменными данной процедуры, поэтому доступны только в этой процедуре (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
ПРИМЕЧАНИЕ. Ключевые слова Процедура, КонецПроцедуры являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).

Синтаксис:
Процедура <ИмяПроцедуры>([[Знач] <Парам 1> [=<ДефЗнач>], … ,[Знач] <Парам N> [=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;

[Возврат;]
// Операторы;

КонецПроцедуры
Англоязычный синтаксис:
Procedure <ИмяПроцедуры>([[Val] <Парам 1> [=<ДефЗнач>], … ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;

[Return;]
// Операторы;

EndProcedure

Пример:

Перем Глоб;
// Описание процедуры
Процедура МояПроцедура(Пар1, Пар2, Пар3) Экспорт
Глоб = Глоб + Пар1 + Пар2 + Пар3;
Возврат;
КонецПроцедуры
Глоб = 123;
МояПроцедура(5, 6, 7); // Вызов процедуры

УдалитьОбработчик (RemoveHandler)

Описание:
Удаляет обработчик события.
При удалении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначенного в качестве
обработчика.
Синтаксис:
УдалитьОбработчик <Событие>, <ОбработчикСобытия>;
Англоязычный синтаксис:
RemoveHandler <Событие>, <ОбработчикСобытия>;
Параметры:

<Событие> – Событие, обработчик которого удаляется.
Событие задается в форме <Выражение>.<ИмяСобытия>, где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, обработчик события которого удаляется.
● <ИмяСобытия> – идентификатор (имя) события.

<ОбработчикСобытия> – Процедура/функция-обработчик события.
Обработчиком события может являться метод объекта встроенного языка. Тогда <ОбработчикСобытия> задается как <Выражение>.<ИмяОбработчика>,
где:
● <Выражение> – произвольное выражение на встроенном языке. Его результатом должен быть объект, метод которого служит обработчиком события.
● <ИмяОбработчика> – имя метода обработчика события.
Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события
задается как имя процедуры/функции.
Пример:

УдалитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;

Функция (Function)

Описание:
Ключевое слово Функция начинает секцию исходного текста функции, выполнение которой можно инициировать из любой точки программного модуля,
просто указав ИмяФункции со списком параметров (если параметры не передаются, то круглые скобки, тем не менее, обязательны). Если в модуле приложения или общем программном модуле в теле описания функции использовано ключевое слово Экспорт, то это означает, что данная функция является доступной из всех других программных модулей конфигурации.
Выполнение функции заканчивается оператором Возврат. Функции отличаются от процедур только тем, что возвращают ВозвращаемоеЗначение. Конец
программной секции функции определяется по оператору КонецФункции.
Вызов любой функции в тексте программного модуля можно записывать как вызов процедуры, т. е. в языке допускается не принимать от функции
возвращаемое значение.
Если ключевое слово Возврат в теле функции не указано или строка модуля, его содержащая, не выполнена, то функция возвращает значение типа Неопределено.
Переменные, объявленные в теле функции в разделе Объявления локальных переменных, являются локальными переменными данной функции, поэтому доступны только в этой функции (за исключением случая передачи их как параметров при вызове других процедур, функций или методов).
ПРИМЕЧАНИЕ. Ключевые слова Функция, КонецФункции являются не операторами, а операторными скобками, поэтому не должны заканчиваться точкой с запятой (это может приводить к ошибкам выполнения модуля).
Синтаксис:

Функция <ИмяФункции>([[Знач] <Парам 1>[=<ДефЗнач>], … ,[Знач] <Парам N>[=<ДефЗнач>]])[Экспорт]
// Объявления локальных переменных;
// Операторы;

Возврат <Возвращаемое значение>;
// Операторы;

КонецФункции

Англоязычный синтаксис:
Function <ИмяФункции>([[Val] <Парам 1>[=<ДефЗнач>], … ,[Val] <Парам N>[=<ДефЗнач>]])[Export]
// Объявления локальных переменных;
// Операторы;

Return <Возвращаемое значение>;
// Операторы;

EndFunction

Пример:
Перем Глоб;
// Описание функции
Функция МояФункция(Пар1, Пар2, Пар3) Экспорт
Глоб = Глоб + Пар1 + Пар2 + Пар3;
Возврат Глоб;
КонецФункции
Глоб = 123;
Рез = МояФункция(5, 6, 7); // Вызов функции

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