Имя: Пароль:
1C
1С v8
Недостаточно памяти при работе с РС
,
0 kozhem1990
 
15.02.16
11:08
Есть регистр сведений (примерно 50000 записей), есть таблица значений (140000 записей). Перебираю записи РС, и для каждой из них ищу соответствие в таблице значений по определенному ресурсу, через функцию Найти(). Если функция Найти() возвращает найденную запись, то создаю менеджер записи в этом же регистре и записываю в попытке. при отладке выдает окно ошибки с единственным сообщение "Недостаточно памяти".
1 ДенисЧ
 
15.02.16
11:09
А памяти на компе 640КБ, которых хватит всем?
2 Zhuravlik
 
15.02.16
11:10
В смысле через "Найти()" - ресурс строковый? А запросом по "ПОДОБНО" никак? Обязательно столько информации в тз помещать?
з.ы. недостаточно памяти через попытку не победишь))
3 kozhem1990
 
15.02.16
11:18
Перед отладкой заглянул в диспетчер: доступно 2,5 Гб памяти. Попытку использую, чтобы записать в лог ошибку, если такая такая имеет метсо быть при записи в РС.
4 H A D G E H O G s
 
15.02.16
11:18
код покажи
5 kozhem1990
 
15.02.16
11:19
поиск = ТЗ.Найти(<Значение>, <Колонки>), - где <Значение>- это мой ресурс, а <Колонки>- имя колонки таблицы значения, по которой ищу
6 kozhem1990
 
15.02.16
11:21
Для каждого Строка Из ТаблицаРС Цикл
                ТЗ.Индексы.Добавить("nn");  
                Поиск = ТЗ.Найти(Строка.НоменклатурныйНомер, "nn");
                Если ЗначениеЗаполнено(Поиск) Тогда
                    МенеджерЗаписи = РегистрыСведений.НоменклатурныеНомера.СоздатьМенеджерЗаписи();
                    МенеджерЗаписи.Номенклатура = Строка.Номенклатура;
                    МенеджерЗаписи.СерияНоменклатуры = Строка.СерияНоменклатуры;
                    МенеджерЗаписи.ДокументПартии = Строка.ДокументПартии;
                    МенеджерЗаписи.Прочитать();
                    МенеджерЗаписи.ДатаПоследнегоДвиженияИС = Поиск[0].Dkr;
                    Попытка
                        МенеджерЗаписи.Записать();
                        Текст.ЗаписатьСтроку("" + ТекущаяДата() + " " + "Cоздана запись с номенклатурным номером " + Строка.НоменклатурныйНомер);
                        Текст.ЗаписатьСтроку("");
                    Исключение
                        Текст.ЗаписатьСтроку("" + ТекущаяДата() + " " + "Не удалось создать запись в регистре с номенклатурным номером " + Строка.НоменклатурныйНомер);
                        Текст.ЗаписатьСтроку("");
                    КонецПопытки;
                КонецЕсли;
            КонецЦикла;
7 kozhem1990
 
15.02.16
11:23
ТаблицаРС - в нее выгрузил РС НоменклатурныеНомера через запрос, а ТЗ - таблица значений.
8 ObjectRelation Model
 
15.02.16
11:23
(6) а зачем индекс создавать в цикле?
9 H A D G E H O G s
 
15.02.16
11:23
ТЗ.Индексы.Добавить("nn");
вынести за цикл
10 kozhem1990
 
15.02.16
11:24
попробую сейчас, спасибо)
11 H A D G E H O G s
 
15.02.16
11:25
Но и этого может не хватить, индексы занимают дозвизды места.
Найти в таблицах через Merge
12 H A D G E H O G s
 
15.02.16
11:26
Вот это тоже не понятно

Поиск[0].Dkr;
13 kozhem1990
 
15.02.16
11:35
(12) Дело было в индексе, вроде не вылетает больше, спасибо еще раз. Поиск[0].Dkr - несколько записей может быть найдено по данному ресурсу в ТЗ, я выбираю самую первую найденную.
14 kozhem1990
 
15.02.16
11:45
Друзья, спасибо всем, можно тему закрывать: действительно, поместил по неопытности создание индекса в цикл, вынес за его пределы, и всё заработало)
15 H A D G E H O G s
 
15.02.16
11:50
(13) "несколько записей может быть найдено по данному ресурсу в ТЗ, я выбираю самую первую найденную."

неправильно
16 kozhem1990
 
15.02.16
12:19
(13) Спасибо, поменял код: теперь ищу не в ТЗ, а перебираю записи ТЗ и ищу соответствие в РС.
17 kozhem1990
 
15.02.16
12:19
(15) Спасибо, поменял код: теперь ищу не в ТЗ, а перебираю записи ТЗ и ищу соответствие в РС.
18 HardBall
 
15.02.16
12:29
ТЗ  во временную таблицу.
Соединяй с в запросе РС по значению ресурса.
Перебирай выборку.
Писай в регистр.
Профит.
19 kozhem1990
 
15.02.16
13:26
(18) На будущее это мне, учту, пока оптимизировать мне так не надо профессионально, уже отработало и так, загрузил данные, но спасибо)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн