gifts2017

Программное обращение к обработке "Универсальный обмен данными в формате xml"

Опубликовал Олег Сорокин (Oleg_nsk) в раздел Обмен - Обмен через XML

В статье рассказывается о быстром написании обработок для выгрузки и загрузки данных, используя методы обработки "Универсальный обмен данными в формате xml".

1. Зачем это надо

Вы можете использовать прилагаемые к статье обработки как шаблоны для быстрой выгрузки/загрузки данных при имеющихся правилах обмена. У меня такая задача возникла после того, как понадобилось быстро предоставить возможность пользователям, которые были плохо знакомы с системой 1С, выгружать из УТ реализации и загружать их как поступления в "Розницу". Причем пользователю необходимо было предоставить возможность самостоятельно выбирать те реализации, которые надо выгружать. Предоставлять возможность использования всех возможностей обработки "Универсальный обмен данными в формате XML" не хотелось. Правила обмена с помощью "Конвертации данных" написать (для этого конкретного случая) довольно просто. Для этого достаточно обладать элементарными знаниями КД (их можно быстро получить из видеолекций Евгения Гилева - http://www.spec8.ru/data-conv).

 

2. Выгрузка

Форма выгрузки у меня выглядела следующим образом:

При изменении даты табличное поле заполняется документами за выбранную дату. Сами правила обмена были вставлены в обработку как макет с типом "Двоичные данные".

При нажатии на кнопку "Выгрузка" выполняется код:


Процедура ДействияФормыВыгрузка(Кнопка)

   
ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
   
ДиалогФайла.Фильтр = "Файл данных (*.xml)|*.xml";
   
ДиалогФайла.ПолноеИмяФайла = "Retail_"+СтрЗаменить(Формат(Дата,"ДФ=dd.MM.yyyy"),".","-");
    Если
ДиалогФайла.Выбрать() Тогда
       
ИмяФайла = ДиалогФайла.ПолноеИмяФайла;
        Попытка
           
ВыгрузитьДанные(ИмяФайла);
           
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
           
ДвоичныеДанные.Записать(ИмяФайла);
        Исключение
           
Предупреждение("Внешний файл не сохранен
            |"
+ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Сама процедура выгрузки выглядит так:


Процедура ВыгрузитьДанные(ИмяФайлаОбмена)

   
Обработка=Обработки.УниверсальныйОбменДаннымиXML.Создать();
   
Обработка.РежимОбмена="Выгрузка";
   
ВремФайл = ПолучитьИмяВременногоФайла("xml");
   
МакетПравилОбмена = ПолучитьМакет("ПравилаВыгрузки");
   
МакетПравилОбмена.Записать(ВремФайл);
   
Обработка.ИмяФайлаПравилОбмена = ВремФайл;//ФайлПравилОбмена;
   
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
   
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
   
Обработка.ЗапоминатьЗагруженныеОбъекты = Истина;
   
Обработка.ИспользоватьОтборПоДатеДляВсехОбъектов = Истина;
   
СписокДок = Новый Массив;
    Для каждого
Стр Из Документы Цикл
        Если НЕ
Стр.Флаг Тогда
            Продолжить;
        КонецЕсли;
       
СписокДок.Добавить(Стр.Реализация);
    КонецЦикла;
   
Обработка.ДатаНачала = Дата;
   
Обработка.ДатаОкончания = КонецДня(Дата);
   
Обработка.ВыгружатьТолькоРазрешенные = Истина;
   
Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
   
Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0; // 0 - не снимать регистрацию, 1 - снимать регистрацию
   
Обработка.ЗагрузитьПравилаОбмена();
   
Обработка.Параметры.Вставить("Документы",СписокДок);
   
Обработка.ВыполнитьВыгрузку();

КонецПроцедуры

Отбор по документам осуществляется с помощью параметра "Документы", описанного в правилах обмена.

 

3. Загрузка

А вот это форма для загрузки:

При загрузке отрабатывает следующий код:


    ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
   
ОбработкаОбмена.ИмяФайлаОбмена = ФайлЗагрузки;
   
ОбработкаОбмена.РежимОбмена = "Загрузка";
   
ОбработкаОбмена.ОткрытьФайлЗагрузки(Истина);
   
ОбработкаОбмена.АрхивироватьФайл = Ложь;;
   
ОбработкаОбмена.ВыполнитьЗагрузку();
   
ОбработкаОбмена = Неопределено;

4. Заключение

В результате получилась предельно простая для понимания пользователей технология обмена. Теперь нас не будут ждать неожиданности вроде выгрузки данных за большой период и не будут поступать вопросы о том "Почему ничего не выгружается?" при неправильном указании отборов. Сделал и забыл. Быстро, просто, прозрачно.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
WorkFiles
.zip 23,21Kb
09.10.12
230
.zip 23,21Kb 230 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Марина Гинко (_qqq) 11.10.12 16:36
Уважаемый, Олег, мне очень понравилась Ваша идея дать пользователям одну обработку для обмена данными между конфигурациями.
И сейчас пытаюсь реализовать этот подход для обмена между 1с 7.7 БП и 1с 8.2 КА.
Возникло вот такое затруднение:
Один из параметров, который надо прередать обработке, выгружающей из семерки (V77Exp.ert), - это ТаблицаНастройкиПараметров.
Подскажите, пожалуйста, какое у него должно быть значение.
Или направьте в какую сторону копать.
2. Алексей Верещагин (alexware) 11.10.12 19:25
Полезная статья. Давать пользователям в пользование "Универсальный обмен данными в формате XML" - плохая идея. А вот в такой оболочке - самое то!
dedicated; +1 Ответить
3. Олег Сорокин (Oleg_nsk) 12.10.12 06:41
(1) _qqq,Таблица настройки параметров заполняется также как обычная таблица в 7.7. У нее пять колонок: Имя, Наименование, ТипЗначения, ВидЗначения, Значение. Подробности заполнения можете найти в коде V77Exp.ert.
4. Марина Гинко (_qqq) 12.10.12 09:10
(3) Oleg_nsk, параметр ТаблицаНастройкиПараметров - это оказывается Список значений.
Еще пока мне не понятно, какие же значения он предназначен передавать обработке V77Exp.ert.
Но она сработала и с пустым списком.
5. Олег Сорокин (Oleg_nsk) 12.10.12 11:33
(4) _qqq, Может мы говорим о разном, но ТаблицаНастройкиПараметров в Универсальном обмене это однозначно таблица значений, а не список.
6. Марина Гинко (_qqq) 12.10.12 11:42
(5) Oleg_nsk, Вы правы в обработке есть ТаблицаНастройкиПараметров - это таблица.
При открытии обработки передается параметр, который также называется:
ЗнТаблицаНастройкиПараметров= СписокПараметров.Получить("ТаблицаНастройкиПараметров");

Это список, его содержимое потом заносится в таблицу:
Для НомерСтрокиСписка = 1 По ЗнТаблицаНастройкиПараметров.РазмерСписка() Цикл
  ЗнТаблицаНастройкиПараметров.ПолучитьЗначение(НомерСтрокиСписка, ПредставлениеЗначения);
  Если ТаблицаНастройкиПараметров.НайтиЗначение(ПредставлениеЗначения,СтрокаТаблицы,1) = 1 Тогда
    ТаблицаНастройкиПараметров.Значение = ЗнТаблицаНастройкиПараметров.Получить(ПредставлениеЗначения);
  КонецЕсли;
КонецЦикла;
...Показать Скрыть
7. mixa_gr wer (mixa_gr) 12.10.12 13:37
Подскажите, как передать список документов для отбора при выгрузке.
не понятно как работает строка

Обработка.Параметры.Вставить("Документы",СписокДок);
8. Олег Сорокин (Oleg_nsk) 12.10.12 14:30
(7) mixa_gr, Смотрите правила обмена. Там в глобальном обработчике "При выгрузке объекта" смотрится есть ли выгружаемый объект в массиве "Документы".
9. Дмитрий (dimk@a) 25.11.12 17:33
Oleg_nsk, спасибо! Выручила ваша обработка - как раз собирался делать нечто подобное, но решил сперва посмотреть на инфостарте ))
Только вот параметры передать не удалось - в самой обработке в процедуре ВыполнитьЗагрузку() все переданные мною параметры очищаются. Прописал запрос параметров в обработчике ПередВыгрузкойДанных() через функцию ВвестиЗначение().
10. Алексей Ко (Жолтокнижниг) 18.12.12 16:49
Идея хороша, реализация не очень, не универсально
Если Параметры.Документы.Найти(Объект) = Неопределено Тогда
	Отказ = Истина;
Иначе
	Сообщить("Выгружается документ: "+Объект);
КонецЕсли;
...Показать Скрыть
11. Николай (beard1) 20.02.13 01:08
Обработка.Параметры.Вставить("Документы",СписокДок);


Ткни носом, будь ласка, где описать параметр Документы... :(
12. Олег Сорокин (Oleg_nsk) 20.02.13 08:51
(11) beard1, Описывать его не надо. Он будет существовать после загрузки правил обмена. Надо к нему обращаться в правилах обмена в глобальном обработчике "Перед выгрузкой объекта" и там если объект не найден в переданном массиве документов, то писать "Отказ = Истина".
13. Николай (beard1) 21.02.13 02:38
Надо к нему обращаться в правилах обмена в глобальном обработчике "Перед выгрузкой объекта"

Спасибо! Работает. Изящьненько...
У меня первые шаги в КД. Я так понял, что глобальный обработчик правил обмена , это Конвертация_ПередВыгрузкойОбъекта, и сначала происходит отбор всех объектов по дате, а в обработчике "Перед выгрузкой объекта" накладывается фильтр по списку документов.

Другими словами, если в периоде отбора будет много документов, то может быть оптимальнее использовать метод описанный здесь http://www.forum.mista.ru/topic.php?id=474869 ? Или без разницы? Вопрос так, теоретический...
14. Олег Сорокин (Oleg_nsk) 21.02.13 07:57
(13) beard1, Может быть, но построитель уходит в прошлое и у меня к нему личная неприязнь. Всё новое создается на СКД. Думаю и универсальную обработку со временем перепишут. Я недавно другую реализацию делал. Выбор периода на форме и в табличной части много видов документов и флажок у каждой строки "отдельный выбор". Пользователь может выгрузить все доки за период или установить флажок и сам накидать в список доки определенного вида которые хочет. Везде у всех потребности разные. Там как раз пришлось построитель использовать.
15. Николай (beard1) 25.02.13 19:43
Спасибо! Наверное, самый красивый способ для данной задачи!
Можно ли применить такой подход для 77? Или там как-то по другому?
16. Сергей Маслов (LexSeIch) 27.02.13 12:21
Мир этому дому! Прекрасный вариант реализации оболочки для пользователей, которым не надо заморачиваться выбором параметров.
17. Олег Сорокин (Oleg_nsk) 28.02.13 07:55
(15) beard1, По 77 не скажу. Эта платформа давно подзабылась
(16) LexSeIch, Спасибо
18. Николай (beard1) 28.02.13 09:21
По 77 не скажу


Разобрался с 7.7. Не так красиво там получается, но работает.
19. Art Sviat (ArtemiFD) 10.03.13 10:45
Спасибо, очень полезная статья. Воспльзовался полученными знаниями в своей обработке http://infostart.ru/public/177099/
20. Павел Медведев (Ксакеп) 26.03.13 09:47
Спасибо за замечательную идею =)
С выгрузкой разобрался без проблем, все работает как надо. А вот загрузка идет в управляемоем приложение, чувствую предстоит покопаться прежде чем удастся все реализовать.
21. Lexnsk (aochkasov) 18.04.13 12:52
Вот то что доктор прописал. Спасибо. Плюсую
22. tgr123 03.12.13 12:08
Спасибо за статью. Использовал идею для своей обработки. Отличие - непосредственная выгрузка в базу-приемник, без выгрузки промежуточного файла XML и обработки для загрузки в базу-приемник. Получилась действительно простая выгрузка в три клика. http://infostart.ru/public/238944/
23. Марат Курманов (kurmanov) 15.02.14 13:55
Спасибо, помогло решить проблему.
24. Сергей Бушмакин (relanium86) 27.02.14 09:31
Спасибо за полезную информацию
25. Xer shi (Xershi) 05.02.15 11:43
(18) beard1, покажи решение, нужен код для 7.7. Хочу выгружать ночью данные из 7.7.
26. Xer shi (Xershi) 05.02.15 13:32
Тоже разобрался с синтаксисом.
В глобальном модуле, когда заходит бот написал
ОткрытьФорму("Обработка.МояОбработка");

