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

Содержание:

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

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

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

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


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


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


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


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


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

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

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

   

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

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

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

    КонецЦикла;

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


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


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


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


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

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

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

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


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


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


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


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

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

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

        Возврат;

    КонецЕсли;

   

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

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

   

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

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

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

    КонецЦикла;

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

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


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


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


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

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

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

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

        Возврат;

    КонецЕсли;

   

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

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

   

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

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

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

    КонецЦикла;

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


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


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

 

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

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


Наши проекты

ФГУП «Почта России»
ФГУП «Почта России»

Отрасль:
Почта, доставка

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

- Оформление заказов поставщикам
- Оформление заказов покупателей
- Упр...

Автоматизация интеграции с информсистемами клиентов на базе «1С:Предприятие 8. WMS Логистика. Управление складом»
ОАО «Фрейт Линк»

Отрасль:
Логистика и грузоперевозки

Внедренное типовое решение:
«1С:Предприятие 8. WMS Логистика. Управление складом»

– Управление складскими запасами;
– Оформление заказов покупателей;
– ...

ОАО «Фаберлик»
ОАО «Фаберлик»

Отрасль:

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

- Регламентированный учет;
- Кадровый учет;...

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

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

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

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

Внедрение системы финансового учета БИТ:Финанс
ООО «Алькор и Ко» (Л’Этуаль)

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

Внедренное типовое решение:
БИТ.Финанс

- Финансовый учет;
- Поддержка проекта внедрения МСФО;
- Регламентные рабо...

Автоматизации бизнес-процессов учета и планирования на базе «1С:ERP Управление предприятием 2.0»
ООО «Буровая сервисная компания «ГРАНД»

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

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

- Создание полноценной управленческой системы взамен существующих
- Внедр...

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

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

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

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

ХИТЕК-ГРУП
ХИТЕК-ГРУП

Отрасль:
Продажа парикмахерского инструмента и аксессуаров

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

Документооборот (ECM)
• Делопроизводство
Управление бизнес-процессами и И...

ООО "НЦКТ"
ООО "НЦКТ"

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

Внедренное типовое решение:
1С:Управление нашей фирмой 8 ПРОФ

Взаиморасчеты с покупателями
Автоматизация бизнес-процессов...

Госкорпорация «Ростех»
Госкорпорация «Ростех»

Отрасль:
Производство, ТЭК >> Машиностроение, приборостроение

Внедренное типовое решение:
1С:Управление холдингом 1.3.

Специалисты «Кодерлайн» помогли разработать и внедрить автоматизированную...

Внедрение ПП "1С:Бухгалтерия 8 ПРОФ" в ООО Фирма «Бисер»
ООО фирма «Бисер»

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

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

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

АО "Нижегородский водоканал"
АО "Нижегородский водоканал"

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

Внедренное типовое решение:
1С:Зарплата и управление персоналом 8. КОРП

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

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

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

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

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