Пример обмена данными с «1С:Предприятием»
«1С:Исполнитель» позволяет обмениваться данными с информационными базами «1С:Предприятия». Запись и чтение данных производится в формате XML, который используется в механизме обмена данными «1С:Предприятия».
Так как структура данных в «1С:Предприятии» может отличаться от структуры данных в «1С:Исполнителе», для выполнения обмена необходимо настроить правила преобразования данных.
Рассмотрим пример обмена между приложением «1С:Исполнителя» и информационной базой «1С:Предприятия», которые содержат следующие типы данных:
- Справочник «Заказы»
- Реквизиты
- Наименование:
Строка
- Покупатель:
Покупатели.Ссылка
- Стоимость:
Число
- Комментарий:
Строка
- Наименование:
- Табличные части
- ПозицииЗаказа
- Товар:
Товары.Ссылка
- Количество:
Число
- Цена:
Число
- Товар:
- ПозицииЗаказа
- Реквизиты
- Справочник «Товары»
- Реквизиты
- Код:
Строка
- Наименование:
Строка
- Категория:
Категории.Ссылка
- Код:
- Реквизиты
- Справочник «Покупатели»
- Реквизиты
- Наименование:
Строка
- Рейтинг:
Число
- Наименование:
- Реквизиты
- Справочник «Категории»
- Реквизиты
- Наименование:
Строка
- Наименование:
- Реквизиты
- Документ «Заказы»
- Реквизиты
- Наименование:
Строка
- Покупатель:
Покупатели.Ссылка
- Стоимость:
Число
- Комментарий:
Строка
- Наименование:
- Табличные части
- ПозицииЗаказа
- Номенклатура:
Номенклатура.Ссылка
- Количество:
Число
- Цена:
Число
- Номенклатура:
- ПозицииЗаказа
- Реквизиты
- Справочник «Номенклатура»
- Реквизиты
- Код:
Строка
- Наименование:
Строка
- ИмяКатегории:
Строка
- Склад:
Склады.Ссылка
- Код:
- Реквизиты
- Справочник «Покупатели»
- Реквизиты
- Наименование:
Строка
- Наименование:
- Реквизиты
- Справочник «Склады»
- Реквизиты
- Наименование:
Строка
- Наименование:
- Реквизиты
Выделим отличия между элементами проекта «1С:Исполнителя» и объектами конфигурации «1С:Предприятия». Это необходимо для дальнейшего описания правил конвертации данных между ними.
- Заказы
- Отличается вид элемента проекта: в «1С:Исполнителе» это справочник, а в «1С:Предприятии» — документ.
- Отличается имя реквизита табличной части: Товар — в «1С:Исполнителе», Номенклатура — в «1С:Предприятии».
- Товары
- Отличается имя справочника: в «1С:Предприятии» это Номенклатура.
- Отличается тип реквизита Категория: в «1С:Исполнителе» это ссылка на справочник, а в «1С:Предприятии» — строковое наименование категорий товаров.
- Реквизит Склад отсутствует в «1С:Исполнителе».
- Покупатели
- Реквизит Рейтинг отсутствует в «1С:Предприятии».
- Справочник Категории отсутствует в «1С:Предприятии».
- Справочник Склады отсутствует в «1С:Исполнителе».
Добавление элемента проекта ПланОбмена
-
Создайте элемент проекта вида ПланОбмена и задайте его имя — УдаленныеСклады.
-
Задайте элементы проекта, входящие в состав плана обмена. В данном примере регистрация изменений будет выполняться для справочников Заказы, Товары и Покупатели.
Настройка конвертации данных
Опишем взаимосвязь между данными, используя свойство плана обмена КонвертацияДанных:
-
Для свойства СхемаДанных данных укажите значение
Конфигурация1СПредприятия8
. Чтение и запись данных будет осуществляться в формате XML, используемом в механизме обмена данными «1С:Предприятия». -
В свойстве Элементы опишите правила конвертации данных. В качестве данных Слева укажите справочники, входящие в состав плана обмена (внутренние данные). Данные Справа — соответствующие им объекты конфигурации «1С:Предприятия» (внешние данные). Необходимо указывать полное имя объекта конфигурации, например: Документ.Заказы, Справочник.Номенклатура и т. д. Далее задайте правила конвертации между внутренними и внешними данными, как показано в примере ниже:
План обмена УдаленныеСкладыВидЭлемента: ПланОбмена
Ид: 5744f770-6102-424d-8335-9383c51fb08b
Имя: УдаленныеСклады
ОбластьВидимости: ВПодсистеме
КонвертацияДанных:
СхемаДанных:
ВидСхемыДанных: Конфигурация1СПредприятия8
Элементы:
-
# В текущей системе "Заказы" — это справочник,
# а во внешней системе — документ.
# Внесем изменения, чтобы автоматически заполнить
# схему данных ДокументОбъект.Заказы.
Слева: Заказы
Справа: Документ.Заказы
ТабличныеЧасти:
-
Слева: ПозицииЗаказа
Поля:
-
# Отличается имя реквизита табличной части:
# в текущей системе — "Товар",
# во внешней системе — "Номенклатура".
Слева: Товар
Справа: Номенклатура
-
Слева: Покупатели
Поля:
-
# Реквизит "Рейтинг" отсутствует во внешней системе.
# Исключим его из процесса обмена данными, иначе
# внешняя система получит информацию о поле, о котором не знает,
# и будет выброшено исключение.
Слева: Рейтинг
Действие: Игнорировать
-
# Отличается имя справочника:
# в текущей системе — "Товары",
# во внешней системе — "Номенклатура".
Слева: Товары
Справа: Справочник.Номенклатура
Поля:
-
# Отличается тип реквизита "Категория":
# в текущей системе это ссылка на справочник,
# а во внешней системе — строка.
# Логика конвертации данных реализуется в обработчиках ПослеКонвертации.
Слева: Категория
Справа: ИмяКатегории
ТипСправа: Строка
Влево:
ПослеКонвертации: ПослеКонвертацииВТовары
Вправо:
ПослеКонвертации: ПослеКонвертацииИзТовары
Реквизиты:
-
Имя: Наименование
Состав:
-
Элемент: Заказы
-
Элемент: Товары
-
Элемент: Покупатели -
Создайте модуль объекта для плана обмена и добавьте в него обработчики событий
ПослеКонвертации
. Опишите в них логику преобразования данных из справочника Товары в данные справочника Номенклатура и наоборот.УдаленныеСклады.Объектметод ПослеКонвертацииВТовары(Источник: Удале нныеСклады.СхемаДанных.СправочникОбъект.Номенклатура,
Назначение: Товары.Объект)
Назначение.Категория = Категории.НайтиПоНаименованию(Источник.ИмяКатегории)
;
метод ПослеКонвертацииИзТовары(Источник: Товары.Объект,
Назначение: УдаленныеСклады.СхемаДанных.СправочникОбъект.Номенклатура)
знч Категория = Источник.Категория?.ЗагрузитьОбъект()
если Категория != Неопределено
Назначение.ИмяКатегории = Категория.Наименование
;
;
Выполнение обмена данными
Для выгрузки и загрузки данных используйте следующие методы:
-
<ИмяПланаОбмена>.ВыгрузитьСообщение()
— полностью выгружает сообщение обмена для заданного узла.Пример полной выгрузки сообщения обменаметод ВыгрузитьСообщениеОбмена(КодУзлаПолучателя: Строка, ИмяФайла: Строка)
пер Узел = УдаленныеСклады.НайтиПоКоду(КодУзлаПолучателя)
пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
пер ЗаписьСодержимого = новый ЗаписьXml(ФайлСообщенияОбмена.ОткрытьПотокЗаписи())
УдаленныеСклады.ВыгрузитьСообщение(ЗаписьСодержимого, Узел)
; -
<ИмяПланаОбмена>.ЗагрузитьСообщение()
— полностью загружает сообщение обмена.Пример полной загрузки сообщения обменаметод ЗагрузитьСообщениеОбмена(ИмяФайла: Строка)
пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
пер ЧтениеСодержимого = новый ЧтениеXml(ФайлСообщенияОбмена.ОткрытьПотокЧтения())
УдаленныеСклады.ЗагрузитьСообщение(ЧтениеСодержимого)
; -
<ИмяПланаОбмена>.Объект.ВыгрузитьДанные()
— выгружает указанные данные в сообщение обмена. Перед записью данные конвертируются.Пример выгрузки данных в сообщение обменаметод ВыгрузитьДанныеВСообщениеОбмена(КодУзлаПолучателя: Строка, ИмяФайла: Строка)
знч Узел = УдаленныеСклады.НайтиПоКоду(КодУзлаПолучателя)
знч УдаленныйСклад = Узел.ЗагрузитьОбъект()
знч ФайлСообщенияОбмена = новый Файл(ИмяФайла)
знч ЗаписьСодержимого= новый ЗаписьXml(ФайлСообщенияОбмена.ОткрытьПотокЗаписи())
исп ОбработкаИсходящегоСообщения = УдаленныеСклады.СоздатьОбработкуИсходящегоСообщения(ЗаписьСодержимого, Узел)
// Заполнение тела сообщения.
для Данные из УдаленныеСклады.ВыбратьИзмененияВСообщение(Узел, ОбработкаИсходящегоСообщения.НомерСообщения)
// Вы можете реализовать собственную логику выгрузки данных.
// Например, для справочника "Заказы".
если Данные это Заказы.Объект
// Выгрузка данных о заказах в сообщение обмена
// (реализация метода не приведена).
// ВыгрузитьЗаказы(ЗаписьСодержимого, Данные)
иначе
// Выгрузка остальных данных в сообщение обмена с использованием логики по умолчанию.
УдаленныйСклад.ВыгрузитьДанные(ЗаписьСодержимого, Данные)
;
;
; -
<ИмяПланаОбмена>.Объект.ЗагрузитьДанные()
— загружает данные из сообщения обмена в базу данных, по одному изменению данных. Перед загрузкой данные конвертируются.Пример загрузки данных из сообщения обменаметод ЗагрузитьДанныеИзСообщенияОбмена(ИмяФайла: Строка)
пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
пер ЧтениеСодержимого = новый ЧтениеXml(ФайлСообщенияОбмена.ОткрытьПотокЧтения())
// Загрузка данных из сообщения обмена, полученного от отправителя.
исп ОбработкаВходящегоСообщения = УдаленныеСклады.СоздатьОбработкуВходящегоСообщения(ЧтениеСодержимого)
знч УдаленныйСклад = ОбработкаВходящегоСообщения.Отправитель.ЗагрузитьОбъект() как УдаленныеСклады.Объект
пока ЧтениеСодержимого.ВидУзла == ВидУзлаXml.НачалоЭлемента
// Вы можете реализовать собственную логику загрузки данных.
// Например, для справочника "Заказы".
если ЧтениеСодержимого.Имя == "DocumentObject.Заказы"
// Загрузка данных о заказах в базу
// (реализация метода не приведена).
// ЗагрузитьЗаказы(ЧтениеСодержимого)
иначе
// Загрузка остальных данных из сообщения обмена с использованием логики по умолчанию.
УдаленныйСклад.ЗагрузитьДанные(ЧтениеСодержимого)
;
;
;