Механизм внешних источников данных (ВИД) в платформе 1С:Предприятие — это мощный инструмент, позволяющий работать с таблицами сторонних СУБД так, будто это родные объекты конфигурации (справочники или документы). Однако, когда возникает задача подключить одну базу 1С к другой базе 1С через этот механизм, мы сталкиваемся с рядом архитектурных особенностей и ограничений. Разберем подробно, как это реализовать, с какими трудностями придется столкнуться и какие альтернативы существуют.
Для начала проанализируем, как работает этот механизм. Внешние источники данных в 1С работают через технологию ODBC (Open Database Connectivity). Это означает, что для успешного подключения к целевой базе в операционной системе должен быть установлен соответствующий драйвер СУБД, на которой работает эта база (например, SQL Server, PostgreSQL или Oracle).
Рассмотрим стандартный сценарий подключения к базе 1С, работающей в клиент-серверном варианте:
ВнешниеИсточникиДанных._Reference25 или _Document40.Выясним причину, по которой пользователи часто заходят в тупик при попытке подключить файловую базу. Файловая база 1С использует собственный проприетарный формат хранения данных в файле 1Cv8.1CD. К сожалению, полноценного и стабильного ODBC-драйвера для прямого чтения этого файла не существует.
Рассмотрим, какие варианты остаются для файловых баз:
1C:Предприятие OLE DB Provider, но он считается устаревшим, работает нестабильно на современных версиях платформы 8.3 и часто не поддерживает сложные типы данных.Таким образом, если ваша цель — подключиться именно к файловой базе через ВИД, то технически правильным ответом будет: это практически невозможно реализовать стандартными средствами без «костылей».
Если же целевая база работает на SQL-сервере, подключение становится возможным, но возникает проблема реструктуризации. При изменении метаданных в целевой базе (например, при добавлении реквизита) 1С может переименовать таблицу в SQL. В результате ваш внешний источник данных перестанет видеть таблицу, так как он привязан к конкретному физическому имени (например, _InfoReg123).
Для решения этой проблемы мы можем использовать программный подход. В платформе 1С существует метод ПолучитьСтруктуруХраненияБазыДанных(), который позволяет сопоставить объекты метаданных с именами таблиц СУБД. Проанализируем пример кода, который помогает динамически определять имена таблиц:
// Пример получения структуры хранения для анализа имен таблиц
СтруктураХранения = ПолучитьСтруктуруХраненияБазыДанных( , Истина);
Для Каждого Таблица Из СтруктураХранения Цикл
Если Таблица.ИмяМетаданных = "Справочник.Номенклатура" Тогда
ИмяТаблицыВСУБД = Таблица.ИмяТаблицыХранения;
Сообщить("Физическое имя таблицы номенклатуры: " + ИмяТаблицыВСУБД);
КонецЕсли;
КонецЦикла;
Используя этот метод в целевой базе (например, через HTTP-сервис), можно передавать актуальные имена таблиц в базу-приемник и программно обновлять настройки ВнешнийИсточникДанных.
Важно понимать критическую особенность работы через ВИД: вы работаете с данными на уровне СУБД, полностью игнорируя программный код целевой базы 1С. Рассмотрим, к чему это приводит при попытке записи данных:
ПередЗаписью или ПриЗаписи не сработают. Если в базе была логика заполнения реквизитов или проверки условий, она будет проигнорирована.По этой причине использование ВИД настоятельно рекомендуется только для чтения данных, например, для построения консолидированной отчетности в реальном времени.
Разберем, когда использование ВИД действительно оправдано по сравнению с другими методами связи двух баз:
1. ВИД (Внешние источники данных): Это самый быстрый способ чтения огромных массивов данных (миллионы строк). Платформа обращается напрямую к SQL, минуя уровень объектной модели 1С. Скорость будет максимально возможной для вашей сети и дисковой подсистемы.
2. COM-соединение: Старый и проверенный метод. Плюсы: соблюдается бизнес-логика. Минусы: очень медленно, требует установки 1С на сервере, сложно отлаживать, потребляет много оперативной памяти (создается отдельный сеанс 1С).
3. OData (REST API): Современный стандарт. Работает через веб-сервер.
// Пример обращения к OData
Соединение = Новый HTTPСоединение("server_address", , "user", "pass");
Запрос = Новый HTTPЗапрос("/base_name/odata/standard.odata/Catalog_Номенклатура");
Ответ = Соединение.Получить(Запрос);
Посмотрим на процесс настройки ВИД по шагам:
ВнешнийИсточникДанных. В свойствах укажите строку соединения. Помните, что строка соединения на сервере и на клиенте может отличаться, если вы используете локальные DSN.ПолучитьСтруктуруХраненияБазыДанных() для поиска соответствий).Число, Строка и особенно Дата.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВнешнийИсточникДанных.НашаВнешняяБаза.Таблица.Товары";
Результат = Запрос.Выполнить();
Мы проанализировали ситуацию и выяснили, что использование внешних источников данных для связи двух баз 1С — это задача, требующая глубокого понимания структуры хранения данных 1С. Если ваша база файловая — используйте HTTP-сервисы или COM. Если база на SQL и вам нужно быстро читать данные для отчетов — ВИД будет лучшим решением, но будьте готовы к ручной настройке соответствия имен таблиц и обработке специфических типов данных 1С.