Старая добрая рекурсия подвела
У себя отлаживал на тесте — нормально, а в продакшне возникла ошибка.
И я сразу понял где.
Была рекурсивная функция. Я беру текст в ячейке, если он пуст, то вызываю функцию для соседней ячейки слева (если это не первая ячейка) и для соседней ячейки справа (если это не последняя ячейка). Не мудрено, что это привело к бесконечному циклу.
Переписал на дополнительную функцию «поиск в направлении», где указывал смещение. Рекурсия стала конечной.
Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийСлеваИСправа(ТД, Область) Экспорт //В самой ячейке ТекТекст = ОпределитьТекстПоНаличиюГоризонтальныхЛинийВЯчейке(ТД, Область); Если ТекТекст <> "" Тогда Возврат ТекТекст; КонецЕсли; ТекТекст = ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, -1); //Налево Если ТекТекст <> "" Тогда Возврат ТекТекст; КонецЕсли; Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, +1); //Направо КонецФункции Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, Область, Дельта) Экспорт Если Дельта = -1 И Область.Лево > 1 И (Область.ГраницаСлева = Неопределено ИЛИ Область.ГраницаСлева.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.НетЛинии) Тогда Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, ТД.Область(Область.Верх, Область.Лево - 1), Дельта); ИначеЕсли Дельта = 1 И Область.Право < ТД.ШиринаТаблицы И (Область.ГраницаСправа = Неопределено ИЛИ Область.ГраницаСправа.ТипЛинии = ТипЛинииЯчейкиТабличногоДокумента.НетЛинии) Тогда Возврат ОпределитьТекстПоНаличиюГоризонтальныхЛинийВНаправлении(ТД, ТД.Область(Область.Верх, Область.Право + 1), Дельта); КонецЕсли; Возврат ""; КонецФункции Функция ОпределитьТекстПоНаличиюГоризонтальныхЛинийВЯчейке(ТД, Область) Экспорт //Если сверху есть линиия или снизу есть линия то работаем //Если текст в ячейке пустой и слева нет линии, то переходим на ячейку слева, иначе возвращаем пусто Если Область.ГраницаСверху <> Неопределено И Область.ГраницаСверху.ТипЛинии <> ТипЛинииЯчейкиТабличногоДокумента.НетЛинии ИЛИ Область.ГраницаСнизу <> Неопределено И Область.ГраницаСнизу.ТипЛинии <> ТипЛинииЯчейкиТабличногоДокумента.НетЛинии Тогда ТекТекст = СокрЛП(Область.Текст); Возврат ТекТекст; КонецЕсли; Возврат ""; КонецФункции
А нафига делать рекурсию там где достаточно простого цикла?
Иногда рекурсия проще в восприятии