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

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

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

Рассмотрим детально, почему возникают эти ошибки и как правильно считывать реквизиты объектов 1С 7.7 для загрузки в 1С 8.3.

Причина ошибки «Поле владельца не заполнено или заполнено неверно»

Проанализируем первую проблему, с которой сталкивается автор при попытке создать элемент подчиненного справочника. В исходном коде строке наименования напрямую присваивалось значение поля владельца:

Подразделения.Владелец = Подразделения1С7.Наименование;

Реквизит Владелец в 1С 8.3 ожидает объект типа СправочникСсылка, принадлежащий справочнику-владельцу (например, Справочники.Организации.Ссылка), а не простую текстовую строку. Если присвоить ему наименование, платформа вызовет ошибку валидации при записи.

Кроме того, при вызове метода СоздатьЭлемент() в 1С 8.3 обязательно указываются скобки. Если записать Справочники.ПодразделенияОрганизаций.СоздатьЭлемент без скобок, переменная получит сам метод, а не новый объект справочника.

Разберем по шагам правильный алгоритм переноса элемента с заполнением владельца:

  1. Находим или создаем объект-владелец в базе 1С 8.3 (например, элемент справочника Организации).
  2. Получаем ссылку на созданный/найденный элемент-владелец.
  3. Создаем новый элемент в подчиненном справочнике и присваиваем полученную ссылку в реквизит Владелец.

Пример корректного кода создания элемента с владельцем:


// Создаем объект нового элемента
ПодразделениеОбъект = Справочники.ПодразделенияОрганизаций.СоздатьЭлемент();

// Находим ссылку на владельца в базе 1С 8.3 по наименованию из 1С 7.7
СсылкаНаВладельца = Справочники.Организации.НайтиПоНаименованию(СокрЛП(Организация1С7.Наименование));

Если ЗначениеЗаполнено(СсылкаНаВладельца) Тогда
    ПодразделениеОбъект.Владелец = СсылкаНаВладельца;
    ПодразделениеОбъект.Наименование = СокрЛП(Подразделения1С7.Наименование);
    ПодразделениеОбъект.Записать();
Иначе
    ВызватьИсключение "Не найден владелец для подразделения!";
КонецЕсли;

Почему отладчик 1С 8.3 отображает «COMОбъект» и не показывает его поля

Выясним причину, почему при обращении к ссылочным реквизитам документа из 1С 7.7 (например, Документ1С7.Подразделение) в отладчике 1С 8.3 отображается только тип COMОбъект без вложенных полей.

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

Чтобы извлечь значения из такого COMОбъект, нужно обращаться к его реквизитам через точку:

Сопоставление реквизитов документа из 1С 7.7 с данными 1С 8.3

Рассмотрим практическую задачу: при загрузке документа из 1С 7.7 требуется сопоставить его реквизит Подразделение с соответствующим справочником в 1С 8.3.

Важные правила при работе со ссылочными реквизитами через OLE:

  1. Проверка на пустое значение: В 1С 7.7 незаполненный реквизит все равно возвращает COMОбъект. Чтобы избежать ошибок, необходимо проверять его методом Выбран() = 1.
  2. Удаление концевых пробелов: В 1С 7.7 строковые значения часто дополняются пробелами до фиксированной длины. Обязательно используйте функцию СокрЛП() перед поиском в 1С 8.3.

Пример кода для получения значения и сопоставления с базой 1С 8.3:


// Проверяем, заполнено ли подразделение в документе 1С 7.7
Если Документ1С7.Подразделение.Выбран() = 1 Тогда
    // Обращаемся напрямую к реквизиту Наименование COM-объекта
    ИмяПодразделения77 = СокрЛП(Документ1С7.Подразделение.Наименование);
    
    // Ищем соответствующий элемент в 1С 8.3
    СсылкаПодразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию(ИмяПодразделения77);
    
    Если ЗначениеЗаполнено(СсылкаПодразделение) Тогда
        НовыйДокумент83.Подразделение = СсылкаПодразделение;
    КонецЕсли;
КонецЕсли;

Различие иерархии и подчинения при переносе

Проанализируем разницу между подчиненными и иерархическими справочниками:

При переносе иерархических справочников рекомендуется выполнять загрузку в два прохода: сначала создавать все группы и элементы верхнего уровня, сохраняя соответствие кодов или идентификаторов, а затем проставлять ссылки на реквизиты Родитель и Владелец.

← На главную