Конвертация 2.1 как выгружать записи регистра сведений порциями? #808327


#0 by il0
Есть конвертация 2.1, в ней настроена выгрузка из ЕРП в Розницу, в том числе и регистра сведений НоменклатураСегментов. У нас так получается, что периодически объем изменений в этом регистре достигает нескольких сотен тысяч записей, соответственно, при загрузке в розницу одним пакетом это все грузится часами, если не сутками. И пока не загрузится, следующие изменения в розницу не попадают, что неприемлемо. Решил ограничить объём выгружаемых за один раз записей, в ПКО РС НоменклатураСегментов, в процедуре ПередВыгрузкой если счётчик превышает порог пишу Отказ=Истина. Прикол в том, что, оказывается, записи РС выгружаются не сами по себе, а в составе набора записей. Т.е. выгружается узел с набором записей, а в этом наборе находится одна запись. Там, где отрабатывает Отказ=Истина, узел с набором записей всё равно создается, просто не пишется вложенный узел с самой записью. Почему так, мне не понятно. Из-за этого при обратной синхронизации из розницы регистрация изменений снимается всё равно со всех записей, и выгруженных и не выгруженных. Есть идеи, как по другому выгружать записи РС порциями? Сорри за многобукв.
#1 by Zhuravlik
Используется штатная выборка?
#2 by il0
Нет, изменения регистрируются программно при изменении элемента справочника СегментыНоменклатуры
#3 by Zhuravlik
Я о правилах) ПВД как работает? Штатно все выбирается, не запросом? Можно поизвращаться с запросом, в общем, но тогда квитирование ляжет на плечи разработчика
#4 by il0
ПВД работает по стандартной выборке. Пожалуй, поковыряю вариант с запросом.
#5 by тарам пам пам
Погугли еще флажок "основной отбор" в измерении регистра НоменклатураСегмента - он на регистрацию влияет. Скорее всего, на номенклатуре он снят - в этом случае как раз регистрируется и выгружается весь регистр одним набором. Если его поставить, то регистр будет регистрироваться и выгружаться по одной записи, в разрезе каждой номенклатуры.
#6 by тарам пам пам
+ по крайней мере, так он для РИБ работает. По идее, конвертация тоже должна его учитывать.
#7 by il0
У регистра три измерения - Сегмент, Номенклатура, Характеристика, и у всех стоит флаг "основной отбор". Не знал, что это может влиять на характер выгрузки. У меня как раз на каждую запись создаётся по отдельному набору. Т.е. 700000 записей - 700000 наборов
#8 by тарам пам пам
хм, выходит в конвертации он не учитывается. А почему изменений так много? Номенклатура действительно постоянно "плавает" между сегментами?
#9 by Zhuravlik
может имеет смысл попробовать его снять с какого-нибудь измерения, чтобы наборы выгружать  по 2, а не по трем
#10 by il0
Отдел маркетинга таким образом скидки назначает, здесь довольно запутанный механизм ценообразования, пока не вникал, можно ли это по-другому организовать. Думал с технической стороны проблему по-быстрому решу, а в результате зарылся что-то.
#11 by тарам пам пам
если в лоб - можно действительно попробовать снять этот флаг с номенклатуры и характеристик, как в предложили, чтобы сегменты выгружались целиком. Обычно целый набор пишется гораздо быстрее кучи мелких записей. Но тогда к обмену будет регистрироваться по сути всегда весь сегмент, даже если в нем изменили только одну позицию номенклатуры.
#12 by kudlach
Они сегмент обработкой что ли присваивают в таких количествах ? Это же как Планы обмена с регистрацией то перегружаются.... И база уже в Террабайтах меряется...
#13 by il0
В общем, коллеги, итог суточных изысканий: по наводке уважаемого Zhuravlik сначала игрался с ПВД, и на первый взгляд даже получилось. Код в обработчике ПередВыгрузкой действительно выгружал только 3 записи. Но проблема оказалась в том, что выгруженными считались всё равно все записи регистра, и при обратном ответе от розницы регистрация изменений снималась со всех записей, а не только с трёх реально выгруженных. Аналогичная история произошла и с обработчиком ПередОбработкой, в нем я пытался выбирать измененные записи и запросом к таблице РегистрСведений.НоменклатураСегмента.Изменения, и с помощью ПланыОбмена.ВыбратьИзменения(Узел,1,Метаданные.РегистрыСведений.НоменклатураСегмента) но в этих случаях всё равно выгрузка продолжала считать все записи выгруженными, а не только реально обработанную часть.
#14 by il0
Продолжаю. В итоге решил отказаться от использования ПВД, отключил его, чтобы оно не "портило" информацию о выгруженности записей. В самой конвертации в обработчике ПослеВыгрузкиДанных вставил следующий код: "ВЫБРАТЬ ПЕРВЫЕ 3 И оно заработало. Обратите внимание на две вещи: 1) Для выгрузки записей регистра сведений нельзя пользоваться процедурой ВыгрузитьПоПравилу - она тупо создает узел с записью регистра, а такой узел не понимает процедура загрузки, и дает ошибку. Процедура ВыгрузитьРегистр создает корректный узел с набором записей, содержащий коллекцию строк из одной строки 2) Оказывается, в качестве фильтра для метода ВыбратьИзменения можно использовать не только метаданные, но, в случае с регистром сведений, и набор записей. Тогда метод возвращает только те записи которые есть в переданном наборе, и ТОЛЬКО ДЛЯ НИХ проставляет номер отправленного сообщения. Т.о. я в ручном режиме выполняю то, что делает ПВД, но только в той части, в которой мне надо.
#15 by il0
Ещё поправка - в запросе сначала нужно выбирать ранее выгруженные изменения, чтобы повторно их выгружать, чтобы они не терялись, если не загрузились в предыдущие итерации         "ВЫБРАТЬ ПЕРВЫЕ 10000
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

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