Доброго Вам времени суток!
Столкнулся со странным поведением платформы на казалось бы элементарном алгоритме.
Написал обработку перепроведения базы с определенной спецификой и вполне благополучно ее использовал, но когда количество документов в базе превысило некое критическое количество обработка начала приводить к аварийному завершению работы 1С с выдачей сообщения о нехватке памяти.
Попытка найти ошибку в алгоритме привела к постепенному "выбрасыванию" фрагментов кода пока от алгоритма не остался по сути цикл получения документов и самое странное - проблема нехватки памяти не исчезла.
Вот пример кода, который отрабатывает за 9 секунд и при этом объем занятой памяти процессом 1C8.exe находится на уровне 36Мб
Выборка = Документы.РасходнаяНакладная.Выбрать();
Кво = 0;
Пока Выборка.Следующий() Цикл
Док = Выборка.ПолучитьОбъект();
Кво=Кво+1;
Если Кво>10000 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Однако стоит добавить обращение через ссылку, как ситуация кардинальным образом меняется - обработка длится 32 секунды и процесс выделяет 145Мб памяти:
Выборка = Документы.РасходнаяНакладная.Выбрать();
Кво = 0;
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Кво=Кво+1;
Если Кво>10000 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Получается, что если получать объект непосредственно из выборки, то все "летает" и работает вполне корректно.
Но стоит попытаться получить объект по ссылке (именно так и был реализован алгоритм работы - ссылка на документ передавалась в процедуру, где выполнялся дополнительный анализ движений регистра и принималось решение о необходимости повторного проведения - в этот момент и получался объект) - система начинает задумываться и выделять память, которую не освобождает даже после закрытия формы обработки.
Заранее благодарю за помощь в решении данного вопроса!
PS: Версия платформы 8.2.17.153