Работа с независимым регистром сведений #350039


#0 by Tronen
Привет всем! В одной конфигурации при синхронизации со сторонней БД SQL приходится записывать в регистр сведений (независимый, что очень важно) большие объемы данных (за один присест 3-6 тыщ записей). После чего эти записи определенным образом перерабатываются и записываются данные в другой регистр (тоже независимый), правда объемом раза в 2 поменьше... При работе с движениями документа, можно создавать ТЗ с колонками, соответствующими ресурсам и измерениям регистра, с последующей загрузкой путем Движения.БлаБла.Загрузить(ТЗ); С независимым регистром сведений такая тема не проходит. Можно СоздатьНаборЗаписей и потом Загрузить, но при этом переписывается весь регистр... Глядя на Замер производительности, больше всего времени занимает строчка Рег.Записать(истина) (порядка 85%), это при том, что помимо тупого копирования данных из ODBC-запроса необходимо много чего просчитать. В общем надо это дело ускорить... Желательно существенно... Машинка там бодрая конечно (2 движка по 4 цилиндра на 2 куба, САСовские винты, полностью буфферизированная четырехканальная память), но процесс последовательный (т.е. разветвить не получится на несколько потоков) и в итоге эта процедура более 5% от процессорных мощностей не занимает (при том что один процесс может занимать до 13%). Обидно блин... В связи с чем вопрос - можно ли каким-то путем всетаки собрать ТЗ (хренсним - большую) и пошустрому ее прямо из памяти затолкать в регистр? Может, конечно, глупый вопрос - есть ли у запросов 1cv8 умение не только выбирать, но и ИНПУТИТЬ или АПДЕЙТИТЬ? Есть еще мысля - минуя 1С напрямую заталкивать данные в SQL-таблицу... Как к этому отнесутся знающие люди? Заранее благодарю за советы.
#1 by ТелепатБот
#2 by H A D G E H O G s
1) Читаем про ОТБОР. 2) Инпутить нельзя.
#3 by H A D G E H O G s
1)СоздатьНаборЗаписей 2) Установить на него отбор 3) Загрузить из ТЗ 4) Записать 5) Попробовать использовать Транзакции 6) Отказаться от 2-ой записи в 2 регистра
#4 by Tronen
СоздатьНаборЗаписей и последующая загрузка из ТЗ - заменяет ВСЕ уже имеющиеся записи... 5) Попробовать использовать Транзакции 6) Отказаться от 2-ой записи в 2 регистра </quot> Не дошло...
#5 by H A D G E H O G s
Вот когда ОТБОР установите - заменится только то, что попадает под отбор
#6 by Tronen
Вот... Уже теплее, как мне кажется... Учитывая, что регистр сведений периодический (в пределах секунды), необходимо, чтобы перезаписывались только записи с периодом больше установленного (все остальное идет как попало, поэтому по остальным полям отбор устанавливать бесполезно)... Отбор может устанавливаться только на равенство... Дальше как?
#7 by H A D G E H O G s
Ладно. Только на равенство... Угу..Согласен. Тогда Менеджер Записи НачатьТранзакцию; МенеджерЗаписи сам все отфильтрует и перезапишет только то что надо. Проблема тогда в том, что читаться/писаться будет циклично, ну да ладно, лучше циклично писать то, что нужно, чем всем скопом толпой ненужное.
#8 by H A D G E H O G s
Ну или тот же менеджернабора записей циклично использовать.. Но там выборка уже побольше будет..
#9 by Tronen
Чета до меня не совсем дошло... В принципе - у меня сейчас происходит почти тоже самое. Если переписать названия из примера выше, то получится следующее: Для Каждого МоиДанные ИЗ ТаблицаДанных Цикл [/code] Разница заключается в следующем: 1) В моем случае при каждой итерации создается новый менеджер; 2) Не используются транзации; В Вашем случае: менеджер создается один, записывается при каждой итерации и используется механизм транзакций, которым я, впрочем, незнаком СОВСЕМ. Не могли бы Вы пояснить следующее: 1) В чем приемущество в быстродействии? 2) Для чего используется счетчик? 3) В Вашем коде отстутвует оператор "КонецЦикла". Где этот конец должен находиться? Заранее спасибо.
#10 by Tronen
Дополнение: в посте выше забыл удалить строку "НачатьТранзакцию"
#11 by H A D G E H O G s
Ошибся...
#12 by H A D G E H O G s
Транзакция позволяет писать в памяти, а не вносить изменения в базу. Счетчик для того, чтобы скидывать из памяти в базу каждую тысячу объектов.
#13 by H A D G E H O G s
Если мы не будем скидывать - производительность падает
#14 by H A D G E H O G s
Кроме того, может возникнуть ошибка и все данные потеряются
#15 by H A D G E H O G s
А так - что то запишется
#16 by H A D G E H O G s
Почитайте про МенеджерЗаписи и НаборЗаписей
#17 by H A D G E H O G s
P.S. 1000 ОБЪЕКТОВ  я взял наугад.. Подбирается число эмпирически.. Юзайте ЗамерПроизводительности
#18 by Tronen
Спасибо большое, очень полезная информация... Завтра обязательно попробую на объекте...
#19 by Tronen
Офигеть... За 5 минут 1,5 месяца обработать (около 75000 записей)!!! Раньше уходило пол-дня... Всем рекомендую с транзакциями работать!!!
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С