При переносе данных из базы 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С 8.3 по наименованию из 1С 7.7
СсылкаНаВладельца = Справочники.Организации.НайтиПоНаименованию(СокрЛП(Организация1С7.Наименование));
Если ЗначениеЗаполнено(СсылкаНаВладельца) Тогда
ПодразделениеОбъект.Владелец = СсылкаНаВладельца;
ПодразделениеОбъект.Наименование = СокрЛП(Подразделения1С7.Наименование);
ПодразделениеОбъект.Записать();
Иначе
ВызватьИсключение "Не найден владелец для подразделения!";
КонецЕсли;
Выясним причину, почему при обращении к ссылочным реквизитам документа из 1С 7.7 (например, Документ1С7.Подразделение) в отладчике 1С 8.3 отображается только тип COMОбъект без вложенных полей.
Это связано с тем, что 1С 7.7 работает через динамическое COM-связывание (интерфейс IDispatch). Внутренняя структура и свойства таких объектов не раскрываются в табло отладчика 1С 8.3. Однако сам объект является полноценным COM-сервером, и в коде к его свойствам и методам можно обращаться напрямую по их именам в 1С 7.7.
Чтобы извлечь значения из такого COMОбъект, нужно обращаться к его реквизитам через точку:
Объект77.Наименование — возвращает наименование справочника 1С 7.7;Объект77.Код — возвращает код элемента 1С 7.7;Объект77.Выбран() — возвращает 1, если ссылка заполнена, и 0, если реквизит пуст.Рассмотрим практическую задачу: при загрузке документа из 1С 7.7 требуется сопоставить его реквизит Подразделение с соответствующим справочником в 1С 8.3.
Важные правила при работе со ссылочными реквизитами через OLE:
COMОбъект. Чтобы избежать ошибок, необходимо проверять его методом Выбран() = 1.СокрЛП() перед поиском в 1С 8.3.Пример кода для получения значения и сопоставления с базой 1С 8.3:
// Проверяем, заполнено ли подразделение в документе 1С 7.7
Если Документ1С7.Подразделение.Выбран() = 1 Тогда
// Обращаемся напрямую к реквизиту Наименование COM-объекта
ИмяПодразделения77 = СокрЛП(Документ1С7.Подразделение.Наименование);
// Ищем соответствующий элемент в 1С 8.3
СсылкаПодразделение = Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию(ИмяПодразделения77);
Если ЗначениеЗаполнено(СсылкаПодразделение) Тогда
НовыйДокумент83.Подразделение = СсылкаПодразделение;
КонецЕсли;
КонецЕсли;
Проанализируем разницу между подчиненными и иерархическими справочниками:
Владелец. Ему присваивается ссылка на элемент другого справочника.Родитель. Для создания группы применяется метод СоздатьГруппу(), а для элементов — СоздатьЭлемент().При переносе иерархических справочников рекомендуется выполнять загрузку в два прохода: сначала создавать все группы и элементы верхнего уровня, сохраняя соответствие кодов или идентификаторов, а затем проставлять ссылки на реквизиты Родитель и Владелец.