А в коде обработки уже написал при открытии формы этим ботом выполнить выгрузку.
27. Alex Steiner (OrsoBear) 09.02.15 12:17
Вроде обсудили, а ответ не понятен.
В обработку передается таблица настройки параметров.
Она в виде списка значений, но в коде, есть и как список значений, и как таблица.
Валится с ошибками.

Хочу передать определенный список объектов, которые нужно выгрузить..
28. Alex Steiner (OrsoBear) 29.02.16 15:15
Прошел год.. и я снова вернулся к тому же вопросу :-)
29. Xer shi (Xershi) 29.02.16 15:16
(28) OrsoBear, спустя год, он понятнее не стал!
30. S K (Sibiande_) 26.04.16 15:56
Внешний файл не сохранён.
Обработка универсальный обмен данными XML модуль объекта 2172: Тип не определён (СправочникСсылкаВидыНоменклатуры)
31. Alex Steiner (OrsoBear) 01.11.16 15:38
Вы будете смеяться. Но только спустя 2 года меня в полной мере достала эта тема. Потому сел, и детально разобрался. Частично воспользовался фрагментами кода.
Доработал семерочную выгрузку, чтобы можно было в нее закидывать параметры, изначально функционал беден.
С загрузкой оказалось все просто. Разве что не устраивают бесполезные сообщения с началом, окончанием загрузки, и с количеством объектов. Пользователям это ни о чем не говорит. Пришлось кидать во внешнюю обработку, и переписывать уведомления под пожелания трудящихся.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа