Как выгрузить банковские счета контрагентов из 1С 7.7 в 1С 8.3 через COM-соединение?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе или интеграции базы данных 1С:Предприятие 7.7 с современной системой 1С:Предприятие 8.3 часто встает задача переноса сопутствующих нормативно-справочных данных. Одной из таких задач является перенос банковских счетов с точной привязкой к соответствующим контрагентам. Разберем подробно, как реализовать подобную выгрузку через COM-соединение (OLE), проанализируем пример кода и обратим внимание на важные технические нюансы архитектуры обеих платформ.

Архитектура соединения и важные технические ограничения

Прежде чем приступать к написанию кода, выясним ключевые платформенные особенности взаимодействия через объект V77.Application:

  1. Разрядность клиента: COM-сервер 1С 7.7 существует исключительно в 32-разрядной версии. Попытка инициализировать соединение из 64-разрядного клиента или сервера 1С 8.3 приведет к системной ошибке «Класс не зарегистрирован». Код должен исполняться строго в 32-разрядном сеансе (или с использованием службы COM+ Windows).
  2. Сопоставление контрагентов: Для безошибочной связки контрагентов в базе 1С 8.3 рекомендуется заранее создать дополнительный реквизит (например, И_Код77) или использовать ИНН/КПП.
  3. Оптимизация COM-объектов: Создание объектов метаданных 7.7 через CreateObject должно выполняться до входа в цикл, чтобы не вызывать утечек оперативной памяти и существенного замедления работы.
  4. Поиск дублей банковских счетов: Проверку на наличие уже существующего счета необходимо выполнять с учетом владельца, так как расчетный счет жестко подчинен конкретному контрагенту.

Пошаговая реализация переноса банковских счетов

Рассмотрим рабочий алгоритм и разберем по шагам создание обработки на стороне 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 на базе Библиотеки стандартных подсистем (БСП) контактная информация хранится иначе:

  1. Хранение в табличной части: Адреса, телефоны и email хранятся в табличной части КонтактнаяИнформация объекта Справочник.Контрагенты.
  2. Разделение по видам: Каждая строка контактной информации имеет реквизит Вид (ссылка на предопределенный элемент справочника ВидыКонтактнойИнформации, например, ЮрАдресКонтрагента или ФактАдресКонтрагента) и Тип (значение системного перечисления Перечисления.ТипыКонтактнойИнформации.Адрес).
  3. Запись значения: Строка адреса из 7.7 помещается в реквизит Представление строки табличной части либо записывается программно через механизм БСП: УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию().

Применение прямого чтения через OLE-соединение позволяет быстро перенести связанные банковские реквизиты без необходимости разрабатывать сложные правила конвертации, если объем переносимых данных строго ограничен.

← На главную