gifts2017

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

Опубликовал Дмитрий Соломатин (sdf1979) в раздел Обмен - Перенос данных из 1С7.7 в 1C8.X

Прозрачная интеграция 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 через внешние источники (см. публикацию http://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

Для того что бы можно было открыть форму элемента необходимо немного изменить код из публикации http://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);

            Путь = БазаОле.КаталогИБ()+"ExtForms\Connector1C82.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);

            Путь = БазаОле.КаталогИБ()+"ExtForms\Connector1C82.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 работать в двух учетных системах. Пользователь даже не заметит этого.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Прозрачная интеграция 1С82 с 1С77.doc
.doc 1,36Mb
09.01.14
24
.doc 1,36Mb 24 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Nathan Rothschild (Rothschild) 09.01.14 17:06
А зачем через глюкастые "ВнешниеИсточникиДанных" ?
Почему не напрямую через ADO ???
***
Если ничего не изменилось, "ВнешниеИсточникиДанных" работают только через интерфейс ODBC.
А через ADO можно использовать и более современный OLEDB.
2. Nathan Rothschild (Rothschild) 09.01.14 17:11
(1)
плюс - за прямой доступ к базе 1С, хоть и 7.7
;)
3. Nathan Rothschild (Rothschild) 09.01.14 17:14
(0) sdf1979,
что за танк у тебя на фотке?
в "танчики" режешься в инете???
4. Дмитрий Соломатин (sdf1979) 09.01.14 17:17
Внешние источники не "глюкастые", а даже очень ничего, а уж в 8.3 вообще отлично
5. Nathan Rothschild (Rothschild) 09.01.14 17:56
(4) sdf1979, ну дело вкуса...


а что там "отличного" появилось в 8.3 ???
1. через OLEDB "ВнешниеИсточникиДанных" заработали?
2. а операции записи ими поддерживаются??
6. Serj (Serj1C) 10.01.14 07:00
(5) Rothschild, Запись будет поддерживаться, говорили на партнерском семинаре
7. Роман Ершов (MRAK) 15.01.14 09:02
8. Андрей Лещанов (Nuuq) 15.01.14 17:45
(3) Rothschild, это не танк, а ПТ-САУ !!! ;)
9. Дмитрий Кеба (Fenicss) 18.01.14 05:50
А как со скоростью работы? Просто я сталкивался с проблемой долгой работы обмена данными через ОЛЕ?
10. Nathan Rothschild (Rothschild) 18.01.14 08:08
(6) Serj1C, дай бог, дай бог - мжет тогда я их полюблю (если глючить не будут при этом)
:)
...
но почему ADO не устраивает?

как пить дать сами "ВнешниеИсточникиДанных"
работаю через ADO с внешними данными.

Зачем весь этот костыль городить???
11. Nathan Rothschild (Rothschild) 18.01.14 08:14
(10)
Лутше бы до логического конца систему компоновки данных довели:
Как известно у СКД есть,
так называемая коллекция "ИсточникиДанных" (непутать с "НаборамиДанных"!):

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

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

Только чтение.
Описание:

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

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

Сервер, толстый клиент, внешнее соединение.
12. Nathan Rothschild (Rothschild) 18.01.14 08:17
(11)
Явно задумана для реализации доступа к внешним данным
причем к самым разным, судя по документации:

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

Имя (Name)
СтрокаСоединения (ConnectionString)
ТипИсточникаДанных (DataSourceType)

13. Nathan Rothschild (Rothschild) 18.01.14 08:27
(12)
но благие намерения так и остались намерениями

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

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

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

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

единственный поддерживаемый в настоящее время
тип источников данных для СКД - "Local"
14. Дмитрий Соломатин (sdf1979) 20.01.14 10:28
Я предполагаю, что внешние источники будут доведены до ума. Что то типа entity framework от майкрософта.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа