8.х Утечки памяти

Тема в разделе "Установка платформы "1С:Предприятие 8"", создана пользователем Pencroff, 12 мар 2010.

  1. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    У меня происходят утечки памяти в колосальных масштабах до 1 МБ на документ или при перепроведении документов за месяц 1 Гб в оперативке.
    Суть проблемы:
    Произвели объединение УАТ и УПП. До объединения была нормальная работа в УАТ. После объединения появились утечки при проведении документов.
    Для анализа где течет память настроил технологический журнал с предположительными документами. Перепровел за период. Получил лог на 3,5 Мб.
    В логе есть сообщения вида:
    "'
    ТаблицаЗначений:
    Документ.уатЗаправкаГСМ : 470 : ФормированиеДвижений(Отказ, Заголовок, РежимПроведения);
    Документ.уатЗаправкаГСМ : 352 : Отказ = НЕ НаборЗаписейГСМнаТС.Приход() ИЛИ Отказ;
    РегистрНакопления.уатОстаткиГСМнаТС : 85 : РезультатЗапросаПоГСМ=РезультатЗапросаПоГСМ.Выгрузить();

    ТаблицаЗначений:
    Документ.уатЗаправкаГСМ : 470 : ФормированиеДвижений(Отказ, Заголовок, РежимПроведения);
    Документ.уатЗаправкаГСМ : 359 : Отказ = НЕ НаборЗаписейАЗС.Расход() ИЛИ Отказ;
    РегистрНакопления.уатЗаправкиГСМ : 25 : РезультатЗапросаПоГСМ=РезультатЗапросаПоГСМ.Выгрузить();

    СправочникОбъект.уатАЗС:
    Документ.уатЗаправкаГСМ : 439 : Если Не КонтрольТипаАЗС(СтрокаСообщения) Тогда
    Документ.уатЗаправкаГСМ : 115 : Если ТипЗнч(АЗС.Контрагент_Склад) <> Тип(""СправочникСсылка.Склады"") и

    ПоследовательностьНаборЗаписей.ПартионныйУчет:
    Документ.уатЗаправкаГСМ : 448 : ЗаписьРегистрации = ПринадлежностьПоследовательностям.ПартионныйУчет.Добавить();

    ПоследовательностьНаборЗаписей.ПартионныйУчетБУ:
    Документ.уатЗаправкаГСМ : 448 : ЗаписьРегистрации = ПринадлежностьПоследовательностям.ПартионныйУчет.Добавить();
    "

    Подскажите как сделать правильный анализ лога и сделать корректировку модулей что бы уменьшить утечки?
    PS На платформу не грешу потому что аналогичная УПП работает на том же сервере и перепроведение ни дает утечек.
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Ну, если перепроводить документы за месяц - 1гб это нормально :)
    Если документов не 5 штук.

    1. Уточните версию платформы, что бы понятнее было.
    2. Приложите файл настройки ТЖ
    3. Желательно выложить весь журнал на каком-нибудь FTP, что бы можно было посмотреть его целиком.
    4.
    Код:
    РегистрНакопления.уатЗаправкиГСМ : 25 : РезультатЗапросаПоГСМ=РезультатЗапросаПоГСМ.Выгрузить();
    
    Проверьте размер полученной таблицы, это первичная инициализация, судя по всему, но надо посмотреть, что с ней дальше происходит.
  3. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Версия платформы 8.1.12.101

    Настройки технологического журнала:
    <?xml version="1.0" encoding="UTF-8"?>
    <config xmlns="http://v8.1c.ru/v8/tech-log">
    <dump create="true" location="D:\DumpsLogs\Dumps" prntscrn="false" type="136"/>
    <log history="24" location="D:\DumpsLogs\Logs">
    <event>
    <eq property="name" value="excp"/>
    </event>
    <event>
    <eq property="name" value="LEAKS"/>
    </event>
    <property name="all"/>
    </log>
    <leaks collect="1">
    <point call="client"/>
    <point call="server"/>
    <point Proc="МодульПриложения/"/>
    <point Proc="Документ.уатЗаданиеНаПеревозку.МодульОбъекта/"/>
    <point Proc="Документ.уатЗаправкаГСМ.МодульОбъекта/"/>
    <point Proc="Документ.уатПутевойЛист.МодульОбъекта/"/>
    <point Proc="Документ.уатРемонтныйЛист.МодульОбъекта/"/>
    <point Proc="Документ.ПоступлениеТоваровУслуг.МодульОбъекта/"/>
    <point Proc="Документ.ПеремещениеТоваров.МодульОбъекта/"/>
    </leaks>
    <log history="" location=""/>
    </config>

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

    Код:
    РегистрНакопления.уатЗаправкиГСМ : 25 : РезультатЗапросаПоГСМ=РезультатЗапросаПоГСМ.Выгрузить();
    
    
    Чаще всего по коду вот такие вот выгрузки встраиваются в структуры для дальнейшего анализа и формирования данных для движения.
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Пока нет времени посмотреть, но 100% следует обновиться и на 15.14.
  5. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    А 30 мегабайт на документ из 175 строк при первом проведении документа Поступление Товаров и Услуг
    и 6 мегабайт утечек после следующих перепроведений в этом сеансе.
    Это нормально?
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Посмотрите, какие подписки стоят на документ. В типовой УПП не наблюдаю такого.

    Еще раз повторюсь: обновляйте платформу - 15 релиз наиболее стабилен.
  7. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Перешел на платформу 8.1.15.14. Тот же результат по утечкам.
    Прогнал документы в которых происходят огромные утечки по 10 - 15 Мб в отладчике и с помощью Process Explorer регистрировал поглощение оперативки клиентом 1С. Перепроводил неоднократно и различные документы. Результат один и тот же. Утечки происходят в документах в которых порядка 100 - 200 строк.
    Это скрещенная конфигурация поэтому в некоторых документах присутствуют механизмы движений как по УПП так и по УАТ. Итак.
    Основные утечки происходят при:
    • удалении движений регистратора
    • проведении документа по регистрам из УАТ
    Процедура УдалитьДвиженияРегистратора типовая из УПП.
    Код:
    // Процедура удаления существующих движений документа при перепроведении (отмене проведения)
    Процедура УдалитьДвиженияРегистратора(ДокументОбъект, Отказ, СтруктураВидовУчета = Неопределено, ОчищатьРегистры = Истина) Экспорт
    
    МассивОбрабатываемыхСтрокТаблицыДвижений = Новый Массив();
    
    РегистрыКБезусловномуУдалению = ОпределитьСписокРегистровСБезусловнымУдалениемДвижений(ДокументОбъект.Ссылка);
    
    // получение списка регистров, по которым существуют движения
    ТаблицаДвижений = ПолныеПрава.ОпределитьНаличиеДвиженийПоРегистратору(ДокументОбъект.Ссылка);
    
    Если ОчищатьРегистры Тогда
    ТаблицаДвижений.Колонки.Добавить("НаборЗаписей");
    ТаблицаДвижений.Колонки.Добавить("БезусловноеУдаление", Новый ОписаниеТипов("Булево"));
    
    Для Каждого СтрокаДвижения ИЗ ТаблицаДвижений Цикл
    // имя регистра передается как значение, полученное с помощью
    // функции ПолноеИмя() метаданных регистра
    ПозицияТочки = Найти(СтрокаДвижения.Имя, ".");
    ТипРегистра = Лев(СтрокаДвижения.Имя, ПозицияТочки - 1);
    ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));
    
    // необходимо очищать только те регистры, которые относятся к видам учета по которым перепроводиться документ
    Если (НЕ СтруктураВидовУчета = Неопределено) И (ТипЗНЧ(СтруктураВидовУчета) = Тип("Структура")) Тогда
    Если НЕ ОпределитьПринадлежностьРегистраКВидамУчета(ИмяРегистра, СтруктураВидовУчета) Тогда
    Продолжить;
    КонецЕсли;
    КонецЕсли;	
    
    МассивОбрабатываемыхСтрокТаблицыДвижений.Добавить(СтрокаДвижения);
    
    Если (НЕ РегистрыКБезусловномуУдалению = Неопределено) И РегистрыКБезусловномуУдалению.Свойство(ИмяРегистра) Тогда
    СтрокаДвижения.БезусловноеУдаление = Истина;
    Набор = ИмяРегистра;
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">			Иначе		</span>
    
    ЕСли ТипРегистра = "РегистрНакопления" Тогда
    МетаданныеНабора = Метаданные.РегистрыНакопления[ИмяРегистра];
    Набор = РегистрыНакопления[ИмяРегистра].СоздатьНаборЗаписей();
    
    ИначеЕсли ТипРегистра = "РегистрБухгалтерии" Тогда
    МетаданныеНабора = Метаданные.РегистрыБухгалтерии[ИмяРегистра];
    Набор = РегистрыБухгалтерии[ИмяРегистра].СоздатьНаборЗаписей();
    
    ИначеЕсли ТипРегистра = "РегистрСведений" Тогда
    МетаданныеНабора = Метаданные.РегистрыСведений[ИмяРегистра];
    Набор = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
    
    ИначеЕсли ТипРегистра = "РегистрРасчета" Тогда
    МетаданныеНабора = Метаданные.РегистрыРасчета[ИмяРегистра];
    Набор = РегистрыРасчета[ИмяРегистра].СоздатьНаборЗаписей();
    
    КонецЕсли;
    
    Если НЕ ПравоДоступа("Изменение", МетаданныеНабора) Тогда
    // отсутствуют права на всю таблицу регистра
    СообщитьОбОшибке("Нарушение прав доступа", Отказ, СтрокаДвижения.Имя);
    Возврат;
    КонецЕсли;
    
    Набор.Отбор.Регистратор.Установить(ДокументОбъект.Ссылка);			
    КонецЕсли;	
    // набор не записывается сразу, чтобы не откатывать транзакцию, если впоследствии
    // выяснится, что на один из регистров не хватает прав.		
    СтрокаДвижения.НаборЗаписей = Набор;		
    
    КонецЦикла;	
    
    Для Каждого СтрокаДвижения ИЗ МассивОбрабатываемыхСтрокТаблицыДвижений <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл		</span>
    Если СтрокаДвижения.БезусловноеУдаление Тогда
    ПолныеПрава.ЗаписатьНаборЗаписейНаСервере(СтрокаДвижения.НаборЗаписей, ДокументОбъект.Ссылка);
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/иначе')">			Иначе		</span>
    Попытка
    СтрокаДвижения.НаборЗаписей.Записать();  // ЗДЕСЬ ОСНОВНАЯ УТЕЧКА. ПОЧЕМУ НЕ ПОНЯТНО? ПОДСКАЖИТЕ С КАКОЙ СТОРОНЫ СМОТРЕТЬ?
    Исключение
    // возможно «сработал» RLS или механизм даты запрета изменения
    СообщитьОбОшибке(ОписаниеОшибки(), Отказ, СтрокаДвижения.Имя);
    ВызватьИсключение "Операция не выполнена";
    КонецПопытки;
    КонецЕсли;	
    КонецЦикла;
    
    Иначе
    Для Каждого СтрокаДвижения ИЗ ТаблицаДвижений Цикл
    // имя регистра передается как значение, полученное с помощью
    // функции ПолноеИмя() метаданных регистра
    ПозицияТочки = Найти(СтрокаДвижения.Имя, ".");
    ИмяРегистра = СокрП(Сред(СтрокаДвижения.Имя, ПозицияТочки + 1));
    ДокументОбъект.Движения[ИмяРегистра].Очистить();
    КонецЦикла;	
    КонецЕсли;
    
    //Если требуется очищать регистры, то нужно проверять количество записей в наборе перед очисткой
    ОчисткаКоллекцииДвиженийДокумента(ДокументОбъект);
    
    // Удаление записей регистрации из всех последовательностей
    ОбщегоНазначения.УдалитьРегистрациюДокументаВПоследовательностях(ДокументОбъект, Истина);
    
    КонецПроцедуры
    
    
    Утечка УдалитьДвиженияРегистратора - происходит один раз при первом перепроведении документа после запуска клиента (далее практически не влияет на объем памяти, если этот же документ перепровести снова).

    Утечка при движении по регистрам УАТ происходит после вот такой процедуры:
    Код:
    Процедура ФормированиеДвижений(Отказ, Заголовок, РежимПроведения) // МОДУЛЬ ДОКУМЕНТА
    Запрос=Новый Запрос();
    ТекстЗапроса=
    "ВЫБРАТЬ
    |	уатПоступлениеТоваровУслугТовары.Номенклатура,
    |	уатПоступлениеТоваровУслугТовары.Количество КАК Количество,
    |	уатПоступлениеТоваровУслугТовары.Ссылка.СкладОрдер как Склад,
    |	ВЫБОР
    |		КОГДА уатПоступлениеТоваровУслугТовары.Ссылка.СуммаВключаетНДС
    |			ТОГДА уатПоступлениеТоваровУслугТовары.Сумма - уатПоступлениеТоваровУслугТовары.СуммаНДС
    |		ИНАЧЕ уатПоступлениеТоваровУслугТовары.Сумма
    |	КОНЕЦ КАК Сумма
    |ИЗ
    |	Документ.ПоступлениеТоваровУслуг.Товары КАК уатПоступлениеТоваровУслугТовары
    |ГДЕ
    |	уатПоступлениеТоваровУслугТовары.Ссылка = &Ссылка";
    
    Запрос.Текст=ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка",Ссылка);
    
    РезультатЗапросаПоТоварам					= Запрос.Выполнить();
    НаборЗаписей								= Движения.уатПартииТоваровНаСкладах;
    НаборЗаписей.ДокументОбъект					= ЭтотОбъект;
    НаборЗаписей.РезультатЗапросаПоНоменклатуре	= РезультатЗапросаПоТоварам;
    НаборЗаписей.ТаблицаУслуг                   = Услуги.Выгрузить(); //:// *_*
    Отказ										= НЕ НаборЗаписей.Приход() ИЛИ Отказ; // НаборЗаписей.Приход() - после выпол нения этого кода происходит утечка
    
    СформироватьДвиженияПоРегиструАмортизацияОС(РезультатЗапросаПоТоварам.Выгрузить());
    
    КонецПроцедуры // ФормированиеДвиженийУпр()
    
    И вот само движение:
    Код:
    // Формирует движения по регистру приход
    // Возвращаемое значение: Булево. Истина - все хокей, Ложь - чего-то не так.
    // Формирует движения по регистру приход
    // Возвращаемое значение: Булево. Истина - все хокей, Ложь - чего-то не так.
    Функция Приход(ЗаполнитьСуммуТаблицы = Ложь) Экспорт  // МОДУЛЬ НАБОРА ЗАПИСЕЙ РЕГИСТРА
    Перем мСписаноКоличество;
    Перем мСписаноСтоимость;
    
    ВсеОК=Истина;
    //мВалютаУправленческогоУчета = Константы.ВалютаУправленческогоУчета.Получить();
    мВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
    
    // получим таблицу 
    Если (РезультатЗапросаПоНоменклатуре=Неопределено) ИЛИ (ТипЗнч(РезультатЗапросаПоНоменклатуре)<>Тип("РезультатЗапроса")) И (ТипЗнч(РезультатЗапросаПоНоменклатуре)<>Тип("ТаблицаЗначений")) Тогда
    РезультатЗапросаПоНоменклатуре=ПолучитьТаблицуПрихода();
    КонецЕсли;
    Если ТипЗнч(РезультатЗапросаПоНоменклатуре)=Тип("РезультатЗапроса") Тогда
    РезультатЗапросаПоНоменклатуре=РезультатЗапросаПоНоменклатуре.Выгрузить();
    КонецЕсли;
    
    //Преребераем строки
    Для каждого текСтрока Из РезультатЗапросаПоНоменклатуре Цикл
    Если текСтрока.Количество <> 0 Тогда
    НоваяЗапись				= Добавить();
    НоваяЗапись.ВидДвижения	= ВидДвиженияНакопления.Приход;
    НоваяЗапись.Период		= ДокументОбъект.Дата;
    НоваяЗапись.Регистратор	= ДокументОбъект.Ссылка;
    НоваяЗапись.Склад		= текСтрока.Склад;
    НоваяЗапись.Организация	= ДокументОбъект.Организация;     //://
    НоваяЗапись.ДокументДвижения = ДокументОбъект.Ссылка;     //://
    
    НоваяЗапись.Партия		= ДокументОбъект.Ссылка;
    НоваяЗапись.Номенклатура= текСтрока.Номенклатура;
    НоваяЗапись.Количество	= текСтрока.Количество;
    НоваяЗапись.Стоимость	= текСтрока.Сумма;	
    КонецЕсли; 
    КонецЦикла; 
    // запись движений
    Если ВсеОК Тогда
    Записать();	// СНОВА УТЕЧКИ :( ЧТО ДЕЛАТЬ?
    КонецЕсли; 
    Возврат ВсеОК; 
    КонецФункции
    
    
    Подскажите что делать и с какой стороны подходить к вопросу, а то по коду мне кажеться что все с программой впорядке а утечки порядка 20 МБ на документ. Спасает что таких документов не много. Но при автоматическом перепроведении как то не хорошо.
  8. Demiurg
    Offline

    Demiurg Опытный в 1С

    Регистрация:
    1 дек 2007
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Сколько у Вас доступной оперативной памяти, разрядность ОС и сервера 1С.
    Настроен ли сбор дампов, есть ли сами дампы?

    кроме того, надо локализовать место утечки

    Общая стратегия:

    Сначала при помощи элемента MEM и вывода событий MEM и CALL в технологический журнал установите те вызовы сервера, при выполнении которых стабильно наблюдается наибольшая утечка памяти как по количеству занятых фрагментов, так и по объему распределенной памяти.
    (Часть работы Вы уже сделали, но надо "добить").

    В процессе анализа можно воспользоваться элементом LEAKS и выводом событий LEAKS.

    Подробности можно прочитать в книге "Руководство администратора", "Приложение 3. Описание и расположение служебных файлов". Обратите особое внимание на разделы:

    * 3.14. logcfg.xml
    * 3.14.1.2. Элемент property
    * 3.14.1.4. Элемент leaks
    * 3.14.1.5. Элемент mem
  9. Demiurg
    Offline

    Demiurg Опытный в 1С

    Регистрация:
    1 дек 2007
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    Код:
    
    МассивОбрабатываемыхСтрокТаблицыДвижений = Новый Массив();
    
    
    
    

    Ну ясен перец, что его надо вручную подстраховать в конце процедуры типа

    Код:
    МассивОбрабатываемыхСтрокТаблицыДвижений = Неопределено;
    
    далее
    Код:
    
    РезультатЗапросаПоТоварам                    = Запрос.Выполнить();
    НаборЗаписей                                = Движения.уатПартииТоваровНаСкладах;
    НаборЗаписей.ДокументОбъект                    = ЭтотОбъект;
    НаборЗаписей.РезультатЗапросаПоНоменклатуре    = РезультатЗапросаПоТоварам;
    НаборЗаписей.ТаблицаУслуг                   = Услуги.Выгрузить(); //:// *_*
    Отказ                                        = НЕ НаборЗаписей.Приход() ИЛИ Отказ; // НаборЗаписей.Приход() - после выпол нения этого кода происходит утечка
    
    
    КонецПроцедуры // ФормированиеДвиженийУпр()
    
    
    не а в конце процедуры чего не чистите НаборЗаписей и РезультатЗапросаПоТоварам ?


    Код:
    Записать();    // СНОВА УТЕЧКИ :( ЧТО ДЕЛАТЬ?
    
    
    
    
    А тут посмотрите, что делается в попутных процеудурах (включен обмен, перед записью, при записи)
  10. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    За
    Код:
            МассивОбрабатываемыхСтрокТаблицыДвижений = Неопределено;
    
    Спасибо, а то я по привычке к строке все присваивал :)
    Очищаю. Результата никакого.
    Более в регистре никакого кода не выполняется. Проверял отладчиком.


    Дампы пытался включать с помощью обработки настройки технологического журнала. Но это ничего не дало. Дампы не создаются.
    МЕМ добавлял но ничего полезного это не дало. Как не дало и вывод LEAKS сообщений с локализацией только на интересующие меня модули.
  11. Demiurg
    Offline

    Demiurg Опытный в 1С

    Регистрация:
    1 дек 2007
    Сообщения:
    97
    Симпатии:
    0
    Баллы:
    26
    что значит не дало,
    логи есть?
    можно их выложить?
  12. TopicStarter Overlay
    Pencroff
    Offline

    Pencroff

    Регистрация:
    9 сен 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Доброго всем дня. Прошу прощения что столь долгое время не отписывался. Но хочу подвести итог по поводу вопросов связанных с утечками памяти в доставшейся мне конфигурации.
    Поиск узких мест производил не я поэтому здесь описываю только результат.
    Что было сделано:

    1. Очищены явные объекты занимающие много места.
    Код:
    Процедура ПриЗаписи(Отказ, Замещение) //://-//
    Регистратор = ЭтотОбъект.Отбор.Регистратор.Значение;
    ТаблицаДвижений = ЭтотОбъект.мТаблицаДвижений;
    Если ТаблицаДвижений <> Неопределено и ТаблицаДвижений.Количество()>0 Тогда
    ВидДвижения = ТаблицаДвижений[0].ВидДвижения; 
    НачисленоОплачено = РегистрыНакопления.НачисленоОплачено.СоздатьНаборЗаписей(); 
    НачисленоОплачено.ДобавитьЗаписьВРегистр(Регистратор, ВидДвижения, ТаблицаДвижений);
    НачисленоОплачено = неопределено; //:**// Для очистки памяти
    КонецЕсли;
    КонецПроцедуры
    
    2. В процедуру проведения передается набор записей без таблицы услуг (поле таблицы услуг набора записей после записи не освобождается и приводит к утечке) данные формируются в процедуре по ссылке на объект
    Код:
    //НаборЗаписейПоМатериалам = Движения.уатПартииТоваровНаСкладах;
    //НаборЗаписейПоМатериалам.ДокументОбъект	= ЭтотОбъект;
    //НаборЗаписейПоМатериалам.РезультатЗапросаПоНоменклатуре = ТаблицаПоМатериалам; //:// *_*
    //НаборЗаписейПоМатериалам.ТаблицаУслуг = Работы.Выгрузить();
    //Отказ = НЕ НаборЗаписейПоМатериалам.Расход(флЗаполнитьСуммуТаблицы) ИЛИ Отказ;   		
    Отказ = НЕ НаборЗаписейПоМатериалам.Расход(флЗаполнитьСуммуТаблицы,ЭтотОбъект,ТаблицаПоМатериалам,Работы.Выгрузить()) ИЛИ Отказ;//:**// 17.03.10 Для борьбы с утечкой памяти
    /////////////////////////////////////////////////////////////////////////////////////////////////////////
    Функция Расход(ЗаполнитьСуммуТаблицы = Ложь,ДокументОбъект=Неопределено,РезультатЗапросаПоНоменклатуре = Неопределено,ТаблицаУслуг = Неопределено) Экспорт
    
    // Текст процедуры
    
    //                 Проблемное место
    
    //Получение остатков ГСМ по партиям
    //РезультатЗапросаПартии	= ПолучитьОстаткиПартий(текСтрока.Склад, текСтрока.Номенклатура).Выгрузить();
    //Попытка           //://       
    //	РезультатЗапросаПартии	= ПолучитьОстаткиПартий(текСтрока.Склад, текСтрока.Номенклатура,ДокументОбъект.Организация).Выгрузить();
    //Исключение
    //	РезультатЗапросаПартии	= ПолучитьОстаткиПартий(текСтрока.Склад, текСтрока.Номенклатура,).Выгрузить();  	    
    //КонецПопытки;
    Попытка           //:// //:**// Передаем документ для борьбы с утечкой      
    РезультатЗапросаПартии	= ПолучитьОстаткиПартий(текСтрока.Склад, текСтрока.Номенклатура,ДокументОбъект.Организация,ДокументОбъект).Выгрузить();
    Исключение
    РезультатЗапросаПартии	= ПолучитьОстаткиПартий(текСтрока.Склад, текСтрока.Номенклатура,,ДокументОбъект).Выгрузить();  	    
    КонецПопытки;
    
    //КоличествоОстаток = ПолучитьОстаток(текСтрока.Склад, текСтрока.Номенклатура);  
    КоличествоОстаток = ПолучитьОстаток(текСтрока.Склад, текСтрока.Номенклатура,ДокументОбъект);
    
    3. Переписана логика формирования движений по регистрам
    Код:
    Если Не Отказ Тогда
    //НаборЗаписей.ВыполнитьДвижения();
    ОбщегоНазначения.ВыполнитьДвижениеПоРегиструНовый(НаборЗаписей,,,ДокументОснование,ТаблицаДвижений,ДокументОснование.Дата); //:**// 16.03.10 для борьбы с утечкой памяти
    КонецЕсли;
    
    4. И соответственно изменена процедура ВыполнитьДвижениеПоРегистру в общем модуле "ОбщегоНазначения"
    Привиду только определение данных процедур:
    Старый вид
    Код:
    Процедура ВыполнитьДвижениеПоРегистру(НаборДвижений, ВидДвижения = Неопределено, ПустыеКолонкиСоставногоТипа = Неопределено) Экспорт
    
    Новый вид (в принципе практически аналогично типовому виду проведения по регистрам)
    Код:
    Процедура ВыполнитьДвижениеПоРегиструНовый(НаборДвижений, ВидДвижения = Неопределено,
    ПустыеКолонкиСоставногоТипа = Неопределено, ДокументОбъект=неопределено, ТаблицаДвижений=неопределено, мПериод=неопределено) Экспорт    //:**// новая процедура для борьбы с утечкой памяти
    
    Помоему вот основные моменты. Если будут вопросы пишите. Специально оставил CF с утечками и без утечек как акадимический пример.

Поделиться этой страницей