Использование рекурсивных вычислений в 1С

Из курса программирования известно, что рекурсией называется вызов функцией самой себя. Фактически, рекурсия является первым шагом к логическому программированию, потому что грамотное ее использование позволяет составить алгоритм, не решая задачи окончательно.

Из курса программирования известно, что рекурсией называется вызов функцией самой себя. Фактически, рекурсия является первым шагом к логическому программированию, потому что грамотное ее использование позволяет составить алгоритм, не решая задачи окончательно.

Источник: http://www.o-planet-1c.narod.ru

Как решить задачу рекурсивно? Запомним простую аксиому: задачу, имеющую рекурсивное решение, всегда можно сформулировать индуктивно. Покажу это на простом примере. Допустим, мы ищем путь из точки А в точку В в лабиринте. Мы оказались на очередном перепутье. Перед нами несколько направлений возможного пути. Что будет, если мы выберем одно из направлений? Правильно, мы окажемся на следующем этапе-перепутье, опять с несколькими направлениями, и вновь перед нами встанет задача выбора. Когда же в некоторый момент мы заходим в тупик или в точку, в которой уже были ранее, нам необходимо просто возвратиться на шаг назад и выбрать другое направление пути из возможных. И так до тех пор, пока мы не придем в конечную точку. Таким образом, сложная задача поиска пути в лабиринте была сведена к однотипным операциям выбора в каждой очередной его точке. Алгоритм рекурсивного решения этой задачи будет выглядеть примерно так:

Функция ПоискПути(Х) Если Х=А Тогда Возврат 1; // Конец пути достигнут здесь КонецЕсли; Пока Есть_Возможные_Пути(Х)=1 Цикл У=Очередная_Точка(Х); Если ПоискПути(У)=1 Тогда Возврат 1; // Конец пути был достигнут где-то там КонецЕсли; КонецЦикла; Возврат 0; // Тупик, или не осталось вариантов КонецФункции

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

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

Будем решать эту задачу в обратном направлении. Вспомним, что метод FIFO, вообще говоря, должен распространяться и на оплату. Иными словами, если от какого-то клиента поступает оплата, то ни что не мешает нам привязать ее к самому раннему неоплаченному документу по этому клиенту. Итак, если клиент А должен нам 1000 рублей, то можно с уверенностью считать неоплаченными последние N документов, по которым он что–либо у нас приобрел на сумму, не меньше, чем 1000 рублей.

Что ж, будем перебирать все операции по контрагентам в обратном порядке, разнося по ним сумму имеющегося долга. Разумеется, это было бы быстрее, чем перебирать и пересчитывать все документы с начала. Построим рекурсивную обработку операций. Будем рассматривать операции отрезками в 31 день.

Функция ПолучитьДокументы(Контрагент,Т,Знач Д1,Знач Д2,СальдоКон=0) // Т – таблица значений, которая заполняется документами на выходе рекурсии // Д1 и Д2 – очередной рассматриваемый период // СальдоКон – сальдо по контрагенту на конец периода. Значение в // самом начале равно нулю. В дальнейшем оно будет расчитано

Составим запрос по операциям контрагента за месяц

Ит=СоздатьОбъект("БухгалтерскиеИтоги"); Ит.ИспользоватьСубконто(ВидыСубконто.Контрагенты,Контрагент,2,0); Если Ит.ВыполнитьЗапрос(Д1,Д2,"62.1",,,1,"операция","С")=0 Тогда Сообщить("Ошибка!"); Возврат 0; КонецЕсли;

Определим условие завершения рекурсии

Если СальдоКон=0 Тогда СальдоКон=Ит.СКД("С")-Ит.СКК("С"); КонецЕсли; Если СальдоКон<=0 Тогда Возврат 1; КонецЕсли;

Нам понадобится вспомогательная таблица значений

Таб=СоздатьОбъект("ТаблицаЗначений"); Таб.НоваяКолонка("Приход","Число",15,2); Таб.НоваяКолонка("Дата","Дата"); Таб.НоваяКолонка("Позиция"); Таб.НоваяКолонка("Документ","Документ");

Заполним таблицу найденными в запросе операциями

Ит.ВыбратьПериоды(); Пока Ит.ПолучитьПериод()=1 Цикл Таб.НоваяСтрока(); Таб.Приход=Ит.ДО("С"); Таб.Документ=Ит.Операция.Документ; Таб.Дата=Ит.Операция.Документ.ДатаДок; Таб.Позиция=Ит.Операция.Документ.ПолучитьПозицию(); КонецЦикла;

Если в текущем месяце не было докуменетов, то рассмотрим месяц ранее по рекурсии. Это будет косвенное условие завершения.

Если Таб.КоличествоСтрок()=0 Тогда Возврат ПолучитьДокументы(Контрагент,Т,Д1-31,Д1-1,СальдоКон); КонецЕсли;

Если полученная таблица операций не пуста, то отсортируем ее по убыванию позиции документов

Таб.Сортировать("-Позиция");

Разнесем долг контрагента по документам, формирующим этот долг. В тот момент, когда остаток долга станет меньше нуля, будем считать, что долг полностью привязан к документам.

Таб.ВыбратьСтроки(); Пока (Таб.ПолучитьСтроку()=1)и(СальдоКон>0) Цикл Если Таб.Приход>0 Тогда Т.НоваяСтрока(); Т.Документ=Таб.Документ; Т.Дата=Таб.Дата; Т.Долг=Таб.Приход; Т.ОстатокДолга=СальдоКон; СальдоКон=СальдоКон-Таб.Приход; КонецЕсли; КонецЦикла;

Если документы в текущем месяце не покрыли долг, то берем в рассмотрение еще один месяц рекурсивно.

Если СальдоКон>0 Тогда Возврат ПолучитьДокументы(Контрагент,Т,Д1-31,Д1-1,СальдоКон); КонецЕсли;

Если покрыли, то возвращаем 1

Возврат 1; КонецФункции

Думаю, теперь каждый без труда поймет, как использовать эту функцию в основном расчетном модуле. Приведу примерный, упрощенный вариант.

Таблица=СоздатьОбъект(«Таблица»); Таблица.ВывестиСекцию(«Шапка»); Т=СоздатьОбъект(«ТаблицаЗначений»); Т.НоваяКолонка(«Документ»); Т.НоваяКолонка(«Дата»); Т.НоваяКолонка(«Долг»); Т.НоваяКолонка(«ОстатокДолга»); Контрагенты=СоздатьОбъект(«Справочник.Контрагенты»); Контрагенты.ВыбратьЭлементы(); Пока Контрагенты.ПолучитьЭлемент()=1 Цикл Д=РабочаяДата(); Т.УдалитьСтроки(); ПолучитьДокументы(Контрагенты.ТекущийЭлемент(),Т,Д-30,Д); ВывестиВТаблицу(Таблица,Контрагенты.ТекущийЭлемент(),Т); КонецЦикла; Таблица.ВывестиСекцию(«Подвал»); Таблица.Опции(0,0,0,0,«ДолгиКонтрагентов1»,«ДолгиКонтрагентов2»); Таблица.ТольоПросмотр(1); Таблица.Показать(«Долги»);

Мы рассмотрели упрощенный вариант задачи, предполагая применение метода FIFO к оплате, и как видите, рекурсия в приведенном случае вполне оправдана. Без сомнения, больший интерес представляет алгоритм, в котором учитывается как дебетовые, так и кредитовые обороты по счету 62, и в этом случае, на выходе мы можем получить что-то вроде книги покупок, но без применения забалансовых счетов. Что ж, дерзайте, коллеги!

Приведенный алгоритм применен в наших обработках "Кто нам должен" и "Кому мы должны"

Начать дискуссию

Как будут проводиться проверки деклараций по НДФЛ с 2025 года

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

Как будут проводиться проверки деклараций по НДФЛ с 2025 года

Курсы повышения
квалификации

18
Официальное удостоверение с занесением в госреестр Рособрнадзора

НК РФ не устанавливает какой-нибудь перечень документов, которые подтверждают фактическое нахождение лиц на территории РФ

В качестве доказательства нахождения человека на территории РФ могут приниматься любые документы, удостоверяющие фактическое количество дней его пребывания в РФ

Бухгалтеры выбирают лучший сервис для сдачи отчетов, Роструд объяснил, как внести в трудовую книжку запись об увольнении по собственному. 👩‍💻«Ночной бухгалтер» № 1706

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

Иллюстрация: Вера Ревина/Клерк.ру
Лучшие спикеры, новый каждый день

Можно будет узнать реальные цены товаров на внутреннем рынке

Дмитрий Григоренко провел рабочую встречу с руководителем ФАС Максимом Шаскольским, который анонсировал создание в России системы ценовых рыночных индикаторов.

Россия и Белоруссия будут согласовывать налоговую политику и создавать общий финансовый рынок

