Перейти к основному содержимому

Пример обмена данными с «1С:Предприятием»

«1С:Шина» позволяет обмениваться данными с информационными базами «1С:Предприятия». Запись и чтение данных производится в формате XML, который используется в механизме обмена данными «1С:Предприятия».

Так как структура данных в «1С:Предприятии» может отличаться от структуры данных в «1С:Шине», для выполнения обмена необходимо настроить правила преобразования данных.

Рассмотрим пример обмена между приложением «1С:Шины» и информационной базой «1С:Предприятия», которые содержат следующие типы данных:

Проект «1С:Предприятие.Элемента»
  • Справочник «Заказы»
    • Реквизиты
      • Наименование: Строка
      • Покупатель: Покупатели.Ссылка
      • Стоимость: Число
      • Комментарий: Строка
    • Табличные части
      • ПозицииЗаказа
        • Товар: Товары.Ссылка
        • Количество: Число
        • Цена: Число
  • Справочник «Товары»
    • Реквизиты
      • Код: Строка
      • Наименование: Строка
      • Категория: Категории.Ссылка
  • Справочник «Покупатели»
    • Реквизиты
      • Наименование: Строка
      • Рейтинг: Число
  • Справочник «Категории»
    • Реквизиты
      • Наименование: Строка
Конфигурация «1С:Предприятия»
  • Документ «Заказы»
    • Реквизиты
      • Наименование: Строка
      • Покупатель: Покупатели.Ссылка
      • Стоимость: Число
      • Комментарий: Строка
    • Табличные части
      • ПозицииЗаказа
        • Номенклатура: Номенклатура.Ссылка
        • Количество: Число
        • Цена: Число
  • Справочник «Номенклатура»
    • Реквизиты
      • Код: Строка
      • Наименование: Строка
      • ИмяКатегории: Строка
      • Склад: Склады.Ссылка
  • Справочник «Покупатели»
    • Реквизиты
      • Наименование: Строка
  • Справочник «Склады»
    • Реквизиты
      • Наименование: Строка

Выделим отличия между элементами проекта «1С:Шины» и объектами конфигурации «1С:Предприятия». Это необходимо для дальнейшего описания правил конвертации данных между ними.

  1. Заказы
    • Отличается вид элемента проекта: в «1С:Шине» это справочник, а в «1С:Предприятии» — документ.
    • Отличается имя реквизита табличной части: Товар — в «1С:Шине», Номенклатура — в «1С:Предприятии».
  2. Товары
    • Отличается имя справочника: в «1С:Предприятии» это Номенклатура.
    • Отличается тип реквизита Категория: в «1С:Шине» это ссылка на справочник, а в «1С:Предприятии» — строковое наименование категорий товаров.
    • Реквизит Склад отсутствует в «1С:Шине».
  3. Покупатели
    • Реквизит Рейтинг отсутствует в «1С:Предприятии».
  4. Справочник Категории отсутствует в «1С:Предприятии».
  5. Справочник Склады отсутствует в «1С:Шине».

Добавление элемента проекта ПланОбмена

  1. Создайте элемент проекта вида ПланОбмена и задайте его имя — УдаленныеСклады.

  2. Задайте элементы проекта, входящие в состав плана обмена. В данном примере регистрация изменений будет выполняться для справочников Заказы, Товары и Покупатели.

    Состав плана обмена

Настройка конвертации данных

Опишем взаимосвязь между данными, используя свойство плана обмена КонвертацияДанных:

  1. Для свойства СхемаДанных данных укажите значение Конфигурация1СПредприятия8. Чтение и запись данных будет осуществляться в формате XML, используемом в механизме обмена данными «1С:Предприятия».

  2. В свойстве Элементы опишите правила конвертации данных. В качестве данных Слева укажите справочники, входящие в состав плана обмена (внутренние данные). Данные Справа — соответствующие им объекты конфигурации «1С:Предприятия» (внешние данные). Необходимо указывать полное имя объекта конфигурации, например: Документ.Заказы, Справочник.Номенклатура и т. д. Далее задайте правила конвертации между внутренними и внешними данными, как показано в примере ниже:

    План обмена УдаленныеСклады
    ВидЭлемента: ПланОбмена
    Ид: 5744f770-6102-424d-8335-9383c51fb08b
    Имя: УдаленныеСклады
    ОбластьВидимости: ВПодсистеме
    КонвертацияДанных:
    СхемаДанных:
    ВидСхемыДанных: Конфигурация1СПредприятия8
    Элементы:
    -
    # В текущей системе "Заказы" — это справочник,
    # а во внешней системе — документ.
    # Внесем изменения, чтобы автоматически заполнить
    # схему данных ДокументОбъект.Заказы.
    Слева: Заказы
    Справа: Документ.Заказы
    ТабличныеЧасти:
    -
    Слева: ПозицииЗаказа
    Поля:
    -
    # Отличается имя реквизита табличной части:
    # в текущей системе — "Товар",
    # во внешней системе — "Номенклатура".
    Слева: Товар
    Справа: Номенклатура
    -
    Слева: Покупатели
    Поля:
    -
    # Реквизит "Рейтинг" отсутствует во внешней системе.
    # Исключим его из процесса обмена данными, иначе
    # внешняя система получит информацию о поле, о котором не знает,
    # и будет выброшено исключение.
    Слева: Рейтинг
    Действие: Игнорировать
    -
    # Отличается имя справочника:
    # в текущей системе — "Товары",
    # во внешней системе — "Номенклатура".
    Слева: Товары
    Справа: Справочник.Номенклатура
    Поля:
    -
    # Отличается тип реквизита "Категория":
    # в текущей системе это ссылка на справочник,
    # а во внешней системе — строка.
    # Логика конвертации данных реализуется в обработчиках ПослеКонвертации.
    Слева: Категория
    Справа: ИмяКатегории
    ТипСправа: Строка
    Влево:
    ПослеКонвертации: ПослеКонвертацииВТовары
    Вправо:
    ПослеКонвертации: ПослеКонвертацииИзТовары
    Реквизиты:
    -
    Имя: Наименование
    Состав:
    -
    Элемент: Заказы
    -
    Элемент: Товары
    -
    Элемент: Покупатели
  3. Создайте модуль объекта для плана обмена и добавьте в него обработчики событий ПослеКонвертации. Опишите в них логику преобразования данных из справочника Товары в данные справочника Номенклатура и наоборот.

    УдаленныеСклады.Объект
    метод ПослеКонвертацииВТовары(Источник: УдаленныеСклады.СхемаДанных.СправочникОбъект.Номенклатура, 
    Назначение: Товары.Объект)
    Назначение.Категория = Категории.НайтиПоНаименованию(Источник.ИмяКатегории)
    ;


    метод ПослеКонвертацииИзТовары(Источник: Товары.Объект,
    Назначение: УдаленныеСклады.СхемаДанных.СправочникОбъект.Номенклатура)
    знч Категория = Источник.Категория?.ЗагрузитьОбъект()
    если Категория != Неопределено
    Назначение.ИмяКатегории = Категория.Наименование
    ;
    ;

Выполнение обмена данными

Для выгрузки и загрузки данных используйте следующие методы:

  • <ИмяПланаОбмена>.ВыгрузитьСообщение() — полностью выгружает сообщение обмена для заданного узла.

    Пример полной выгрузки сообщения обмена
    метод ВыгрузитьСообщениеОбмена(КодУзлаПолучателя: Строка, ИмяФайла: Строка)
    пер Узел = УдаленныеСклады.НайтиПоКоду(КодУзлаПолучателя)
    пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
    пер ЗаписьСодержимого = новый ЗаписьXml(ФайлСообщенияОбмена.ОткрытьПотокЗаписи())
    УдаленныеСклады.ВыгрузитьСообщение(ЗаписьСодержимого, Узел)
    ;
  • <ИмяПланаОбмена>.ЗагрузитьСообщение() — полностью загружает сообщение обмена.

    Пример полной загрузки сообщения обмена
    метод ЗагрузитьСообщениеОбмена(ИмяФайла: Строка)
    пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
    пер ЧтениеСодержимого = новый ЧтениеXml(ФайлСообщенияОбмена.ОткрытьПотокЧтения())
    УдаленныеСклады.ЗагрузитьСообщение(ЧтениеСодержимого)
    ;
  • <ИмяПланаОбмена>.Объект.ВыгрузитьДанные() — выгружает указанные данные в сообщение обмена. Перед записью данные конвертируются.

    Пример выгрузки данных в сообщение обмена
    метод ВыгрузитьДанныеВСообщениеОбмена(КодУзлаПолучателя: Строка, ИмяФайла: Строка)
    знч Узел = УдаленныеСклады.НайтиПоКоду(КодУзлаПолучателя)
    знч УдаленныйСклад = Узел.ЗагрузитьОбъект()
    знч ФайлСообщенияОбмена = новый Файл(ИмяФайла)
    знч ЗаписьСодержимого= новый ЗаписьXml(ФайлСообщенияОбмена.ОткрытьПотокЗаписи())
    исп ОбработкаИсходящегоСообщения = УдаленныеСклады.СоздатьОбработкуИсходящегоСообщения(ЗаписьСодержимого, Узел)

    // Заполнение тела сообщения.
    для Данные из УдаленныеСклады.ВыбратьИзмененияВСообщение(Узел, ОбработкаИсходящегоСообщения.НомерСообщения)
    // Вы можете реализовать собственную логику выгрузки данных.
    // Например, для справочника "Заказы".
    если Данные это Заказы.Объект
    // Выгрузка данных о заказах в сообщение обмена
    // (реализация метода не приведена).
    // ВыгрузитьЗаказы(ЗаписьСодержимого, Данные)
    иначе
    // Выгрузка остальных данных в сообщение обмена с использованием логики по умолчанию.
    УдаленныйСклад.ВыгрузитьДанные(ЗаписьСодержимого, Данные)
    ;
    ;
    ;
  • <ИмяПланаОбмена>.Объект.ЗагрузитьДанные() — загружает данные из сообщения обмена в базу данных, по одному изменению данных. Перед загрузкой данные конвертируются.

    Пример загрузки данных из сообщения обмена
    метод ЗагрузитьДанныеИзСообщенияОбмена(ИмяФайла: Строка)
    пер ФайлСообщенияОбмена = новый Файл(ИмяФайла)
    пер ЧтениеСодержимого = новый ЧтениеXml(ФайлСообщенияОбмена.ОткрытьПотокЧтения())
    // Загрузка данных из сообщения обмена, полученного от отправителя.
    исп ОбработкаВходящегоСообщения = УдаленныеСклады.СоздатьОбработкуВходящегоСообщения(ЧтениеСодержимого)
    знч УдаленныйСклад = ОбработкаВходящегоСообщения.Отправитель.ЗагрузитьОбъект() как УдаленныеСклады.Объект
    пока ЧтениеСодержимого.ВидУзла == ВидУзлаXml.НачалоЭлемента
    // Вы можете реализовать собственную логику загрузки данных.
    // Например, для справочника "Заказы".
    если ЧтениеСодержимого.Имя == "DocumentObject.Заказы"
    // Загрузка данных о заказах в базу
    // (реализация метода не приведена).
    // ЗагрузитьЗаказы(ЧтениеСодержимого)
    иначе
    // Загрузка остальных данных из сообщения обмена с использованием логики по умолчанию.
    УдаленныйСклад.ЗагрузитьДанные(ЧтениеСодержимого)
    ;
    ;
    ;