1С Платформа 8.3.10: Проверка циклических ссылок

Я продолжаю изучать ознакомительную версию платформы 1С 8.3.10. И эта моя статья будет посвящена циклическим ссылкам.
Для тех кто не в курсе, проведу небольшой ликбез по теме циклических ссылок. Циклическая ссылка возникает тогда, когда какой-то объект ссылается на самого себя. Это может приводить к различным проблемам в плане производительности, в частности утечки памяти.


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

&НаСервере
Процедура ТестНаСервере()
Массив = Новый Массив;
Массив.Добавить(«ПервыйЭлемент»);
Массив.Добавить(1);
Структура = Новый Структура;
Структура.Вставить(«Первый»,«ПервыйЭлемент»);
Структура.Вставить(«Второй»,Массив);
Массив.Добавить(Структура);
КонецПроцедуры
&НаКлиенте
Процедура Тест(Команда)
ТестНаСервере();
КонецПроцедуры

Если мы сейчас сделаем проверку синтаксиса, то ни каких ошибок не будет.
Но повторяюсь, такой или подобный код крайне нежелателен. Если мы будем его запускать в открытой форме, то память, которую будут использовать эти данные, не будет очищаться при закрытии формы, и при каждом открытии формы будет накапливаться и накапливаться. В результате такой работы программы или произойдет аварийный выход, или приложение будет «съедать» очень много памяти. Понятно чем грозит это в дальнейшем — 1С: Предприятие будет ужасно тормозить, обработка, где написан такой код будет очень долго открываться или не откроется совсем.
Что бы таких проблем не было, в платформе 1С 8.3.10 разработчики реализовали проверку циклических ссылок. Было разработано несколько механизмов проверок циклических ссылок, мы разберем некоторые из них.
Самый простой способ, это возможность проверки наличия циклических ссылок при работе приложения. Для этого эту проверку нужно включить – необходимо в настройках конфигуратора 1С установить флажок «Проверка циклических ссылок встроенного языка» (Сервис – Параметры – Запуск 1С: Предприятия – Дополнительные)

Если мы запустим написанный выше код с включенным параметром «Проверка циклических ссылок встроенного языка», то 1С: Предприятие выдаст ошибку.


Этот способ очень удобен, когда Вы ведете отладку приложения. Но этот способ не всегда удобен, если необходимо контролировать циклический ссылки при разработке нескольких конфигураций, т.к. в каждой базе нужно будет устанавливать этот параметр.
В этом случае гораздо удобнее изменить файл conf.cfg (у меня он находится в каталоге C:\Program Files (x86)\1cv8\conf)
В этот файл необходимо добавить следующую строку

EnableCheckScriptCircularRefs=true,

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

ПроверитьЦиклическиеСсылкиВстроенногоЯзыка()

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

&НаСервере
Процедура ТестНаСервере()
Массив = Новый Массив;
Массив.Добавить(«ПервыйЭлемент»);
Массив.Добавить(1);
Структура = Новый Структура;
Структура.Вставить(«Первый»,«ПервыйЭлемент»);
Структура.Вставить(«Второй»,Массив);
Массив.Добавить(Структура);
ЦиклическиеСсылки = ПроверитьЦиклическиеСсылкиВстроенногоЯзыка();
КонецПроцедуры

А если Мы его применим в любом другом месте кода:

&НаСервере
Процедура ПроверитьНаСервере()
ЦиклическиеСсылки = ПроверитьЦиклическиеСсылкиВстроенногоЯзыка();
КонецПроцедуры
&НаКлиенте
Процедура Проверить(Команда)
ПроверитьНаСервере();
КонецПроцедуры

То таблица ЦиклическиеСсылки будет пустая.

Таким образом можно сделать вывод, что метод носит узконаправленный характер и может пригодиться только для отладки небольшого куска кода. Нельзя его использовать для проверки конфигурации в целом. Разработчики платформы рекомендуют его использовать только для отладки, т.к. этот метод очень сильно загружает 1С: Предприятие
Теперь вернемся к таблице значений ЦиклическиеСсылки и посмотрим что она возвращает.
Для этого я поставлю точку останова на конце процедуры ТестНаСервере, а потом раскрою таблицу значений в таблоКак видно у таблицы значений две колонки – «ОписаниеЗначения» (тип строка) и «ЭлементыЦиклическихСсылок» (тип Массив).
В первой колонке содержится название переменной, где найдена циклическая ссылка. А вот вторая колонка, где массив, интереснее. Посмотрим на рисунках что в составе этого массива.

В этом массиве содержатся строки цикла ссылок, разделенные запятым. Разберем на примере строки с массивом (первый рисунок). Первое значение строки – сама переменная с которой все начинается, второе значение Массив[2] – элемент переменной, который ведет к зацикливанию, в нашем случае это Массив.Добавить(Структура), а последняя строка – переменная на которую вышел цикл, т.е. опять Массив.
Поэтому с этим методом очень удобно отлаживать код программы, что бы узнать, где и когда у нас пошло зацикливание.
На этом я закончу изучать работу с циклическими ссылками, если Вам что не понятно, то пишите в комментариях к этой статье, и мы вместе постараемся разобрать возникшие вопросы.

Книга «Программировать в 1С за 9 шагов»

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

  1. Без сложных технических терминов.
  2. Более 500 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга написана понятным и простым языком — для новичка.
  6. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 16%: vCph8bW3rE

Поддержите мой проект перечислив любую сумму:

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

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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

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

пять + 20 =