Имя: Пароль:
1C
1С v8
Конвертация данных - запрос при обмене справочников
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
Ах да, забыл добавить - если данные по объекту собираются запросом, то в ПКО для объекта Номенклатура надо поставить галочку "не запоминать выгруженные объекты"