Имя: Пароль:
1C
1С v8
КД: набор записей из отдельных объектов в xml файле
0 Вуглускр1991
 
09.01.13
08:28
Привет!
Вчерась, нужно было прикрутить в БП 2 цены из ТиС 9. А в БП 2 цены - регистр сведений, подчиненный регистратору. Поплевав на руки, нарисовал документ "установка цен", дата - как надо, время ноль, внутренностей нет, а движений - сколько цен в справочнике.
Пользуюсь КД 2.
Но вот порядок выгрузки этих цен был такой, что записи в регистр сведений разбросаны по файлу, товар 1, потом одна запись скажем на дату 01.01.13, затем товар 2, и вторая запись на ту же дату.
Это такое содержимое файла xml. Не получалось у меня отдельные записи в набор записей сформировать. Для этого пришлось бы документ описывать более широко, и у всей номенклатуры, что попадает в выгрузку (это и выборка и по ссылкам) формировать эти цены отдельными документами. А кто знает наперед, какой набор товара будет выгружен...
И наткнулся я здесь на тему:
v8: Конвертация Регистр сведений подчинен регистратору
Девушка очень хотела объяснить словами все это, но слов подходящих просто не было тогда.
Если кто прорубился сквозь описание ситуации, вот решение:
В обработчике конвертации записи регистра сведений, помимо задекларированного контекста "объект" (Отказ там, ОбъектМодифицирован  к примеру) доступен также
НаборЗаписей
Надеюсь эту переменную не переименуют в последующих обновлениях.
Так вот, можно по регистратору читать текущий набор записей, анализировать, стоит ли его перезаписывать, и если стоит, то пользоваться этой переменной для загрузки нового набора.
Там по ходу алгоритма, стоит присваивание
Объект = НаборЗаписей;
в то время как Объект во всех обработка - это одна запись.
1 Defender aka LINN
 
09.01.13
08:37
Ничего не понял, но на всякий случай: вы нифига не знаете КД
2 Andy13
 
09.01.13
08:44
Афигеть.
Бедный микроскоп...
3 Вуглускр1991
 
09.01.13
08:55
(2) Ничего, ничего! Вот создавать по одному документу на каждый элемент цен номенклатуры - вот это была бы жесть .. и я чуть не сделал такое.
4 Defender aka LINN
 
09.01.13
08:58
(3) Ну, сделал ты один документ, хорошо. А при чем тут переменная "Объект", которая при этом еще и "НаборЗаписей"?
5 Andy13
 
09.01.13
09:00
А зачем создал документ? Типового не хватило чтоль?
6 Вуглускр1991
 
09.01.13
09:10
(4)Когда в xml файле объект - это одна запись регистра сведений, то набор записей всякий раз из неё и состоит и перезаписывается во время выгрузки. Таким образом по окончании выгрузки цены имеют лишь те товары, регистры записи которых были перезаписаны последними (в разрезе дат регистраторов).
В файле:
<Нпп = 5> ... описание цены товара1 на дату 01.01.13
...
<Нпп = 7> ... описание цены товара2 на дату 01.01.13
После выгрузки в документе "Установка цен" от 01.01.13 ,будет только последняя запись -  то есть цена будет у товара2
(5) Создал в смысле записал новый типовой документ.
7 Defender aka LINN
 
09.01.13
09:14
(6) А какая религия мешает сделать один набор записей в XML-файле?
8 Голубушка
 
09.01.13
09:15
почему отказались от заполнения табличной части дока ? .. это же проще ..
и зачем объект=наборзаписей .. жесть какая то
напиши правило выгрузки регистра сведений .. и ставь в правиле свой липовый регистратор
9 Andy13
 
09.01.13
09:18
(6)
----
После выгрузки в документе "Установка цен" от 01.01.13 ,будет только последняя запись -  то есть цена будет у товара2
----

Галочку "Не запоминать выгруженные объекты" поставил в нужном месте?
10 Andy13
 
09.01.13
09:19
(8) Вот и я удивляюсь...
11 Defender aka LINN
 
09.01.13
09:20
(8) Подозреваю, из-за даты
12 Вуглускр1991
 
09.01.13
09:48
(8) Потому, что я заранее не знаю, какой товар будет выгружен в xml файл.
"объект=наборзаписей .. жесть какая то" - это классика, типовое решение, это не я писал.
(7) А для этого нужно знать список товаров которые будут выгружены и цены этих товаров сгруппировать по датам, и на основе этой группировки создавать документ "Установка цен" с заполненными табличными частями.
Я не вижу способа определить этот список. А разбивать его цены по датам - ну просто лень.
13 Вуглускр1991
 
09.01.13
09:50
(9) И с галочкой и без галочки не работало, а сейчас работает галочки ведут себя корректно, если запись есть в наборе, набор не перезаписывается.
14 Вуглускр1991
 
09.01.13
09:51
ОбъектИсточник это строка, ОбъектПриемник - это РегистрСведенийЗапись.ЦеныНоменклатуры Обработчик "После загрузки"
Вот кстати и код:
ВременныйНаборЗаписей = РегистрыСведений["ЦеныНоменклатуры"].СоздатьНаборЗаписей();

Для Каждого ЭлементОтбора Из ВременныйНаборЗаписей.Отбор Цикл
   ЭлементОтбора.Установить(Объект[ЭлементОтбора.Имя]);
КонецЦикла;

ВременныйНаборЗаписей.Прочитать();

Если ВременныйНаборЗаписей.Количество() > 0 Тогда
   
   ТаблицаСтарая = ВременныйНаборЗаписей.Выгрузить();
   НадоДобавлятьВТабло = Истина;
   
   Для Каждого СтрТС Из ТаблицаСтарая Цикл
       
       Если   (СтрТС.ТипЦен       = Объект.ТипЦен)
            И (СтрТС.Номенклатура = Объект.Номенклатура)
            И (СтрТС.Валюта       = Объект.Валюта)
            И (СтрТС.Цена           = Объект.Цена) Тогда
           Отказ = Истина;
           НадоДобавлятьВТабло = Ложь;
           Прервать;
       ИначеЕсли   (СтрТС.ТипЦен       = Объект.ТипЦен)
                 И (СтрТС.Номенклатура = Объект.Номенклатура) Тогда
           СтрТС.Валюта       = Объект.Валюта;
           СтрТС.Цена           = Объект.Цена;
           ИндаСтро = ТаблицаСтарая.Индекс(СтрТС);
           Если ИндаСтро > 0 Тогда
               ТаблицаСтарая.Сдвинуть(СтрТС, -ИндаСтро)
           КонецЕсли;
           НадоДобавлятьВТабло = Ложь;
           Прервать;
       КонецЕсли;
   КонецЦикла;
   
   Если НадоДобавлятьВТабло Тогда
       
       СтрНов = ТаблицаСтарая.Вставить(0);
       ЗаполнитьЗначенияСвойств(СтрНов,Объект);
   КонецЕсли;
   
   Если Не Отказ Тогда
       НаборЗаписей.Загрузить(ТаблицаСтарая);
   КонецЕсли;
КонецЕсли;

ВременныйНаборЗаписей = 0;
15 Defender aka LINN
 
09.01.13
09:53
(12) "для этого нужно знать список товаров" - а сейчас они как выгружаются в таком случае?
"это классика, типовое решение" - Строка кода может и из типовой. А вот "решение" из (0) - это чистейшей воды копрокод.
16 Defender aka LINN
 
09.01.13
09:54
(14) Хосспади... Как это теперь развидеть?
17 Вуглускр1991
 
09.01.13
09:58
(15) Сейчас они выгружаются по ссылкам из документов. Специальной выборки нет. Прогружать абсолютно все не нужно. Если ты ищешь способ обозвать это копрокодом - то ты уже нашел и сделал. Можешь расслабиться.
18 Defender aka LINN
 
09.01.13
10:00
(17) И? Какая религия мешает собрать эти ссылки и выгрузить в один набор?
19 Вуглускр1991
 
09.01.13
10:06
(18) Собрать из документов? Отследить какие виды документов отмечены галочками в форме в 7.7, какие выставлены отборы, за какой период, сделать серию запросов, выгрузить в ТЗ, свернуть ТЗ по номенклатуре, дополнить ценами, сгруппировать по датам. Так?
У нас вообще реквизиты формы можно использовать в обработчике согласно документации КД (я понимаю, что доступны физически и можно без проблем), но так ли это рекомендуют делать Разработчики? не много ли будет работы? Там ведь целые сервисные блоки написаны для отбора объектов в стандартную выгрузку.
20 Defender aka LINN
 
09.01.13
10:22
"Отследить какие виды документов отмечены галочками в форме в 7.7, какие выставлены отборы, за какой период, сделать серию запросов, выгрузить в ТЗ, свернуть ТЗ по номенклатуре, дополнить ценами, сгруппировать по датам. Так?" - Ну, если нечего делать, то можно и так.
А я бы в правиле выгрузки номенклатуры отслеживал, какие позиции выгружены, передавал их в параметр и после выгрузки бы дополнительно вызывал выгрузку цен, которая создала бы один документ с одним набором записей.
21 Вуглускр1991
 
09.01.13
10:38
(20) "передавал их в параметр" - глобальный объект? Параметр конвертации? "после выгрузки" - всего и вся в конце списка правил выгрузки произвольным алгоритмом из параметра по списку наформировать цены, сгруппировать по датам и правильный документ установки цен на каждую дату и типцены?
Да, это будет прямое решение и не надо бояться, что документ установки цен распроведут в БП.
У моего решения недостаток - постоянная перезапись набора записей регистра сведений, при чтении из XML очередной цены. тоже нормально.
22 Defender aka LINN
 
09.01.13
10:41
(21) Или так, да.
Независимо от того, куда вы едете — это в гору и против ветра!