Утверждены планы мероприятий по исполнению Основных направлений реализации положений Договора о создании Союзного государства между Россией и Белоруссией на 2024–2026 годы.

Налоговики уточнили дату несения расходов в виде компенсации за авто сотрудника

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

Опытом делятся эксперты-практики, без воды
Отпуска

Отпуск работников детсадов могут увеличить

Первый зампред комитета Госдумы по просвещению Яна Лантратова предложила увеличить продолжительность отпуска для работников детсадов с 42 до 56 дней.

Глава комитета Госдумы по бюджету и налогам объяснил причины увеличения дефицита федерального бюджета-2024

Андрей Макаров заявил, что финансирование нужно на ряд вопросов, которые были озвучены президентом Владимиром Путиным.

7 шагов к эффективному контент-плану для блога или сайта

Хороший контент-план — это не просто перечень тем для публикаций, это карта, которая поможет ориентироваться в материалах сайта или блога и двигаться в правильном направлении. Без такого плана легко заблудиться среди множества тем и форматов.

Бесплатно с Отчетность в СФР

ЕФС-1 при увольнении сотрудника: образец заполнения

Увольнение сотрудника — это процесс, который требует внимания к деталям. В этой статье мы даем пошаговую инструкцию и образец заполнения ЕФС-1 при увольнении работника. Вы узнаете, какие разделы нужно заполнить, какие данные указать и какие нюансы учесть.

ЕФС-1 при увольнении сотрудника: образец заполнения

Можно ли вернуть деньги за товар, если недостаки в нем выявлены спустя несколько лет

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

Можно ли вернуть деньги за товар, если недостаки в нем выявлены спустя несколько лет

💥 Шесть вебинаров по налоговой реформе-2025: готовимся к новым НДФЛ, НДС, налогу на прибыль и УСН уже сейчас

С 2025 года все изменится, и половина НК будет переписана. Поэтому важно уже сейчас понять, какими будут новые правила игры и как организовать свою работу. «Клерк» проводит серию вебинаров с ведущими экспертами: налоговыми консультантами, юристами, адвокатами, аутсорсерами. Не пропустите!

💥 Шесть вебинаров по налоговой реформе-2025: готовимся к новым НДФЛ, НДС, налогу на прибыль и УСН уже сейчас
Миникурсы, текстовые и видеоинструкции для бухгалтеров
Санкции 2022-2024

Санкции США против НРД. Позиция EUROCLEAR

12 июня 2024 года США расширили санкционные списки в отношении российских субъектов. В числе прочих ограничения введены против Национального расчетного депозитария (НРД).

Санкции США против НРД. Позиция EUROCLEAR

За продажу детям энергетиков санкции будут, скорее всего, как за крепкий алкоголь

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

Из-за новых ставок по НДФЛ с 2025 года Госдума приняла поправки в федеральный бюджет

Изменения связаны в том числе с реформой в налоговой системе с 2025 года. Завтра депутаты рассмотрят еще три законопроекта из этого пакета.

Родителей уравняли в правах при получении документов в госорганах

Госдума приняла в третьем окончательном чтении закон об обеспечении равенства прав родителей, действующих в интересах своих несовершеннолетних детей, при получении госуслуг и документов в органах исполнительной власти.

⚡️ Итоги дня: на Wildberries можно колеровать краску, «Вкусно — и точка» выплатила компенсацию пострадавшему в «Макдоналдсе», а Nvidia стала крупнейшей компанией в США

Подготовили обзор главных событий дня — 19 июня 2024 года. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

Как систематизировать обучение в компании

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

Как систематизировать обучение в компании

Вакансии

Новые вакансии для бухгалтеров и финансистов Добавить вакансию

Кому будет выгодна налоговая амнистия за дробление бизнеса

Не каждый готов добровольно сдаться ФНС и признать дробление. Рассказываем, кому налоговая амнистия за дробление бизнеса будет выгодна.

Кому будет выгодна налоговая амнистия за дробление бизнеса

Интересные материалы

Пенсии

МРОТ привяжут с будущего года к медианной зарплате, а работающим пенсионерам с 1 февраля возобновят индексацию пенсий

Узнайте, как изменится МРОТ в 2025 году, как на него влияет медианная зарплата и что изменилось в индексации пенсий. В нашем руководстве вы найдете подробную информацию о планируемых изменениях и их влиянии на доходы граждан.

МРОТ привяжут с будущего года к медианной зарплате, а работающим пенсионерам с 1 февраля возобновят индексацию пенсий