Вначале, безусловно, воспользуемся конфигурацией «Конвертация данных», чтобы создать необходимые нам правила обмена (как — это отдельная тема).
Итак, собственно сама ВЫГРУЗКА:
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена = «Выгрузка»;
Обработка.ВыводВОкноСообщенийИнформационныхСообщений = Истина;
При необходимости можно задать период выгрузки (как пример):
Обработка.ДатаНачала = ТекущаяДата();
Обработка.ДатаОкончания = ТекущаяДата();
Обработка.ИмяФайлаПравилОбмена = «D:ПравилаОбменаДанными.xml»;
Источник = ЭтотОбъект.Ссылка;
ИмяФайла = Строка(ТипЗнч(Источник)) + » » + Строка(Источник.Номер);
Обработка.ИмяФайлаОбмена = «D:E»+ Источник +«.xml»;
Обработка.ЗагрузитьПравилаОбмена();
Основные параметры мы определили, теперь надо настроить отбор. Если в этом нет необходимости, то просто запускаете выгрузку:
Обработка.ВыполнитьВыгрузку();
Настройка ОТБОРА:
Тут надо обратить внимание на массив «ВременнаяТаблицаПравил.Строки[1]» и в частности на индекс массива строк,
1 — это ветка «Справочники». Ну и так далее по аналогии
ВременнаяТаблицаПравил = Обработка.ТаблицаПравилВыгрузки.Скопировать();
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[1].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование <> «ПеремещениеТоваров00001» Тогда
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[2].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование <> «ПеремещениеТоваров00001» Тогда
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;
Здесь вы определяете искомое правило выгрузки, которое нужно оставить включенным на определенной ветке (сами можете варьировать чего и сколько):
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование = «ПеремещениеТоваров00001» Тогда
СтрокаУровня2.Включить = 1;
Иначе
СтрокаУровня2.Включить = 0;
КонецЕсли;
КонецЦикла;
Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
Теперь настраиваем ОТБОР, смысл которого в том, чтобы передать в нашу выгрузку ссылку на документ(ты) который(е) хотим выгрузить:
Для Каждого СтрокаУровня2 Из ВременнаяТаблицаПравил.Строки[0].Строки Цикл
Наименование = СтрокаУровня2.Имя;
Если Наименование = «ПеремещениеТоваров00001» Тогда
ТекущееПВД = СтрокаУровня2;
Построитель = Новый ПостроительОтчета;
Если ТекущееПВД.ИмяОбъектаДляЗапроса <> Неопределено Тогда
Построитель.Текст =
«ВЫБРАТЬ Разрешенные _.* ИЗ » + ТекущееПВД.ИмяОбъектаДляЗапроса + » КАК _
|
|
|{ГДЕ _.Ссылка.* КАК » + СтрЗаменить(ТекущееПВД.ИмяОбъектаДляЗапроса, «.», «_») + «}»;
КонецЕсли;
Отбор = Построитель.Отбор;
Если Отбор.Найти(«Документ_ПеремещениеТоваров») = Неопределено Тогда
Отбор.Добавить(«Документ_ПеремещениеТоваров»);
КонецЕсли;
Массив = Новый Массив;
Массив.Добавить(Тип(«ДокументСсылка.ПеремещениеТоваров»));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , );
Отбор[«Документ_ПеремещениеТоваров»].Использование = Истина;
Отбор[«Документ_ПеремещениеТоваров»].Значение = ЭтотОбъект.Ссылка;
Отбор[«Документ_ПеремещениеТоваров»].ВидСравнения = ВидСравнения.Равно;
ДоступностьПостроителя = Истина;
Если Построитель.Отбор.Количество() > 0 Тогда
ТекущееПВД.НастройкиПостроителя = Построитель.ПолучитьНастройки();
ТекущееПВД.ИспользоватьОтбор = ИСТИНА;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Обработка.ТаблицаПравилВыгрузки = ВременнаяТаблицаПравил.Скопировать();
Ну и, собственно, запускаем саму выгрузку и получаем файл для загрузки:
Обработка.АрхивироватьФайл = Истина;
Обработка.ВыполнитьВыгрузку();
Далее процесс загрузки:
Он довольно прост
МассивФайлов = НайтиФайлы(«D:E», «*.zip»);
Для Каждого Стм Из МассивФайлов Цикл
ТекстВопроса = «Загрузить — » + Стм.ПолноеИмя;
Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да);
Если Ответ = КодВозвратаДиалога.Да Тогда
Обработка = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.ИмяФайлаОбмена = Стм.ПолноеИмя;
Обработка.РежимОбмена = «Загрузка»;
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка.ВыполнитьЗагрузку();
УдалитьФайлы(Стм.ПолноеИмя);
КонецЕсли;
КонецЦикла;
Расширение .zip для файлов обмена пусть вас не смущает, обработка самостоятельно упакует .xml файл в архив:
Обработка.АрхивироватьФайл = Истина;
И также самостоятельно уже без дополнительных указаний распакует и загрузит. Это существенно уменьшает размеры файла обмена.
Вот примерно так можно поступить.
Продолжение темы :
Пример выгрузки из документа получается?
Завтра выложу пример (обработку).
(1)Не совсем понял в чем вопрос, если вы имеете ввиду вигрузку только табличной части документа (скажем товары) в другой документ либо такой же но с обработкой этих данных — то это надо описывать в обработчиках событий в Конвертации данных (когда будите писать правила обмена). Я только показал как сделать некий регламент обмена а не запрограммировать его логику (это отдельная тема).
Информация удобная, автору благодарность.
Мне потребовалось выгружать по плану обмена. Поэтому немного добавлю:
НашУзел = ПланыОбмена.ХХХХ.НайтиПоКоду(«2»);
УстановитьУзелОбменаУСтрокДерева(Обработка.ТаблицаПравилВыгрузки.Строки, НашУзел);
Процедуру УстановитьУзелОбменаУСтрокДерева просто копируем из формы обработки.
Насколько я понял данный пример в отборе отбирает только один документ, что на практике бывает редко. Попробовал изменить строки на
где Массив это мой программно создаваемый список значений заполненный ссылками на документ. Ничего не получилось.
Можно в качестве примера указать выгрузку списка документов. Думаю формирование списка каждый может сделать под себя, и по дате и по контрагенту и по чему угодно.
(4) Отбор[«Документ_РеализацияТоваровУслуг»].Значение = Массив.Скопировать();
где Массив имеет тип СписокЗначений.
Показать
После этих строк смотрю в отладчике отбор и вижу
Выгружено объектов 0.
(6) Как я понял проблема настроить отбор в варианте «ВСписке» программно… обработку не буду ради это писать… но где то так:
Структура = Новый СписокЗначений;
Запрос = Новый Запрос();
Запрос.Текст =
«ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка,
| ПеремещениеТоваров.Дата
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.Дата МЕЖДУ &датаНачала И &датаКонца»;
Запрос.УстановитьПараметр(«ДатаНачала», НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр(«ДатаКонца», ТекущаяДата());
Структура = Запрос.Выполнить().Выгрузить();
Отбор[«Документ_ПеремещениеТоваров»].Использование = Истина;
Отбор[«Документ_ПеремещениеТоваров»].ВидСравнения = ВидСравнения.ВСписке;//Равно;
Отбор[«Документ_ПеремещениеТоваров»].Значение.ЗагрузитьЗначения(Структура.ВыгрузитьКолонку(«Ссылка»));//Источник;
Вот так список значений заполняется, я детально не встраивал в обработку но вызвав форму обработки видел что список значений заполнился ссылками, по ошибке ничего не вывалилось.
Данная методика будет работать с выгрузкой из базы в которой две организации (ИП и ООО)? конф УТ ред 11 (управляемое приложение)
спасибо очень помогло правда пришлось с легка модифицировать
(8) Данная методика будет работать не зависимо от форм отганизационно-правовой формы. Но на версии УТ 11 я ее не тестировал за неимением (Конфигурации где будет работать написаны в заголовке).
Привет! Спасибо за тему — очень актуальная для меня оказалась. Такой вопрос — можно ли этот «кусок» развить до полуавтоматического общения двух идентичных БД via e-mail?
(11) Привет! количества вариантов (автоматического, например как у меня по регламенту… много, надо будет дописать схему реализации) ограниченно лишь функционалом самой 1С. Там есть возможность авто пересылки сообщений и их автоматического приема и обработки НО! данная обработка «вытаскивает» весь объект вместе с подчиненными ссылками и в итоге мы получаем файл где то на 60 метров (и это в архиве!).
Можно правилами обмена пробовать ограничивать объем выгрузки но тогда не факт что мы в пакете обмена будем иметь весь объем необходимой инфы.
По этому почта возможна но… как неполноценный по эффективности вариант когда имеет дело с файлом сформированным описанной обработкой… но попытка не пытка, это лишь мое мнение.
Хочу поблагодарить автора! Очень и очень замечательную вещь выложили! Буквально меня спасли =) очень сократил время на разработку! + 10 !!!
Спасибо за статью.
Я не пойму зачем нужно копировать ТаблицуПравилВыгрузки? Почему бы сразу в неё изменения не вносить?
(17) Публикация не подвергалась оптимизации если вам так удобнее то почему нет.. тут лишь изложена одна из идей обмена а не обработки данных в процессе этого обмена.
Спасибо! Статья помогла.
Спасибо! Очень полезная статейка
Обработка.ВыполнитьЗагрузку();
УдалитьФайлы(Стм.ПолноеИмя);
У вас не возникает ошибки совместного доступа к файлу в последней строке?
(21)Нет не возникает, а должно?
Спасибо за статью. Подтолкнули на мысль, использовал в работе. Очень пригодилось.
Спасибо за статью! Как раз возникла необходимость постоянной перегрузки документов из одной базы в другую через универсальный отчет.
Спасибо буду пробовать, интересная статья
…применим если вы не можите…
*можЕте
А как настроить отбор только по справочникам (у)??
Можете подсказать, как сделать то же самое, но только в УФ? Есть внешняя обработка на УФ с кнопкой выгрузить, по нажатию на которую нужно выгрузить по правилу обмена используя обработку УниверсальныйОбменДаннымиXML на УФ, например, в БП3.
Не актуально, разобрался.
Спасибо! Очень помогло!
Всё работает, но возникает проблема с добавлением отбора на регистр сведений, у кого нибудь есть пример кода?
(7) еще дело может быть в отсутствии галочки у корневых разделов ПВД (Справочники, Документы), при установленной галке в строках этих разделов.
(30) Гость,
Вряд ли кто нибудь теперь уже ответит.
Тоже бьюсь над этим — как отобрать независимые регистры сведений?
В частности нужно отобрать по периоду или по дате ключевого документа.
Если кому ещё интересно.
В самой обработке универсального обмена в модуле формы есть процедура НастроитьПостроитель().
Оттуда можно выдернуть нужные строки.
коротко вот пример для независимого периодического регистра сведений:
Показать
Здесь важно брать именно ИмяОбъектаДляЗапросаРегистра.
Показать
Работает, Спасибо! А нет возможности добавить реквизит в отбор?
Примерно следущее?
Отбор добавляется но при
выводится ошибка
(33) а есть пример выгрузки только измененных записей регистра сведений? (не периодического и без регистратора)
Показать
Вот так работает, мож пригодится кому…
Доброго времени суток. Спасибо за статью, но у меня возникла проблема.
Показать
Сделал вот так, но почему то попадют все документы «СпАвтор» почему то не отрабатывается условие. Не подскажете в чем дело?
Добрый день! может кто-нибудь выложить код полностью рабочей обработки? у меня почему-то только справочники выгружаются, документы никак не могу выгрузить, как ни пытался… буду очень благодарен)
Доброго дня. В серверном варианте на линуксе ( скорее всего на виндоус так же будет) загрузка файла блокировала файл обмена. Помогло удаление файла, причем только функцией из самой обработки.