Имя: Пароль:
1C
1С v8
Запись в регистр сведений. Где ошибка?
0 Bananas
 
07.09.12
11:13
&НаСервере
Procedure  ЗагрузитьТранспортныеОграничения(ТаблицаТоваров)
   
   Var Separator;
   ЗАпросСкладов = Новый Запрос;
   ЗАпросСкладов.Текст =
   "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    Склады.Ссылка,
   |    Склады.ВариантСроковПоставки
   |ИЗ
   |    Справочник.Склады КАК Склады";
   ТаблицаСкладов = ЗАпросСкладов.Выполнить().Выгрузить();
   СтруктураТаблиц = ПолучитьИзВременногоХранилища(ТаблицаТоваров).ТаблицаЗначений;
   Номенклатура = Справочники.Номенклатура;
   Запись= РегистрыСведений.ТранспортныеОграничения;
   НаборЗаписей = Запись.СоздатьНаборЗаписей();
   //НаборЗаписей .Отбор.Склад.Установить(Склад.Ссылка, Истина);
   НаборЗаписей.Прочитать();
   НаборЗаписей.Очистить();
   НаборЗаписей.Записать(Истина);
   //возврат;
   Сч = 0;
   Для Сч = 0 По СтруктураТаблиц.Количество()-1 Цикл
       Строчка = СтруктураТаблиц.Получить(Сч).Значение;
       эТовар =  Номенклатура.НайтиПоРеквизиту("Артикул",Строчка.АртикулНоменкл);
       Если Не ЗначениеЗаполнено(эТовар) Тогда Продолжить; КонецЕсли; //  Продолжить;
       Для Каждого ЗаписьСклада из ТаблицаСкладов Цикл
           СтрокаЗаписи = НаборЗаписей.Добавить();
           СтрокаЗаписи.Склад = ЗаписьСклада.Ссылка;//СКлад;
           СтрокаЗаписи.Номенклатура = эТовар.Ссылка;
           СтрокаЗаписи.СпособПополненияЗапаса = Справочники.СпособыПополненияЗапаса.НайтиПоНаименованию("Покупка у поставщика");
           ПостфиксКолонки = ЗаписьСклада.ВариантСроковПоставки;
           СтрочноеПредставлениеСрока =  Строчка["CрокТранспортировки"+ПостфиксКолонки];
           ЧисловойСрок =
           ?(СтрочноеПредставлениеСрока = "C1",    7,
           ?(СтрочноеПредставлениеСрока = "C2",    5,
           ?(СтрочноеПредставлениеСрока = "C2A",    10,
           ?(СтрочноеПредставлениеСрока = "C3(+)",    100,
           ?(СтрочноеПредставлениеСрока = "C3(2)",    14,
           ?(СтрочноеПредставлениеСрока = "C3(4)",    28,
           ?(СтрочноеПредставлениеСрока = "C3(5)",    35,
           ?(СтрочноеПредставлениеСрока = "C3(6)",    42,
           ?(СтрочноеПредставлениеСрока = "C3(7)",    49,0)))))))));

           СтрокаЗаписи.СрокТранспортировки = ЧисловойСрок;
           СтрокаЗаписи.Календарь = Справочники.Календари.НайтиПоНаименованию("Стандартный календарь пятидневка");
           СтрокаЗаписи.СкладскойСтатус = СТрочка["СкладскойСтатус"+ПостфиксКолонки];
           СтрокаЗаписи.МинимальнаяПартияПродажи = Число(СТрочка["МинПартия"+ПостфиксКолонки]);
           СтрокаЗаписи.Заблокировано = ?(СТрочка.Заблокировано = "Нет",Ложь,Истина);
           СтрокаЗаписи.СнимаетсяСПродаж = ?(СТрочка.СнимаетсяСПродаж = "Нет",Ложь,Истина);
           СтрокаЗаписи.Активность = Истина;
       КонецЦикла;
   EndDo;    
   НаборЗаписей.Записать(Истина);
   
EndProcedure


