В процессе сопровождения, интеграции и аудита информационных систем на платформе 1С:Предприятие разработчики часто сталкиваются с необходимостью оперативного анализа данных, хранящихся в смежных или распределенных базах. Сверить остатки между базами «1С:Управление торговлей» и «1С:Бухгалтерия», проверить миграцию документов в РИБ (распределенной информационной базе) или провести экспресс-анализ справочников — все эти задачи требуют быстрого доступа к «чужим» таблицам без написания полноценных планов обмена.
В этой статье мы подробно разберем, как реализовать или настроить инструмент для отправки запросов к удаленной базе 1С, проанализируем существующие подходы, их плюсы, минусы и технические ограничения.
Если задача носит разовый или эпизодический характер, создавать собственное решение с нуля не имеет смысла. Проанализируем схему работы через популярный и мощный пакет обработок «Инструменты разработчика» (ИР). Этот инструмент позволяет сравнивать результаты выполнения запросов в разных базах при помощи файлов обмена.
Рассмотрим по шагам стандартный алгоритм работы в этом случае:
Этот подход надежен, так как использует штатные механизмы сериализации ИР, но он неудобен при постоянном интерактивном анализе, когда текст запроса приходится динамически менять.
Для автоматизации процесса и выполнения запроса «в один клик» мы можем использовать технологию COMConnector. Этот способ позволяет подключиться к контексту удаленной базы, передать туда текст запроса, выполнить его на стороне сервера-приемника и вернуть результат обратно.
Разберем пример реализации простой консоли, которая выполняет запрос через COM-соединение:
// Функция выполняет запрос в удаленной базе через COM
Функция ВыполнитьЗапросЧерезCOM(СтрокаПодключения, ТекстЗапроса) Экспорт
// Инициализируем COM-соединение
Инициализатор = Новый COMОбъект("V83.COMConnector");
Попытка
Соединение = Инициализатор.Connect(СтрокаПодключения);
Исключение
ВызватьИсключение "Не удалось установить соединение: " + ОписаниеОшибки();
КонецПопытки;
// Создаем запрос в контексте удаленной базы
ВнешнийЗапрос = Соединение.NewObject("Запрос");
ВнешнийЗапрос.Текст = ТекстЗапроса;
Попытка
РезультатЗапроса = ВнешнийЗапрос.Выполнить();
Исключение
ВызватьИсключение "Ошибка выполнения запроса на удаленной стороне: " + ОписаниеОшибки();
КонецПопытки;
// Выгружаем результат во временную таблицу COM
ТаблицаCOM = РезультатЗапроса.Выгрузить();
// Переносим данные в локальную ТаблицуЗначений
ЛокальнаяТаблица = Новый ТаблицаЗначений;
// Создаем колонки в локальной таблице
Для Каждого КолонкаCOM Из ТаблицаCOM.Колонки Цикл
ЛокальнаяТаблица.Колонки.Добавить(КолонкаCOM.Имя, Новый ОписаниеТипов("Строка"));
// Используем тип "Строка", так как ссылочные типы другой базы не сопоставлены с текущей
КонецЦикла;
// Заполняем строки данными, получая строковые представления
Для Каждого СтрокаCOM Из ТаблицаCOM Цикл
НоваяСтрока = ЛокальнаяТаблица.Добавить();
Для Каждого КолонкаCOM Из ТаблицаCOM.Колонки Цикл
// Принудительно приводим к строке на удаленной стороне, чтобы избежать битых ссылок
НоваяСтрока[КолонкаCOM.Имя] = Соединение.String(СтрокаCOM[КолонкаCOM.Имя]);
КонецЦикла;
КонецЦикла;
Возврат ЛокальнаяТаблица;
КонецФункции
Важное примечание: Обратите внимание на строку Соединение.String(...). Если вы попытаетесь напрямую передать ссылку (например, справочник Номенклатура) из удаленной базы в локальную таблицу значений, платформа 1С отобразит её как «Объект не найден» или пустую уникальный идентификатор (GUID). Это связано с тем, что типы метаданных в разных базах не имеют сквозной совместимости по внутренним идентификаторам.
Использование COM-соединения постепенно уходит в прошлое из-за его медлительности, платформенной зависимости (требуется Windows-сервер и зарегистрированные DLL-библиотеки) и проблем с безопасностью при прохождении через брандмауэры.
Более современным и производительным решением является использование **HTTP-сервисов**. Выясним схему работы этой технологии:
/execute-query).Такой подход работает быстрее, стабильнее и позволяет легко обходить ограничения операционных систем (например, если сервера 1С работают под управлением ОС Linux).
Если обе информационные базы развернуты на СУБД (например, MS SQL Server или PostgreSQL), мы можем воспользоваться штатным механизмом платформы 1С — «Внешними источниками данных».
Этот способ позволяет подключить таблицы удаленной базы непосредственно в дерево метаданных нашей конфигурации:
Минус метода: Имена таблиц в СУБД платформы 1С имеют технический вид (например, _InfoReg20584 вместо привычного РегистрСведений.ЦеныНоменклатуры). Разработчику придется предварительно сопоставить физические имена таблиц логическим объектам метаданных 1С.
Для решения сложных аналитических задач над огромными объемами данных, когда передача через XML/JSON вызывает переполнение памяти, администраторы баз данных настраивают механизм **Linked Servers** (Связанные серверы) на уровне MS SQL Server.
После настройки связи администратор может выполнять прямые SQL-запросы, объединяющие таблицы обеих баз в один JOIN-запрос. В 1С такой запрос можно запустить с помощью внешних компонент (например, через ADODB-соединение) прямо из консоли запросов, что обеспечивает максимальную производительность обработки данных.
Выбор конкретного инструмента зависит от регулярности задачи и требований к скорости выполнения: