Программное обращение к обработке "Универсальный обмен данными в формате 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. Заключение

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

34 Comments

  1. _qqq

    Уважаемый, Олег, мне очень понравилась Ваша идея дать пользователям одну обработку для обмена данными между конфигурациями.

    И сейчас пытаюсь реализовать этот подход для обмена между 1с 7.7 БП и 1с 8.2 КА.

    Возникло вот такое затруднение:

    Один из параметров, который надо прередать обработке, выгружающей из семерки (V77Exp.ert), — это ТаблицаНастройкиПараметров.

    Подскажите, пожалуйста, какое у него должно быть значение.

    Или направьте в какую сторону копать.

    Reply
  2. alexware

    Полезная статья. Давать пользователям в пользование «Универсальный обмен данными в формате XML» — плохая идея. А вот в такой оболочке — самое то!

    Reply
  3. Oleg_nsk

    (1) Таблица настройки параметров заполняется также как обычная таблица в 7.7. У нее пять колонок: Имя, Наименование, ТипЗначения, ВидЗначения, Значение. Подробности заполнения можете найти в коде V77Exp.ert.

    Reply
  4. _qqq

    (3) Oleg_nsk, параметр ТаблицаНастройкиПараметров — это оказывается Список значений.

    Еще пока мне не понятно, какие же значения он предназначен передавать обработке V77Exp.ert.

    Но она сработала и с пустым списком.

    Reply
  5. Oleg_nsk

    (4) Может мы говорим о разном, но ТаблицаНастройкиПараметров в Универсальном обмене это однозначно таблица значений, а не список.

    Reply
  6. _qqq

    (5) Oleg_nsk, Вы правы в обработке есть ТаблицаНастройкиПараметров — это таблица.

    При открытии обработки передается параметр, который также называется:

    ЗнТаблицаНастройкиПараметров= СписокПараметров.Получить(«ТаблицаНастройкиПараметров»);

    Это список, его содержимое потом заносится в таблицу:

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

    Подскажите, как передать список документов для отбора при выгрузке.

    не понятно как работает строка

    Обработка.Параметры.Вставить(«Документы»,СписокДок);

    Reply
  8. Oleg_nsk

    (7) mixa_gr, Смотрите правила обмена. Там в глобальном обработчике «При выгрузке объекта» смотрится есть ли выгружаемый объект в массиве «Документы».

    Reply
  9. dimk@a

    Oleg_nsk, спасибо! Выручила ваша обработка — как раз собирался делать нечто подобное, но решил сперва посмотреть на инфостарте ))

    Только вот параметры передать не удалось — в самой обработке в процедуре ВыполнитьЗагрузку() все переданные мною параметры очищаются. Прописал запрос параметров в обработчике ПередВыгрузкойДанных() через функцию ВвестиЗначение().

    Reply
  10. Жолтокнижниг

    Идея хороша, реализация не очень, не универсально

    Если Параметры.Документы.Найти(Объект) = Неопределено Тогда
    Отказ = Истина;
    Иначе
    Сообщить(«Выгружается документ: «+Объект);
    КонецЕсли;
    Reply
  11. beard1
    Обработка.Параметры.Вставить(«Документы»,СписокДок);

    Ткни носом, будь ласка, где описать параметр Документы… 🙁

    Reply
  12. Oleg_nsk

    (11) beard1, Описывать его не надо. Он будет существовать после загрузки правил обмена. Надо к нему обращаться в правилах обмена в глобальном обработчике «Перед выгрузкой объекта» и там если объект не найден в переданном массиве документов, то писать «Отказ = Истина».

    Reply
  13. beard1
    Надо к нему обращаться в правилах обмена в глобальном обработчике «Перед выгрузкой объекта»

    Спасибо! Работает. Изящьненько…

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

    Другими словами, если в периоде отбора будет много документов, то может быть оптимальнее использовать метод описанный здесь http://www.forum.mista.ru/topic.php?id=474869 ? Или без разницы? Вопрос так, теоретический…

    Reply
  14. Oleg_nsk

    (13) beard1, Может быть, но построитель уходит в прошлое и у меня к нему личная неприязнь. Всё новое создается на СКД. Думаю и универсальную обработку со временем перепишут. Я недавно другую реализацию делал. Выбор периода на форме и в табличной части много видов документов и флажок у каждой строки «отдельный выбор». Пользователь может выгрузить все доки за период или установить флажок и сам накидать в список доки определенного вида которые хочет. Везде у всех потребности разные. Там как раз пришлось построитель использовать.

    Reply
  15. beard1

    Спасибо! Наверное, самый красивый способ для данной задачи!

    Можно ли применить такой подход для 77? Или там как-то по другому?

    Reply
  16. LexSeIch

    Мир этому дому! Прекрасный вариант реализации оболочки для пользователей, которым не надо заморачиваться выбором параметров.

    Reply
  17. Oleg_nsk

    (15) beard1, По 77 не скажу. Эта платформа давно подзабылась

    (16) LexSeIch, Спасибо

    Reply
  18. beard1
    По 77 не скажу

    Разобрался с 7.7. Не так красиво там получается, но работает.

    Reply
  19. ArtemiFD

    Спасибо, очень полезная статья. Воспльзовался полученными знаниями в своей обработке http://infostart.ru/public/177099/

    Reply
  20. Ксакеп

    Спасибо за замечательную идею =)

    С выгрузкой разобрался без проблем, все работает как надо. А вот загрузка идет в управляемоем приложение, чувствую предстоит покопаться прежде чем удастся все реализовать.

    Reply
  21. aochkasov

    Вот то что доктор прописал. Спасибо. Плюсую

    Reply
  22. tgr123

    Спасибо за статью. Использовал идею для своей обработки. Отличие — непосредственная выгрузка в базу-приемник, без выгрузки промежуточного файла XML и обработки для загрузки в базу-приемник. Получилась действительно простая выгрузка в три клика. http://infostart.ru/public/238944/

    Reply
  23. kurmanov

    Спасибо, помогло решить проблему.

    Reply
  24. relanium86

    Спасибо за полезную информацию

    Reply
  25. Xershi

    (18) beard1, покажи решение, нужен код для 7.7. Хочу выгружать ночью данные из 7.7.

    Reply
  26. Xershi

    Тоже разобрался с синтаксисом.

    В глобальном модуле, когда заходит бот написал

    ОткрытьФорму(«Обработка.МояОбработка»);

    А в коде обработки уже написал при открытии формы этим ботом выполнить выгрузку.

    Reply
  27. OrsoBear

    Вроде обсудили, а ответ не понятен.

    В обработку передается таблица настройки параметров.

    Она в виде списка значений, но в коде, есть и как список значений, и как таблица.

    Валится с ошибками.

    Хочу передать определенный список объектов, которые нужно выгрузить..

    Reply
  28. OrsoBear

    Прошел год.. и я снова вернулся к тому же вопросу 🙂

    Reply
  29. Xershi

    (28) OrsoBear, спустя год, он понятнее не стал!

    Reply
  30. Sibiande_

    Внешний файл не сохранён.

    Обработка универсальный обмен данными XML модуль объекта 2172: Тип не определён (СправочникСсылкаВидыНоменклатуры)

    Reply
  31. OrsoBear

    Вы будете смеяться. Но только спустя 2 года меня в полной мере достала эта тема. Потому сел, и детально разобрался. Частично воспользовался фрагментами кода.

    Доработал семерочную выгрузку, чтобы можно было в нее закидывать параметры, изначально функционал беден.

    С загрузкой оказалось все просто. Разве что не устраивают бесполезные сообщения с началом, окончанием загрузки, и с количеством объектов. Пользователям это ни о чем не говорит. Пришлось кидать во внешнюю обработку, и переписывать уведомления под пожелания трудящихся.

    Reply
  32. fieryfist

    При организации обмена подобным способом возникает проблема при удалении объектов. Например из ИБ1 передали в ИБ2 некий объект, затем в ИБ1 его удалили, в итоге в ИБ2 объект остался и удален не будет, т.к. при последующих выгрузках информация о нем из ИБ1 не передается. Как вы решили эту проблему?

    Reply
  33. vis_tmp

    (31)Можешь дать обработку для 7.7 ?

    Reply
  34. OrsoBear

    (33) Увы. Базы перевел на восьмерку. Старые разработки удалил за ненадобностью.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *