Часто в практике разработки на 1С возникает необходимость собрать данные для единого отчета из нескольких независимых баз данных. Если базы находятся в одной локальной сети или на одном сервере, задача легко решается обычным COM-соединением. Но что делать, если нужная нам база данных (например, 1С:Управление торговлей) находится на совершенно другом сервере, в другой физической сети? Рассмотрим эту ситуацию подробнее и разберем все возможные способы решения данной архитектурной задачи.
Проанализируем ситуацию: у нас есть отчет, который должен в реальном времени получать выборку документов из удаленной базы. Прямой видимости между серверами нет. Разберем по шагам, какие технологии предлагает платформа 1С и смежные IT-инфраструктуры.
Самый простой с точки зрения программирования 1С способ — объединить две разные сети с помощью виртуальной частной сети (VPN). Для этого необходимо привлечь системных администраторов обеих сетей.
Важные нюансы:
Когда сети объединены, удаленный сервер становится виден как локальный, и мы можем использовать стандартное подключение через V83.ComConnector.
В новых версиях платформы также появилась возможность устанавливать COM-соединение по протоколам HTTP/HTTPS. Если опубликовать удаленную базу на веб-сервере (IIS или Apache), мы сможем подключаться к ней напрямую без настройки VPN. Строка подключения в таком случае будет выглядеть как обращение к сайту (например: Srvr="http://1c.site.ru/base"). Трафик идет через стандартные порты, а безопасность обеспечивается сертификатом SSL.
Если нет возможности настраивать VPN, отличным решением станет переход на сервисориентированную архитектуру. Выясним причину: это безопаснее, быстрее работает на медленных каналах связи и не требует прямого доступа к SQL или файлам базы.
Мы создаем в удаленной базе свой HTTP-сервис (или Web-сервис), который принимает параметры для формирования отчета и возвращает готовую таблицу значений в формате JSON или XML.
Посмотрим на пример трансформации логики отчета:
// Было (через COM-соединение локально):
тзДанныеУдаленнойБазы = ПолучитьДанныеИздалекаЧерезComСоединение(ПараметрыОтчета);
// Станет (через HTTP-запрос к удаленному серверу):
тзДанныеУдаленнойБазы = ПолучитьДанныеИздалека(ПараметрыОтчета, "HTTP");
На стороне отчета останется лишь отправить POST-запрос с параметрами, получить ответ от удаленной базы и десериализовать JSON обратно в таблицу для вывода в Систему компоновки данных.
Если удаленная база работает на платформе 8.3, мы можем избежать написания дополнительного серверного кода в конфигурации-источнике. Достаточно опубликовать базу на веб-сервере и включить стандартный интерфейс OData.
Платформа автоматически сгенерирует REST-интерфейс ко всем разрешенным объектам конфигурации. В нашем отчете мы просто формируем GET-запросы с нужными фильтрами. Платформа сама вернет ответ в формате JSON или XML, который мы программно распарсим и используем в отчете.
Поскольку в нашем примере удаленная база является SQL-версией, можно пойти по пути прямого извлечения данных из базы Microsoft SQL Server или PostgreSQL, минуя сервер 1С:Предприятия. Разберем два варианта такого подхода:
_Document123).ADODB.Connection, указать строку подключения к удаленному IP-адресу с логином и паролем SQL-пользователя, и выполнить прямой SELECT запрос.Не всегда онлайн-запросы к удаленной базе являются лучшим решением. В процессе формирования отчета выполнение тяжелых запросов через сеть может приводить к задержкам или блокировкам.
Рассмотрим альтернативный подход: соберите потенциально необходимые для построения отчетности данные с помощью обычных регламентных обменов. Данные могут выгружаться раз в несколько минут (или часов) в ту базу, где строится отчет, либо в отдельную центральную управленческую базу. Таким образом, отчет будет строиться локально, избегая в сеансе пользователя длительных обращений к внешним источникам по нестабильной сети. Этот метод особенно хорош, если данные требуются для сложной аналитики, где нужна максимальная производительность отчета.