Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=10774)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Утечка памяти в платформе?

Автор: Maximus314 23.01.13, 22:45

Доброго Вам времени суток!

Столкнулся со странным поведением платформы на казалось бы элементарном алгоритме.

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

Попытка найти ошибку в алгоритме привела к постепенному "выбрасыванию" фрагментов кода пока от алгоритма не остался по сути цикл получения документов и самое странное - проблема нехватки памяти не исчезла.

Вот пример кода, который отрабатывает за 9 секунд и при этом объем занятой памяти процессом 1C8.exe находится на уровне 36Мб

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

Однако стоит добавить обращение через ссылку, как ситуация кардинальным образом меняется - обработка длится 32 секунды и процесс выделяет 145Мб памяти:

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

Получается, что если получать объект непосредственно из выборки, то все "летает" и работает вполне корректно.

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

Заранее благодарю за помощь в решении данного вопроса!

PS: Версия платформы 8.2.17.153


Автор: Vofka 24.01.13, 9:09

Попробуйте после выполнения действий обнулять переменную Док:

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

Автор: logist 24.01.13, 9:09

А в чем вопрос то? Вы получили ссылки в выборке, зачем получать их еще раз?

Автор: Acid 24.01.13, 11:09

Цитата(Maximus314 @ 23.01.13, 22:45) *
система начинает задумываться и выделять память, которую не освобождает даже после закрытия формы обработки.

Заранее благодарю за помощь в решении данного вопроса!

Обратитесь в 1С! smile.gif

Автор: pumbaE 24.01.13, 12:28

http://pro1c.org.ua/redirect.php?http://devel1c.blogspot.com/2013/01/blog-post_11.html

Автор: Acid 24.01.13, 13:28

Цитата(pumbaE @ 24.01.13, 12:28) http://pro1c.org.ua/index.php?act=findpost&pid=63723

на самом деле это "особенность" платформы 1С. Объектная модель в нормальных ООП-языках через точку отрабатывает как надо.
Поэтому я бы дополнил название статьи smile.gif

Автор: Vofka 24.01.13, 13:34

Цитата(Acid @ 24.01.13, 13:28) *
Объектная модель в нормальных ООП-языках через точку отрабатывает как надо.

В других языках объектная модель <> объектной модели 1С. Объектная модель в 1С во многом рассчитана на работу с базой данных и через точку во многих случаях система неявно начинает работать с базой. И сделано это для того, чтобы облегчить нам работу и что бы мы не думали о низкоуровневых (если можно это так назвать) штучках-дрючках.

Автор: Acid 24.01.13, 13:53

поэтому 1С не корректно называть объектной из уважения к ООП.
Псевдо-объектная модель, скорее.

И все равно приходится работать с

Цитата(Vofka @ 24.01.13, 13:34) *
что бы мы не думали о низкоуровневых (если можно это так назвать) штучках-дрючках
штучками-дрючками при разработке, например, веб-сервисов. smile.gif

Автор: Vofka 24.01.13, 14:07

Цитата(Acid @ 24.01.13, 13:53) http://pro1c.org.ua/index.php?act=findpost&pid=63728
И все равно приходится работать с штучками-дрючками при разработке, например, веб-сервисов. smile.gif

Ну я ж и не говорил, что во всем так, я говорил, что "во многом". Вот веб-сервисы ко "многим" не относятся smile.gif . Благодаря тому, что разработчики платформы "скрыли" многие вещи от программистов, чем упростили нам работу, уровень вхождения в 1С очень большой, а качество работы очень многих "специалистов" просто обнять и плакать оставляет желать лучшего.

Автор: vadim007 24.01.13, 17:54

Извиняюсь, что немного не в тему - тут речь о восьмерке.
У меня было подобное, но на семерке.
"Специалист", ранее обслуживающий контору, в доке ВозвратнаяНакладная написал след. код:

Опер = ДокПродажи.Операция;
Опер.ВыбратьПроводки();
Пока Опер.ПолучитьПроводку()=1 Цикл
   ...
КонецЦикла;

Все работало ничего, но однажды создали документ на более чем 3000 позиций. И при проведении такого возврата 1С вываливалась с сообщением об ошибке.
Сразу не въехал в проблему, но через два дня проб и ошибок пришел к следующему алгоритму:
       Опер = СоздатьОбъект("Операция");
    Если Опер.НайтиОперацию(ДокПродажи) = 0 Тогда
        Текст = Шаблон("У документа '[ДокПродажи]' операция не найдена!");
        Сообщить(Текст, "!!!");
        Возврат;
    КонецЕсли;
    //! Опер = ДокПродажи.Операция;
    Опер.ВыбратьПроводки();
    Пока Опер.ПолучитьПроводку()=1 Цикл
                ...
    КонецЦикла;


Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua