Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

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

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

Если Параметры.СчетчикНоменклатурыСегментов>2 Тогда
    Отказ=Истина;
Иначе
    Параметры.СчетчикНоменклатурыСегментов=Параметры.СчетчикНоменклатурыСегментов+1;
КонецЕсли;

действительно выгружал только 3 записи. Но проблема оказалась в том, что выгруженными считались всё равно все записи регистра, и при обратном ответе от розницы регистрация изменений снималась со всех записей, а не только с трёх реально выгруженных.
Аналогичная история произошла и с обработчиком ПередОбработкой, в нем я пытался выбирать измененные записи и запросом к таблице РегистрСведений.НоменклатураСегмента.Изменения, и с помощью ПланыОбмена.ВыбратьИзменения(Узел,1,Метаданные.РегистрыСведений.НоменклатураСегмента) но в этих случаях всё равно выгрузка продолжала считать все записи выгруженными, а не только реально обработанную часть.
   il0
 
14 - 14.11.17 - 13:23
(13) Продолжаю.
В итоге решил отказаться от использования ПВД, отключил его, чтобы оно не "портило" информацию о выгруженности записей. В самой конвертации в обработчике ПослеВыгрузкиДанных вставил следующий код:
Узел=ПланыОбмена.ОбменУправлениеПредприятиемРозница.НайтиПоНаименованию("Розница, редакция 2.1 (2)");
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ ПЕРВЫЕ 3
|    НоменклатураСегментаИзменения.Сегмент,
|    НоменклатураСегментаИзменения.Номенклатура,
|    НоменклатураСегментаИзменения.Характеристика
|ИЗ
|    РегистрСведений.НоменклатураСегмента.Изменения КАК НоменклатураСегментаИзменения
|ГДЕ
|    НоменклатураСегментаИзменения.Узел = &Узел";

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

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

КонецЦикла;

И оно заработало. Обратите внимание на две вещи:
1) Для выгрузки записей регистра сведений нельзя пользоваться процедурой ВыгрузитьПоПравилу - она тупо создает узел с записью регистра, а такой узел не понимает процедура загрузки, и дает ошибку. Процедура ВыгрузитьРегистр создает корректный узел с набором записей, содержащий коллекцию строк из одной строки
2) Оказывается, в качестве фильтра для метода ВыбратьИзменения можно использовать не только метаданные, но, в случае с регистром сведений, и набор записей. Тогда метод возвращает только те записи которые есть в переданном наборе, и ТОЛЬКО ДЛЯ НИХ проставляет номер отправленного сообщения.

Т.о. я в ручном режиме выполняю то, что делает ПВД, но только в той части, в которой мне надо.
   il0
 
15 - 14.11.17 - 17:37
Ещё поправка - в запросе сначала нужно выбирать ранее выгруженные изменения, чтобы повторно их выгружать, чтобы они не терялись, если не загрузились в предыдущие итерации

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует