Выгрузка данных через произвольный запрос (План обмена)

1. SeverBaP 5 09.09.14 14:23 Сейчас в теме
Нужно используя план обмена передавать актуальные остатки товаров из УТ10 в самописною. Так как в УТ хранятся остатки в регистре накопления, а в приемнике в регистре сведений и нужно передавать полностью срез всех остатков на текущий момент. Для этого прописал для её всё в конвертации, в самом ПВД ПередОбработкой поместил код:
Запрос = Новый запрос();
Запрос.текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
               |    ВложенныйЗапрос.Склад КАК Склад,
               |    ВложенныйЗапрос.Номенклатура КАК Номенклатура,
               |    СУММА(ВложенныйЗапрос.КоличествоОстаток - ВложенныйЗапрос.КоличествоВРезерве) КАК Количество,
               |    ИСТИНА КАК Активность
               |ИЗ
               |    (ВЫБРАТЬ
               |        ТоварыНаСкладахОстатки.Склад КАК Склад,
               |        ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
               |        ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
               |        0 КАК КоличествоВРезерве
               |    ИЗ
               |        РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, {(Склад).* КАК Склад, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (СерияНоменклатуры).* КАК СерияНоменклатуры}) КАК ТоварыНаСкладахОстатки
               |    
               |    ОБЪЕДИНИТЬ ВСЕ
               |    
               |    ВЫБРАТЬ
               |        ТоварыВРезервеНаСкладахОстатки.Склад,
               |        ТоварыВРезервеНаСкладахОстатки.Номенклатура,
               |        0,
               |        ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток
               |    ИЗ
               |        РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаКон, {(Склад).* КАК Склад, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (СерияНоменклатуры).* КАК СерияНоменклатуры, (ДокументРезерва).* КАК ДокументОснование}) КАК ТоварыВРезервеНаСкладахОстатки) КАК ВложенныйЗапрос
               |
               |СГРУППИРОВАТЬ ПО
               |    ВложенныйЗапрос.Склад,
               |    ВложенныйЗапрос.Номенклатура
               |
               |УПОРЯДОЧИТЬ ПО
               |    Склад,
               |    Номенклатура";
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ТекущаяДата()));
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Показать

при совершении обмена данных он в файлы с данными выдает только те записи которые недавно прошли изменения, а если использовать обработку универсальныйобмен то выдает все необходимы данные. Подскажите как надо настроить что бы при обмене (если использовать планобмена) выгружались остатки все, а не только те которые были недавно изменены.

PS: полные правила в вложении.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
20. kasper076 113 15.09.14 12:23 Сейчас в теме
(1) SeverBaP, ПКО и ПВД применяются только к тем записям регистра, для которых зарегистрированы изменения.
21. SeverBaP 5 15.09.14 12:30 Сейчас в теме
(20) kasper076, в постановке задачи было написано все данные об остатках и всех последний ценах. изменения совсем не то.
22. kasper076 113 15.09.14 14:04 Сейчас в теме
(21) SeverBaP, я объясняю почему не все данные выгружаются.
23. SeverBaP 5 15.09.14 14:05 Сейчас в теме
(22) kasper076, Блин я все уже решил все выгружается, читай сообщения раньше... хватит тролить.
2. SeverBaP 5 10.09.14 12:15 Сейчас в теме
3. пользователь 10.09.14 12:27
Создать правило выгрузки с запросом. На узле отключить регистрацию регистров с остатками.
В самой конвертации прописать код в обработчике "ПослеВыгрузкиДанных":
ПКО = Правила["ПВ_ВыгрузкаОстатков"];
ВыгрузитьДанныеПоПравилу(ПКО);

4. SeverBaP 5 10.09.14 13:07 Сейчас в теме
(3) bomba,
Создать правило выгрузки с запросом. На узле отключить регистрацию регистров с остатками.
что под этим понимать изключить из состава в плане обмена?
5. SeverBaP 5 10.09.14 13:24 Сейчас в теме
(3) bomba, ВыгрузитьДанныеПоПравилу что за метод можно где-то описание почитать?
6. SeverBaP 5 10.09.14 14:00 Сейчас в теме
(3) bomba, Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)
Обработчик = ПослеВыгрузкиДанных (конвертация)
ОписаниеОшибки = Поле объекта не обнаружено (ПравилоКонвертации)
ПозицияМодуля = Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11695)
КСообщенияОбОшибках = 63

