При интеграции различных информационных систем на платформе 1С часто возникает задача прямого чтения данных из одной базы в другую. Использование COM-соединения (COM-объекта V83.COMConnector) является классическим способом решения этой задачи. Рассмотрим подробно, как не просто подключиться к базе, но и эффективно извлечь из нее документы, справочники и их реквизиты.
Для начала нам необходимо создать объект коннектора и установить соединение с информационной базой. В зависимости от того, является ли база файловой или серверной, строка подключения будет различаться. Разберем пример для серверного варианта, который чаще всего используется в связке с SQL Server.
// Определение параметров подключения
СтрокаПодключения = "srvr='ИмяСервера'; ref='ИмяБазы'; usr='Логин'; pwd='Пароль';";
COMConnector = Новый COMОбъект("V83.COMConnector");
Попытка
// Устанавливаем соединение
ComConnection = COMConnector.Connect(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Важный момент: если вы работаете на 64-битной платформе, убедитесь, что разрядность клиента и COM-компоненты совпадают. В случае возникновения ошибок регистрации класса рекомендуется проверить настройки в "Службах компонентов" Windows (dcomcnfg).
Многие начинающие разработчики пытаются использовать коллекцию ComConnection.Метаданные для получения элементов. Важно понимать, что объект Метаданные предоставляет только описание структуры базы (имена полей, типы, количество документов), но не сами записи. Для получения конкретных данных — ссылок, номеров, дат — необходимо использовать либо менеджеры объектов (например, Выбрать()), либо объект Запрос.
Наиболее производительный способ получения данных — выполнение запроса на стороне базы-источника. Рассмотрим ситуацию, когда нам нужно получить табличную часть "Товары" документа "Поступление товаров и услуг" за определенный период. Выясним причину, по которой обычный запрос может не сработать: все объекты (запросы, параметры) должны создаваться в контексте внешнего соединения.
// Создаем объект запроса именно во внешней базе
ЗапросКом = ComConnection.NewObject("Запрос");
// Текст запроса пишется на языке запросов 1С
ЗапросКом.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка,
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Контрагент.Наименование КАК КонтрагентНаименование,
| Док.Товары.(
| Номенклатура.Наименование КАК Товар,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК Док
|ГДЕ
| Док.Дата МЕЖДУ &НачДата И &КонДата
| И Док.Проведен = ИСТИНА";
// Параметры также передаются через методы внешнего объекта
ЗапросКом.УстановитьПараметр("НачДата", НачалоДня(Объект.ДатаНачала));
ЗапросКом.УстановитьПараметр("КонДата", КонецДня(Объект.ДатаОкончания));
// Выполняем запрос и получаем выборку
ВыборкаКом = ЗапросКом.Выполнить().Выбрать();
Проанализируем процесс обхода выборки. Основная сложность заключается в том, что ссылочные типы (например, ДокументСсылка или СправочникСсылка) передаются как COM-объекты. Вы не сможете напрямую сравнить ссылку из внешней базы со ссылкой в текущей базе.
Разберем основные правила доступа к данным:
Ref вместо Ссылка, Number вместо Номер), хотя современные версии платформы поддерживают и русские имена.
Пока ВыборкаКом.Следующий() Цикл
// Получаем простые данные
НомерДокумента = ВыборкаКом.Номер;
ДатаДокумента = ВыборкаКом.Дата;
// Ссылочный объект (COMОбъект)
ВнешняяСсылка = ВыборкаКом.Ссылка;
// Получение данных табличной части
ВыборкаТоваров = ВыборкаКом.Товары.Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл
НаименованиеТовара = ВыборкаТоваров.Товар; // Получено в запросе через точку
Кол = ВыборкаТоваров.Количество;
Сообщить("Документ №" + НомерДокумента + ": Товар - " + НаименованиеТовара);
КонецЦикла;
КонецЦикла;
Если ваша задача — загрузить данные и сопоставить их с объектами в текущей базе, рассмотрите следующие советы:
Использование ГУИД (UUID): Это самый надежный способ сопоставления. Получить его из внешней базы можно так:
СтрокаГП = ComConnection.String(ВыборкаКом.Ссылка.UUID());
В текущей базе вы сможете найти объект по этому идентификатору, используя метод ПолучитьСсылку() соответствующего менеджера.
Выгрузка в таблицу значений: Для ускорения работы можно выгрузить результат запроса в таблицу значений на стороне внешней базы, а затем перебрать ее. Однако помните, что сама ТаблицаЗначений не может быть напрямую передана в текущую базу как объект 1С. Ее нужно либо обходить как COM-объект, либо сериализовать в строку (XML или JSON).
Завершение работы: Не забывайте закрывать соединение. В 1С это делается обнулением переменной:
ComConnection = Неопределено;
Это освобождает лицензию на сервере 1С, которую занимало ваше соединение.
Таким образом, мы рассмотрели полный цикл работы с данными через COM: от подключения до извлечения детальной информации из табличных частей. Этот метод остается незаменимым для оперативного обмена данными между конфигурациями на платформе 1С:Предприятие 8.