Имя: Пароль:
1C
1С v8
Заполнить регистр накопления из таблицы значений
0 Alekzander
 
05.07.13
09:39
Понимаю, что тема уже была, смотрел и анализировал, но всё же...

Стоит задача - выбрать данные регистра с отбором по дате, занести в ТЗ, свернуть её и снова загрузить в тот же регистр. Вычитал, что можно использовать следующую конструкцию:

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

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

       КонецЦикла;
   КонецЦикла;
   НаборЗаписей.Загрузить(Тз);
   
   НаборЗаписей.Записать();

Сейчас она во многом мне не нравится, хотя я точно не знаю, верная она или нет, в любом случае, выполняется она чертовски долго (почти 12 часов), существует ли другой вариант или можно как-то ускорить этот процесс, например, избавившись от вложенного цикла?
1 Alekzander
 
05.07.13
09:40
Ах да, забыл самое главное. УТ 11.1 у меня)
2 skunk
 
05.07.13
09:42
"12 часов" это насколько записей?
3 Alekzander
 
05.07.13
09:44
(2) ну за день бывает около 100-200, суммарно за полмесяца (работаю на копии базы от 14 июня) приблизительно 1500-1700, не думаю, что это много.
4 skunk
 
05.07.13
09:48

   тзОбхода = ТЗ.Скопировать();
   тзОбхода.Свернуть("Номенклатура,Владелец,Склад,ВидЗапасовПродавца",);
   Для Каждого Стр Из тзОбхода Цикл
       Отбор = Новый Структура();
       Отбор.Вставить("Номенклатура",Стр.Номенклатура);
       Отбор.Вставить("Владелец",Стр.Владелец);
       Отбор.Вставить("Склад",Стр.Склад);
       Отбор.Вставить("ВидЗапасовПродавца",Стр.ВидЗапасовПродавца);
       Строки = ТЗ.НайтиСтроки(Отбор);
       Для Каждого Строка Из Строки Цикл
           Строка.Номенклатура = Стр.Номенклатура;
           Строка.ВидЗапасовПродавца = Стр.ВидЗапасовПродавца;
           Строка.Владелец = Стр.Владелец;
           Строка.Склад = Стр.Склад;
           Если Стр.Количество <= 0 Тогда
               Строка.ВидДвижения = ВидДвиженияНакопления.Приход;
               Строка.Количество = -Стр.Количество;
           Иначе
               Строка.ВидДвижения = ВидДвиженияНакопления.Расход;
               Строка.Количество = Стр.Количество;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   НаборЗаписей.Загрузить(Тз);
   НаборЗаписей.Записать();
5 Alekzander
 
05.07.13
09:50
(4) забыл эту часть кода приложить. Она есть, копия ТЗ, на которой выполняется свёртка.
6 skunk
 
05.07.13
09:51
(5)для чего тогда в цикле "Строки = ТЗ.НайтиСтроки(Отбор);"?
7 ДенисЧ
 
05.07.13
09:51
полторы тыщи записей - 12 часов????????
У тебя сервер на первом пне, что ли??
8 Alekzander
 
05.07.13
09:51
(4) там у меня ещё суммирование идёт по ресурсам Количество и Возвращено:

ТЗ2.Свернуть("Владелец, Номенклатура, Склад, ВидЗапасовПродавца",    "Количество, Возвращено");
9 Maxus43
 
05.07.13
09:53
только расчету себестоимости на УПП позволено крутится больше 3-4 часов, всё остальное - очень кривой код ИМХО)
10 skunk
 
05.07.13
09:53
давай весь код сюда ... точнее обработку выложи куда-нибудь
11 Alekzander
 
05.07.13
09:59
(10) ок, щас
12 Alekzander
 
05.07.13
09:59
13 skunk
 
05.07.13
10:01
(12)пиля ... я забыл тут скачка файла из нета забанена
14 skunk
 
05.07.13
10:02
вырежи весь код ... и отправь письмом на [email protected]
15 ptiz
 
05.07.13
10:07
код - жееееесть...
в логику вникать на стал, но

1) соединение в запросе чудовищное
2) если делаешь поиск в больших таблицах - используй индексирование
16 Alekzander
 
05.07.13
10:09
(14) готово
17 skunk
 
05.07.13
10:38
наверное надо как-то так сделать


стрЗапрос = "ВЫБРАТЬ
           |    ТоварыОрганизацийКПередаче.ОрганизацияВладелец,
           |    ТоварыОрганизацийКПередаче.Номенклатура,
           |    ТоварыОрганизацийКПередаче.Склад,
           |    ТоварыОрганизацийКПередаче.ВидЗапасовПродавца,
           |    ТоварыОрганизацийКПередаче.НомерГТД,
           |    ВЫБОР
           |        КОГДА ТоварыОрганизацийКПередаче.КоличествоОстаток <= 0
           |            ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
           |        ИНАЧЕ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
           |    КОНЕЦ КАК ВидДвижения,
           |    &сдРегистратор КАК Регистратор,
           |    СУММА(ВЫБОР
           |            КОГДА ТоварыОрганизацийКПередаче.КоличествоОстаток <= 0
           |                ТОГДА -ТоварыОрганизацийКПередаче.КоличествоОстаток
           |            ИНАЧЕ ТоварыОрганизацийКПередаче.КоличествоОстаток
           |        КОНЕЦ) КАК КоличествоОстаток,
           |    СУММА(ТоварыОрганизацийКПередаче.ВозвращеноОстаток) КАК ВозвращеноОстаток
           |ИЗ
           |    РегистрНакопления.ТоварыОрганизацийКПередаче КАК ТоварыОрганизацийКПередаче
           |ГДЕ
           |    ТоварыОрганизацийКПередаче.Период >= ДАТАВРЕМЯ(2013, 6, 1)
           |
           |СГРУППИРОВАТЬ ПО
           |    ТоварыОрганизацийКПередаче.ОрганизацияВладелец,
           |    ТоварыОрганизацийКПередаче.Номенклатура,
           |    ТоварыОрганизацийКПередаче.Склад,
           |    ТоварыОрганизацийКПередаче.ВидЗапасовПродавца,
           |    ТоварыОрганизацийКПередаче.НомерГТД,
           |    ВЫБОР
           |        КОГДА ТоварыОрганизацийКПередаче.КоличествоОстаток <= 0
           |            ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
           |        ИНАЧЕ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
           |    КОНЕЦ";
запДанных = Новый Запрос(стрЗапрос);
запДанных.УстановитьПараметр("сдРегистратор", Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("000Т-000001"));
тзРезультат = запДанных.Выполнить().Выгрузить();
нзрнТовары = РегистрыНакопления.ТоварыОрганизацийКПередаче.СоздатьНаборЗаписей();
нзрнТовары.Отбор.Регистратор.Установить(Выборка.Регистратор);
нзрнТовары.Загрузить(тзРезультат);
нзрнТовары.Записать();
18 skunk
 
05.07.13
10:40
ну это если на твой код орентироваться
19 skunk
 
05.07.13
10:40
и как мне кажеться, это

нзрнТовары.Отбор.Регистратор.Установить(Выборка.Регистратор);

надо изменить на это
нзрнТовары.Отбор.Регистратор.Установить(Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("000Т-000001"));
20 Alekzander
 
05.07.13
11:06
(19) щас со старшим программистом сидим, он примерно такой же вариант подсказывает, как в (17). По крайней мере, я понял, что и без циклов можно обойтись, хотя вряд ли - в любом случае виды движений в каждой строке изменять придётся, но этот цикл навряд ли будет 12 часов выполняться)
21 Alekzander
 
05.07.13
11:09
(17) а, проглядел условие в запросе. Тогда цикл даром не нужен.
22 skunk
 
05.07.13
11:09
(20)они в самом запросе и меняються
23 Alekzander
 
05.07.13
12:55
Теперь проблема такая: вроде и установил отбор по регистратору - а всё равно идёт ругачка на его отсутствие, в чём может быть загвоздка?
24 skunk
 
05.07.13
13:03
(23)скорее всего в из-за (19) ... у тебя регистратор в отборе не соотвествует регистратору который устанавливается из таблицы значений
25 skunk
 
05.07.13
13:04
и кстати глянь может ли твой регистратор делать движения по данному регистру
26 Alekzander
 
05.07.13
13:17
(25) я даже просто тупо создаю документ "передача товаров", он стопудово делает движения по этому регистру, а в результате хоть бы хны.

Документ = Документы.ПередачаТоваровМеждуОрганизациями.СоздатьДокумент();
Документ.Дата = ТекущаяДата();
Документ.Записать();
нзрнТовары.Отбор.Регистратор.Установить(Документ);
нзрнТовары.Загрузить(тзРезультат);
нзрнТовары.Записать();

Может порядок неправильный или что ещё?
27 skunk
 
05.07.13
13:20
(26)а в запрос ты его отдаешь?
28 Alekzander
 
05.07.13
13:21
(27) да в запросе есть Регистратор, пробовал, как раньше получалось нзрнТовары.Отбор.Регистратор.Установить(Выборка.Регистратор) - не пашет...
29 skunk
 
05.07.13
13:21
так что даст?

нзрнТовары = РегистрыНакопления.ТоварыОрганизацийКПередаче.СоздатьНаборЗаписей();
нзрнТовары.Загрузить(тзРезультат);
нзрнТовары.Записать();
30 Alekzander
 
05.07.13
13:23
{Форма.Форма.Форма(59)}: Ошибка при вызове метода контекста (Записать)
нзрнТовары.Записать();
по причине:
Ошибка записи! Не установлен отбор по регистратору (Регистр накопления: Товары организаций к передаче)

Что и следовало ожидать...
31 skunk
 
05.07.13
13:30
Документ = Документы.ПередачаТоваровМеждуОрганизациями.СоздатьДокумент();
Документ.Дата = ТекущаяДата();
Документ.Записать();
нзрнТовары.Отбор.Регистратор.Установить(Документ.Ссылка);
32 Alekzander
 
05.07.13
13:34
(31) блиииииннн.... во я дурак... Ссылка же, ну конечно!))) Пятница, мозги совсем не пашут))