Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 дек 2024, 06:53

Быстрая запись в регистр сведений

Автор pyrkin_vanya, 20 окт 2014, 09:28

0 Пользователей и 1 гость просматривают эту тему.

pyrkin_vanya

Всем привет. Ребят, подскажите пожалуйста. Есть регистр сведений. Непериодический, независимый. Там хранятся данные для выгрузки. Данных много. Каждый день добавляется по несколько тысяч. Есть реквизит в этом регистре "ВыгруженНаСайт". Срабатывает регл. задание и выгружает на сайт эти данные. После того, как выгрузка прошла нужно во всех необходимых записях просто проставить этот реквизит в Истина. В процессе выгрузки я собираю все значения измерений в табл. значений,  а потом в цикле перебираю ее и устанавливаю отбор в наборе записей. Вот


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

ЭлементНабора = НаборВыгрузкиНаСайт[0];
ЭлементНабора.ДатаВыгрузкиНаСайт      = СерверныеФункции.ТекущаяДатаНаСервере();
ЭлементНабора.ВыгруженНаСайт          = Истина;


Попытка
   НаборВыгрузкиНаСайт.Записать(Истина);
Исключение
  ЗаписьЖурналаРегистрации("РегистрацияДокументаДляВыгрузкиНаСайт", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка при записи в РС ИсторияВыгрузкиНаСайт документа: " + Ссылка);
КонецПопытки;
[size=78%]
Это работает, но не очень быстро. В наборе записей нельзя установить отбор по всей таблице сразу. ВСписке например. Может есть есть какие методы? [/size]

Yura063

А почему бы вам при выгрузки на сайт отмечать, все ровно вы там перебираете все данные регистра.
И почему бы вам не удалять из регистра записи, тем самым выш регистр не будет таким большим и отбор будет работать быстрее.
Помогли, отблагодари!

pyrkin_vanya

Цитата: Yura063 от 20 окт 2014, 09:44
А почему бы вам при выгрузки на сайт отмечать, все ровно вы там перебираете все данные регистра.
И почему бы вам не удалять из регистра записи, тем самым выш регистр не будет таким большим и отбор будет работать быстрее.
Объясню. Это только одна выгрузка. Есть еще и другая (контрольная). И иногда приходится данные перевыгружать. Запросом просто данные сначала отбираются для выгрызки по определенным условиям. Все максимально быстро. Записи надо хранить, т.к. там я еще добавил еще дату и время выгрузки. Это надо отслеживать. Поэтому удалить их не могу. А сразу не могу записи менять. Во-первых тоже самое получится :), а во-вторых, от сайта может прийти не корректный ответ загрузки, тем самым выгрузка не прошла.

Yura063

Может как вариант записывайте в ТЗ те строки которые выгрузили в конце выгрузки, удачной, Циклом пройдите по ТЗ и проставьте значение. Все инфа будет хранится в памяти и выборку делать не нужно будет.
Помогли, отблагодари!

pyrkin_vanya

Цитата: Yura063 от 20 окт 2014, 10:07
Может как вариант записывайте в ТЗ те строки которые выгрузили в конце выгрузки, удачной, Циклом пройдите по ТЗ и проставьте значение. Все инфа будет хранится в памяти и выборку делать не нужно будет.
Я так и делаю. Работает. Когда 100 записей, то не заметно, а когда 1000, то заметно. В этом и вопрос.

Yura063

Судя по коду вы каждый элемент ищите в регистре
Добавлено: 20 окт 2014, 10:31


Цитата: pyrkin_vanya от 20 окт 2014, 10:11
Я так и делаю. Работает. Когда 100 записей, то не заметно, а когда 1000, то заметно. В этом и вопрос.
Еще вариант, вы меняете сразу при выгрузки на сайт, записываете в ТЗ. В случае не выгрузки то по ТЗ меняете значение обратно.
Помогли, отблагодари!

pyrkin_vanya

Цитата: Yura063 от 20 окт 2014, 10:21
Судя по коду вы каждый элемент ищите в регистре
У меня только одно измерений. И значение этого измерения всегда одно. По нему и делаю отбор.
Цитата: Yura063 от 20 окт 2014, 10:21
Еще вариант, вы меняете сразу при выгрузки на сайт, записываете в ТЗ. В случае не выгрузки то по ТЗ меняете значение обратно.
Сразу нельзя. Т.к. выгрузка через XML. И выполняется сразу и все. Так что только потом :)

cska-fanat-kz

Процедура КнопкаВыполнитьНажатие(Кнопка)
Сообщить("Начало выполнения - "+Строка(ТекущаяДата()));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсторияОбменаДанными.Период,
| ИсторияОбменаДанными.УзелИнформационнойБазы
|ИЗ
| РегистрСведений.ИсторияОбменаДанными КАК ИсторияОбменаДанными
|ГДЕ
| ИсторияОбменаДанными.УзелИнформационнойБазы = &Узел";

Запрос.УстановитьПараметр("Узел", Узел);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

КолвоЗаписей = 0;

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

Если ТекЗапись.Выбран() Тогда

ТекЗапись.КомментарийКВыгрузкеДанных = "???";
ТекЗапись.РезультатПоследнейВыгрузки = ЛОЖЬ;

КолвоЗаписей = КолвоЗаписей + 1;

КонецЕсли;
ТекЗапись.Записать();
КонецЦикла;

Сообщить("Колво записей - "+Строка(КолвоЗаписей));
Сообщить("Окончание выполнения - "+Строка(ТекущаяДата()));
КонецПроцедуры


Результат:
Начало выполнения - 20.10.2014 12:48:07
Колво записей - 4 521
Окончание выполнения - 20.10.2014 12:48:16
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

pyrkin_vanya

Цитата: cska-fanat-kz от 20 окт 2014, 10:48
Процедура КнопкаВыполнитьНажатие(Кнопка)
Сообщить("Начало выполнения - "+Строка(ТекущаяДата()));

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсторияОбменаДанными.Период,
| ИсторияОбменаДанными.УзелИнформационнойБазы
|ИЗ
| РегистрСведений.ИсторияОбменаДанными КАК ИсторияОбменаДанными
|ГДЕ
| ИсторияОбменаДанными.УзелИнформационнойБазы = &Узел";

Запрос.УстановитьПараметр("Узел", Узел);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

КолвоЗаписей = 0;

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

Если ТекЗапись.Выбран() Тогда

ТекЗапись.КомментарийКВыгрузкеДанных = "???";
ТекЗапись.РезультатПоследнейВыгрузки = ЛОЖЬ;

КолвоЗаписей = КолвоЗаписей + 1;

КонецЕсли;
ТекЗапись.Записать();
КонецЦикла;

Сообщить("Колво записей - "+Строка(КолвоЗаписей));
Сообщить("Окончание выполнения - "+Строка(ТекущаяДата()));
КонецПроцедуры


Результат:
Начало выполнения - 20.10.2014 12:48:07
Колво записей - 4 521
Окончание выполнения - 20.10.2014 12:48:16
Получается же тоже самое только через менеджер записи. В цикле же читается и в цикле же записывается. Перелопатил весь инет. Профессиональную разработку тоже. Ничего нет. Судя по всему других, более быстрых способов записи в регистр не существует. Печаль. Всем спасибо большое за участие.

cska-fanat-kz

Зато запросом получаете тот самый отбор "в списке"
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск