Данную методику интеграции 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).
Но есть особенность, если мы произведем выбор элемента (двойным щелчком или Enter), то форма элемента справочника не откроется, а мы войдем в режим редактирования (рис. 2).
Для того что бы можно было открыть форму элемента необходимо немного изменить код из публикации //infostart.ru/public/170534/.
- ОбщиеМодули.ОбщийМодульСправочники77
- Ищем процедуру «ДобавитьДерево(пФорма, пСтруктураОтображенияДерева, пСтруктураДействий) Экспорт»
- Ранее в цикле создания элементов для каждой колонки мы создавали элемент «ПолеВвода», а теперь нам надо «ПолеНадписи», что бы можно было перехватить процедуру «Выбор».
- Поэтому меняем «НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;» на «НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи;»
Следующий шаг – перехватить процедуру выбор у формы списка внешнего источника данных «Справочник_Клиенты». Открываем форму списка внешнего источника данных «Справочник_Клиенты» и меняем
СТАРУЮ ВЕРСИЮ
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураОтображенияДерева = Новый Структура;
СтруктураОтображенияДерева.Вставить("ПутьКДанным","Дерево");
СтруктураОтображенияДерева.Вставить("Отображение",ОтображениеТаблицы.ИерархическийСписок);
СтруктураОтображенияДерева.Вставить("КартинкаСтрок",БиблиотекаКартинок.ГруппаИЭлемент);
СтруктураОтображенияДерева.Вставить("ПутьКДаннымКартинкиСтроки","Дерево.ЭтоГруппа");
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриСменеТекущегоРодителя","ЭлементДеревоПриСменеТекущегоРодителя");
ОбщийМодульСправочники77.ДобавитьДерево(ЭтаФорма, СтруктураОтображенияДерева, СтруктураДействий);
КонецПроцедуры
НА НОВУЮ
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураОтображенияДерева = Новый Структура;
СтруктураОтображенияДерева.Вставить("ПутьКДанным","Дерево");
СтруктураОтображенияДерева.Вставить("Отображение",ОтображениеТаблицы.ИерархическийСписок);
СтруктураОтображенияДерева.Вставить("КартинкаСтрок",БиблиотекаКартинок.ГруппаИЭлемент);
СтруктураОтображенияДерева.Вставить("ПутьКДаннымКартинкиСтроки","Дерево.ЭтоГруппа");
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПриСменеТекущегоРодителя","ЭлементДеревоПриСменеТекущегоРодителя");
СтруктураДействий.Вставить("Выбор","ЭлементДеревоВыбор");
ОбщийМодульСправочники77.ДобавитьДерево(ЭтаФорма, СтруктураОтображенияДерева, СтруктураДействий);
КонецПроцедуры
Так же в код формы списка добавляем процедуру обработки выбора
&НаКлиенте
Процедура ЭлементДеревоВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Параметр = Новый Структура("Ключ", Элемент.ТекущиеДанные.Элемент);
Форма = ПолучитьФорму("ВнешнийИсточникДанных.Торговля_77.Таблица.Справочник_Клиенты.ФормаОбъекта",Параметр);
Форма.Открыть();
СтандартнаяОбработка = Ложь;
КонецПроцедуры
После вышеприведенных манипуляций после выбора элемента в форме списка открывается автоматически сгенерированная форма для элемента внешнего источника «Справочники_Клиенты» (Рис. 3)
У данной формы несколько недостатков. Отсутствует кнопка записи объекта и это объяснимо – это же форма элемента внешнего источника данных. Так же все реквизиты, как простых типов, так и ссылочных, закрыты для изменения. Будем конструировать форму сами. Создаем форму объекта, удаляем все автоматически сгенерированные реквизиты с формы и отключаем стандартную командную панель (Рис. 4).
Для того что бы можно было редактировать данные элемента необходимо добавить реквизиты формы и связать их изменения с реквизитами объекта. Добавляем реквизиты формы. Для реквизитов ссылочного типа оставляем только кнопки выбора и очистки (Рис. 5).
Но при открытии данной формы из списка элементов – данных нет. Поэтому добавляем для формы элемента процедуру «ПриСозданииНаСервере»:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтаФорма.РеквИНН = СокрЛП(Объект.ИНН);
ЭтаФорма.РеквНаименование = СокрЛП(Объект.Наименование);
Если Объект.Регион.ID <> " " Тогда
ЭтаФорма.РеквРегион = Объект.Регион;
КонецЕсли;
Если Объект.ПочтРегион.ID <> " " Тогда
ЭтаФорма.РеквПочтРегион = Объект.ПочтРегион;
КонецЕсли;
Если Объект.ЮрРегион.ID <> " " Тогда
ЭтаФорма.РеквЮрРегион = Объект.ЮрРегион;
КонецЕсли;
КонецПроцедуры
Что у нас получилось при открытии элемента (Рис. 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)
Добавляем программный код выполнения команд:
&НаСервере
Функция ЗаписатьНаСервере()
Результат = СформироватьХМЛ();
Возврат ОбщийМодульОЛЕ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).
Как мы видим, все прекрасно работает. Теперь доработаем обработку в 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 работать в двух учетных системах. Пользователь даже не заметит этого.