Имя: Пароль:
1C
 
Нехватка памяти
0 le_
 
30.08.10
17:13
На сервере, в регламентном задании выполняется подобный код:

Для Каждого Зн Из СЗДоков Цикл//СЗДоков - список значений
   Документ = Зн.Значение;
   ДокументОбъект = Документ.ПолучитьОбъект();
   ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЦикла;

Когда список документов очень большой, через какое-то время выполнение задания просто прерывается.

Попытался выполнить тоже самое, на клиенте, с помощью внешней обработки.
Документы проводятся, все ОК, но через какое-то время возникает ошибка "Не хватает памяти" и 1С-ка просто вылетает.

Выяснилось, что память в основном расходуется вот в этом месте:
ДокументОбъект = Документ.ПолучитьОбъект();

И что бы после этого с переменной ДокументОбъект не делал, память не освобождается!
Даже при закрытии формы этой внешней обработки, память не освобождается.

Подскажите, что с этим можно сделать?
Постоянно перезапускать клиент 1С-ки или сервер - это не вариант...
А документы перепроводить как-то нужно...
1 Fragster
 
гуру
30.08.10
17:31
а еси переменную обозвать по другому?
2 le_
 
30.08.10
17:33
(1) На самом деле, в программе она по-другому называется, это я здесь, для примера, так ее обозвал. В общем, изменение её имени не помогает...
3 Jstunner
 
30.08.10
17:35
(0) выполняется в одной транзакции?
4 le_
 
30.08.10
17:37
(3) Пробовал сделать так:
Для Каждого Зн Из СЗДоков Цикл
   Документ = Зн.Значение;
   НачатьТранзакцию();
   ДокументОбъект = Документ.ПолучитьОбъект();
   ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
   ЗафиксироватьТранзакцию();
КонецЦикла;

Тоже не помогает...
5 Jstunner
 
30.08.10
17:38
(4) нее, перед циклом нет начала транзакции?
6 le_
 
30.08.10
17:38
(5) Не, перед циклом нет.
7 rs_trade
 
30.08.10
17:38
(4) ДокументОбъект.Записать в попытке надо делать
8 H A D G E H O G s
 
30.08.10
17:39
Ну тупо попробовать так
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
ДокументОбъект=Неопределено;
9 le_
 
30.08.10
17:40
(7) Оно в попытке и выполняется в реальных условиях, но проблему с памятью это не решает.

(8) Пробовал - не помогает. Память не очищается даже при закрытии формы обработки.


А вообще, может кто-нибудь попробовать проделать то же самое: выбрать документы за период побольше, запихнуть их в СЗ и попробовать перепровести?

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

Может, путем общих экспериментов найдется решение...
10 acsent
 
30.08.10
17:41
x64
11 le_
 
30.08.10
17:42
x32 везде. И сервер и клиенты.
12 Jstunner
 
30.08.10
17:43
а так?


Для Каждого Зн Из СЗДоков Цикл//СЗДоков - список значений

  Зн.Значение.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

КонецЦикла;
13 acsent
 
30.08.10
17:43
(10) Это не вопрос, это способ решения
14 H A D G E H O G s
 
30.08.10
17:45
(13) Какой-то жестокий способ решения.

Автор, посмотри подписки на события, может там куда объект засовывается.
Что за конфа?
15 Jstunner
 
30.08.10
17:46
в УПП есть методы ВыполнитьВосстановление и ВыполнитьВосстановлениеНаСервере, оба прекрасно работают для любого кол-ва документов
16 Kom-off
 
30.08.10
17:49
(0) Как была получена СЗДоков?
17 H A D G E H O G s
 
30.08.10
17:50
Что за конфа?
Что за документы?
18 Kom-off
 
30.08.10
17:51
(16)+ Короче, была такая же проблема. В моем примере память утекала даже в пустом цикле. Заменил обход по таблице значений, полученной выгрузкой из запроса на обход результата запроса и все встало на свои места.
19 Kom-off
 
30.08.10
17:52
(18)+ А еще, судя по комментарию кода в (0) можно попробовать заменить тип СЗДоков со списка значений на массив.
20 rs_trade
 
30.08.10
17:54
движок то какой? может тебе обновиться до 12.80?
21 sash-ml
 
30.08.10
18:04
(18) + "СЗДоков" лучше сделать как результат выборки
и добавить
ДокументОбъект = Неопределено; в конце каждой итерации.
22 le_
 
30.08.10
18:06
Конфа - УПП.
Платформа: 8.2.10.77.
Документы: в основном "РеализацияТоваровУслуг".

Замена СЗ на ТЗ или на массив - не помогает.

В общем, это обработка, которой перетаскиваются данные из 7.7 в 8.

Документы сначала создаются, ссылки заносятся в СЗ или ТЗ (не суть), определенным образом сортируются и после этого проводятся по-порядку.

(12) - Не помогло, к сожалению.

Попробую подписки на события еще поковырять - может действительно там что-то...
23 le_
 
30.08.10
18:26
Вроде, нет ничего подозрительного в подписках. Никаких переменных, которые постоянно висели в памяти и разрастались...
24 73
 
30.08.10
18:30
<Документы сначала создаются> - может тут разрастается? Объекты ведь.
25 le_
 
30.08.10
18:36
(24) Не, до начала проведения все работает нормально.
Сами созданные документы (объекты) в памяти не хранятся. Документ создается, записывается и его ссылка заносится в СЗ. Переменная типа ДокументОбъект обнуляется.
Список с ссылками на документы в памяти занимает около 4 кб...

Вот когда начинается перебор этого списка, получение объектов и проведение, память куда-то утекает...
26 le_
 
30.08.10
18:58
//написал вот такую процедурку для тестирования всего этого дела:
Процедура КнопкаСформироватьНажатие(Кнопка)
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    РеализацияТоваровУслуг.Ссылка КАК Док
                  |ИЗ
                  |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                  |ГДЕ
                  |    РеализацияТоваровУслуг.Проведен <> Ложь";
   
   Рез = Запрос.Выполнить().Выгрузить();
   Для Каждого Стр Из Рез Цикл
       ОбработкаПрерыванияПользователя();
       Состояние(Стр.Док);
       //Стр.Док.получитьОбъект().Записать(РежимЗаписиДокумента.ОтменаПроведения);
       Об = Стр.Док.получитьОбъект();
       Об.Записать(РежимЗаписиДокумента.ОтменаПроведения);
   Конеццикла;
КонецПроцедуры

Получается то же самое!
При отмене проведения память так же утекает...

Вот такой вариант:
Стр.Док.получитьОбъект().Записать(РежимЗаписиДокумента.ОтменаПроведения);
в этом случае работает намного лучше, чем
Об = Стр.Док.получитьОбъект();
Об.Записать(РежимЗаписиДокумента.ОтменаПроведения);

Хоть и утекает, но не такими объемами... Уже лучше.
Спасибо Jstunner за подсказку...
27 rs_trade
 
30.08.10
21:56
движок обнови, у тебя старый совсем
28 le_
 
31.08.10
10:08
(27) Обновил - не помогло...
29 Aprobator
 
31.08.10
10:25
(0) покопайся в модуле документа. Может там чего интересное спряталось.
30 1C-Nick
 
31.08.10
10:35
(26) а если не выгружать в таблицу значений, а обходить результат запроса?
или попробовать в конце сделать
Рез.Очистить();
Рез = Неопределено;
31 TankerM
 
31.08.10
12:31
На 7.7 похоже, вдруг и решение аналогичное :о))

Типа такого:
Для Каждого Зн Из СЗДоков Цикл//СЗДоков - список значений

   Документ = Зн.Значение.Ссылка;
   ДокументОбъект = Документ.ПолучитьОбъект();
   ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЦикла;

Или такого изврата:
Для Каждого Зн Из СЗДоков Цикл//СЗДоков - список значений

   УИД = Зн.Значение.УникальныйИдентификатор();
   Документ = Документы[Зн.Значение.Метаданные().Имя].ПолучитьСсылку(УИД);
   ДокументОбъект = Документ.ПолучитьОбъект();
   ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
КонецЦикла;
32 le_
 
01.09.10
10:05
Ничего из вышеописанного не помогло, к сожалению... (
33 НЕА123
 
01.09.10
10:13
(32)
при интерактивном проведении происходит утечка?
34 Jstunner
 
01.09.10
10:15
РеализацияТоваровУслуг типовой?
35 le_
 
01.09.10
10:20
(33) Да, сейчас проверил, память так же расходуется при интерактивном проведении и не очищается по его завершении.

(34) Да, документ типовой.
36 Jstunner
 
01.09.10
10:22
хрень какая-то..

переставлять винду уже предлагали? :)
37 le_
 
01.09.10
10:24
Действительно, хрень (

Дело не в винде, думаю - пробовал на разных машинах: на рабочей, на сервере, дома - везде одно и то же.

У кого-нибудь есть УТП - попробуйте провести реализацию и посмотрите в диспетчере, как память расходуется процессом.
38 1C-Nick
 
01.09.10
10:27
(37) какая версия УТП? Память расходуется только когда первый раз проводишь или при последующих проведениях расходуется столько же памяти?
39 sapphire
 
01.09.10
10:36
А технологический журнал покурить предлагали?
40 le_
 
01.09.10
10:37
(38) УТП 1.1.7.3

Расходуется и при проведении, и при отмене проведения, и при повторном проведении.

(39) И что я из этого журнала смогу выкурить?..
41 sapphire
 
01.09.10
10:39
(40) Где именно в коде происходит утечка памяти.
42 le_
 
01.09.10
10:41
(41) Каким образом? Я с ним просто никогда раньше не работал...

Кстати, штатная обработка проведения документов "Сервис" - "Универсальные обработки" - "Групповое перепроведение документов" так же вылетает с ошибкой...
43 sash-ml
 
01.09.10
10:43
была такая прога "MEMDEFRAG" называлась, как раз для таких случаев.
А УТП для Украины?
44 НЕА123
 
01.09.10
10:43
(35)
тогда делай (29) + подписки на события.
где-то зацикливание.

типа так

перем А;

А = ЭтотОбъект;
45 le_
 
01.09.10
10:48
(43) Мем дефраг пробовал - не спасает. Да, для Украины.

(44) Я уже в модуле документа все глобальные переменные в конце процедуры ОбработкаПроведения обнуляю - и всё равно такая же фигня...
46 sapphire
 
01.09.10
10:51
47 НЕА123
 
01.09.10
10:54
(45)
желательно не только глобальные, а все, которые содержат ссылки.
48 le_
 
01.09.10
10:55
(46) Спасибо, попробую.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.