Имя: Пароль:
1C
1С v8
1C Конвертация данных: обмен между двумя идентичными УПП, спр.Номенклатура, ПВД
0 Kleo
 
15.08.14
06:57
Здравствуйте!

Подскажите по настройке ПВД для спр.Номенклатура.

Задача выгрузить все элементы справочника из одной УПП в другую УПП, кроме одной папки. Разово я сделала с помощью КД и Универсальный обмен данными в формате XML, где можно задать отбор. все просто. но в дальнейшем нужно будет постоянно делать такой обмен в автоматическом режиме. нужно дописать это условие в КД, чтобы выгружались все элементы справочника Номенклатуры, кроме одной папки.

Так вот сделала так: настроила правила обмена данными для спр.номенклатура и всех сопутствующих справочников. далее создала ПВД, где Способ выборки - Произвольный. и в обработчике событий Перед обработкой написала алгоритм:


Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
|    КатегорииОбъектов.Ссылка
|ПОМЕСТИТЬ ВТ_КатегорияСинхронизация
|ИЗ
|    Справочник.КатегорииОбъектов КАК КатегорииОбъектов
|ГДЕ
|    КатегорииОбъектов.Код = ""СинхУПП""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    КатегорииОбъектов.Объект КАК Номенклатура
|ПОМЕСТИТЬ ВТ_КатегорииОбъектов
|ИЗ
|    РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
|ГДЕ
|    КатегорииОбъектов.Категория В
|            (ВЫБРАТЬ
|                ВТ_КатегорияСинхронизация.Ссылка
|            ИЗ
|                ВТ_КатегорияСинхронизация КАК ВТ_КатегорияСинхронизация)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Номенклатура.Код,
|    Номенклатура.Наименование,
|    Номенклатура.Ссылка,
|    Номенклатура.ПометкаУдаления,
|    Номенклатура.Родитель,
|    Номенклатура.ЭтоГруппа,
|    Номенклатура.Артикул,
|    Номенклатура.НаименованиеПолное,
|    Номенклатура.Весовой,
|    Номенклатура.ВесовойКоэффициентВхождения,
|    Номенклатура.ВестиВнутрискладскойУчетПродукции,
|    Номенклатура.ВестиОперативныйУчетОстатковНЗП,
|    Номенклатура.ВестиПартионныйУчетПоСериям,
|    Номенклатура.ВестиУчетПоСериям,
|    Номенклатура.ВестиУчетПоСериямВНЗП,
|    Номенклатура.ВестиУчетПоХарактеристикам,
|    Номенклатура.ВидВоспроизводства,
|    Номенклатура.ВидНоменклатуры,
|    Номенклатура.ЕдиницаДляОтчетов,
|    Номенклатура.ЕдиницаХраненияОстатков,
|    Номенклатура.БазоваяЕдиницаИзмерения,
|    Номенклатура.Набор,
|    Номенклатура.НазначениеИспользования,
|    Номенклатура.СтавкаНДС,
|    Номенклатура.Комментарий,
|    Номенклатура.НоменклатурнаяГруппаЗатрат,
|    Номенклатура.Услуга,
|    Номенклатура.ОсновноеИзображение,
|    Номенклатура.ОсновнойПоставщик,
|    Номенклатура.НоменклатурнаяГруппа,
|    Номенклатура.СтранаПроисхождения,
|    Номенклатура.НомерГТД,
|    Номенклатура.ТребуетсяВнешняяСертификация,
|    Номенклатура.ТребуетсяВнутренняяСертификация,
|    Номенклатура.СтатьяЗатрат,
|    Номенклатура.ВестиСерийныеНомера,
|    Номенклатура.Комплект,
|    Номенклатура.ПорядокПрисвоенияСерийногоНомера,
|    Номенклатура.ЦеноваяГруппа,
|    Номенклатура.ОКП,
|    Номенклатура.ЕдиницаИзмеренияМест,
|    Номенклатура.ДополнительноеОписаниеНоменклатуры,
|    Номенклатура.Производитель,
|    Номенклатура.Импортер,
|    Номенклатура.ДополнительноеОписаниеНоменклатурыВФорматеHTML
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.Ссылка В ИЕРАРХИИ
|                (ВЫБРАТЬ
|                    ВТ_КатегорииОбъектов.Номенклатура
|                ИЗ
|                    ВТ_КатегорииОбъектов КАК ВТ_КатегорииОбъектов)";

ВыборкаДанных = Запрос.Выполнить();


и все. указала правило конвертации объекта Номенклатура. алгоритм работает, но выгружается только один элемент, первый из запроса. что не так? нужно перебирать выборка детальных записей запроса? и если использовать ВыгрузитьПоПравилу, то что отправить в ИсходящиеДанные? или что-то нужно еще прописать в ПКО?
1 VladZ
 
15.08.14
07:01
(0) Привет! Давненько тебя здесь не было...

Я делаю так:

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Для каждого аСтрока из результатЗапроса Цикл
    ВыгрузитьПоПравилу(аСтрока.Объект);
КонецЦикла;
2 Godofsin
 
15.08.14
07:06
(0) Выгрузка нужна автоматическая? можно условия отбора прописать в обработке и скриптом ее запускать
3 VladZ
 
15.08.14
07:12
+1 Зачем в последнем запросе выбирать все реквизиты? Хватит и

ВЫБРАТЬ
    Номенклатура.Ссылка как Объект
из....

А выгружаемые реквизиты задавай в ПКО.
4 Kleo
 
15.08.14
07:27
(2) неа. так точно не подойдет. а как скриптом?

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Для каждого аСтрока из результатЗапроса Цикл
    ВыгрузитьПоПравилу(аСтрока.Объект);
КонецЦикла;

(1) Привет!  аСтрока.Объект - нет такого в запросе - это вообще здесь Источник описывается

(3) перебирать нужно все, т.к. иначе он потом из ПКО не берет эти значения и выгрузка вообще не происходит - выходит ошибка, что не обнаружено такое ПКС
5 Kleo
 
15.08.14
07:30
есть такой параметр "ВыборкаДанных" в обработчике событий "Перед обработкой" в ПВД. и в него должны все строки ПВД попадать. а попадает только первая строка запроса. почему???
6 Defender aka LINN
 
15.08.14
07:31
(5) "Не запоминать выгруженные".
7 VladZ
 
15.08.14
07:33
(4) Конечно нет. :)
Согласно твоему запросу должно быть:

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Для каждого аСтрока из результатЗапроса Цикл
    ВыгрузитьПоПравилу(аСтрока.Ссылка);
//!!!!!!
КонецЦикла;
8 Godofsin
 
15.08.14
07:38
(4) ДатаПоследнейВыгрузки = ХранилищеСистемныхНастроек.Загрузить("ДатаПоследнейВыгрузкиВК100","ДатаПоследнейВыгрузкиВК100","Робот");
    
    Если ДатаПоследнейВыгрузки = Неопределено тогда
         ДатаПоследнейВыгрузки = ТекущаяДата();
    КонецЕсли;
    
    ТС = СПравочники.ТорговыеСети.НайтиПоНаименованию("К 100");
    Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    Обработка.РежимОбмена = "Выгрузка";
    Обработка.ВыводВОкноСообщенийИнформационныхСообщений = Ложь;
    
    Если НачалоДня(ТекущаяДата()) = НачалоДня(ДатаПоследнейВыгрузки) тогда
         ДатаПоследнейВыгрузки = ДатаПоследнейВыгрузки - 86400;
    КонецЕсли;
    
    Обработка.ДатаНачала  = НачалоДня(ДатаПоследнейВыгрузки);
    Обработка.ДатаОкончания   = КонецДня(ТекущаяДата() - 86400);
    
    Обработка.ИмяФайлаПравилОбмена = "\\Programmist\share\ОбменТО.xml";
    
    Обработка.ЗагрузитьПравилаОбмена();
    
    Обработка.Параметры.Вставить("ТорговаяСеть", ТС);
    
    ПараметрСеть = Обработка.ТаблицаНастройкиПараметров.Найти("ТорговаяСеть");
    
    Если ПараметрСеть = Неопределено тогда
        Сообщить("Ошибка определения параметра!");
        Возврат;
    Иначе    
        ПараметрСеть.Значение = ТС;
    КонецЕсли;
    
    //*****************Выгружаем продажи*******************//
    
    Обработка.ИмяФайлаОбмена = "D:\1C.Base\Kastor\Trade\1С8_ТО\ExtForms\ВыгрузкаТО_РТУ.xml";
    ВременнаяТаблицаПравил = Обработка.ТаблицаПравилВыгрузки.Скопировать();
    
    Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
        
        Наименование = СтрокаУровня2.Имя;
        
        Если Наименование <> "РеализацияТоваровУслуг" Тогда
            СтрокаУровня2.Включить = 0;
        Иначе    
            СтрокаУровня2.Включить = 1;
        КонецЕсли;
        
        
    КонецЦикла;
    Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
    Сообщить("***** Выгрузка продаж с "+Обработка.ДатаНачала + " по " +Обработка.ДатаОкончания);
    Обработка.ВыполнитьВыгрузку();
    
    
    //****************Выгружаем Возвраты******************//
    
    Обработка.ИмяФайлаОбмена = "D:\1C.Base\Kastor\Trade\1С8_ТО\ExtForms\ВыгрузкаТО_Возвраты.xml";
    ВременнаяТаблицаПравил = Обработка.ТаблицаПравилВыгрузки.Скопировать();
    
    Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
        
        Наименование = СтрокаУровня2.Имя;
        
        Если Наименование <> "ВозвратТоваровОтПокупателя" Тогда
            СтрокаУровня2.Включить = 0;
        Иначе    
            СтрокаУровня2.Включить = 1;
        КонецЕсли;
        
        
    КонецЦикла;
    Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
    Сообщить("***** Выгрузка возвратов с "+Обработка.ДатаНачала + " по " +Обработка.ДатаОкончания);
    Обработка.ВыполнитьВыгрузку();
    
    //****************Выгружаем ПКО******************//
    
    Обработка.ДатаНачала  = НачалоДня(ДатаПоследнейВыгрузки-(10*86400));
    Обработка.ДатаОкончания   = КонецДня(ТекущаяДата() - 86400);
    
    
    Обработка.ИмяФайлаОбмена = "D:\1C.Base\Kastor\Trade\1С8_ТО\ExtForms\ВыгрузкаТО_ПКО.xml";
    ВременнаяТаблицаПравил = Обработка.ТаблицаПравилВыгрузки.Скопировать();
    
    Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
        
        Наименование = СтрокаУровня2.Имя;
        
        Если Наименование <> "ПриходныйКассовыйОрдер" Тогда
            СтрокаУровня2.Включить = 0;
        Иначе    
            СтрокаУровня2.Включить = 1;
        КонецЕсли;
        
    КонецЦикла;
    
    Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
    Сообщить("***** Выгрузка ПКО с "+Обработка.ДатаНачала + " по " +Обработка.ДатаОкончания);
    Обработка.ВыполнитьВыгрузку();
    
    
    ХранилищеСистемныхНастроек.Сохранить("ДатаПоследнейВыгрузкиВК100", "ДатаПоследнейВыгрузкиВК100", ТекущаяДата(),,"Робот");
    
    ЗапускБазыК100();
9 Godofsin
 
15.08.14
07:39
(8) а, стоп. Здесь без отбора.
10 Godofsin
 
15.08.14
07:41
Вообщем вот тут все доходчиво объяснено:
http://infostart.ru/public/86109/
11 VladZ
 
15.08.14
07:46
(4) а в ПКО у тебя что является источником? Номенклатура?
12 VladZ
 
15.08.14
07:51
(0) Аську твою потерял. Не справишься сама - стучись.
13 Kleo
 
15.08.14
08:02
(10) ок, спасибо.

(12) я сделала по-другому. но мне интересно, почему этот способ не работает, как это описано в книге по конвертации данных
14 Kleo
 
15.08.14
08:04
я в самой Конвертации в Обработчик событий "Перед выгрузкой данных" описываю этот запрос, его выгружаю в ТЗ, а ТЗ передаю в параметр. далее уже в ПКО Номенклатура Перед выгрузкой делаю проверку:

ТаблицаОбязательнаяСинхронизация = Параметры.ТаблицаОбязательнаяСинхронизация;
    
    ПараметрыОтбора = Новый Структура("Ссылка", Источник);
    НайденныеСтроки = ТаблицаОбязательнаяСинхронизация.НайтиСтроки(ПараметрыОтбора);
    Если НайденныеСтроки.Количество() > 0 Тогда
        НеЗамещатьОбъектПриЗагрузке = Истина;
    Иначе
        Отказ = истина;
    КонецЕсли;
15 VladZ
 
15.08.14
08:13
(14) Тоже вариант. А (7) не взлетело?
16 Defender aka LINN
 
15.08.14
08:34
(13) Потому что (6), @#$