Попытался записывать по складам(код закомментирован) начинает выдавать ошибку неуникальности(Запись с таким ключом уже есть). Перепробовал все варианты НаборЗаписей.Записать(Истина) с ложью и истиной. Потом вроде скопом стало получаться. Но сейчас когда количество записей перешло определенный предел 36000*на количество складов то стало выдавать нехватку памяти. Подскажите плиз где ошибка в коде, исправив которую, можно было записывать порциями по складам а не сразу скопом. Скопом писало нормально без всяких нарушений уникальности.
1 Команданте
 
07.09.12
11:14
писец код
2 zladenuw
 
07.09.12
11:15
а где отборы по измерениям. до прочтение. по этому и ошибка
3 Bananas
 
07.09.12
11:16
(2) Там закомментированно. Изначально был отбор. Первый склад грузит нормально. А при втором складе начинает выдавать ошибку.
4 Bananas
 
07.09.12
11:17
(2) То что отбор не в цикле, это я вначале вообще поочереди склады грузил. Потом уже начал скопом все склады перебирать.
5 Bananas
 
07.09.12
11:18
(1) Согласен. Вот прошу помощи.
6 zladenuw
 
07.09.12
11:21
так. какие у тебя измерение и ресурсы в РС
7 zladenuw
 
07.09.12
11:22
и ошибку покаж
8 Bananas
 
07.09.12
11:23
(6) Склад, Номенклатура, СпособПополненияЗапаса . Характеристика не используется. Остальное ресурсы. Проблемы возникли, когда добавил два новых ресурса. Это УТ11.
9 Bananas
 
07.09.12
11:25
(7) В данном случае ошибка "Недостаточно памяти". До добавления ресурсов было все нормально. А в случае если начинаю писать порциями, то дает что "Запись с такими ключами уже существует".
10 zladenuw
 
07.09.12
11:27
на делать так как в СП

КурсыВалют = РегистрыСведений.КурсыВалют;
НаборКурсов = КурсыВалют.СоздатьНаборЗаписей();
Доллар = Справочники.Валюты.НайтиПоНаименованию("USD");
НаборКурсов.Отбор.Валюта.Установить(Доллар);
НаборКурсов.Отбор.Период.Установить(НачалоДня(ТекущаяДата()));
НаборКурсов.Прочитать();
Если НаборКурсов.Количество() = 0 Тогда
   НовыйКурс = НаборКурсов.Добавить();
   НовыйКурс.Валюта = Доллар;
   НовыйКурс.Период = ТекущаяДата();
ИначеЕсли НаборКурсов.Количество() = 1 Тогда
   НовыйКурс = НаборКурсов[0];
Иначе
   Текст = "ru = ""Курс валюты задается один раз в день."";"
    + " en = ""Rate is set once a day.""";
   Предупреждение(НСтр(Текст), 60);
   Возврат;
КонецЕсли;
НовыйКурс.Курс = 31.44;
НовыйКурс.Кратность = 1;
НаборКурсов.Записать();
11 zladenuw
 
07.09.12
11:28
а хотя...
 СтрокаЗаписи.СпособПополненияЗапаса = Справочники.СпособыПополненияЗапаса.НайтиПоНаименованию("Покупка у поставщика");
СпособПополненияЗапаса  какие свойства стоят для него РС
12 Bananas
 
