|
Конвертация данных - запрос при обмене справочников | ☑ | ||
---|---|---|---|---|
0
impulse9
22.11.12
✎
08:37
|
Задача: выгрузить из УТ 10.3 справочник номенклатуры + остатки определенному складу + определенный тип цены, в один справочник в приемнике.
в ПКО Справочник.Номенклатура перед выгрузкой: Запрос = Новый Запрос("ВЫБРАТЬ | ПартииТоваровНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки |ГДЕ | ПартииТоваровНаСкладахОстатки.Склад = &Склад | И ПартииТоваровНаСкладахОстатки.Номенклатура = &Номенклатура"); Запрос.УстановитьПараметр("Склад",Справочники.Склады.НайтиПоКоду("IRK000005").Ссылка); Запрос.УстановитьПараметр("Номенклатура",Источник); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Источник.Количество = Выборка.КоличествоОстаток; КонецЦикла; Запрос1 = Новый Запрос("ВЫБРАТЬ | ЦеныНоменклатуры.Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |ГДЕ | ЦеныНоменклатуры.ТипЦен = &ТипЦен | И ЦеныНоменклатуры.Номенклатура = &Номенклатура | И ЦеныНоменклатуры.Валюта = &Валюта"); Запрос1.УстановитьПараметр("Номенклатура",Источник); Запрос1.УстановитьПараметр("Валюта",Справочники.Валюты.НайтиПоКоду("643").Ссылка); Запрос1.УстановитьПараметр("ТипЦен",Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("IRK000001").Ссылка); Выборка = Запрос1.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Источник.Цена = Выборка.Цена; КонецЦикла; При выгрузке ругается на строчку Источник.Цена = Выборка.Цена; Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(1562)}: Ошибка в обработчике события ПриВыгрузкеОбъекта ПКО = Номенклатура (Справочник: Номенклатура) Объект = Ariston NTS 50 (SU) водонагреватель накопительный свыше 30 л (Справочник ссылка: Номенклатура) Обработчик = ПриВыгрузкеОбъекта ОписаниеОшибки = Поле объекта не обнаружено (Цена) ПозицияМодуля = (43) КодСообщения = 42 Подскажите, как поправить? |
|||
1
GenV
22.11.12
✎
08:38
|
Источник.Цена
|
|||
2
impulse9
22.11.12
✎
08:40
|
Конечно, не Источник а Объект.
|
|||
3
impulse9
22.11.12
✎
08:54
|
Теперь ругается так
Ошибка при выгрузке данных: {Обработка.УниверсальныйОбменДаннымиXML(1593)}: Ошибка получения свойства объекта из входящих данных ПКО = Номенклатура (Справочник: Номенклатура) ПКС = 13 ( --> Количество) Объект = 02 БЫТОВАЯ ТЕХНИКА (Справочник ссылка: Номенклатура) СвойствоПриемника = Количество (Число) ОписаниеОшибки = Получение элемента по индексу для значения не определено ПозицияМодуля = Обработка.УниверсальныйОбменДаннымиXML(8196) КодСообщения = 68 |
|||
4
Alex S D
22.11.12
✎
08:59
|
вот ты сумашедший, у тебя запрос вызывается при выгрузке каждого объекта...
|
|||
5
impulse9
22.11.12
✎
09:03
|
Alex S D самое главное что не работает ) Мне бы разобраться, а потом я общим запросом все перепишу
|
|||
6
Alex S D
22.11.12
✎
09:05
|
ну видно же, что нет источника для "количество"
|
|||
7
impulse9
22.11.12
✎
09:08
|
В ПКС у Количество стоит галка "Получить значение их входящих данных"
Я эти данные вычисляю запросом. Куда их подмахнуть, чтобы они при загрузке подхватились? |
|||
8
Alex S D
22.11.12
✎
09:09
|
(7) в структуру ИсходящиеДанные
|
|||
9
Alex S D
22.11.12
✎
09:09
|
или ВходящиеДанные , не помню)
|
|||
10
Дейл
22.11.12
✎
09:12
|
ну для начала напиши запрос нормально
2 почему перед выгрузкой? Сделай в правиле Выгрузке объектов - перед обработкой ВыборкаДанных = Запрос.Выполнить().Выгрузить(); и будет тебе счастье |
|||
11
Дейл
22.11.12
✎
09:13
|
(7) - источник хоть пустой?
|
|||
12
Дейл
22.11.12
✎
09:15
|
(9)ВыгрузитьПоПравилу(,, ИсходящиеДанные,, "НачисленияИУдержания");
|
|||
13
Дейл
22.11.12
✎
09:15
|
как пример
|
|||
14
Дейл
22.11.12
✎
09:16
|
реально сделай запросом грамотным и все будет ок и без структруры обойдешся
|
|||
15
impulse9
22.11.12
✎
09:44
|
(11) Когда галочку ставить источник очищается
Да, надо переписать запрос под весь справочник |
|||
16
Дейл
22.11.12
✎
09:48
|
Да кстати в параметрах запроса не "Источник", а источник.ссылка
|
|||
17
impulse9
23.11.12
✎
08:14
|
В общем, я совсем не понимаю, кучу книжек открыл, просмотрел все примеры, похожего не нашел
Есть запрос, который вытаскивает все нужные данные: Запрос = Новый Запрос("ВЫБРАТЬ | ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура, | СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток) КАК Количество, | ВложенныйЗапрос.УПР_ГРУППА1, | ВложенныйЗапрос.УПР_ГРУППА2, | ВложенныйЗапрос.УПР_ГРУППА3, | ВложенныйЗапрос.УПР_ГРУППА4, | ВложенныйЗапрос.УПР_Бренд, | ВложенныйЗапрос1.Цена КАК ЦенаЗакупочная |ИЗ | РегистрНакопления.ПартииТоваровНаСкладах.Остатки КАК ПартииТоваровНаСкладахОстатки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.УПР_ГРУППА1 КАК УПР_ГРУППА1, | Номенклатура.УПР_ГРУППА2 КАК УПР_ГРУППА2, | Номенклатура.УПР_ГРУППА3 КАК УПР_ГРУППА3, | Номенклатура.УПР_ГРУППА4 КАК УПР_ГРУППА4, | Номенклатура.УПР_Бренд КАК УПР_Бренд | ИЗ | Справочник.Номенклатура КАК Номенклатура | | СГРУППИРОВАТЬ ПО | Номенклатура.Ссылка, | Номенклатура.УПР_ГРУППА1, | Номенклатура.УПР_ГРУППА2, | Номенклатура.УПР_ГРУППА3, | Номенклатура.УПР_ГРУППА4, | Номенклатура.УПР_Бренд) КАК ВложенныйЗапрос | ПО ПартииТоваровНаСкладахОстатки.Номенклатура = ВложенныйЗапрос.Ссылка | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Цена КАК Цена | ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры | ГДЕ | ЦеныНоменклатуры.ТипЦен = &ОптоваяЦена | И ЦеныНоменклатуры.Валюта = &Валюта) КАК ВложенныйЗапрос1 | ПО ПартииТоваровНаСкладахОстатки.Номенклатура = ВложенныйЗапрос1.Номенклатура |ГДЕ | ПартииТоваровНаСкладахОстатки.Склад = &ОсновнойСклад |СГРУППИРОВАТЬ ПО | ВложенныйЗапрос.УПР_ГРУППА1, | ВложенныйЗапрос.УПР_ГРУППА2, | ВложенныйЗапрос.УПР_ГРУППА3, | ВложенныйЗапрос.УПР_ГРУППА4, | ВложенныйЗапрос.УПР_Бренд, | ПартииТоваровНаСкладахОстатки.Номенклатура, | ВложенныйЗапрос1.Цена |УПОРЯДОЧИТЬ ПО | Номенклатура, | Количество"; Запрос.УстановитьПараметр("Склад",Справочники.Склады.НайтиПоКоду("IRK000005").Ссылка); Запрос.УстановитьПараметр("Номенклатура",Источник.Ссылка); Запрос.УстановитьПараметр("Валюта",Справочники.Валюты.НайтиПоКоду("643").Ссылка); Запрос.УстановитьПараметр("ТипЦен",Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("IRK000001").Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Ткните пальцем,, куда его подставить, чтобы оно выгрузилось в файл, и потом с него загрузилось. По-любому все просто и я туплю |
|||
18
PCcomCat
23.11.12
✎
08:24
|
А нельзя сделать проще? После выгрузки данных выгрузить все остатки и цены, например, в текстовый файл. А после загрузки данных считать остатки из файла и записать куда нужно.
Уж очень сильно сомневаюсь, что в приемнике у справочника Номенклатура есть реквизит Цена, да и остаток - будешь для каждой позиции свой документ остатков делать или каждый раз искать документ? Да и запрос остатков и цен всего справочника уж куда быстрей выполнится, чем в сумме по каждой позиции справочника. |
|||
19
impulse9
23.11.12
✎
08:29
|
В приемнике нет документов. Приемник - это просто база-каталог товаров, которые есть в наличии. Соответственно в справочнике Номенклатура есть и Цена и Количество.
Запрос и вытаскивает данные по всему справочнику Номенклатура, с условием, что по элементу есть остатки. PCcomCat, спасибо за желание помочь |
|||
20
impulse9
23.11.12
✎
08:31
|
Да, про текстовый файл - обмен таким способом уже готов и работает.
Надо переделать на стандартный обмен через XML |
|||
21
PCcomCat
23.11.12
✎
08:42
|
(19) Сложно помочь, не зная структуры приемника.
|
|||
22
impulse9
23.11.12
✎
08:52
|
(21) Все очень просто. В приемнике 5 справочников, и все.
Справочник Номенклатура: Количество как число Цена как число УПР_ГРУППА1 как элемент справочника УПР_ГРУППА1 УПР_ГРУППА2 как элемент справочника УПР_ГРУППА2 УПР_ГРУППА3 как элемент справочника УПР_ГРУППА3 УПР_ГРУППА4 как элемент справочника УПР_ГРУППА4 |
|||
23
PCcomCat
23.11.12
✎
08:59
|
(22) Сделай правило конвертации для свойства: Источник - любой реквизит, Приёмник - реквизит остаток; а ПриВызргузке этого свойства пропиши свой запрос, и Значение = результат из твоего запроса.
|
|||
24
impulse9
23.11.12
✎
09:04
|
(23) Правильно ли я понимаю, что этот запрос выполнится 1 раз для каждого элемента справочника, т.е. более 100000 раз?
|
|||
25
PCcomCat
23.11.12
✎
09:06
|
(24) Этот запрос будет выполняться для каждого элемента справочника.
|
|||
26
PCcomCat
23.11.12
✎
09:08
|
(24)Как вариант: Перед выгрузкой данных сформируй свой запрос по всем остаткам и запиши результат в ТаблицуЗначений, а для свойства Остаток пропиши поиск строки таблицы с этим элементом через Отбор.
|
|||
27
Новенький_2009
23.11.12
✎
09:10
|
О майн гот. Ну и велосипед! :)
1. Делаешь ПВД, с произвольным алгоритмом, в котором описываешь твой виртуальный объект. 2. Идешь в соотв. ПКО, и у них снимаешь галки кэшированья 3. Все. Какие запросы перед выгрузкой? Ты в своем уме? |
|||
28
impulse9
23.11.12
✎
11:41
|
(26) Спасибо
(27) в источнике искомые данные ЦЕНА и КОЛИЧЕСТВО хранятся в регистрах, в приемнике в реквизитах справочника. |
|||
29
Новенький_2009
23.11.12
✎
11:52
|
(28) никак не могу понять, в чем противоречие с тем, что я тебе описал в (27). Заджойнь сразу и цену и количество для требуемой выборки (за один раз), да отдай эту выборку на вход твоего ПКО.
Или чо, ты думаешь, такое невозможно? :) Покури произвольный алгоритм в ПВД. |
|||
30
impulse9
23.11.12
✎
12:07
|
(29) Было бы круто и для меня, и для тех, кто потом придет сюда из гугла, если бы ты написал более подробно, как решить задачу "конвертация значения регистра в реквизит справочника" на моем примере.
У меня такая задача стоит не только в этой конвертации, так что ты бы очень мне помог. |
|||
31
Новенький_2009
23.11.12
✎
13:41
|
для всех кто придет сюда из гугла, и тебя тоже, отвечаю:
1. Создаешь ПКО для конвертации справочника Номенклатуры. 2. Для него создаешь ПВД с произвольным алгоритмом 3. В нем определяешь переменную ВыборкаДанных как Запрос, и описываешь текст запроса. Важно чтобы алиасы запроса совпали с названием реквизитов приемника в ПКО, которые ты собрался заполнять. Сохраняешь ПВД. Это все. Если запросом не получается сделать, тогда определяешь переменную ВыборкаДанных как произвольную коллекцию, и заполняешь ее программным кодом. Указываешь в качестве ПКО, то что ты сделал п.1 |
|||
32
impulse9
28.11.12
✎
05:55
|
Спасибо за ответ, сделал сам, потом прочитал и убедился, что сделал правильно )
1. В Правиле Выгрузки Данных ставим Способ Выборки = Произвольный механизм (вот в чем меня был затуп!!!) 2. Написал в Правиле Выгрузки Данных для Объекта Справочник.Номенклатура, раздел Перед Обработкой: Запрос = Новый Запрос("ВЫБРАТЬ .... Мой запрос, в котором имена переменных совпадают с реквизитами справочника .... ВыборкаДанных = Запрос.Выполнить().Выгрузить(); Сообщить("Номенклатуры выгружена"); Все! Всем спасибо! |
|||
33
impulse9
28.11.12
✎
06:00
|
Ах да, забыл добавить - если данные по объекту собираются запросом, то в ПКО для объекта Номенклатура надо поставить галочку "не запоминать выгруженные объекты"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |