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