При переходе или интеграции базы данных 1С:Предприятие 7.7 с современной системой 1С:Предприятие 8.3 часто встает задача переноса сопутствующих нормативно-справочных данных. Одной из таких задач является перенос банковских счетов с точной привязкой к соответствующим контрагентам. Разберем подробно, как реализовать подобную выгрузку через COM-соединение (OLE), проанализируем пример кода и обратим внимание на важные технические нюансы архитектуры обеих платформ.
Прежде чем приступать к написанию кода, выясним ключевые платформенные особенности взаимодействия через объект V77.Application:
И_Код77) или использовать ИНН/КПП.CreateObject должно выполняться до входа в цикл, чтобы не вызывать утечек оперативной памяти и существенного замедления работы.Рассмотрим рабочий алгоритм и разберем по шагам создание обработки на стороне 1С 8.3.
Шаг 1. Инициализация соединения с информационной базой 1С 7.7.
Для подключения создаем объект V77.Application и передаем строку параметров запуска, включающую каталог базы, логин и пароль.
Шаг 2. Обход справочника контрагентов и выборка счетов.
Выбираем контрагентов в базе 1С 8.3, находим соответствующий элемент в 1С 7.7 по сохраненному коду, устанавливаем владельца для выборки счетов через метод ИспользоватьВладельца() и последовательно считываем банковские реквизиты.
Шаг 3. Создание подчиненного элемента справочника «БанковскиеСчета» в 1С 8.3.
Заполняем реквизиты Владелец, НомерСчета, Банк, ВалютаДенежныхСредств и записываем новый элемент.
Посмотрим на программный код реализации:
Сообщить("Запускаем 1С 7.7...", СтатусСообщения.Информация);
Попытка
V77 = Новый COMОбъект("V77.Application");
Исключение
Сообщить("Не удалось создать COM-объект 1С 7.7: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
Каталог = "D:\1С77\prod\";
Логин = "Администратор";
Пароль = "123";
ПараметрыЗапуска = """" + "enterprise /d""" + Каталог + """"
+ ?(ЗначениеЗаполнено(Логин), " /n""" + СокрЛП(Логин) + """", "")
+ ?(ЗначениеЗаполнено(Пароль), " /p""" + СокрЛП(Пароль) + """", "");
Открыта = V77.Initialize(V77.RMTrade, ПараметрыЗапуска, "NO_SPLASH_SHOW");
Если Открыта = 0 Тогда
Сообщить("Базу данных 7.7 открыть не удалось!", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Сообщить("Соединение успешно установлено.", СтатусСообщения.Информация);
// Создаем объекты 7.7 один раз до цикла для экономии памяти
Контрагенты77 = V77.CreateObject("Справочник.Контрагенты");
Счета77 = V77.CreateObject("Справочник.РасчетныеСчета");
СписокКонтрагентов = Справочники.Контрагенты.Выбрать();
Пока СписокКонтрагентов.Следующий() Цикл
Если Не ЗначениеЗаполнено(СписокКонтрагентов.И_Код77) Тогда
Продолжить;
КонецЕсли;
// Ищем контрагента в 7.7 по коду
Если Контрагенты77.НайтиПоКоду(Число(СписокКонтрагентов.И_Код77), 0) = 1 Тогда
ТекКонтрагент77 = Контрагенты77.ТекущийЭлемент();
// Устанавливаем владельца для подчиненного справочника расчетных счетов
Счета77.ИспользоватьВладельца(ТекКонтрагент77);
Счета77.ВыбратьЭлементы();
Пока Счета77.ПолучитьЭлемент() = 1 Цикл
НомерСчета77 = СокрЛП(Счета77.Номер);
// Проверяем наличие счета у данного контрагента
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Ссылка
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Владелец = &Владелец
| И БанковскиеСчета.НомерСчета = &НомерСчета";
Запрос.УстановитьПараметр("Владелец", СписокКонтрагентов.Ссылка);
Запрос.УстановитьПараметр("НомерСчета", НомерСчета77);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
НовыйСчет = Справочники.БанковскиеСчета.СоздатьЭлемент();
НовыйСчет.Владелец = СписокКонтрагентов.Ссылка;
НовыйСчет.НомерСчета = НомерСчета77;
// Поиск банка по БИК
БИКБанка = СокрЛП(Счета77.БанкОрганизации.Код);
НайденныйБанк = Справочники.Банки.НайтиПоКоду(БИКБанка);
Если ЗначениеЗаполнено(НайденныйБанк) Тогда
НовыйСчет.Банк = НайденныйБанк;
КонецЕсли;
НовыйСчет.ВалютаДенежныхСредств = Справочники.Валюты.НайтиПоКоду("643");
НовыйСчет.ВидСчета = "Расчетный";
НовыйСчет.Наименование = СокрЛП(Счета77.БанкОрганизации.Наименование) + " (Расчетный)";
НовыйСчет.Записать();
Сообщить("Создан счет " + НомерСчета77 + " для " + СписокКонтрагентов.Наименование);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Проанализируем сопутствующий вопрос переноса юридических и почтовых адресов. В 1С 7.7 юридический адрес контрагента чаще всего хранится в виде единой строки в реквизите ЮрАдрес. Однако в современных конфигурациях 1С 8.3 на базе Библиотеки стандартных подсистем (БСП) контактная информация хранится иначе:
КонтактнаяИнформация объекта Справочник.Контрагенты.Вид (ссылка на предопределенный элемент справочника ВидыКонтактнойИнформации, например, ЮрАдресКонтрагента или ФактАдресКонтрагента) и Тип (значение системного перечисления Перечисления.ТипыКонтактнойИнформации.Адрес).Представление строки табличной части либо записывается программно через механизм БСП: УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию().Применение прямого чтения через OLE-соединение позволяет быстро перенести связанные банковские реквизиты без необходимости разрабатывать сложные правила конвертации, если объем переносимых данных строго ограничен.