Как получить данные контрагента из субконто при переносе данных из 1С 7.7 через OLE

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При интеграции или переносе данных из устаревших систем на платформе 1С 7.7 в современные конфигурации (например, Бухгалтерию предприятия 3.0), разработчики часто сталкиваются с особенностями хранения аналитики. В отличие от управляемых форм 8.3, где реквизиты документов обычно типизированы строго, в версии 7.7 в таких документах, как Приходный кассовый ордер (ПКО) или Расходный кассовый ордер (РКО), данные о контрагенте часто «спрятаны» в универсальных полях субконто. Это происходит потому, что состав аналитики в 7.7 напрямую зависит от выбранного счета учета.

В рамках этой статьи мы разберем, как программно извлечь наименование, ИНН и другие реквизиты контрагента из субконто, работая через COM-соединение (OLE).

Понимание структуры субконто в 1С 7.7

Для начала проанализируем, почему нельзя просто обратиться к полю Контрагент. В конфигурациях 7.7 (таких как «УСН» или «Бухгалтерский учет») счета кассы или расчетного счета могут корреспондировать с разными счетами (60, 62, 76 и т.д.). Поскольку каждый счет имеет свой набор видов субконто, документ 7.7 использует универсальные реквизиты Субконто1, Субконто2 и Субконто3. Их тип не определен заранее и становится понятным только в момент выполнения кода.

При работе через OLE объект Субконто1 возвращается как Com-объект. Чтобы «достучаться» до его внутренних свойств, нам нужно убедиться, что внутри действительно находится справочник «Контрагенты».

Алгоритм получения данных из субконто

Рассмотрим пошагово процесс извлечения данных. Нам необходимо выполнить три проверки: на пустое значение, на тип данных и на вид справочника.

Для реализации этого механизма используем следующий подход в коде:


// Предположим, БазаОлеТек — это установленное соединение с базой 7.7
// докнт — объект документа ПКО или РКО, полученный через OLE

Если БазаОлеТек.ПустоеЗначение(докнт.Субконто1) = 0 Тогда
    // Проверяем, является ли значение справочником
    Если БазаОлеТек.ТипЗначенияСтр(докнт.Субконто1) = "Справочник" Тогда
        // Проверяем, какой именно это справочник
        Если докнт.Субконто1.Вид() = "Контрагенты" Тогда
            // Теперь мы можем безопасно обращаться к реквизитам
            ИмяКонтрагента = докнт.Субконто1.Наименование;
            ИННКонтрагента = докнт.Субконто1.ИНН;
            
            Сообщить("Найден контрагент: " + ИмяКонтрагента + " ИНН: " + ИННКонтрагента);
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Разберем подробнее используемые методы:

  1. ПустоеЗначение() — обязательная проверка. Если попытаться вызвать методы у пустого субконто через OLE, это может привести к ошибке обращения к памяти или аварийному завершению скрипта.
  2. ТипЗначенияСтр() — возвращает строковое представление типа. В 1С 7.7 субконто может быть числом, строкой, датой или агрегатным типом (Справочник, Документ, Перечисление).
  3. Вид() — этот метод доступен для объектов типа «Справочник» и «Документ». Он возвращает название метаданных (например, "Контрагенты", "Номенклатура", "Договоры").

Особенности реквизита ИНН в 1С 7.7

При переносе данных в БП 3.0 важно помнить о формате хранения ИНН в старых базах. Проанализируем типичную ситуацию: в 7.7 поле ИНН часто является строковым и нередко содержит в себе одновременно и ИНН, и КПП, разделенные символом "/" (например, "7701010101/770101001").

Чтобы корректно заполнить карточку контрагента в 1С 8.3, рекомендуем использовать функцию разделения строки:


ПолныйИНН = докнт.Субконто1.ИНН;
ПозицияСлэша = Найти(ПолныйИНН, "/");

Если ПозицияСлэша > 0 Тогда
    ЧистыйИНН = Лев(ПолныйИНН, ПозицияСлэша - 1);
    КПП = Сред(ПолныйИНН, ПозицияСлэша + 1);
Иначе
    ЧистыйИНН = ПолныйИНН;
    КПП = "";
КонецЕсли;

Также полезно перед записью в новую базу очищать ИНН от лишних пробелов с помощью функции СокрЛП(), так как в 7.7 пользователи часто допускали небрежность при вводе данных.

Работа с периодическими реквизитами через OLE

В 1С 7.7 некоторые данные контрагента (например, юридический адрес или полное наименование) могут быть периодическими. Попытка прямого обращения докнт.Субконто1.ЮридическийАдрес через OLE может вернуть пустое значение или ошибку, если реквизит определен как периодический в конфигураторе.

Для получения таких данных необходимо использовать метод Получить(Дата). Разберем пример получения значения на дату документа:


// Получаем объект периодического реквизита через OLE
ДатаДок = докнт.ДатаДок;
ЮрАдрес = докнт.Субконто1.ЮридическийАдрес.Получить(ДатаДок);

Повышение надежности кода: метод ПолучитьАтрибут

При работе через COM-соединение иногда возникают конфликты имен или сложности с доступом к свойствам объектов. Профессиональные разработчики рекомендуют использовать универсальный метод ПолучитьАтрибут(). Это позволяет избежать проблем, если имя реквизита совпадает с зарезервированным словом языка.

Пример использования:


// Вместо докнт.Субконто1.ИНН
ТекИНН = докнт.Субконто1.ПолучитьАтрибут("ИНН");

Зависимость субконто от плана счетов

Нужно учитывать, что «Контрагент» не всегда находится именно в Субконто1. В некоторых сильно модифицированных базах УСН 7.7 порядок аналитики может быть изменен. Выясним причину возможной ошибки: если ваш код не находит контрагента в первом субконто, стоит программно проверить настройки счета.

Проанализируем ситуацию с помощью обращения к плану счетов:


СчетДок = докнт.СчетОплаты; // или СчетКасса
Для Ном = 1 По СчетДок.КоличествоСубконто() Цикл
    ВидСубк = СчетДок.ВидСубконто(Ном);
    Если ВидСубк.Идентификатор() = "Контрагенты" Тогда
        // Мы нашли, в каком именно поле (1, 2 или 3) лежит контрагент
        ИмяПоля = "Субконто" + Ном;
        НужныйКонтрагент = докнт.ПолучитьАтрибут(ИмяПоля);
        Прервать;
    КонецЕсли;
КонецЦикла;

Оптимизация скорости выгрузки

Работа через OLE — это довольно медленный процесс, так как каждый вызов Субконто1.Наименование инициирует сетевой запрос между процессами. Если вам нужно перенести десятки тысяч документов, рассмотрим способы оптимизации:

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

← На главную