07.09.12
11:32
Запись= РегистрыСведений.ТранспортныеОграничения;
   НаборЗаписей = Запись.СоздатьНаборЗаписей();
   //возврат;
   Сч = 0;
   Для Сч = 0 По СтруктураТаблиц.Количество()-1 Цикл
       Строчка = СтруктураТаблиц.Получить(Сч).Значение;
       эТовар =  Номенклатура.НайтиПоРеквизиту("Артикул",Строчка.АртикулНоменкл);
       НаборЗаписей .Отбор.Номенклатура.Установить(эТовар.Ссылка, Истина);
       НаборЗаписей.Прочитать();
       НаборЗаписей.Очистить();
       НаборЗаписей.Записать(Истина);

       Если Не ЗначениеЗаполнено(эТовар) Тогда Продолжить; КонецЕсли; //  Продолжить;
       Для Каждого ЗаписьСклада из ТаблицаСкладов Цикл
           СтрокаЗаписи = НаборЗаписей.Добавить();
           СтрокаЗаписи.Склад = ЗаписьСклада.Ссылка;//СКлад;
           СтрокаЗаписи.Номенклатура = эТовар.Ссылка;
           СтрокаЗаписи.СпособПополненияЗапаса = Справочники.СпособыПополненияЗапаса.НайтиПоНаименованию("Покупка у поставщика");
           //Если ПостфиксКолонки = "1" Тогда
           ПостфиксКолонки = ЗаписьСклада.ВариантСроковПоставки;
           СтрочноеПредставлениеСрока =  Строчка["CрокТранспортировки"+ПостфиксКолонки];
           ЧисловойСрок =
           ?(СтрочноеПредставлениеСрока = "C1",    7,
           ?(СтрочноеПредставлениеСрока = "C2",    5,
           ?(СтрочноеПредставлениеСрока = "C2A",    10,
           ?(СтрочноеПредставлениеСрока = "C3(+)",    100,
           ?(СтрочноеПредставлениеСрока = "C3(2)",    14,
           ?(СтрочноеПредставлениеСрока = "C3(4)",    28,
           ?(СтрочноеПредставлениеСрока = "C3(5)",    35,
           ?(СтрочноеПредставлениеСрока = "C3(6)",    42,
           ?(СтрочноеПредставлениеСрока = "C3(7)",    49,0)))))))));

           СтрокаЗаписи.СрокТранспортировки = ЧисловойСрок;
           СтрокаЗаписи.Календарь = Справочники.Календари.НайтиПоНаименованию("Стандартный календарь пятидневка");
           СтрокаЗаписи.СкладскойСтатус = СТрочка["СкладскойСтатус"+ПостфиксКолонки];
           СтрокаЗаписи.МинимальнаяПартияПродажи = Число(СТрочка["МинПартия"+ПостфиксКолонки]);
           СтрокаЗаписи.Заблокировано = ?(СТрочка.Заблокировано = "Нет",Ложь,Истина);
           СтрокаЗаписи.СнимаетсяСПродаж = ?(СТрочка.СнимаетсяСПродаж = "Нет",Ложь,Истина);
           СтрокаЗаписи.Активность = Истина;
       КонецЦикла;
       НаборЗаписей.Записать(Истина);
   EndDo;    
   //НаборЗаписей.Записать(Истина);

Сделал так вроде заработало. Что странно. Раньше не работало.

(11) Не индексировать там стоит.
13 zladenuw
 
07.09.12
11:34
у тебя 3 измерения. тебя по 2-3 нужно делать отбор. ты делал по складу. и получалось так что у тебя на 1 склад шло 3 записи. и по этому 1с писала, что хер тебе. такая запись есть.
14 Bananas
 
07.09.12
11:36
(13) Дык если все скопом писал одним набором, всеж шло нормально. Пока памяти хватало.
15 zladenuw
 
07.09.12
11:37
если первый раз отбор был по складу, и ты поставил   НаборЗаписей.Записать(Истина) то у тебя пред запись с таким ключом перезаписывалась.
16 Bananas
 
07.09.12
11:38
В принципе если вникнуть в (13) до меня что-то начинает доходить.
17 Bananas
 
07.09.12
11:38
(15) Ну в данном случае получается что я ставлю отбор по номенклатуре а склады скопом пишу. Поэтому пишется все нормально.
18 zladenuw
 
07.09.12
11:42
у тебя могу перезаписаться записи где есть данная номенклатура и другой склад. так что лучше 2 отбора и вперед
19 Bananas
 
07.09.12
11:43
(18) Сейчас в базе УТ11 36000 номенклатур и 13 складов. 468000 записей в регистре. Интересно под линуксом на Постгресе выдержит когда количество товаров будет 200000? Не сильно будет тормозить? А это только один регистр. Есть еще цены, допреквизиты, свойства и много чего еще.

Ну так по любому быстрее должно быть. Это первая подгрузка из эксель. Потом соптимизирую по записи.
20 zladenuw
 
07.09.12
11:47
(19) а чего ему не выдержать. единственное плохое качество постгреса что он блокируют все таблицу, а не строку таблицы как МС. а так все путем. у нас даже днем бекапы делаются базы и все ок. не кто не жалуется
21 Bananas
 
07.09.12
11:50
(20) Да клиент повадился на sql.ru. Ему там много что наговорили. :)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.