26.02.2025 Максим Овечёнков 2316
Рекурсия 1С

Содержание:

1.     Пример рекурсивного вызова в 1С

2.     Проблемы бесконечной рекурсии

3.     Условия выхода из рекурсии

4.     Использование счетчика для контроля глубины рекурсии  


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


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


1.     Пример рекурсивного вызова в 1С


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


Процедура ОбходПодразделений(ТекущаяГруппа)

    // Печатаем наименование текущей группы

    Сообщить(ТекущаяГруппа.Наименование);

   

    // Рекурсивный вызов для каждого подразделения в группе

    Для Каждого Подразделение Из ТекущаяГруппа.Подразделения Цикл

        ОбходПодразделений(Подразделение);

    КонецЦикла;

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


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


2.     Проблемы бесконечной рекурсии


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


Процедура ПриСменеСтраницы()

    // Устанавливаем текущую страницу панели

    Панель.СменитьАктивнуюСтраницу(ТекущаяСтраница);

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


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


3.     Условия выхода из рекурсии


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


Процедура ОбходГруппы(ТекущаяГруппа)

    // Условие выхода из рекурсии

    Если ТекущаяГруппа = Неопределено Тогда

        Возврат;

    КонецЕсли;

   

    // Печать текущего подразделения

    Сообщить(ТекущаяГруппа.Наименование);

   

    // Рекурсивный вызов для подгрупп

    Для Каждого Подразделение Из ТекущаяГруппа.Подразделения Цикл

        ОбходГруппы(Подразделение);

    КонецЦикла;

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

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


4.     Использование счетчика для контроля глубины рекурсии


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


Процедура ОбходПодразделений(ТекущаяГруппа, Уровень)

    // Ограничение на максимальную глубину рекурсии

    Если Уровень > 10 Тогда

        Сообщить("Превышено максимальное количество уровней рекурсии.");

        Возврат;

    КонецЕсли;

   

    // Печать текущего подразделения

    Сообщить(ТекущаяГруппа.Наименование);

   

    // Рекурсивный вызов для подгрупп

    Для Каждого Подразделение Из ТекущаяГруппа.Подразделения Цикл

        ОбходПодразделений(Подразделение, Уровень + 1);

    КонецЦикла;

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


В данном примере параметр Уровень отслеживает количество уровней рекурсии. Если оно превышает установленный лимит (например, 10), выполнение прекращается. Это предотвратит переполнение стека и вызовет завершение работы рекурсии до того, как система выйдет из строя.


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

 

Специалист компании ООО "Кодерлайн"

Максим Овечёнков


Наши проекты

Внедрение 1С:Управление торговлей в оптово-розничной компании «Ална-Байк»
ИП Титов Виктор Сергеевич «Ална-Байк»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

- Управление складами;
- Управление заказами поставщиков;
- Управление зак...

ООО "РУКАРД-АУРА"
ООО "РУКАРД-АУРА"

Отрасль:
Профессиональные услуги

Внедренное типовое решение:
1С:Комплексная автоматизация

- Налоговый учет;...

АО «Вертолетная сервисная компания»
АО «Вертолетная сервисная компания»

Отрасль:
МТО эксплуатации вертолетной техники

Внедренное типовое решение:
1С:Бухгалтерия КОРП

- Консультации по сложным вопросам налогового и бухгалтерского учета;
- Ра...

Внедрение блока бухгалтерского учета «1С:Управление производственным предприятием»
ОАО «Издательство «Просвещение»

Отрасль:
Производство

Внедренное типовое решение:
1С:Управление производственным предприятием

Бухгалтерский учет:
- Завершение периода;
- Регламентированная отчетнос...

ООО “РТИТС”
ООО “РТИТС”

Отрасль:
Транспортные системы

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Блок регламентированного кадрового учета и расчета заработной платы в 1С:ERP;...

ПАО «АрселорМиттал Кривой Рог»
ПАО «АрселорМиттал Кривой Рог»

Отрасль:
Металлургическая промышленность

Внедренное типовое решение:
1С:Управление производственным предприятием для Украины

- Кадровый учет
- Расчет зарплаты
- Регламентированная отчетность
- Уч...

ЗАО «Многопрофильная формирующая авиагруппа» (ЗАО МФГ)
ЗАО «Многопрофильная формирующая авиагруппа» (ЗАО МФГ)

Отрасль:
Оптовая торговля транспортными средствами и оборудованием

Внедренное типовое решение:
1С:Бухгалтерия ПРОФ

- Финансы, управленческий учет, мониторинг показателей
- Бухгалтерский уче...

 ЗАО "Инвестгеосервис" -ДО
ЗАО «Инвестгеосервис»

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:Документооборот КОРП

- Работа с файлами;
- Делопроизводство;
- Процессы движения документов; ...

ООО «Фипар»
ООО «Фипар»

Отрасль:

Внедренное типовое решение:
1С:Предприятие 8. ERP Управление предприятием 2

Специалисты «Кодерлайн» внедрили «1С:ERP. Управление предприятием 2» и автома...

ООО «ЛИГА-ТРАНС»
ООО «ЛИГА-ТРАНС»

Отрасль:
Профессиональные услуги, бытовое обслуживание

Внедренное типовое решение:
«1С:ERP Управление предприятием 2.1».

- Сделано ТЗ по автоматизации учета МСФО: - Разработана карта бюджета доходо...

ООО «Экслтрейд»
ООО «Экслтрейд»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

Оформление заказов поставщикам Оптовая торговля Торговые операции ...

ООО «Иви.ру»
ООО «Иви.ру»

Отрасль:
Медиаиндустрия

Внедренное типовое решение:
1С:Управление корпоративными финансами

Подсистема казначейства
Модуль бюджетного контроля по ДДС ...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение