Как реализовать консоль запросов и отчетов к другой базе 1С?

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

В процессе сопровождения, интеграции и аудита информационных систем на платформе 1С:Предприятие разработчики часто сталкиваются с необходимостью оперативного анализа данных, хранящихся в смежных или распределенных базах. Сверить остатки между базами «1С:Управление торговлей» и «1С:Бухгалтерия», проверить миграцию документов в РИБ (распределенной информационной базе) или провести экспресс-анализ справочников — все эти задачи требуют быстрого доступа к «чужим» таблицам без написания полноценных планов обмена.

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

Метод 1. Использование встроенного инструментария «Инструменты разработчика» (ИР)

Если задача носит разовый или эпизодический характер, создавать собственное решение с нуля не имеет смысла. Проанализируем схему работы через популярный и мощный пакет обработок «Инструменты разработчика» (ИР). Этот инструмент позволяет сравнивать результаты выполнения запросов в разных базах при помощи файлов обмена.

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

  1. Открываем консоль запросов ИР в локальной (основной) базе и пишем нужный нам текст запроса.
  2. Сохраняем схему запроса во внешний файл XML.
  3. Переносим файл в удаленную базу, открываем там аналогичную консоль ИР и загружаем схему.
  4. Выполняем запрос в удаленной базе и сохраняем его результат в файл таблицы значений.
  5. Возвращаемся в основную базу, выполняем локальный запрос и при помощи встроенного в ИР сравнителя таблиц сопоставляем локальный результат с выгруженным внешним файлом.

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

Метод 2. Прямое COM/OLE-соединение между базами

Для автоматизации процесса и выполнения запроса «в один клик» мы можем использовать технологию 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). Это связано с тем, что типы метаданных в разных базах не имеют сквозной совместимости по внутренним идентификаторам.

Метод 3. Современный подход через HTTP-сервисы

Использование COM-соединения постепенно уходит в прошлое из-за его медлительности, платформенной зависимости (требуется Windows-сервер и зарегистрированные DLL-библиотеки) и проблем с безопасностью при прохождении через брандмауэры.

Более современным и производительным решением является использование **HTTP-сервисов**. Выясним схему работы этой технологии:

  1. В удаленной базе регистрируется и публикуется простой HTTP-сервис (например, с шаблоном /execute-query).
  2. В теле POST-запроса локальная консоль передает структуру в формате JSON, содержащую текст запроса и параметры.
  3. Удаленная база принимает запрос, выполняет его, упаковывает результат в XML-сериализованную таблицу значений или массив структур JSON и отправляет обратно.
  4. Локальная база десериализует ответ и выводит таблицу на форму.

Такой подход работает быстрее, стабильнее и позволяет легко обходить ограничения операционных систем (например, если сервера 1С работают под управлением ОС Linux).

Метод 4. Настройка «Внешних источников данных» в СУБД

Если обе информационные базы развернуты на СУБД (например, MS SQL Server или PostgreSQL), мы можем воспользоваться штатным механизмом платформы 1С — «Внешними источниками данных».

Этот способ позволяет подключить таблицы удаленной базы непосредственно в дерево метаданных нашей конфигурации:

Минус метода: Имена таблиц в СУБД платформы 1С имеют технический вид (например, _InfoReg20584 вместо привычного РегистрСведений.ЦеныНоменклатуры). Разработчику придется предварительно сопоставить физические имена таблиц логическим объектам метаданных 1С.

Метод 5. Связанные серверы (Linked Servers) в MS SQL

Для решения сложных аналитических задач над огромными объемами данных, когда передача через XML/JSON вызывает переполнение памяти, администраторы баз данных настраивают механизм **Linked Servers** (Связанные серверы) на уровне MS SQL Server.

После настройки связи администратор может выполнять прямые SQL-запросы, объединяющие таблицы обеих баз в один JOIN-запрос. В 1С такой запрос можно запустить с помощью внешних компонент (например, через ADODB-соединение) прямо из консоли запросов, что обеспечивает максимальную производительность обработки данных.

Резюме и рекомендации

Выбор конкретного инструмента зависит от регулярности задачи и требований к скорости выполнения:

← На главную