Старая добрая рекурсия подвела

У себя отлаживал на тесте — нормально, а в продакшне возникла ошибка.

И я сразу понял где.

Была рекурсивная функция. Я беру текст в ячейке, если он пуст, то вызываю функцию для соседней ячейки слева (если это не первая ячейка) и для соседней ячейки справа (если это не последняя ячейка). Не мудрено, что это привело к бесконечному циклу.

Переписал на дополнительную функцию «поиск в направлении», где указывал смещение. Рекурсия стала конечной.

Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийСлеваИСправа(ТД, Область) Экспорт
	//В самой ячейке
	ТекТекст = ОпределитьТекстПоНаличиюГоризонтальныхЛинийВЯчейке(ТД, Область);
	Если ТекТекст <> "" Тогда
		Возврат ТекТекст;
	КонецЕсли;
	
	ТекТекст = ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, -1);  //Налево
	Если ТекТекст <> "" Тогда
		Возврат ТекТекст;
	КонецЕсли;
		
	Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, +1);  //Направо
	
КонецФункции

Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, Дельта) Экспорт
	Если Дельта = -1 И Область.Лево > 1 И (Область.ГраницаСлева = Неопределено ИЛИ Область.ГраницаСлева.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.НетЛинии) Тогда
		Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, ТД.Область(Область.Верх, Область.Лево - 1), Дельта);
	ИначеЕсли Дельта = 1 И Область.Право < ТД.ШиринаТаблицы И (Область.ГраницаСправа = Неопределено ИЛИ Область.ГраницаСправа.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.НетЛинии) Тогда
		Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, ТД.Область(Область.Верх, Область.Право + 1), Дельта);
	КонецЕсли;
	Возврат "";
КонецФункции

Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийВЯчейке(ТД, Область) Экспорт
	//Если сверху есть линиия или снизу есть линия то работаем
	//Если текст в ячейке пустой и слева нет линии, то переходим на ячейку слева, иначе возвращаем пусто
	Если 
		Область.ГраницаСверху <> Неопределено И Область.ГраницаСверху.ТипЛинии <> ТипЛинииЯчейкиТабличногоДокумента.НетЛинии
		ИЛИ Область.ГраницаСнизу <> Неопределено И Область.ГраницаСнизу.ТипЛинии <> ТипЛинииЯчейкиТабличногоДокумента.НетЛинии Тогда
		ТекТекст = СокрЛП(Область.Текст);
		Возврат ТекТекст;
	КонецЕсли;
	Возврат "";
КонецФункции

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. НуфНуф:

    А нафига делать рекурсию там где достаточно простого цикла?

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

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