выдало
9. пользователь 10.09.14 14:18
(6) Надеюсь вы не просто скопировали мой код) Укажите вместо "ПВ_ВыгрузкаОстатков" имя правила выгрузки в котором вы писали запрос выборки всех остатков.
7. NatalyaVP 10.09.14 14:11 Сейчас в теме
Что значит "все необходимые данные"?
В план обмена попадают данные из вашего запроса, значит он неверен или неполон.
8. SeverBaP 5 10.09.14 14:14 Сейчас в теме
(7) NatalyaVP, Это значит что в выборке данных 3000 позиций, а выгрузилось только 5
11. NatalyaVP 10.09.14 14:25 Сейчас в теме
(8) SeverBaP, уточните из запроса вы получаете 3000 записей, только они не загружаются в самописную базу?
Или в запросе вы эти данные не можете получить?
10. пользователь 10.09.14 14:20
(7) При работе обмена по правилам не вызывается обработчик ПередОбработкой. Из правила выгрузки берется правило конвертации, а в качестве объекта выгрузки передается объект измененный, зарегистрированный на узле.
12. SeverBaP 5 10.09.14 15:06 Сейчас в теме
(10) bomba, нифига не понял, все как вы описали я сделал (поменял на то ПКО которое надо) убрал с регистрации дальше чет перестал догонять вроде давно с конвертацией работаю но счас дуб дубом
13. пользователь 10.09.14 17:38
(12) SeverBaP, общем в обработке конвертации есть процедура ВыгрузитьДанныеПоПравилу, входящий параметр у нее ПВ(Правило выгрузки). Смысл таков, что нужно эту процедуру вызвать с параметром правила выгрузки.
Балииин... Сам запутался, сказал вам подсунуть ПКО =) Тогда делаем так(Соответственно меняем ПВ_ВыгрузкаОстатков на свое):

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


Прошу прощения, что ввел в заблуждение =)
14. SeverBaP 5 11.09.14 14:49 Сейчас в теме
(13) bomba, Прописал как вы подсказали (правда у вас там ошибка есть то что функция возврат).
Сейчас у меня в этом обработчике такой код:
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ОстаткиТоваров", "Имя");
Если НЕ ПравилоВыгрузки = Неопределено Тогда
    ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);    
КонецЕсли;
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ЦеныНоменклатуры", "Имя");
Если НЕ ПравилоВыгрузки = Неопределено Тогда
    ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);    
КонецЕсли;

Показать

Все хорошо работает при выгрузке, но в самой базе приемнике выдает ошибку:
Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства)

вроде все штатно, теперь буду выяснять почему так падает.
15. пользователь 11.09.14 15:02
(14) Соглашусь, так правильнее. А логичнее:
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ОстаткиТоваров", "Имя");
Если ПравилоВыгрузки <> Неопределено Тогда
    ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);    
КонецЕсли;
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ЦеныНоменклатуры", "Имя");
Если ПравилоВыгрузки <> Неопределено Тогда
    ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);    
КонецЕсли;


Хотя душевно тоже тяготею к конструкции:
Если НЕ ПравилоВыгрузки = Неопределено Тогда
16. SeverBaP 5 11.09.14 17:46 Сейчас в теме
(15) bomba, ага верно.

Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства

Эту ошибку можно решить только так:
Подобная проблема возникает, когда записи регистра загружены из другой базы как объект. Например, когда как «ВыгрузитьОбъект» перенесено, а не «ВыгрузитьРегистр».


В этой ситуации, если происходит перенос из справочникав регистр, то нужно использовать конструкцию подобную такой:


Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить («Имя»);
Отбор.Колонки.Добавить («Значение»);
Отбор.Колонки.Добавить («Использование»);

СтрокаОтбора = Отбор.Добавить ();
СтрокаОтбора.Имя = «СтруктурнаяЕдиница»;
СтрокаОтбора.Значение = Объект.Владелец;
СтрокаОтбора.Использование = Истина;

СтрокаОтбора.Имя = «ОтветственноеЛицо»;
СтрокаОтбора.Значение = Объект.ОтветственноеЛицо;
СтрокаОтбора.Использование = Истина;

Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить («Активность»);
Строки.Колонки.Добавить («Период»);
Строки.Колонки.Добавить («СтруктурнаяЕдиница»);
Строки.Колонки.Добавить («ОтветственноеЛицо»);
Строки.Колонки.Добавить («Должность»);
Строки.Колонки.Добавить («ФизическоеЛицо»);

Строка = Строки.Добавить ();
ЗаполнитьЗначенияСвойств (Строка, Объект);
Строка.Период = Объект.ДатаНачала;
Строка.СтруктурнаяЕдиница = Объект.Владелец;

НаборЗаписей = Новый Структура («Отбор, Строки»);
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;

ВыгрузитьРегистр (НаборЗаписей,,, Истина, «ОтветственныеЛицаОрганизаций»);
Показать
так что вот
17. пользователь 11.09.14 18:26
(16) Все проще. Поставь в ПКО регистров галку "Не выгружать объекты свойств источника по ссылкам". Или я не понял в чем суть ошибки.
18. SeverBaP 5 11.09.14 19:10 Сейчас в теме
19. SeverBaP 5 15.09.14 12:09 Сейчас в теме
Решил все траблы и косяки с обменом.
Для того чтобы все работало необходимо в конвертации после выгрузки данных прописать Выполнить(Алгоритмы.ВыгрузкаЦен);
Сам алгоритм содержит текст
    Запрос=Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ЦеныНоменклатурыСрезПоследних.Период,
    |    ЦеныНоменклатурыСрезПоследних.Активность,
    |    ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.Валюта,
    |    ЦеныНоменклатурыСрезПоследних.Цена
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |ГДЕ
    |    ЦеныНоменклатурыСрезПоследних.Цена > 0
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура");
    ВыборкаДанных=Запрос.Выполнить().Выгрузить();
    // Создание пустого набора записей
    
    Отбор = Новый ТаблицаЗначений;
    Отбор.Колонки.Добавить("Имя");
    Отбор.Колонки.Добавить("Значение");
    Отбор.Колонки.Добавить("Использование");
    
    Строки = Новый ТаблицаЗначений;
    Строки.Колонки.Добавить("ТипЦен");
    Строки.Колонки.Добавить("Номенклатура");
    Строки.Колонки.Добавить("Валюта");
    
    Строки.Колонки.Добавить("Цена");
    Строки.Колонки.Добавить("Активность");
    Строки.Колонки.Добавить("Период");
    
    Сообщить(ВыборкаДанных.Количество());
    
    Для Каждого ДанныеЦен из ВыборкаДанных Цикл
        
        Отбор.Очистить();
        Строки.Очистить();
        
        СтрокаОтбора = Отбор.Добавить();
        СтрокаОтбора.Имя            = "ТипЦен";
        СтрокаОтбора.Значение        = ДанныеЦен.ТипЦен.Ссылка;
        СтрокаОтбора.Использование    = Истина;
        
        СтрокаОтбора = Отбор.Добавить();
        СтрокаОтбора.Имя            = "Номенклатура";
        СтрокаОтбора.Значение        = ДанныеЦен.Номенклатура.Ссылка;
        СтрокаОтбора.Использование    = Истина;
        
        СтрокаОтбора = Отбор.Добавить();
        СтрокаОтбора.Имя            = "Валюта";
        СтрокаОтбора.Значение        = ДанныеЦен.Валюта.Ссылка;
        СтрокаОтбора.Использование    = Истина;
        
        
        СтрокаНабора = Строки.Добавить();
        СтрокаНабора.ТипЦен            = ДанныеЦен.ТипЦен.Ссылка;
        СтрокаНабора.Номенклатура    = ДанныеЦен.Номенклатура.Ссылка;
        СтрокаНабора.Валюта            = ДанныеЦен.Валюта.Ссылка;
        СтрокаНабора.Цена            = ДанныеЦен.Цена;
        СтрокаНабора.Активность        = ДанныеЦен.Активность;
        СтрокаНабора.Период            = ДанныеЦен.Период;
        
        // Выгрузка набора записей
        // создаем виртуальный набор записей
        НаборЗаписей = Новый Структура("Отбор, Строки");
        НаборЗаписей.Отбор  = Отбор;
        НаборЗаписей.Строки = Строки;
        
        ВыгрузитьРегистр(НаборЗаписей,,,,"ЦеныНоменклатуры");
        
    КонецЦикла;

Показать

как видно тут написано через ВыгрузитьРегистр, эта функция позволяет избежать
Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства)
иначе если использовать что bomba посоветовал то быдет эта ошибка. Его предложение правильное и рабочее, но в базе приемника данные не обрабатываются из той ошибки.
При обмене данных с последним вариантом выполняется обмен, но с достаточно продолжительными выгрузками и загрузками по времени. Поэтому придётся оставить костыли с пост обработками в которых прописана выгрузка/загрузка этих данных в отдельный файл с которого загрузка/выгрузка производится во много раз быстрее.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот