Прозрачная интеграция 1С8.2 с 1С7.7 (Внешние источники, OLE)










Прозрачная интеграция 1С8.2 с 1С7.7 через внешние источники и OLE. Данные из 1С7.7 читаем посредством внешних источников, изменения данных передаем в 1С7.7 по OLE путем отправки xml.

Данную методику интеграции 1С82 с 1С77 пришлось разрабатывать при плановом переходе с самописной конфигурации на 1С77 в конфигурацию 1С82 УПП. Т.к. предприятие не маленькое, есть удаленные филиалы, то скачкообразный переход не то что не возможен, но скажем так – довольно затруднительно. Так еще и в самописной конфигурации на 1С77 много вещей, которых просто нет в 1С82 УПП. Переводить предприятие решили отделами. В данной ситуации необходимо параллельно работать в двух учетных системах и работать не такой уж короткий срок. Необходимо было обеспечить методику однократного ввода информации, но так что бы данная информация в realtime отображалась в двух учетных системах (1С82 и 1С77). Можно было пойти простым путем, т.е. путем написания обработок по миграции данных, но это уже не realtime и лишние телодвижения либо со стороны пользователя, либо со стороны системных администраторов.
Всю задачу разбиваем на этапы:
1. Получение данных из 1С77 через внешние источники (см. публикацию //infostart.ru/public/170534/)
2. Возможность редактирования данных из 1С77 в среде 1С82
3. Подключение к 1С77 из 1с82 через OLE с сохранением подключения между вызовами сервера
4. Отправка измененных данных в 1С77 и их сохранение

 

Возможность редактирования данных из 1С77 в 1С82

Данную возможность буду рассматривать все так же на примере справочника «Клиенты». Что у нас получилось после подключения справочника «Клиенты» и создания формы списка (Рис. 1).

Рис. 1

 

Но есть особенность, если мы произведем выбор элемента (двойным щелчком или Enter), то форма элемента справочника не откроется, а мы войдем в режим редактирования (рис. 2).

Рис. 2

Для того что бы можно было открыть форму элемента необходимо немного изменить код из публикации //infostart.ru/public/170534/.

 

  • ОбщиеМодули.ОбщийМодульСправочники77
  • Ищем процедуру «ДобавитьДерево(пФорма, пСтруктураОтображенияДерева, пСтруктураДействий) Экспорт»
  • Ранее в цикле создания элементов для каждой колонки мы создавали элемент «ПолеВвода», а теперь нам надо «ПолеНадписи», что бы можно было перехватить процедуру «Выбор».
  • Поэтому меняем «НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;» на «НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;»

 

Следующий шаг – перехватить процедуру выбор у формы списка внешнего источника данных «Справочник_Клиенты». Открываем форму списка внешнего источника данных «Справочник_Клиенты» и меняем

 

СТАРУЮ ВЕРСИЮ

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            СтруктураОтображенияДерева = Новый Структура;

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

            СтруктураОтображенияДерева.Вставить(«Отображение»,ОтображениеТаблицы.ИерархическийСписок);

            СтруктураОтображенияДерева.Вставить(«КартинкаСтрок»,БиблиотекаКартинок.ГруппаИЭлемент);

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

           

            СтруктураДействий = Новый Структура;

            СтруктураДействий.Вставить(«ПриСменеТекущегоРодителя»,»ЭлементДеревоПриСменеТекущегоРодителя»);

           

            ОбщийМодульСправочники77.ДобавитьДерево(ЭтаФорма, СтруктураОтображенияДерева, СтруктураДействий);

КонецПроцедуры

 

НА НОВУЮ

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            СтруктураОтображенияДерева = Новый Структура;

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

            СтруктураОтображенияДерева.Вставить(«Отображение»,ОтображениеТаблицы.ИерархическийСписок);

            СтруктураОтображенияДерева.Вставить(«КартинкаСтрок»,БиблиотекаКартинок.ГруппаИЭлемент);

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

           

            СтруктураДействий = Новый Структура;

            СтруктураДействий.Вставить(«ПриСменеТекущегоРодителя»,»ЭлементДеревоПриСменеТекущегоРодителя»);

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

           

            ОбщийМодульСправочники77.ДобавитьДерево(ЭтаФорма, СтруктураОтображенияДерева, СтруктураДействий);

КонецПроцедуры

 

Так же в код формы списка добавляем процедуру обработки выбора

 

&НаКлиенте

Процедура ЭлементДеревоВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

            Параметр = Новый Структура(«Ключ», Элемент.ТекущиеДанные.Элемент);

            Форма = ПолучитьФорму(«ВнешнийИсточникДанных.Торговля_77.Таблица.Справочник_Клиенты.ФормаОбъекта»,Параметр);

            Форма.Открыть();

            СтандартнаяОбработка = Ложь;

КонецПроцедуры

 

После вышеприведенных манипуляций после выбора элемента в форме списка открывается автоматически сгенерированная форма для элемента внешнего источника «Справочники_Клиенты» (Рис. 3)

Рис. 3

У данной формы несколько недостатков. Отсутствует кнопка записи объекта и это объяснимо – это же форма элемента внешнего источника данных. Так же все реквизиты, как простых типов, так и ссылочных, закрыты для изменения. Будем конструировать форму сами. Создаем форму объекта, удаляем все автоматически сгенерированные реквизиты с формы и отключаем стандартную командную панель (Рис. 4).

Рис. 4

Для того что бы можно было редактировать данные элемента необходимо добавить реквизиты формы и связать их изменения с реквизитами объекта. Добавляем реквизиты формы. Для реквизитов ссылочного типа оставляем только кнопки выбора и очистки (Рис. 5).

Рис. 5

Но при открытии данной формы из списка элементов – данных нет. Поэтому добавляем для формы элемента процедуру «ПриСозданииНаСервере»:

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            ЭтаФорма.РеквИНН = СокрЛП(Объект.ИНН);

            ЭтаФорма.РеквНаименование = СокрЛП(Объект.Наименование);

            Если Объект.Регион.ID <> »         » Тогда

                        ЭтаФорма.РеквРегион = Объект.Регион;

            КонецЕсли;

            Если Объект.ПочтРегион.ID <> »         » Тогда

                        ЭтаФорма.РеквПочтРегион = Объект.ПочтРегион;

            КонецЕсли;

            Если Объект.ЮрРегион.ID <> »         » Тогда

                        ЭтаФорма.РеквЮрРегион = Объект.ЮрРегион;

            КонецЕсли;

КонецПроцедуры

 

Что у нас получилось при открытии элемента (Рис. 6)

Рис. 6

Но теперь, если мы записывали данные, то заметили бы, что значения реквизитов объекта не равны значениям реквизитам формы. Поэтому для реквизитов формы простых типов мы добавляем процедуры «ПриИзменении», а для реквизитов формы ссылочных типов мы добавляем процедуры «ОбработкаВыбора».

 

&НаКлиенте

Процедура РеквИННПриИзменении(Элемент)

            Объект.ИНН = Элемент.ТекстРедактирования;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквНаименованиеПриИзменении(Элемент)

            Объект.Наименование = Элемент.ТекстРедактирования;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквРегионОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

            Объект.Регион = ВыбранноеЗначение;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквЮрРегионОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

            Объект.ЮрРегион = ВыбранноеЗначение;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквПочтРегионОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

            Объект.ПочтРегион = ВыбранноеЗначение;

КонецПроцедуры

 

Так же для реквизитов ссылочного типа необходимо добавить процедуры «Очистка»

 

&НаКлиенте

Процедура РеквРегионОчистка(Элемент, СтандартнаяОбработка)

            Объект.Регион = Неопределено;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквЮрРегионОчистка(Элемент, СтандартнаяОбработка)

            Объект.ЮрРегион = Неопределено;

КонецПроцедуры

 

&НаКлиенте

Процедура РеквПочтРегионОчистка(Элемент, СтандартнаяОбработка)

            Объект.ПочтРегион = Неопределено;

КонецПроцедуры

 

Теперь форма элемента функционирует как надо. Открывается из списка элементов, отображает данные из 1С77 и позволяет их редактировать. Теперь осталось добавить команды записи. Но перед тем как добавлять команды записи, необходимо решить по какой технологии мы будем отправлять данные в 1С77. Я выбрал следующую схему. Работать с 1С77 мы будем через OLE, данные в 1С77 будем отправлять путем передачи xml-пакета OLE объекту, а OLE объект будет обрабатывать xml-данные внешней обработкой, которую положим в каталог базы данных 1С77.

Данная схема имеет следующие преимущества: распараллеливание работ по разработке между 1С8.2 и 1С7.7. Имея шаблон xml-данных параллельно можно дорабатывать 8.2 для отправки данных, а так же можно вести разработку в 1С7.7 по обработке полученных данных. Т.к. база 1С77 распределенная и имеется большое количество филиалов, то код в 1С77 по обработке полученных данных решено было вынести во внешнюю обработку, тем самым мы себя защитим от непредвиденных смен конфигураций при возникновении ошибок при обработке xml-пакета.

Но есть у данной схемы большой минус — состояние OLE объекта при вызовах серверных процедур не сохраняется. Поэтому предварительно нам необходимо научиться подключать 1С77 через OLE и сохранять данное подключение. Сохранять подключение будем во временном хранилище.

Подключение к 1С77 из 1с82 через OLE с сохранением подключения между вызовами сервера

 

Для подключения к 1С77 через OLE введем следующие параметры сеанса:

  • Connector1C77 (Уникальный идентификатор) – уникальный идентификатор коннектора к 77, нужен будет при помещении OLE объекта во временное хранилище
  • АдресConnector1C77 (Строка(0), переменная) – адрес OLE объекта во временном хранилище
  • Пользователь77 (Строка(0), переменная) – пользователь 1С77, под которым будет происходить авторизация
  • Пароль77 (Строка(0), переменная) – пароль пользователя 1С77
  • Путь77 (Строка(0), переменная) – путь к базе 1С77

 

 

Открываем модуль сеанса и добавляем следующую процедуру (заменяем звездочки на свои параметры J)

 

Процедура УстановкаПараметровСеанса()

               ПараметрыСеанса.Connector1C77 = Новый УникальныйИдентификатор();

               ПараметрыСеанса.АдресConnector1C77 = «»;

               ПараметрыСеанса.Пользователь77 = «***»;

               ПараметрыСеанса.Пароль77 = «***»;

               ПараметрыСеанса.Путь77 = «\******»;

КонецПроцедуры

 

Далее добавляем новый общий модуль «ОбщийМодульОЛЕ77» с параметрами: Клиент(управляемое приложение), Сервер, Вызов сервера.

 

В данный модуль добавляем три функции:

  • Подключить77() – осуществляет подключение к 1С77 через OLE
  • ЕстьПодключение() – осуществляет проверку наличие подключения
  • ОтправитьДанные(пДанные) – отправляет xml-данные в 1С77

 

Код данных функций смотрим ниже

 

&НаСервере

Функция Подключить77() Экспорт

Если ЭтоАдресВременногоХранилища(ПараметрыСеанса.АдресConnector1C77) Тогда

                        БазаОле = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресConnector1C77);

            КонецЕсли;

           

            Если БазаОле = Неопределено Тогда

                        БазаОле = Новый COMОбъект(«V77s.Application»);

                        СтрокаПодключения = «/D»»»+ПараметрыСеанса.Путь77+»»» /N»»»+ПараметрыСеанса.Пользователь77+»»» /P»»»+ПараметрыСеанса.Пароль77+»»»»;

                        Connection = БазаОле.Initialize(БазаОле.RMTrade , СтрокаПодключения,»NO_SPLASH_SHOW»);

                        Если Connection Тогда

                                   ПараметрыСеанса.АдресConnector1C77 = ПоместитьВоВременноеХранилище(БазаОле, ПараметрыСеанса.Connector1C77);

                        КонецЕсли;

            КонецЕсли;

КонецФункции

 

&НаСервере

Функция ЕстьПодключение() Экспорт

            Подключение = Ложь;

            Если ЭтоАдресВременногоХранилища(ПараметрыСеанса.АдресConnector1C77) Тогда

                        БазаОле = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресConnector1C77);

            КонецЕсли;

           

            Если БазаОле <> Неопределено Тогда

                        Подключение = Истина;

            КонецЕсли;

           

            Возврат Подключение;

КонецФункции

 

&НаСервере

Функция ОтправитьДанные(пДанные) Экспорт

            Если ЕстьПодключение() = Ложь Тогда

                        Возврат Ложь;

            КонецЕсли;

           

            БазаОле = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресConnector1C77);

            Путь = БазаОле.КаталогИБ()+»ExtFormsConnector1C82.ert»;

            Результат = пДанные;

            БазаОле.ОткрытьФормуМодально(«Отчет»,Результат,Путь);

           

            Возврат Результат;

КонецФункции

 

 

Для того что бы данные нормально обрабатывались в 1С77 необходимо в каталог базы в ExtForms положить обработку «Connector1C82.ert». Об этой обработке поговорим чуть позже.

 

Отправка измененных данных в 1С77 и их сохранение

 

Отправлять данные будем путем формирования xml-пакета и передачи его OLE объекту 1С77.

 

Для этого идем в модуль формы объекта внешнего источника данных «Справочник_Клиенты» и добавляем следующую функцию

 

&НаСервере

Функция СформироватьХМЛ()

   ХМЛ = Новый ЗаписьXML;

   ХМЛ.УстановитьСтроку(«UTF-8»);

   ХМЛ.ЗаписатьОбъявлениеXML();

   ХМЛ.ЗаписатьНачалоЭлемента(«ОТ_1С82»);

               ХМЛ.ЗаписатьНачалоЭлемента(«Справочники»);

                          ХМЛ.ЗаписатьНачалоЭлемента(«Клиенты»);

                                      ХМЛ.ЗаписатьНачалоЭлемента(«Элемент»);

                                                  ХМЛ.ЗаписатьАтрибут(«ID», Объект.ID);

                                                  Если СокрЛП(Объект.ИНН) <> «» Тогда

                                                              ХМЛ.ЗаписатьАтрибут(«Код», СокрЛП(Объект.ИНН));

                                                  КонецЕсли;

                                                  Если СокрЛП(Объект.Наименование) <> «» Тогда

                                                              ХМЛ.ЗаписатьАтрибут(«Наименование», СокрЛП(Объект.Наименование));

                                                  КонецЕсли;

                                                  Если СокрЛП(Объект.Регион.ID) <> «» Тогда

                                                              ХМЛ.ЗаписатьАтрибут(«Регион», Объект.Регион.ID);

                                                  КонецЕсли;

                                                  Если СокрЛП(Объект.ЮрРегион.ID) <> «» Тогда

                                                              ХМЛ.ЗаписатьАтрибут(«ЮрАдрес_Регион», Объект.ЮрРегион.ID);

                                                  КонецЕсли;

                                                  Если СокрЛП(Объект.ПочтРегион.ID) <> «» Тогда

                                                              ХМЛ.ЗаписатьАтрибут(«ПочтАдр_Регион», Объект.ПочтРегион.ID);

                                                  КонецЕсли;

                                      ХМЛ.ЗаписатьКонецЭлемента();

                          ХМЛ.ЗаписатьКонецЭлемента();

               ХМЛ.ЗаписатьКонецЭлемента();

   ХМЛ.ЗаписатьКонецЭлемента();

   Результат = ХМЛ.Закрыть();

  

   Возврат Результат;

КонецФункции

 

Следующий шаг – добавить на форму элемента команды записи и подключения к 1С77.

 

Добавляем команды формы: «ЗаписатьЗакрыть», «ЗаписатьМоя», «Подключить77» (Рис. 7)

Рис. 7

Добавляем программный код выполнения команд:

 

&НаСервере

Функция ЗаписатьНаСервере()

   Результат = СформироватьХМЛ();

   Возврат ОбщийМодульОЛЕ77.ОтправитьДанные(Результат);

КонецФункции

 

&НаКлиенте

Процедура ЗаписатьЗакрыть(Команда)

   ЗаписатьНаСервере();

КонецПроцедуры

 

&НаКлиенте

Процедура ЗаписатьМоя(Команда)

   Результат = ЗаписатьНаСервере();

   Сообщить(Результат);

КонецПроцедуры

 

&НаСервере

Процедура Подключить77_НаСервере()

   Если (НЕ ОбщийМодульОЛЕ77.ЕстьПодключение()) Тогда

               ОбщийМодульОЛЕ77.Подключить77();

   КонецЕсли;

  

   Если ОбщийМодульОЛЕ77.ЕстьПодключение() Тогда

               ЭтаФорма.Элементы.Подключить77.Заголовок = «Есть подключение»;

               ЭтаФорма.Элементы.ЗаписатьЗакрыть.Доступность = Истина;

               ЭтаФорма.Элементы.ЗаписатьМоя.Доступность = Истина;

   Иначе

               Сообщить(«Не удалось подключиться к 1С77»);

   КонецЕсли;

КонецПроцедуры

&НаКлиенте

Процедура Подключить77(Команда)

   Подключить77_НаСервере();

КонецПроцедуры

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

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   ЭтаФорма.РеквИНН = СокрЛП(Объект.ИНН);

   ЭтаФорма.РеквНаименование = СокрЛП(Объект.Наименование);

   Если Объект.Регион.ID <> »         » Тогда

               ЭтаФорма.РеквРегион = Объект.Регион;

   КонецЕсли;

   Если Объект.ПочтРегион.ID <> »         » Тогда

               ЭтаФорма.РеквПочтРегион = Объект.ПочтРегион;

   КонецЕсли;

   Если Объект.ЮрРегион.ID <> »         » Тогда

               ЭтаФорма.РеквЮрРегион = Объект.ЮрРегион;

   КонецЕсли;

  

   Если ОбщийМодульОЛЕ77.ЕстьПодключение() Тогда

               ЭтаФорма.Элементы.Подключить77.Заголовок = «Есть подключение»;

   Иначе

               ЭтаФорма.Элементы.ЗаписатьЗакрыть.Доступность = Ложь;

               ЭтаФорма.Элементы.ЗаписатьМоя.Доступность = Ложь;

   КонецЕсли;

КонецПроцедуры

 

 

Теперь для проверки корректности работы всего механизма обмена мы создадим внешнюю обработку на 1С77. Напоминаю, что данную обработку необходимо положить в каталог базы 77 ExtForms, т.к. эту обработку мы открываем следующим кодом:

 

&НаСервере

Функция ОтправитьДанные(пДанные) Экспорт

            Если ЕстьПодключение() = Ложь Тогда

                        Возврат Ложь;

            КонецЕсли;

           

            БазаОле = ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресConnector1C77);

            Путь = БазаОле.КаталогИБ()+»ExtFormsConnector1C82.ert»;

            Результат = пДанные;

            БазаОле.ОткрытьФормуМодально(«Отчет»,Результат,Путь);

           

            Возврат Результат;

КонецФункции

 

 Для начала она будет возвращать обратно тот же параметр, что и получит. Ниже код обработки.

 

Процедура ПриОткрытии()

   Если ПустоеЗначение(Форма.Параметр) = 0 Тогда

               ХМЛ = Форма.Параметр;

               Форма.Параметр = «»;

               Форма.Параметр = ХМЛ;

               СтатусВозврата(0);

   КонецЕсли;

КонецПроцедуры

 

При подключении к 1С77 будет довольно длительная и неприятная задержка. Но затем обработка xml данных будет проводиться практически с той же длительностью, если бы вы работали напрямую в 1С77. (Рис. 8).

Рис. 8

Как мы видим, все прекрасно работает. Теперь доработаем обработку в 1С77 для записи изменений, переданных из 1с82 xml-пакетом. Т.к. конфигурация в 1С77 практически полностью переделана под функционал 1cpp.dll, то как же без нее… Разборку xml-пакета выполняем с помощью v7plus.dll. Код обработки 1С77 ниже. Переменная фХМЛ – многострочное окно текста на форме. Для удобства отладки.

 

Перем мМД;

 

Функция ОбъектПоИД(пИД, пВид)

   лЭлемент = мМД.ЗначениеИзСтрокиБД(пВид, пИД);

   Если ТипЗначенияСтр(лЭлемент) = «Справочник» Тогда

               лОбъект = СоздатьОбъект(пВид);

               лОбъект.НайтиЭлемент(лЭлемент);

   КонецЕсли;

  

   Возврат лОбъект.ТекущийЭлемент();

КонецФункции

 

Функция ОбработатьОТ_1С82СправочникКлиенты(пДанные)

   лВозврат = «Элемент записан…»;

  

   Попытка

               лСпрКлиенты = СоздатьОбъект(«Справочник.Клиенты»);

              

               Для ТекСтр = 1 По пДанные.КоличествоПодчиненных() Цикл

                          ТекУзел = пДанные.ПолучитьПодчиненныйПоНомеру(ТекСтр);

                          лИД = ТекУзел.ПолучитьАтрибут(«ID»);

                          лКод = ТекУзел.ПолучитьАтрибут(«Код»);

                          лНаименование = ТекУзел.ПолучитьАтрибут(«Наименование»);

                          лРегион = ОбъектПоИД(ТекУзел.ПолучитьАтрибут(«Регион»), «Справочник.Регионы»);

                          лЮрРегион = ОбъектПоИД(ТекУзел.ПолучитьАтрибут(«ЮрАдрес_Регион»), «Справочник.Регионы»);

                          лПочтРегион = ОбъектПоИД(ТекУзел.ПолучитьАтрибут(«ПочтАдр_Регион»), «Справочник.Регионы»);

                         

                          лЭлемент = ОбъектПоИД(лИД, «Справочник.Клиенты»);

                          лСпрКлиенты.НайтиЭлемент(лЭлемент);

                          лСпрКлиенты.Код = лКод;

                          лСпрКлиенты.Наименование = лНаименование;

                          лСпрКлиенты.СНАЗВ = лНаименование;

                          лСпрКлиенты.Регион = лРегион;

                          лСпрКлиенты.ЮрАдрес_Регион = лЮрРегион;

                          лСпрКлиенты.ПочтАдр_Регион = лПочтРегион;

                          лСпрКлиенты.Записать();

               КонецЦикла;

   Исключение

               лВозврат = ОписаниеОшибки();

   КонецПопытки;

  

   Возврат лВозврат;

КонецФункции

 

Функция ОбработатьОТ_1С82Справочники(пДанные)

   лВозврат = «»;

   Для ТекСтр = 1 По пДанные.КоличествоПодчиненных() Цикл

               ТекУзел = пДанные.ПолучитьПодчиненныйПоНомеру(ТекСтр);

               Если ТекУзел.Наименование = «Клиенты» Тогда

                          лВозврат = ОбработатьОТ_1С82СправочникКлиенты(ТекУзел);

               КонецЕсли;

   КонецЦикла;

  

   Возврат лВозврат;

КонецФункции

 

Функция ОбработатьОТ_1С82(пДанные)

   лВозврат = «»;

   Для ТекСтр = 1 По пДанные.КоличествоПодчиненных() Цикл

               ТекУзел = пДанные.ПолучитьПодчиненныйПоНомеру(ТекСтр);

               Если ТекУзел.Наименование = «Справочники» Тогда

                          лВозврат = ОбработатьОТ_1С82Справочники(ТекУзел);

               КонецЕсли;

   КонецЦикла;

  

   Возврат лВозврат;

КонецФункции

 

 

Функция Сформировать()

   лВозврат = «»;

   Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы()+»v7plus.dll»)<>1 Тогда

               Возврат(«Error: Не удалось загрузить внешнюю компоненту v7plus.dll!»);        

   КонецЕсли;

  

   ХМЛАнализатор                        =          СоздатьОбъект(«AddIn.XMLParser»);

   ВерсияАнализатора      =          ХМЛАнализатор.ВерсияАнализатора;

   Если ВерсияАнализатора <> «2.0» Тогда 

               Возврат(«Error: ХМЛ Анализатор не той версии»);

   КонецЕсли;

 

   ХМЛ_ДОМ         = ХМЛАнализатор.СоздатьДокумент();

   ХМЛ_ДОМ.Кодировка=»UTF-8″;

   ХМЛ_ДОМ.ЗагрузитьИзСтроки(фХМЛ);

   Источники = ХМЛ_ДОМ.ВыбратьУзлы(«ОТ_1С82»);

   Для ТекНом = 0 По Источники.КоличествоУзлов() — 1 Цикл

               ТекИсточник = Источники.ПолучитьУзел(ТекНом);

              

               Если ТекИсточник.Наименование = «ОТ_1С82» Тогда

                          лВозврат = ОбработатьОТ_1С82(ТекИсточник);

               КонецЕсли;

   КонецЦикла;

  

   Возврат лВозврат;

КонецФункции

 

Процедура ПриОткрытии()

   Если ПустоеЗначение(Форма.Параметр) = 0 Тогда

               фХМЛ = Форма.Параметр;

               лВозврат = Сформировать();

               Форма.Параметр = лВозврат;

               СтатусВозврата(0);

   КонецЕсли;

КонецПроцедуры

 

мМД = СоздатьОбъект(«MetaDataWork»);

 

 

Данной методикой можно не только корректировать данные 1с77, полученные через внешние источники, но и подписавшись на события документов и справочников 1с82 в режиме realtime работать в двух учетных системах. Пользователь даже не заметит этого.

16 Comments

  1. Rothschild

    А зачем через глюкастые «ВнешниеИсточникиДанных» ?

    Почему не напрямую через ADO ???

    ***

    Если ничего не изменилось, «ВнешниеИсточникиДанных» работают только через интерфейс ODBC.

    А через ADO можно использовать и более современный OLEDB.

    Reply
  2. Rothschild

    (1)

    плюс — за прямой доступ к базе 1С, хоть и 7.7

    😉

    Reply
  3. Rothschild

    (0)

    что за танк у тебя на фотке?

    в «танчики» режешься в инете???

    Reply
  4. sdf1979

    Внешние источники не «глюкастые», а даже очень ничего, а уж в 8.3 вообще отлично

    Reply
  5. Rothschild

    (4) ну дело вкуса…

    а что там «отличного» появилось в 8.3 ???

    1. через OLEDB «ВнешниеИсточникиДанных» заработали?

    2. а операции записи ими поддерживаются??

    Reply
  6. Serj1C

    (5) Rothschild, Запись будет поддерживаться, говорили на партнерском семинаре

    Reply
  7. MRAK

    Плюсую, большая работа!

    Reply
  8. Nuuq

    (3) Rothschild, это не танк, а ПТ-САУ !!! 😉

    Reply
  9. Fenicss

    А как со скоростью работы? Просто я сталкивался с проблемой долгой работы обмена данными через ОЛЕ?

    Reply
  10. Rothschild

    (6) Serj1C, дай бог, дай бог — мжет тогда я их полюблю (если глючить не будут при этом)

    🙂



    но почему ADO не устраивает?

    как пить дать сами «ВнешниеИсточникиДанных»

    работаю через ADO с внешними данными.

    Зачем весь этот костыль городить???

    Reply
  11. Rothschild

    (10)

    Лутше бы до логического конца систему компоновки данных довели:

    Как известно у СКД есть,

    так называемая коллекция «ИсточникиДанных» (непутать с «НаборамиДанных»!):


    СхемаКомпоновкиДанных (DataCompositionSchema)

    ИсточникиДанных (DataSources)


    Использование:

    Только чтение.

    Описание:

    Тип: ИсточникиДанныхСхемыКомпоновкиДанных.

    Содержит источники, описанные в схеме.

    Доступность:

    Сервер, толстый клиент, внешнее соединение.

    Показать

    Reply
  12. Rothschild

    (11)

    Явно задумана для реализации доступа к внешним данным

    причем к самым разным, судя по документации:


    ИсточникДанныхСхемыКомпоновкиДанных (DataCompositionSchemaDataSource)

    Свойства:

    Имя (Name)

    СтрокаСоединения (ConnectionString)

    ТипИсточникаДанных (DataSourceType)

    Reply
  13. Rothschild

    (12)

    но благие намерения так и остались намерениями


    ИсточникДанныхСхемыКомпоновкиДанных (DataCompositionSchemaDataSource)

    ТипИсточникаДанных (DataSourceType)


    Использование:

    Чтение и запись.

    Описание:

    Тип: Строка.

    Тип источника данных. Для текущей информационной базы — «Local».

    единственный поддерживаемый в настоящее время

    тип источников данных для СКД — «Local»

    Reply
  14. sdf1979

    Я предполагаю, что внешние источники будут доведены до ума. Что то типа entity framework от майкрософта.

    Reply
  15. kos

    платформа 8.3.8.2088

    при подключении к 1с77 для полей «Строка(Х), Х>100» выдает сообщение

    ВнешнийИсточникДанных Поле XXX: Для строки фиксированной длины запрещено задавать длину строки более 100 символов

    Что делать ?

    Reply
  16. sdf1979

    СУБД для 1с77 какая? Файловая или MS SQL? Какой тип поля на СУБД 1с77 SP1008?

    Reply

Leave a Comment

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