1. Зачем это надо
Вы можете использовать прилагаемые к статье обработки как шаблоны для быстрой выгрузки/загрузки данных при имеющихся правилах обмена. У меня такая задача возникла после того, как понадобилось быстро предоставить возможность пользователям, которые были плохо знакомы с системой 1С, выгружать из УТ реализации и загружать их как поступления в «Розницу». Причем пользователю необходимо было предоставить возможность самостоятельно выбирать те реализации, которые надо выгружать. Предоставлять возможность использования всех возможностей обработки «Универсальный обмен данными в формате XML» не хотелось. Правила обмена с помощью «Конвертации данных» написать (для этого конкретного случая) довольно просто. Для этого достаточно обладать элементарными знаниями КД (их можно быстро получить из видеолекций Евгения Гилева — http://www.spec8.ru/data-conv).
2. Выгрузка
Форма выгрузки у меня выглядела следующим образом:
При изменении даты табличное поле заполняется документами за выбранную дату. Сами правила обмена были вставлены в обработку как макет с типом «Двоичные данные».
При нажатии на кнопку «Выгрузка» выполняется код:
Процедура ДействияФормыВыгрузка(Кнопка)
ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогФайла.Фильтр = «Файл данных (*.xml)|*.xml»;
ДиалогФайла.ПолноеИмяФайла = «Retail_»+СтрЗаменить(Формат(Дата,«ДФ=dd.MM.yyyy»),«.»,«-«);
Если ДиалогФайла.Выбрать() Тогда
ИмяФайла = ДиалогФайла.ПолноеИмяФайла;
Попытка
ВыгрузитьДанные(ИмяФайла);
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
ДвоичныеДанные.Записать(ИмяФайла);
Исключение
Предупреждение(«Внешний файл не сохранен
|»+ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Сама процедура выгрузки выглядит так:
Процедура ВыгрузитьДанные(ИмяФайлаОбмена)
Обработка=Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработка.РежимОбмена=«Выгрузка»;
ВремФайл = ПолучитьИмяВременногоФайла(«xml»);
МакетПравилОбмена = ПолучитьМакет(«ПравилаВыгрузки»);
МакетПравилОбмена.Записать(ВремФайл);
Обработка.ИмяФайлаПравилОбмена = ВремФайл;//ФайлПравилОбмена;
Обработка.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка.ЗапоминатьЗагруженныеОбъекты = Истина;
Обработка.ИспользоватьОтборПоДатеДляВсехОбъектов = Истина;
СписокДок = Новый Массив;
Для каждого Стр Из Документы Цикл
Если НЕ Стр.Флаг Тогда
Продолжить;
КонецЕсли;
СписокДок.Добавить(Стр.Реализация);
КонецЦикла;
Обработка.ДатаНачала = Дата;
Обработка.ДатаОкончания = КонецДня(Дата);
Обработка.ВыгружатьТолькоРазрешенные = Истина;
Обработка.ИмяФайлаОбмена = ИмяФайлаОбмена;
Обработка.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0; // 0 — не снимать регистрацию, 1 — снимать регистрацию
Обработка.ЗагрузитьПравилаОбмена();
Обработка.Параметры.Вставить(«Документы»,СписокДок);
Обработка.ВыполнитьВыгрузку();
КонецПроцедуры
Отбор по документам осуществляется с помощью параметра «Документы», описанного в правилах обмена.
3. Загрузка
А вот это форма для загрузки:
При загрузке отрабатывает следующий код:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаОбмена = ФайлЗагрузки;
ОбработкаОбмена.РежимОбмена = «Загрузка»;
ОбработкаОбмена.ОткрытьФайлЗагрузки(Истина);
ОбработкаОбмена.АрхивироватьФайл = Ложь;;
ОбработкаОбмена.ВыполнитьЗагрузку();
ОбработкаОбмена = Неопределено;
4. Заключение
В результате получилась предельно простая для понимания пользователей технология обмена. Теперь нас не будут ждать неожиданности вроде выгрузки данных за большой период и не будут поступать вопросы о том «Почему ничего не выгружается?» при неправильном указании отборов. Сделал и забыл. Быстро, просто, прозрачно.
Уважаемый, Олег, мне очень понравилась Ваша идея дать пользователям одну обработку для обмена данными между конфигурациями.
И сейчас пытаюсь реализовать этот подход для обмена между 1с 7.7 БП и 1с 8.2 КА.
Возникло вот такое затруднение:
Один из параметров, который надо прередать обработке, выгружающей из семерки (V77Exp.ert), — это ТаблицаНастройкиПараметров.
Подскажите, пожалуйста, какое у него должно быть значение.
Или направьте в какую сторону копать.
Полезная статья. Давать пользователям в пользование «Универсальный обмен данными в формате XML» — плохая идея. А вот в такой оболочке — самое то!
(1) Таблица настройки параметров заполняется также как обычная таблица в 7.7. У нее пять колонок: Имя, Наименование, ТипЗначения, ВидЗначения, Значение. Подробности заполнения можете найти в коде V77Exp.ert.
(3) Oleg_nsk, параметр ТаблицаНастройкиПараметров — это оказывается Список значений.
Еще пока мне не понятно, какие же значения он предназначен передавать обработке V77Exp.ert.
Но она сработала и с пустым списком.
(4) Может мы говорим о разном, но ТаблицаНастройкиПараметров в Универсальном обмене это однозначно таблица значений, а не список.
(5) Oleg_nsk, Вы правы в обработке есть ТаблицаНастройкиПараметров — это таблица.
При открытии обработки передается параметр, который также называется:
Это список, его содержимое потом заносится в таблицу:
Подскажите, как передать список документов для отбора при выгрузке.
не понятно как работает строка
Обработка.Параметры.Вставить(«Документы»,СписокДок);
(7) mixa_gr, Смотрите правила обмена. Там в глобальном обработчике «При выгрузке объекта» смотрится есть ли выгружаемый объект в массиве «Документы».
Oleg_nsk, спасибо! Выручила ваша обработка — как раз собирался делать нечто подобное, но решил сперва посмотреть на инфостарте ))
Только вот параметры передать не удалось — в самой обработке в процедуре ВыполнитьЗагрузку() все переданные мною параметры очищаются. Прописал запрос параметров в обработчике ПередВыгрузкойДанных() через функцию ВвестиЗначение().
Идея хороша, реализация не очень, не универсально
Ткни носом, будь ласка, где описать параметр Документы… 🙁
(11) beard1, Описывать его не надо. Он будет существовать после загрузки правил обмена. Надо к нему обращаться в правилах обмена в глобальном обработчике «Перед выгрузкой объекта» и там если объект не найден в переданном массиве документов, то писать «Отказ = Истина».
Спасибо! Работает. Изящьненько…
У меня первые шаги в КД. Я так понял, что глобальный обработчик правил обмена , это Конвертация_ПередВыгрузкойОбъекта, и сначала происходит отбор всех объектов по дате, а в обработчике «Перед выгрузкой объекта» накладывается фильтр по списку документов.
Другими словами, если в периоде отбора будет много документов, то может быть оптимальнее использовать метод описанный здесьhttp://www.forum.mista.ru/topic.php?id=474869 ? Или без разницы? Вопрос так, теоретический…
(13) beard1, Может быть, но построитель уходит в прошлое и у меня к нему личная неприязнь. Всё новое создается на СКД. Думаю и универсальную обработку со временем перепишут. Я недавно другую реализацию делал. Выбор периода на форме и в табличной части много видов документов и флажок у каждой строки «отдельный выбор». Пользователь может выгрузить все доки за период или установить флажок и сам накидать в список доки определенного вида которые хочет. Везде у всех потребности разные. Там как раз пришлось построитель использовать.
Спасибо! Наверное, самый красивый способ для данной задачи!
Можно ли применить такой подход для 77? Или там как-то по другому?
Мир этому дому! Прекрасный вариант реализации оболочки для пользователей, которым не надо заморачиваться выбором параметров.
(15) beard1, По 77 не скажу. Эта платформа давно подзабылась
(16) LexSeIch, Спасибо
Разобрался с 7.7. Не так красиво там получается, но работает.
Спасибо, очень полезная статья. Воспльзовался полученными знаниями в своей обработкеhttp://infostart.ru/public/177099/
Спасибо за замечательную идею =)
С выгрузкой разобрался без проблем, все работает как надо. А вот загрузка идет в управляемоем приложение, чувствую предстоит покопаться прежде чем удастся все реализовать.
Вот то что доктор прописал. Спасибо. Плюсую
Спасибо за статью. Использовал идею для своей обработки. Отличие — непосредственная выгрузка в базу-приемник, без выгрузки промежуточного файла XML и обработки для загрузки в базу-приемник. Получилась действительно простая выгрузка в три клика.http://infostart.ru/public/238944/
Спасибо, помогло решить проблему.
Спасибо за полезную информацию
(18) beard1, покажи решение, нужен код для 7.7. Хочу выгружать ночью данные из 7.7.
Тоже разобрался с синтаксисом.
В глобальном модуле, когда заходит бот написал
А в коде обработки уже написал при открытии формы этим ботом выполнить выгрузку.
Вроде обсудили, а ответ не понятен.
В обработку передается таблица настройки параметров.
Она в виде списка значений, но в коде, есть и как список значений, и как таблица.
Валится с ошибками.
Хочу передать определенный список объектов, которые нужно выгрузить..
Прошел год.. и я снова вернулся к тому же вопросу 🙂
(28) OrsoBear, спустя год, он понятнее не стал!
Внешний файл не сохранён.
Обработка универсальный обмен данными XML модуль объекта 2172: Тип не определён (СправочникСсылкаВидыНоменклатуры)
Вы будете смеяться. Но только спустя 2 года меня в полной мере достала эта тема. Потому сел, и детально разобрался. Частично воспользовался фрагментами кода.
Доработал семерочную выгрузку, чтобы можно было в нее закидывать параметры, изначально функционал беден.
С загрузкой оказалось все просто. Разве что не устраивают бесполезные сообщения с началом, окончанием загрузки, и с количеством объектов. Пользователям это ни о чем не говорит. Пришлось кидать во внешнюю обработку, и переписывать уведомления под пожелания трудящихся.
При организации обмена подобным способом возникает проблема при удалении объектов. Например из ИБ1 передали в ИБ2 некий объект, затем в ИБ1 его удалили, в итоге в ИБ2 объект остался и удален не будет, т.к. при последующих выгрузках информация о нем из ИБ1 не передается. Как вы решили эту проблему?
(31)Можешь дать обработку для 7.7 ?
(33) Увы. Базы перевел на восьмерку. Старые разработки удалил за ненадобностью.