Перейти к содержимому

Как выйти из цикла в 1с

  • автор:

Как выйти из цикла в 1с

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе «Анализ защищенности веб-приложений» �� Записаться бесплатно!

CTF с учебными материалами Codeby Games Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

  • Форум
  • Developer Zone
  • Языки программирования
  • Базы данных и администрирование

Как выйти из цикла в 1с

Условный пример:
Процедура Сформировать()
Запрос=СоздатьОбъект(«Запрос»);
ТекстЗапроса ;

Пока Запрос.Группировка(1)=1 Цикл
Сообщить(Запрос.ВыбФирма);

Пока Запрос.Группировка(2)=1 Цикл
Сообщить(Запрос.Контрагент);

Пока Запрос.Группировка(3,-1)=1 Цикл
Сообщить(Запрос.Док);

Если Запрос.Док.КоличествоСтрок()=1 Тогда
Прервать;
КонецЕсли;

Пока Запрос.Группировка(4)=1 Цикл

В базе за заданный период есть только два документа «Расходная накладная»:
1) Расходная накладная 1, Контрагент 1, Фирма Какая-то, количество строк 1.
2) Расходная накладная 2, Контрагент 2, Фирма Какая-то, количество строк 1.

Результатом выполнения есть следующие сообщения в строке состояния:
Фирма Какая-то
Контрагент1
Расходная накладная 1
Контрагент 2

По моим соображениям, программа должна прекратить перебор документов по Контрагенту 1, и перейти к перебору документов по Контрагенту 2, и как только наткнется на документ, в табличной части которого одна строка – выйти из цикла.
Судя по результатам, программа и не начинает перебирать документы по Контрагенту 2.
Почему?
Если в Группировке(3) задать направление по возрастанию, то получается правильно. Но мне важно, что бы документы выбирались, начиная с последнего.

Прервать,Перейти?
Почему Прервать не катит?
В чем цель ?
Соображения . Как дешевый бухгалтер задачу формулируешь
так, беглым глазом — что-то тут с запросом нет то.
(3) формулирую, как умеею.
(3) Цель: понять, почему в данном запросе программа не перебирает документы по Контрагенту 2.

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

Всегда так писала, было нормально…
…а переменная Фирма несет в себе название фирмы.

(1) сегодня читал здесь статью о том, как корректно писать код Как раз «прервать» и «перейти» считаются крайне нежелательными операторами, это так — к слову. ничего личного.

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

и зачем док=. текущий документ(). Убери все и начни с простого — найдешь проблему.
кидаю теорию:
Двойная группировка
Этот запрос совершает очень полезную работу: он группирует всех сотрудников по должностям. Заметьте, что сначала идет группировка по должности, а затем по сотруднику, это очень важно. Обратите внимание на переменную запроса Сотр. Она ссылается на строку справочника Сотрудники. Чтобы вывести ФИО сотрудника используется обращение к атрибуту объекта: Сотр.Наименование.

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

Пока Запрос.Группировка(«Долж»)=1 Цикл
. Сообщить(Запрос.Долж);
. Пока Запрос.Группировка(«Сотр»)=1 Цикл
. Сообщить(«. » + Запрос.Сотр.Наименование);
. КонецЦикла;
КонецЦикла;
а тут и группы и без групп. Не, я в 1с то-же недавно но в програмировании — дай боже. На личном примере знаю, не так сделаешь запрос — и ничего не получишь.

Куда уже проще? Отладчиком проверяла – не отбирает документы по второму контрагенту! Замаялась уже сама выяснять причину, вот и прошу помочь мне!
Без оператора Прервать все работает, а с ним…- не совсем так, как я предполагала.

Запрос.Выгрузить(ТЗ)
Попробуй использовать Перейти (на метку за 3-й группировкой).

+(15) и посмотреть что получится, какие доки. хотя я бы убрал все лишнее и поставил услови только по контрагенту2, чтобы знать — будет ли он отбираться. Крепись — и все пройдет.

Провел подобный эксперимент, реально глюк. У меня как только ставлю -1 после «прервать» сваливается в бесконечный цикл. «Перейти» не помогло.

Остаётся старый дубовый способ, см. (15).

Еще вариант (работает):

Пропускаем=0;
Пока Запрос.Группировка(3,-1) = 1 Цикл

Если Пропускаем=1 Тогда
продолжить;
КонецЕсли;

Если Запрос.Док.КоличествоСтрок()=1 Тогда
Пропускаем=1;
КонецЕсли;

Дополнение к (20) после Пропускаем=1; добавить Продолжить;

(21) Да, это работает! Хорошо, если у меня два документа, а если перебирать документы за год! Лучше прервать выполнение цикла, чем продолжать их перебирать!

(22) В ТЗ выгрузи и с ней изгаляйся. После Прервать не срабатывает Запрос.Группировка(3,-1), чего непонятно-то. Это одноразовая функция, работает либо до конца выборки, либо до Прервать.
Для начала сделай так, чтобы увидеть что получается, ну а дальше думаю разберешься, что с той ТЗ делать:
Запрос.Выполнить(ТекстЗапроса);
ТЗ=СоздатьОбъект(«ТаблицаЗначений»);
Запрос.Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку();

|Группировка Товар без Групп;
имхо, лишнее.

+(23) Хотя. Если вложенная, должна и после Прервать работать, эт поэкспериментировать надо. Ну да с ТЗ полюбэ сработает, и всегда посмотреть можно что ты там выбираешь.

Немного перефразирую:
Процедура Сформировать()
Запрос=СоздатьОбъект(«Запрос»);
ТекстЗапроса ;

Запрос.Выполнить(ТекстЗапроса);
Пока Запрос.Группировка(1)=1 Цикл
Сообщить(Запрос.ВыбФирма);
Пока Запрос.Группировка(2)=1 Цикл
Сообщить(Запрос.Контрагент);
Пока Запрос.Группировка(3,-1)=1 Цикл
Сообщить(Запрос.Док);
Если Запрос.Док.КоличествоСтрок()=1 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Почему данный код приводит к зацикливанию?

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

(26)тебе же уже не раз написали, вот цитатко:

>>не следует прерывать последовательность просмотра временного набора данных (например, оператором Прервать;), если вы собираетесь использовать временный набор дальше или еще раз, т. к. в таком случае теряется точка позиционирования во временном наборе и продолжать просмотр невозможно;
(с) ЖКК

у тебя ток из вложенного цикла выходит
Если убираю -1, то не зацикливает, но при этом не входит второй раз в группировку(3)!

(28)Я читаю следующее:
Прервать
Прерывает выполнение цикла.
Синтаксис:
Прервать
Описание:
Прерывает выполнение цикла. Оператор Прервать приводит к немедленному прекращению выполнения цикла и передает управление первому оператору, следующему за конструкцией оператора Пока или Для. Оператор Прервать может использоваться только внутри конструкций операторов цикла Пока и Для.

То есть его нельзя использовать во вложенном цикле?

(29) а мне и нужно, чтобы выходило только из одного.

(31)Порой фразы, вырванные из контекста, меняют смысл сказанного до неузнаваемости.
Дилетант (ламер) отличается от профи в том числе и тем, что понадергав из целого куски мнит себя гуру. Да, раз потратив время на решение узкой конкретной задачи. пробехав бегло соответствующий раздел мануала, можно разлулить траблу. Но это не значит, что однажды найденное удачное решение будет рулить всегда. Вещи _похожие_, зачастую, являются _разными_. Цикл циклу рознь. Те же грабли с выборкой из справочника с переназначением кода или сменой родителя.
А часто люди не жалелеют время и описывают ограничения на использование функционала.
Вот и твой случай прописан черным по белому в документации. Надо только прочитать и осознать. А недоступное для понимания (есть там и такое) принять как объективную реальность. Или написАть свою нетленку. Флаги с барабанами. Их есть.

(33) в (31)я взяла из книги «Описание встроенного языка». А в какой вы книге прочитали, то, что указали в (28)?

Циклы в 1С 8.3

В платформе 1С 8.3 существует три вида циклов. Это циклы «Для Цикл», «Для каждого Цикл» и «Пока Цикл». При помощи циклов «Для Цикл» и «Пока Цикл» можно осуществлять цикличное повторение произвольных операторов. А цикл «Для каждого Цикл» необходим для обхода коллекций значений (массивов, таблиц значений и т.п.). В этой статье на разберем простые примеры всех трёх видов циклов.

Цикл «Для Цикл»

Разберем самый простой вид цикла. Этот цикл имеет следующий синтаксис.

Для НазваниеПерем = СчетчНачало по СчетчКонец Цикл Операторы> КонецЦикла; 

В этом цикле, переменной НазваниеПерем в самом начале присваивается выражение СчетчНачало, которое имеет числовое значение (целое число). Потом, в каждой итерации цикла переменная НазваниеПерем увеличивается на 1. Цикл будет выполняться пока переменная НазваниеПерем меньше или равно переменной СчетчКонец.

СчетчНачало и СчетчКонец могут быть как числами, так и переменными с типом число.

Для н = 1 по 100 Цикл Операторы> КонецЦикла; 
Нач = 1; Кон = 100; Для н = Нач по Кон Цикл Операторы> КонецЦикла; 

Причем СчетчНачало может быть меньше нуля.

Для н = -100 по 100 Цикл Операторы> КонецЦикла; 

Чтобы цикл корректно работал СчетчНачало должно быть меньше СчетчКонец.

Такой код будет не корректен!!

Для н = 100 по -100 Цикл Операторы> КонецЦикла; 

С этим циклом удобно работать, когда нам нужно линейно заполнить какие-нибудь величины. Например, заполним массив в 1С цифрами от -3 до 3.

массивЦифр = Новый Массив; Для н = -3 до 3 Цикл массивЦифр.Добавить(н); КонецЦикла; 

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

Для н = 0 по массивЦифр.ВГраница() Цикл ЭлементМассива = массивЦифр[н]; КонецЦикла; 

Цикл «Пока Цикл»

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

Данный цикл имеет следующий синтаксис

Пока ЗначениеВыражения Цикл Операторы>; КонецЦикла; 

ЗначениеВыражения – какое-то логическое выражение. Пока это выражение истинно, то операторы цикла будут выполняться. Если выражение принимает значение Ложь, то цикл прекращается.

При помощи данного цикла можно делать различные нестандартные обходы. Например, выше мы заполнили массив цифрами начиная от -3 до 3, но циклом «Для Цикл» мы не можем заполнить массив цифрами от 3 до -3. Но, мы можем это сделать при помощи цикла «Пока Цикл»

Массив = Новый Массив; НачЗначение = 3; КонЗначение = - 3; ТекЗнач = НачЗначение; Пока ТекЗнач >= КонЗначение Цикл Массив.Добавить(ТекЗнач); ТекЗнач = ТекЗнач - 1; КонецЦикла; 

Этот цикл можно также использовать, когда нужно что-то заполнить датами.

Массив = Новый Массив; НачЗначение = '20100101'; КонЗначение = '20100131'; ТекЗнач = НачЗначение; Пока ТекЗнач = КонЗначение Цикл Массив.Добавить(ТекЗнач); ТекЗнач = ТекЗнач + 24*3600; КонецЦикла; 

В этом коде мы заполняем массив датами, начиная с 1 января и заканчивая 31 января.

Цикл «Для каждого Цикл»

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

Этот цикл имеет следующий синтаксис:

Для Каждого ЭлементКоллеции из КакаяТоКоллекция цикл Операторы> КонецЦикла 

Переменной ЭлементКоллекции присваивает очередное значение элемента коллекции.

Например, если мы напишем вот такой код.

Массив1 = Новый Массив; Массив1.Добавить(100); Массив1.Добавить(45); Массив1.Добавить(1000); Для Каждого элМассива из Массив1 Цикл КонецЦикла; 

То при первом обходе переменная ЭлМассива будет равна 100, при втором — 45, а при третьем – 1000.

Это массив, у него, по сути, каждый элемент это значение какого-то типа, а если будет обход более сложной коллекции? Например, таблицы значений. В том случае, если будет обход таблицы, значений, то в переменной ЭлементКоллекции будет содержать очередная строка этой таблицы значений. Мы можем получить значение колонок в этой строке через оператор «.».

Пример в этом коде

ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("НазваниеУслуги"); ТЗ.Колонки.Добавить("Сумма"); СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.НазваниеУслуги = "За ремонт"; СтрокаТЗ.Сумма = 100; СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.НазваниеУслуги = "Транспортные"; СтрокаТЗ.Сумма = 1000; Для Каждого стрТЗ из ТЗ Цикл Сообщить("------------"); Сообщить("Название услуги: " + стрТЗ.НазваниеУслуги); Сообщить("Сумма: " + стрТЗ.Сумма); КонецЦикла 

И результат работы этого кода

Обход циклом Для каждого цикл

Прервать цикл 1С

Иногда возникают такие ситуации, когда нужно из цикла выйти. Сделать это можно при помощи оператора Прервать. Этот оператор применим ко всем тремя видам циклов.

Для НазваниеПерем = СчетчНачало по СчетчКонец Цикл Операторы> Прервать; Операторы> КонецЦикла; 

После выполнения этого оператора Прервать все последующие операторы в теле цикла не выполняются, и следующим выполняется оператор после ключевого слова КонецЦикла.

Рассмотрим следующий пример.

Для Счетчик = - 5 по 5 Цикл Если Счетчик = 0 Тогда Прервать; КонецЕсли; Х = 1/Счетчик; КонецЦикла; 

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

Продолжить цикл 1С

А есть ситуации, когда нам не нужно выходить из цикла, но и не нужно продолжать текущую итерацию. Помочь нам в этом может оператор Продолжить. Этот оператор также применим ко всем тремя видам циклов.

Для НазваниеПерем = СчетчНачало по СчетчКонец Цикл Операторы> Продолжить; Операторы> КонецЦикла; 

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

Рассмотрим такой пример.

Для Счетчик = - 5 по 5 Цикл Если Счетчик = 0 Тогда Продолжить; КонецЕсли; Х = 1/Счетчик; КонецЦикла; 

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

Более подробно и основательно начальные вопросы программирования в 1С есть в моей книге:

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Перехват исключений в коде

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. В общем случае не рекомендуется перехватывать исключения. В частности не нужно перехватывать исключения только ради выдачи сообщения об ошибке. Необработанное исключение в любом случае будет выдано пользователю в виде сообщения об ошибке (а также будет автоматически записано в журнал регистрации для администратора и отправлено в сервис регистрации ошибок).

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

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

3. Частные случаи некорректного использования и перехвата исключений.

Область применения (уточнение): управляемое приложение, обычное приложение.

3.1. Если имеется некоторая серверная бизнес-логика, которая вызывается с клиента при интерактивной работе пользователя:

&НаСервере
Процедура ВыполнитьОперацию()
// код, приводящий к вызову исключения
.
КонецПроцедуры

то неправильно маскировать от пользователя и администратора исходную проблему:

// на клиенте
Попытка
ВыполнитьОперацию();
Исключение
ПоказатьПредупреждение(,НСтр(«ru = ‘Операция не может быть выполнена.'»));
КонецПопытки;

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

и тогда на клиенте:

Попытка
ВыполнитьОперацию();
Исключение
ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ПоказатьПредупреждение(,НСтр(«ru = ‘Операция не может быть выполнена по причине:'») + Символы.ПС + ТекстСообщения);
КонецПопытки;

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

3.2. Не следует анализировать текст исключений с целью интерпретации причины ошибки. Текст исключения может меняться в зависимости от локализации. В условиях отсутствия штатных средств (например, типизированных исключений), следует выдавать пользователю тексты исключений «как есть». Для понятности, его можно дополнить пояснением возможных причин.
Например:

Попытка
ЗагрузитьФайлИзИнтернета(. );
Исключение
ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстСообщения = НСтр(«ru = ‘Не удалось загрузить файл:'») + Символы.ПС + ТекстСообщения + Символы.ПС + НСтр(«ru = ‘Возможные причины:
• Нет подключения к Интернету;
• На веб-узле возникли неполадки;
• Брандмауэр или другое промежуточное ПО (антивирусы и т.п.) блокируют попытки программы подключиться к Интернету;
• Подключение к Интернету выполняется через прокси-сервер, но его параметры не заданы в программе.'»);
ПоказатьПредупреждение(,ТекстСообщения);
КонецПопытки;

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

КодОшибки = ЗагрузитьФайлИзИнтернета(. );
Если КодОшибки = 12345 Тогда
.
ИначеЕсли .

правильно применять строковые литералы (например, «Успешно», «НетМестаНаДиске», «Отменено» и т.п.):

РезультатЗагрузки = ЗагрузитьФайлИзИнтернета(. );
Если РезультатЗагрузки = «Успешно» Тогда
.
ИначеЕсли .

Строковые литералы кодов ошибок не локализуются.

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

3.3. Если имеется некоторая клиентская бизнес-логика (код выполняется полностью на клиенте):

&НаКлиенте
Процедура СоздатьФайлНаДиске()
// код, приводящий к вызову исключения
.
КонецПроцедуры

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

Попытка
// клиентский код, приводящий к вызову исключения
СоздатьФайлНаДиске();
Исключение
ТекстСообщения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ПоказатьПредупреждение(,НСтр(«ru = ‘Операция не может быть выполнена по причине:'») + Символы.ПС + ТекстСообщения);
ЗаписатьОшибкуРаботыСФайлами(ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;

3.4. Недопустимо перехватывать любые исключения, бесследно для системного администратора:

Попытка
// код, приводящий к вызову исключения
.
Исключение // перехват любых исключений
КонецПопытки;

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

Попытка
// код, приводящий к вызову исключения
.
Исключение
// Пояснение причин перехвата всех исключений «незаметно» от пользователя.
// .
// И запись события в журнал регистрации для системного администратора.
ЗаписьЖурналаРегистрации(НСтр(«ru = ‘Выполнение операции'»),
УровеньЖурналаРегистрации.Ошибка.
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

3.5. Неприемлемо в событиях ПриЗаписи , ПередЗаписью , ПередУдалением , ОбработкаПроведения , ОбработкаПроверкиЗаполнения и т.п. вызывать исключения для выдачи останавливающих предупреждений, которые должен отработать пользователь. Вместо этого следует устанавливать параметр Отказ в значение Истина и выводить сообщения пользователю. Тем самым пользователь увидит все блокирующие причины остановки сразу, а не по очереди.

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

Процедура ПередЗаписью(Отказ)
Если Не ЗарегистрироватьИзмененияНаУзлахПлановОбмена() Тогда
ВызватьИсключение НСтр(«ru = ‘Не удалось зарегистрировать изменения на узлах планов обмена. Обратитесь к администратору.'»);
КонецЕсли;
.
КонецПроцедуры

Подробнее см. пп. 1.1 и 1.3 стандарта Информирование пользователя.

3.6. Недопустимо делать проверки наличия у объекта реквизитов, методов, макетов и т.п., используя для этого исключения, т.к. это может привести к сложно диагностируемым ошибкам, а также затрудняет отладку в режиме «Останавливаться по ошибке».
Вместо перехвата исключений в этом случае рекомендуется:

  • использовать механизмы работы с метаданными, чтобы явным образом проверять наличие или отсутствие реквизита (макета и т.п.);
  • если различия связаны с особенностями встраивания библиотек – описывать особенности явным образом в переопределяемых модулях (см. Переопределяемые и поставляемые объекты);
  • пересмотреть логику работы методов, использующих перехват исключений. Например, можно предусмотреть параметры, которые определяются в вызывающем коде и указывают нужно или нет обращаться к какому-либо методу или свойству объекта.

Попытка
КонтекстЭДОСервер.ПолучитьМакет(«КомпонентаОбмена»);
ПутьВК = КонтекстЭДОСервер.ПутьКОбъекту + «.Макет.КомпонентаОбмена»;
Исключение
КонецПопытки;

МакетКомпонентыОбмена = КонтекстЭДОСервер.Метаданные().Макеты.Найти(«КомпонентаОбмена»);
Если МакетКомпонентыОбмена <> Неопределено Тогда
ПутьКМакету = КомпонентаОбмена.ПолноеИмя()
КонецЕсли;

3.7. Порядок обработки исключений при использовании транзакций описан в стандарте Транзакции: правила использования.

3.8. Неправильно использовать исключения для приведения значения к типу. Для таких операций необходимо использовать возможности объекта ОписаниеТипов .

Попытка
КоличествоДнейРазрешения = Число(Значение);
Исключение
КоличествоДнейРазрешения = 0; // значение по умолчанию
КонецПопытки;

ОписаниеТипа = Новый ОписаниеТипов(«Число»);
КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(Значение);

См. также

  • Информирование пользователя
  • Работа с параметром «Отказ» в обработчиках событий
  • Сообщения пользователю

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *