![]() |
|
Нехватка памяти | ☑ | ||
---|---|---|---|---|
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) Спасибо, попробую.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |