10.04.2020 Щербаков Кирилл 21756
Использование рекурсии в 1С

Содержание:

1.    Понятие рекурсии в 1С

 

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


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

 

&НаКлиенте

Процедура Сосчитать(Команда)

            СчетДоДесяти(Число);

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

 

Процедура СчетДоДесяти(НачальноеЧисло)

    Если НачальноеЧисло <= 10 Тогда

        Сообщить(Строка(НачальноеЧисло));

        НачальноеЧисло = НачальноеЧисло + 1;

        СчетДоДесяти(НачальноеЧисло);

    Иначе //выход из рекурсии

                        Сообщить("Счет окончен.");

                        Возврат;

    КонецЕсли;

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

 

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


Такой счет до десяти – пример линейной рекурсии в 1С. То есть каждый очередной вызов процедуры инициирует лишь один рекурсивный вызов или при выполнении условия выхода не инициирует вовсе.


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

 

Функция ПолучитьЧислоРядаФибоначчиПоНомеру(НомерЧислаВРяду)

            Если НомерЧислаВРяду < 2 Тогда

                        Возврат НомерЧислаВРяду;

            КонецЕсли;

           

            Возврат ПолучитьЧислоРядаФибоначчиПоНомеру(НомерЧислаВРяду - 1) + ПолучитьЧислоРядаФибоначчиПоНомеру(НомерЧислаВРяду - 2)

КонецФункции

 

&НаКлиенте

Процедура Фибоначчи(Команда)

            Сообщить(ПолучитьЧислоРядаФибоначчиПоНомеру(Число));

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


2.    Как используется рекурсия в 1С

 

Практическим примером использования рекурсии в 1С является алгоритм получения верхнеуровнего элемента справочника с иерархией элементов.


Получим для указанной организации главную организацию в иерархии элементов. Здесь условие выхода - Элемент.Уровень() = 0:

 

&НаКлиенте

Процедура УзнатьГлавнуюОрганизацию(Команда)

           

            Если Не ЗначениеЗаполнено(Организация) Тогда

                        Сообщить("Укажите Организацию");

                        Возврат;

            КонецЕсли;

           

            УзнатьГлавнуюОрганизациюНаСервере();

           

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

 

&НаСервере

Процедура УзнатьГлавнуюОрганизациюНаСервере()

           

            Если Организация.Уровень() = 0 Тогда

                        Сообщить("Указана организация верхнего уровня");

            КонецЕсли;

           

            ГоловнаяОрганизация = ПолучитьРодителя(Организация);

           

            Сообщить(ГоловнаяОрганизация);

           

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

 

&НаСервереБезКонтекста

Функция ПолучитьРодителя(Элемент)

           

            Если Элемент.Уровень() = 0 Тогда

                        Возврат Элемент;

            КонецЕсли;

           

            Возврат ПолучитьРодителя(Элемент.Родитель);

           

КонецФункции

 

 

Другой обычный случай использования рекурсии в 1С – обход дерева значений. Устройство этой иерархической структуры позволяет реализовать такой алгоритм:

 

&НаСервере

Процедура ОбойтиРекурсивно(Дерево)

           

            Для Каждого Строка Из Дерево.Строки Цикл

                       

      Сообщить(Строка.Организация);

            Если Строка.Строки.Количество()>0 Тогда //Иначе выход из рекурсии

                       

         ОбойтиРекурсивно(Строка);

                       

            КонецЕсли;

           

КонецЦикла;

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

 

Если у строки два или более подчиненных, наблюдаем каскадную рекурсию.


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

Щербаков Кирилл

 

Наши проекты

СТС-Медиа
СТС-Медиа

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

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

- Бухгалтерский учет;
- Налоговый учет;
- МСФО (GAAP/управленческий учет);
- Казначейство...

ООО «Лаборатория успеха»
ООО «Лаборатория успеха»

Отрасль:
Общественное и плановое питание, гостиничный бизнес, туризм

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

Бухгалтерский учет;
Расчет зарплаты и кадровый учет;...

ООО "СЖД"
ООО "СЖД"

Отрасль:
Торговля, склад, логистика, транспорт

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

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

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

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

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

Реализовали разработку уникального модуля «Интернет-магазины» на базе программного продукта «1С:Управление холдингом» согласно технического ...

ФГОУ ВПО «Горский государственный аграрный университет»
ФГОУ ВПО «Горский государственный аграрный университет»

Отрасль:
Образование

Внедренное типовое решение:
1С:Колледж ПРОФ

- Управление персоналом и кадровый учет (HRM):
Кадровый учет
Управление обучением и повышением квалификации
- Финансы, управлен...

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

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

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

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

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

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

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

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

ООО ХДМ Рус
ООО ХДМ Рус

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

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

Управление цепочками поставок Оптовая торговля ...

Московский филиал ООО «Авиакомпания «Икар»
Московский филиал ООО «Авиакомпания «Икар»

Отрасль:
Авиаперевозки

Внедренное типовое решение:
1С:Зарплата и управление персоналом

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

Группа компаний ТМ «Дружба народов»
Группа компаний ТМ «Дружба народов»

Отрасль:
Пищевая промышленность

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

- Переход на новый релиз 2.1 программы «1С:ERP Управление предприятием»
- Разработка обработки «Свертка информационной базы»
- Разрабо...

Автоматизация контроля исполнительской дисциплины на базе ПП «1С:Документооборот 8 ПРОФ»
ООО «ФСК Лидер»

Отрасль:
Строительство и девелопмент

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

- Делопроизводство;
- Учет и хранение документов;
- Учет и контроль исполнения поручений;
- Учет договоров...

ООО «Стейдж Энтертейнмент Россия»
ООО «Стейдж Энтертейнмент Россия»

Отрасль:
Театральная деятельность

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

Реализован процесс трансформации данных бухгалтерского учета по РСБУ в данные международного учета (ГААП) на платформе «1С:Предприятие 8»:...

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

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

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

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