1с ошибка зацикливание уровней
В чем суть этого оператора? В ходе выполнения программы часто могут возникать ошибки, такие как деление на ноль, корень из отрицательного числа и прочие. Эти ошибки приводят к «крушению» программы – это значит, что программа прекратит свою работу и ни какие операторы после ошибки выполняться не будут. Чтобы обойти исключительную ситуацию и продолжить выполнение программы, в языке программирования 1С существует оператор Попытка…Исключение.
Рассмотрим его синтаксис.
Попытка
//операторы попытки
Исключение
//операторы исключения.
КонецПопытки
Разберем этот синтаксис.
Ключевое слово Попытка открывает список операторов, выполнение которых может привести к исключительной ситуации, все операторы между ключевыми словами Попытка и Исключение это Операторы попытки.
Ключевое слово Исключение открывает список операторов, которые будут выполняться в том случае, если вызвана исключительная ситуация операторами попытки. Т.е. если во время выполнения программы один из операторов попытки вызвал ошибку выполнения программы (исключительную ситуацию), то выполнение данного оператора прерывается и управление передается на первый Оператор исключения. Причем обращаю Ваше внимание, что управление будет передано и в том случае, если исключительную ситуацию вызвали функции и процедуры, разработанные программистом и применяемые в качестве операторов попытки. Естественно, что если ошибка произошла в процедуре или функции, то ее выполнение будет прервано.
Описание ошибки в 1С
В коде выше я использовал собственное выражение для описания ошибки, но можно использовать метод ОписаниеОшибки(), который возвращается описание ошибки с точки зрения разработчиков платформы 1С. Это функция, которая возвращает текст с описанием ошибки. Например, код выше можно переделать так:
Тогда, при выполнении выйдет «стандартизированное» описание ошибки.
Оператор ВызватьИсключение в 1С
Оператор ВызватьИсключение можно использовать отдельно для «эмуляции» вызова исключение. Например, при выполнении этой команды формы:
Будет вызвано исключение.
Причём, в открывавшемся окне можно посмотреть место в коде, где было вызвано исключение.
Попытка внутри попытки в 1С
В платформе 1С 8.3 можно один оператор попытки разместить в другом операторе. Например, на управляемой форме обработки разместим несколько реквизитов с типом Число.
И по команде с формы попытаемся вычислить корень из каждого реквизита, при этом сделаем это в двух вложенных операторах попытки.
И результат работы этой обработки:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
почему то всегда считал, что это проверяется платформой при записи. при переносе в другую группу и т.д.
Сам не понимаю из-за чего это возникло, может проблема возникла из-за обмена через распределенную базу.
у меня сейчас нету этой базы она на работе, не факт что она именно так зациклилась может и подругому как нибудь
делаешь копию, потом в конфигураторе убираешь иерархию, потом по com-у востанавливаешь нормальные ветки
логично это попробую обязательно. Я боюсь что не получиться. Повиснет наверно 1с-ка. У кого нибудь была такая проблема или нет ?
Такая проблема была при переносе из 7.7. Лечилось + обработку написал за 5 минут по очистке родителей таких.
отлично тогда с этого и начну. Спасибо за подсказку. А то я хотел снова пробовать запускать тестирование и исправление.
ну так 27 и есть главный . дятел. или очистка (элементы слетят в корень) или запись туда выбранного родителя - вполне исправят ситуацию
Тсссс, молчи.. А то придет Сержант 1С и банным веником гонять тебя будет. Опять потом психосексуальные комплексы залечивать будешь..
наверно запрос будет примерно такой: Номенклатура.Ссылка ИЗ только есть у меня сомнение, что удасть переписать такие элементы, хотя попробовать стоит
А если зацикливание "через уровень" идет? :) З.Ы. Платформа такие вещи дает записать "на раз": Объект.ОбменДаными.Загрузка = Истина и не такие чудеса творит.
если через уровень? в 34 тогда правильней условие такое "(Номенклатура.Родитель.Уровень+1) >= Номенклатура.Уровень"
може и не будет, не знаю, но вообще я от зацикливания справочников (правда по реквизиту в ТЧ) боролся :) и обычно оно гдето через 2-3 уровня появляеться
И как получилось побороть ? Почему сомнения что удасться побороть такие элементы ? И как тогда бороться если не даст их перезаписать ?
если не даст переписать, то или прямым запросом (но восьмерку я прямыми не ковырял), или попробовать через загрузку, или .
Была такая хрень - неправильно перенес справочники из 7.7, вот и закольцевал группы номенклатуиы - хорошо хоть сразу обработку написал,если надо могу скинуть
". З.Ы. Платформа такие вещи дает записать "на раз": Объект.ОбменДаными.Загрузка = Истина и не такие чудеса творит." Выходит, что платформа - гавно, причем гавно большое.
Тебя послушать, так выходит что "format c:" - самое большое "зло". И того кто "это" придумал - повесить мало.
Я сталкивался с "зацикливанием" - не так все просто :( - одним запросом не отделаешься :( И группы "зацикливаются" через один-два-несколько уровней, - и номенклатура может оказаться "родителем". Как ловить тогда все "кольца"? Имхо: в цикле для каждой номенклатуры перебираем родителей с подсчетом их количества и запоминаем в списке значений. Как только количество родителей и количество в списке перестанет быть равным - список пользователю показать - пусть сам решает где надо рвать "кольцо". Перебор, конечно, не самое лучшее решение. Но это лучше, чем пытать составить "красивое" решение исходя из представления "а как это может быть".
Петя, ты в снеговике много работал? :) Вообще, такое "зацикливание", ИМХО - проблема логики, а не платформы.
На мой взгляд, более корректно, если подобные операции шли бы в транзакции и при подобных ошибках после выдачи диагностики шел бы откат транзакции (зачем вносить явно ошибочные действия в наши данные?)
Так я вроде описал :-)
"Типовой" ЗУП 2.5 в котором (ну так получилось исторически) полный бардак в Справочнике ПодразделенияОрганизаций (хотя не только в нём), т.е. есть куча "двойников" в элементах справочников подразделения (причем часть сотрудников числится в одном "близнеце", а часть в другом). Причем есть ещё и "вложенность", ну типа в филеале есть подразделение "Руководство", которому подчинёно подразделение "Руководство".
Итак, имеем элементы справочника Руководство_001, у которого в качестве родителя есть элемент справочника Руководство_002
Запускаем твою обработку (кстати, классная обработка и большое тебе за это спасибо) чтобы заменить ненужное Руководство на "единое и правильное". К сожалению получаем, что у элемента Руководство он сам у себя является родителем.
И конфа начинает сходить с ума, например при записи элемента справочника Подразделение_НьюВасюки, влетает в бесконечный цикл в функции
// Возвращает выборку со значениями реквизитов переданной ссылки
//
Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| " + ИменаРеквизитов + "
|ИЗ
| " + Ссылка.Метаданные().ПолноеИмя() + " КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Результат = Новый Структура(ИменаРеквизитов);
ЗаполнитьЗначенияСвойств(Результат, Выборка);
Где в качестве ссылки идёт наш кривой элемент (хотя мы и пишем совсем иную сущность), а ИмяРеквизитов - "Родитель".
Короче, моё предложение - если есть явная ошибка при замене (и программа это "знает"), то делать откат транзакции и не пугать бедных программистов 1С :-)
При обновлении с 19 на 22.11 релиз возникает ошибка "Зацикливание уровней". Ошибка возникает уже при принятии изменений в пользовательском режиме примерно на 62%. Написал обработку на выявления справочников которые могут быть подчинены друг другу, но ничего не нашел. Может кто-то встречался с подобным? Скриншот прилагаю.
Вложения:
3318
954
380
153
3318
954
390
52
1. Если смотреть на типовые конфигурации, то такого не замечал ни разу. Там устаревшие объекты не удаляются, а просто переименовываются в неиспользуемые. В ваших конфигурациях это не так?
2. Всегда было любопытно, а как работает автоматическое обновление в таком случае (когда пропущено несколько обновлений)? Оно последовательно запускает программу в режиме 1С:Предприятие после каждого промежуточного релиза?
3318
954
1. Если смотреть на типовые конфигурации, то такого не замечал ни разу. Там устаревшие объекты не удаляются, а просто переименовываются в неиспользуемые. В ваших конфигурациях это не так?
2. Всегда было любопытно, а как работает автоматическое обновление в таком случае (когда пропущено несколько обновлений)? Оно последовательно запускает программу в режиме 1С:Предприятие после каждого промежуточного релиза?
По п.1 Ага, переименовываются в "Удалить. ", а через пару релизов удаляются. Особенно часто это происходит в объектах библиотеки БСП. Мое дело предупредить, а решение принимает тот, кто обновляет
390
Я продолжаю изучать ознакомительную версию платформы 1С 8.3.10. И эта моя статья будет посвящена циклическим ссылкам.
Для тех кто не в курсе, проведу небольшой ликбез по теме циклических ссылок. Циклическая ссылка возникает тогда, когда какой-то объект ссылается на самого себя. Это может приводить к различным проблемам в плане производительности, в частности утечки памяти.
Приведем пример циклической ссылки: в обработке 1С, на сервере создадим массив, в один из его элементов будем записывать структуру, которая будет содержать этот массив.
Это будет такой код:
&НаСервере
Процедура ТестНаСервере ()
Массив = Новый Массив ;
Массив . Добавить ( «ПервыйЭлемент» );
Массив . Добавить ( 1 );
Структура = Новый Структура ;
Структура . Вставить ( «Первый» , «ПервыйЭлемент» );
Структура . Вставить ( «Второй» , Массив );
Массив . Добавить ( Структура );
КонецПроцедуры
&НаКлиенте
Процедура Тест ( Команда )
ТестНаСервере ();
КонецПроцедуры
Если мы сейчас сделаем проверку синтаксиса, то ни каких ошибок не будет.
Но повторяюсь, такой или подобный код крайне нежелателен. Если мы будем его запускать в открытой форме, то память, которую будут использовать эти данные, не будет очищаться при закрытии формы, и при каждом открытии формы будет накапливаться и накапливаться. В результате такой работы программы или произойдет аварийный выход, или приложение будет «съедать» очень много памяти. Понятно чем грозит это в дальнейшем — 1С: Предприятие будет ужасно тормозить, обработка, где написан такой код будет очень долго открываться или не откроется совсем.
Что бы таких проблем не было, в платформе 1С 8.3.10 разработчики реализовали проверку циклических ссылок. Было разработано несколько механизмов проверок циклических ссылок, мы разберем некоторые из них.
Самый простой способ, это возможность проверки наличия циклических ссылок при работе приложения. Для этого эту проверку нужно включить – необходимо в настройках конфигуратора 1С установить флажок «Проверка циклических ссылок встроенного языка» (Сервис – Параметры – Запуск 1С: Предприятия – Дополнительные)
Если мы запустим написанный выше код с включенным параметром «Проверка циклических ссылок встроенного языка», то 1С: Предприятие выдаст ошибку.
Этот способ очень удобен, когда Вы ведете отладку приложения. Но этот способ не всегда удобен, если необходимо контролировать циклический ссылки при разработке нескольких конфигураций, т.к. в каждой базе нужно будет устанавливать этот параметр.
В этом случае гораздо удобнее изменить файл conf.cfg (у меня он находится в каталоге C:\Program Files (x86)\1cv8\conf)
В этот файл необходимо добавить следующую строку
тогда у любой базы, запускаемой под платформой 1С 8.3.10, при работе будет осуществляться проверка циклических ссылок.
Что бы проверить цикличность ссылок на стороне сервера, когда используется клиент-серверный вариант работы, то необходимо запустить сервер с ключом /EnableCheckScriptCircularRefs
И как Вы заметили по предыдущей картинке в случае включенной проверки на цикличность ссылок, работа приложения будет завершена. Иногда это может вызывать проблемы со стороны пользователей. Для того что бы работа продолжалась можно или использовать технологический журнал со специальными настройками, или разработчику использовать метод глобального контекста
Когда будет вызван данный метод, проверятся все локальные переменные доступные в это время. То есть, если мы в нашей процедуре ТестНаСервере() применим этот метод, то он вернет заполненную таблицу значений ЦиклическиеСсылки (о ней позже).
&НаСервере
Процедура ТестНаСервере ()
Массив = Новый Массив ;
Массив . Добавить ( «ПервыйЭлемент» );
Массив . Добавить ( 1 );
Структура = Новый Структура ;
Структура . Вставить ( «Первый» , «ПервыйЭлемент» );
Структура . Вставить ( «Второй» , Массив );
Массив . Добавить ( Структура );
ЦиклическиеСсылки = ПроверитьЦиклическиеСсылкиВстроенногоЯзыка ();
КонецПроцедуры
А если Мы его применим в любом другом месте кода:
То таблица ЦиклическиеСсылки будет пустая.
Таким образом можно сделать вывод, что метод носит узконаправленный характер и может пригодиться только для отладки небольшого куска кода. Нельзя его использовать для проверки конфигурации в целом. Разработчики платформы рекомендуют его использовать только для отладки, т.к. этот метод очень сильно загружает 1С: Предприятие
Теперь вернемся к таблице значений ЦиклическиеСсылки и посмотрим что она возвращает.
Для этого я поставлю точку останова на конце процедуры ТестНаСервере, а потом раскрою таблицу значений в таблоКак видно у таблицы значений две колонки – «ОписаниеЗначения» (тип строка) и «ЭлементыЦиклическихСсылок» (тип Массив).
В первой колонке содержится название переменной, где найдена циклическая ссылка. А вот вторая колонка, где массив, интереснее. Посмотрим на рисунках что в составе этого массива.
В этом массиве содержатся строки цикла ссылок, разделенные запятым. Разберем на примере строки с массивом (первый рисунок). Первое значение строки – сама переменная с которой все начинается, второе значение Массив[2] – элемент переменной, который ведет к зацикливанию, в нашем случае это Массив.Добавить(Структура), а последняя строка – переменная на которую вышел цикл, т.е. опять Массив.
Поэтому с этим методом очень удобно отлаживать код программы, что бы узнать, где и когда у нас пошло зацикливание.
На этом я закончу изучать работу с циклическими ссылками, если Вам что не понятно, то пишите в комментариях к этой статье, и мы вместе постараемся разобрать возникшие вопросы.
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Читайте также: