Выгрузка данных через произвольный запрос (План обмена)
Нужно используя план обмена передавать актуальные остатки товаров из УТ10 в самописною. Так как в УТ хранятся остатки в регистре накопления, а в приемнике в регистре сведений и нужно передавать полностью срез всех остатков на текущий момент. Для этого прописал для её всё в конвертации, в самом ПВД ПередОбработкой поместил код:
при совершении обмена данных он в файлы с данными выдает только те записи которые недавно прошли изменения, а если использовать обработку универсальныйобмен то выдает все необходимы данные. Подскажите как надо настроить что бы при обмене (если использовать планобмена) выгружались остатки все, а не только те которые были недавно изменены.
PS: полные правила в вложении.
Запрос = Новый запрос();
Запрос.текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Склад КАК Склад,
| ВложенныйЗапрос.Номенклатура КАК Номенклатура,
| СУММА(ВложенныйЗапрос.КоличествоОстаток - ВложенныйЗапрос.КоличествоВРезерве) КАК Количество,
| ИСТИНА КАК Активность
|ИЗ
| (ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
| 0 КАК КоличествоВРезерве
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, {(Склад).* КАК Склад, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (СерияНоменклатуры).* КАК СерияНоменклатуры}) КАК ТоварыНаСкладахОстатки
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| ТоварыВРезервеНаСкладахОстатки.Склад,
| ТоварыВРезервеНаСкладахОстатки.Номенклатура,
| 0,
| ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток
| ИЗ
| РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&ДатаКон, {(Склад).* КАК Склад, (Номенклатура).* КАК Номенклатура, (ХарактеристикаНоменклатуры).* КАК ХарактеристикаНоменклатуры, (СерияНоменклатуры).* КАК СерияНоменклатуры, (ДокументРезерва).* КАК ДокументОснование}) КАК ТоварыВРезервеНаСкладахОстатки) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Склад,
| Номенклатура";
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ТекущаяДата()));
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Показатьпри совершении обмена данных он в файлы с данными выдает только те записи которые недавно прошли изменения, а если использовать обработку универсальныйобмен то выдает все необходимы данные. Подскажите как надо настроить что бы при обмене (если использовать планобмена) выгружались остатки все, а не только те которые были недавно изменены.
PS: полные правила в вложении.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) bomba, Ошибка в обработчике события ПослеВыгрузкиДанных (конвертация)
Обработчик = ПослеВыгрузкиДанных (конвертация)
ОписаниеОшибки = Поле объекта не обнаружено (ПравилоКонвертации)
ПозицияМодуля = Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11695)
КСообщенияОбОшибках = 63
выдало
Обработчик = ПослеВыгрузкиДанных (конвертация)
ОписаниеОшибки = Поле объекта не обнаружено (ПравилоКонвертации)
ПозицияМодуля = Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11695)
КСообщенияОбОшибках = 63
выдало
13.
пользователь
10.09.14 17:38
(12) SeverBaP, общем в обработке конвертации есть процедура ВыгрузитьДанныеПоПравилу, входящий параметр у нее ПВ(Правило выгрузки). Смысл таков, что нужно эту процедуру вызвать с параметром правила выгрузки.
Балииин... Сам запутался, сказал вам подсунуть ПКО =) Тогда делаем так(Соответственно меняем ПВ_ВыгрузкаОстатков на свое):
Прошу прощения, что ввел в заблуждение =)
Балииин... Сам запутался, сказал вам подсунуть ПКО =) Тогда делаем так(Соответственно меняем ПВ_ВыгрузкаОстатков на свое):
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ПВ_ВыгрузкаОстатков", "Имя");
Если ПравилоВыгрузки = Неопределено Тогда
//Ругаемся и выходим
Возврат;
КонецЕсли;
ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);
Прошу прощения, что ввел в заблуждение =)
(13) bomba, Прописал как вы подсказали (правда у вас там ошибка есть то что функция возврат).
Сейчас у меня в этом обработчике такой код:
Все хорошо работает при выгрузке, но в самой базе приемнике выдает ошибку:
вроде все штатно, теперь буду выяснять почему так падает.
Сейчас у меня в этом обработчике такой код:
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ОстаткиТоваров", "Имя");
Если НЕ ПравилоВыгрузки = Неопределено Тогда
ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);
КонецЕсли;
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ЦеныНоменклатуры", "Имя");
Если НЕ ПравилоВыгрузки = Неопределено Тогда
ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);
КонецЕсли;
ПоказатьВсе хорошо работает при выгрузке, но в самой базе приемнике выдает ошибку:
Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства)
вроде все штатно, теперь буду выяснять почему так падает.
15.
пользователь
11.09.14 15:02
(14) Соглашусь, так правильнее. А логичнее:
Хотя душевно тоже тяготею к конструкции:
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ОстаткиТоваров", "Имя");
Если ПравилоВыгрузки <> Неопределено Тогда
ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);
КонецЕсли;
ПравилоВыгрузки = ТаблицаПравилВыгрузки.Найти("ЦеныНоменклатуры", "Имя");
Если ПравилоВыгрузки <> Неопределено Тогда
ВыгрузитьДанныеПоПравилу(ПравилоВыгрузки);
КонецЕсли;
Хотя душевно тоже тяготею к конструкции:
Если НЕ ПравилоВыгрузки = Неопределено Тогда
(15) bomba, ага верно.
Эту ошибку можно решить только так:
так что вот
Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства
Эту ошибку можно решить только так:
Подобная проблема возникает, когда записи регистра загружены из другой базы как объект. Например, когда как «ВыгрузитьОбъект» перенесено, а не «ВыгрузитьРегистр».
В этой ситуации, если происходит перенос из справочникав регистр, то нужно использовать конструкцию подобную такой:
Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить («Имя»);
Отбор.Колонки.Добавить («Значение»);
Отбор.Колонки.Добавить («Использование»);
СтрокаОтбора = Отбор.Добавить ();
СтрокаОтбора.Имя = «СтруктурнаяЕдиница»;
СтрокаОтбора.Значение = Объект.Владелец;
СтрокаОтбора.Использование = Истина;
СтрокаОтбора.Имя = «ОтветственноеЛицо»;
СтрокаОтбора.Значение = Объект.ОтветственноеЛицо;
СтрокаОтбора.Использование = Истина;
Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить («Активность»);
Строки.Колонки.Добавить («Период»);
Строки.Колонки.Добавить («СтруктурнаяЕдиница»);
Строки.Колонки.Добавить («ОтветственноеЛицо»);
Строки.Колонки.Добавить («Должность»);
Строки.Колонки.Добавить («ФизическоеЛицо»);
Строка = Строки.Добавить ();
ЗаполнитьЗначенияСвойств (Строка, Объект);
Строка.Период = Объект.ДатаНачала;
Строка.СтруктурнаяЕдиница = Объект.Владелец;
НаборЗаписей = Новый Структура («Отбор, Строки»);
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;
ВыгрузитьРегистр (НаборЗаписей,,, Истина, «ОтветственныеЛицаОрганизаций»);
ПоказатьВ этой ситуации, если происходит перенос из справочникав регистр, то нужно использовать конструкцию подобную такой:
Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить («Имя»);
Отбор.Колонки.Добавить («Значение»);
Отбор.Колонки.Добавить («Использование»);
СтрокаОтбора = Отбор.Добавить ();
СтрокаОтбора.Имя = «СтруктурнаяЕдиница»;
СтрокаОтбора.Значение = Объект.Владелец;
СтрокаОтбора.Использование = Истина;
СтрокаОтбора.Имя = «ОтветственноеЛицо»;
СтрокаОтбора.Значение = Объект.ОтветственноеЛицо;
СтрокаОтбора.Использование = Истина;
Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить («Активность»);
Строки.Колонки.Добавить («Период»);
Строки.Колонки.Добавить («СтруктурнаяЕдиница»);
Строки.Колонки.Добавить («ОтветственноеЛицо»);
Строки.Колонки.Добавить («Должность»);
Строки.Колонки.Добавить («ФизическоеЛицо»);
Строка = Строки.Добавить ();
ЗаполнитьЗначенияСвойств (Строка, Объект);
Строка.Период = Объект.ДатаНачала;
Строка.СтруктурнаяЕдиница = Объект.Владелец;
НаборЗаписей = Новый Структура («Отбор, Строки»);
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;
ВыгрузитьРегистр (НаборЗаписей,,, Истина, «ОтветственныеЛицаОрганизаций»);
Решил все траблы и косяки с обменом.
Для того чтобы все работало необходимо в конвертации после выгрузки данных прописать Выполнить(Алгоритмы.ВыгрузкаЦен);
Сам алгоритм содержит текст
как видно тут написано через ВыгрузитьРегистр, эта функция позволяет избежать
При обмене данных с последним вариантом выполняется обмен, но с достаточно продолжительными выгрузками и загрузками по времени. Поэтому придётся оставить костыли с пост обработками в которых прописана выгрузка/загрузка этих данных в отдельный файл с которого загрузка/выгрузка производится во много раз быстрее.
Для того чтобы все работало необходимо в конвертации после выгрузки данных прописать Выполнить(Алгоритмы.ВыгрузкаЦен);
Сам алгоритм содержит текст
Запрос=Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЦеныНоменклатурыСрезПоследних.Период,
| ЦеныНоменклатурыСрезПоследних.Активность,
| ЦеныНоменклатурыСрезПоследних.ТипЦен КАК ТипЦен,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Валюта,
| ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.Цена > 0
|
|УПОРЯДОЧИТЬ ПО
| Номенклатура");
ВыборкаДанных=Запрос.Выполнить().Выгрузить();
// Создание пустого набора записей
Отбор = Новый ТаблицаЗначений;
Отбор.Колонки.Добавить("Имя");
Отбор.Колонки.Добавить("Значение");
Отбор.Колонки.Добавить("Использование");
Строки = Новый ТаблицаЗначений;
Строки.Колонки.Добавить("ТипЦен");
Строки.Колонки.Добавить("Номенклатура");
Строки.Колонки.Добавить("Валюта");
Строки.Колонки.Добавить("Цена");
Строки.Колонки.Добавить("Активность");
Строки.Колонки.Добавить("Период");
Сообщить(ВыборкаДанных.Количество());
Для Каждого ДанныеЦен из ВыборкаДанных Цикл
Отбор.Очистить();
Строки.Очистить();
СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "ТипЦен";
СтрокаОтбора.Значение = ДанныеЦен.ТипЦен.Ссылка;
СтрокаОтбора.Использование = Истина;
СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "Номенклатура";
СтрокаОтбора.Значение = ДанныеЦен.Номенклатура.Ссылка;
СтрокаОтбора.Использование = Истина;
СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Имя = "Валюта";
СтрокаОтбора.Значение = ДанныеЦен.Валюта.Ссылка;
СтрокаОтбора.Использование = Истина;
СтрокаНабора = Строки.Добавить();
СтрокаНабора.ТипЦен = ДанныеЦен.ТипЦен.Ссылка;
СтрокаНабора.Номенклатура = ДанныеЦен.Номенклатура.Ссылка;
СтрокаНабора.Валюта = ДанныеЦен.Валюта.Ссылка;
СтрокаНабора.Цена = ДанныеЦен.Цена;
СтрокаНабора.Активность = ДанныеЦен.Активность;
СтрокаНабора.Период = ДанныеЦен.Период;
// Выгрузка набора записей
// создаем виртуальный набор записей
НаборЗаписей = Новый Структура("Отбор, Строки");
НаборЗаписей.Отбор = Отбор;
НаборЗаписей.Строки = Строки;
ВыгрузитьРегистр(НаборЗаписей,,,,"ЦеныНоменклатуры");
КонецЦикла;
Показатькак видно тут написано через ВыгрузитьРегистр, эта функция позволяет избежать
Ошибка при загрузке данных: {Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9517)}: Поле объекта не обнаружено (ДополнительныеСвойства)
иначе если использовать что bomba посоветовал то быдет эта ошибка. Его предложение правильное и рабочее, но в базе приемника данные не обрабатываются из той ошибки.
При обмене данных с последним вариантом выполняется обмен, но с достаточно продолжительными выгрузками и загрузками по времени. Поэтому придётся оставить костыли с пост обработками в которых прописана выгрузка/загрузка этих данных в отдельный файл с которого загрузка/выгрузка производится во много раз быстрее.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот