Имя: Пароль:
1C
1С v8
Как бороться с ошибкой "Недостаточно памяти"?
0 devlabnn
 
16.12.11
11:09
При записи набора регистра сведений 1с вылетает с ошибкой "Недостаточно памяти".
Код:

НЗ = РегистрыСведений.СреднийЗапасМагазинов.СоздатьНаборЗаписей();
НЗ.Отбор.Период.Использование = Истина;
НЗ.Отбор.Период.Значение = НачалоПериода;
НЗ.Отбор.Склад.Использование = Истина;
НЗ.Отбор.Склад.Значение = Т.Склад;
НЗ.Загрузить(ВремТЗ);
НЗ.Записать();

В таблице около полумиллиона строк. При возникновении ошибки свободно 12ГБ памяти. ОС 32 бит Windows Server 2008. Что делать?
1 zak555
 
16.12.11
11:10
загружать по этапу ?
2 Rie
 
16.12.11
11:10
(0) Ключевое слово - 32 бит.
3 cViper
 
16.12.11
11:11
добавь память.
4 devlabnn
 
16.12.11
11:11
(1) Тогда не получиться набором загрузить, только через менеджер по одной записи. Это дольше раз в 5-10 получится
5 devlabnn
 
16.12.11
11:11
(3) Куда?
6 devlabnn
 
16.12.11
11:11
(3) >> При возникновении ошибки свободно 12ГБ памяти
7 nbIx
 
16.12.11
11:13
(0)записывай порциями, что тут не понятного
8 devlabnn
 
16.12.11
11:15
(7) >> (4)

Мне интересно понять, какой памяти нехватает? Может дело в том, что 32-х битная ОС не позволяет процессу 1С отъедать более какого-то порога памяти и переход на 64-х битную поможет?
9 asady
 
16.12.11
11:15
(0)
падает на этом?
НЗ.Загрузить(ВремТЗ);

или на этом?
НЗ.Записать();

скорее всего на НЗ.Записать()
попробуй перед записть поставить
НЗ.ОбменДанными.Загрузка=Истина;
10 nbIx
 
16.12.11
11:16
(8) Да кто тебе сказал, что нужно по одной записи.
Посмотри на метод набора записать, и параметр "Замещать"
11 nbIx
 
16.12.11
11:17
(10) + Записывай по 50 тыщ. тебе этого хватит.
12 эцп
 
16.12.11
11:17
(0) Скорее всего у регистра есть еще реквизиты, на которые можно наложить отборы. Так что стоит разбить таблицу значений на меньшие таблицы (в соответствии с отборами) и загрузить частями в регистр
13 pavlika
 
16.12.11
11:18
(10) Например, если объем физической памяти 32-разрядного сервера более 2 Гб, то имеет смысл использовать несколько рабочих процессов. Каждый рабочий процесс может занимать до 2 Гб виртуального адресного пространства, поэтому можно запускать несколько рабочих процессов из расчета 1,5-2 Гб оперативной памяти сервера на один рабочий процесс. Если используется 64-разрядный сервер, то обычно достаточно на каждом физическом сервере запускать один рабочий процесс.
http://www.its.1c.ru/db/v8doc#content:2131:1
14 pavlika
 
16.12.11
11:18
к (8) конечно
15 Azverin
 
16.12.11
11:21
(8) 64 ОС поможет. а большие и никто)
16 Fragster
 
гуру
16.12.11
11:22
(4) набор.Записать(ЛОЖЬ)
17 zak555
 
16.12.11
11:22
зачем ОС 32битной 12 ГБ ?
18 Fragster
 
гуру
16.12.11
11:23
(16)+ и по частям
19 zak555
 
16.12.11
11:23
отдайте мне 8 ГБ
20 John83
 
16.12.11
11:28
(17) так на серваке можно использовать > 4гигов
разве не?
21 zak555
 
16.12.11
11:29
(20) как бы 32 видит только 4 ГБ и всё
22 zak555
 
16.12.11
11:30
а х64 кажись до 192 Гб
23 devlabnn
 
16.12.11
11:31
(21) Windows Server может больше, только процесс не может более 4гб
24 devlabnn
 
16.12.11
11:32
(10) попробую этот вариант
25 H A D G E H O G s
 
16.12.11
11:32
НЗ = РегистрыСведений.СреднийЗапасМагазинов.СоздатьНаборЗаписей();
НЗ.Отбор.Период.Использование = Истина;
НЗ.Отбор.Период.Значение = НачалоПериода;
НЗ.Отбор.Склад.Использование = Истина;
НЗ.Отбор.Склад.Значение = Т.Склад;
НЗ.Загрузить(ВремТЗ);
ВремТЗ.Очистить();
НЗ.Записать();
ВремТЗ=НЗ.Выгрузить(); // Если надо
26 H A D G E H O G s
 
16.12.11
11:34
(16) Запись с текущими ключевыми полями уже существует.
Ага?
27 dmpl
 
16.12.11
11:38
(26) Сначала записать пустой набор ;)