Подключение к внешнему источнику данных 1с

Обновлено: 02.07.2024

Внешние источники данных — это прикладные объекты конфигурации. Они позволяют работать с внешними базами данных, не основанными на 1С:Предприятии. Благодаря этим объектам конфигурации информацию из внешних баз можно использовать внутри прикладного решения так же, как будто бы она хранится в самой информационной базе.

Внешний источник может получать данные из ODBC-источников в операционных системах Windows и Linux, причем при работе с СУБД Microsoft SQL Server, IBM DB2, PostgreSQL и Oracle Database обеспечиваются полные возможности языка запросов. Кроме этого внешние источники данных позволяют подключить к прикладному решению многомерные источники данных, такие как:
  • Microsoft Analysis Services;
  • Oracle Essbase;
  • IBM InfoSphere Warehouse.

При работе с другими СУБД некоторые конструкции языка запросов могут не работать, т. к. они ограничены возможностями того ODBC-драйвера, который используется.

Внешний источник данных состоит из набора таблиц.

Внешний источник данных

Таблицы внешнего источника данных можно описать вручную, или с помощью конструктора.

Внешний источник данных

Конструктор, используя строку соединения, может подключится к внешней базе данных и предоставить список таблиц, доступных для добавления во внешний источник.

Внешний источник данных

Каждая таблица, по сути, является самостоятельным объектом конфигурации. Она содержит набор полей, для неё могут быть определены формы, созданы команды и заданы макеты.

Внешний источник данных

Таблицы внешних источников используются в конфигурации точно так же, как и таблицы любых других объектов конфигурации.

Например, платформа автоматически генерирует для них формы, или же форму разработчик может создать самостоятельно.

Внешний источник данных

К данным этих таблиц можно обращаться с помощью языка запросов.

Внешний источник данных

Эти таблицы можно использовать в отчётах на системе компоновки данных.

Внешний источник данных

Также на элементы этих таблиц можно ссылаться как на любые другие данные объектного типа. Например, как на элементы справочников или документы.

Релиз 8.2.14.533 - наконец-то более-менее стабильный вариант 14-го релиза платформы. Наконец-то представился случай испытать в деле замечательную возможность - "внешние источники данных".

Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С, и при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес-приложений, с твердой уверенностью скажет вам, что ему нравится больше всего в 1С. Конечно конструктор запросов - самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал. А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту "бочку мёда" насыпана куча "ложек дёгтя". Обо всём по порядку:

1) Настройка и использование - без "танцев с бубном" не получится

a) Добавляете внешний источник данных - вроде ничего сложного.

б) Ставите галочку "Выбрать из списка" - обязательно - это нужно, чтобы проверить работоспособность уже вначале, и избавить себя от лишних заморочек.

- обязательно нажимаем ". " - подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже

А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
Это драйвер ODBC - в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекомендация, но выбирайте самый древний или самый общий драйвер в случае, если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекомендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.

д) Стандартные диалоги выбора Сервера

е) На вопрос сохранения пароля рекомендую ответить "да", иначе так и не получится это дело запустить.

ж) Выбираете таблицу и реквизиты. замечательная возможность - её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных

з) А теперь запускаете, открываете конструктор запросов - выбираете тупо все записи из таблицы и ОПА - ошибка. Что делать? Если у вас управляемый интерфейс - заглянуть в меню сервис, а если обычный.
Я лично использовал вот такой код:

Параметры = ВнешниеИсточникиДанных . DAX . ПолучитьОбщиеПараметрыСоединения ();
Параметры . АутентификацияСтандартная = Истина;
Параметры . ИмяПользователя = "sa" ;
Параметры . Пароль = "pas" ;
Параметры . СтрокаСоединения = "DRIVER=;SERVER=servet;UID=sa;PWD=;DATABASE=database" ;
Параметры . СУБД = "MSSQLServer" ;

ВнешниеИсточникиДанных . DAX . УстановитьОбщиеПараметрыСоединения ( Параметры );
ВнешниеИсточникиДанных . DAX . УстановитьПараметрыСоединенияПользователя ( ИмяПользователя (), Параметры );
ВнешниеИсточникиДанных . DAX . УстановитьПараметрыСоединенияСеанса ( Параметры );

ВнешниеИсточникиДанных . DAX . УстановитьСоединение ();

Может каких-то кусков и не нужно, но это работает. Выполнить код нужно ОДИН РАЗ. После чего будет нормально подключаться. мистика конечно - зачем это было нужно не понятно.

2) Источники данных только для чтения
Да, чудес не бывает. но иногда так хочется.

3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал

Как же так. то, чего так ждали и уже представляли и облизывались, как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём - сгруппируем, вставим в отчет, а не тут-то было.

Но, естественно, опытных людей это не останавливает. какая мысль пришла в голову? Правильно - временные таблицы:

4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ

А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят "чтобы жизнь раем не казалась" сделать :).

5) Можно использовать только в соединениях СКД
Для тех кто не знает - это в СКД на вкладке "Связи наборов данных". Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка "Условие связи" и "Параметр связи". Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает "условие связи"? Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле "Выражение" - в большинстве случаев этого хватает. вот только как-то не очень просто получается.

Итого ранее эта задача решалась где-то так:

ДатаНач = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы [ 5 ]. Значение ;
ДатаКон = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы [ 4 ]. Значение ;
Если ДатаКон > '20100101' Тогда
ДатаКон = '20100101' ;
КонецЕсли;

КЧ = Новый КвалификаторыЧисла ( 15 , 2 );
КС = Новый КвалификаторыСтроки ( 255 );

МассивЧисло = Новый Массив ();
МассивЧисло . Добавить ( Тип ( "Число" ));

МассивСтрока = Новый Массив ();
МассивСтрока . Добавить ( Тип ( "Строка" ));

МассивДата = Новый Массив ();
МассивДата . Добавить ( Тип ( "Дата" ));

//В таблицу будем заполнять бухгалтерскую себестоимость
ТипЧисло = Новый ОписаниеТипов ( МассивЧисло ,, КЧ );
ТипСтрока = Новый ОписаниеТипов ( МассивСтрока ,, КС );
ТипДата = Новый ОписаниеТипов ( МассивДата );

//таблица для загрузки данных из SQL
ТЗ = Новый ТаблицаЗначений ();
ТЗ . Колонки . Добавить ( "НоменклатураКод" , ТипСтрока );
ТЗ . Колонки . Добавить ( "Qnty" , ТипЧисло );
ТЗ . Колонки . Добавить ( "Период" , ТипДата );

ТЗ . Индексы . Добавить ( "Период" );

//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports" ;
Connection = Новый COMОбъект ( "ADODB.Connection" );
Command = Новый COMОбъект ( "ADODB.Command" );
RecordSet = Новый COMОбъект ( "ADODB.RecordSet" );
Дата = "" ;
Попытка
Connection . Open ( СокрЛП ( СтрокаПодключения ));
Command . ActiveConnection = Connection ;
Command . CommandText = "Select * from PH where period >= '" + Строка ( Формат ( ДатаНач , "ДФ=ггггММдд" )) + "' and period <= '" + Строка ( Формат ( ДатаКон , "ДФ=ггггММдд" )) + "'" ;
RecordSet = Command . Execute ();
RecordSet . MoveFirst ();
Исключение
Возврат ТЗ ;
КонецПопытки;

Пока RecordSet . EOF = Ложь Цикл
Строка = ТЗ . Добавить ();
Строка . НоменклатураКод = RecordSet . Fields ( RecordSet . Fields . Item ( 1 ). Name ). Value ;
Строка . Qnty = RecordSet . Fields ( RecordSet . Fields . Item ( 12 ). Name ). Value ;
Строка . Период = RecordSet . Fields ( RecordSet . Fields . Item ( 13 ). Name ). Value ;
RecordSet . MoveNext ();
КонецЦикла;

Запрос = Новый Запрос ();
ВрТаблица = Новый МенеджерВременныхТаблиц ();
Запрос . МенеджерВременныхТаблиц = ВрТаблица ;
Запрос . УстановитьПараметр ( "врТаблицаДанных" , ТЗ );
Запрос . УстановитьПараметр ( "ДатаНач" , ДатаНач );
Запрос . УстановитьПараметр ( "ДатаКон" , ДатаКон );
Запрос . Текст = "ВЫБРАТЬ
| врТаблицаДанных.НоменклатураКод,
| врТаблицаДанных.Qnty,
| врТаблицаДанных.Период
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
| &врТаблицаДанных КАК врТаблицаДанных
|ГДЕ
| врТаблицаДанных.Период >= &ДатаНач
| И врТаблицаДанных.Период <= &ДатаКон" ;
Запрос . Выполнить ();
ТЗ = Неопределено;

Запрос = Новый Запрос ;
Запрос . МенеджерВременныхТаблиц = ВрТаблица ;
Запрос . Текст = "Здесь запрос с участием верменной таблицы" ;

Результат = Запрос . Выполнить ();
Возврат Результат ;

ВнешнийНабор = ИнициализироватьИсточникДанных ();
НаборДанных = Новый Структура ();
НаборДанных . Вставить ( "ТаблицаSQL" , ВнешнийНабор );
ТиповыеОтчеты . СформироватьТиповойОтчет ( ЭтотОбъект , Результат , ДанныеРасшифровки , ВыводВФормуОтчета , НаборДанных );

Собственно строчек кода немного и они достаточно стандартны. при этом можно пользоваться полным функционалом конструктора запросов, а в СКД отдать только функцию КОМПОНОВКИ ДАННЫХ

Но на вид чуть, конечно, не так красиво. да и выгрузка в таблицу значений каждый раз - нужно код писать и проверять, не ошибся ли в названии реквизитов. а то, что нам дали в 1С, выглядит как-то половинчато. Я ещё не определился, чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.

Внешние источники данных (добавление, изменение, удаление) на примерах

В версии платформы 8.3.5.1068 (и позднее) появилась возможность добавления, изменения и удаления данных во внешних источниках программными средствами 1С. Примеры данной возможности представлены в данной статье.

Для того, чтобы запись во внешние источники стала возможной, компания 1С добавила новые свойства таблицам данных и полям внешних источников:

  • Для всей таблицы - свойство ТолькоЧтение. ТолькоЧтение = Истина означает, что изменение данных в этой таблице невозможно;
  • Для отдельных полей таблицы - свойства ТолькоЧтение, РазрешитьNull и ЗначениеЗаполнения:
    • ТолькоЧтение = Истина означает, что изменение данных в этом поле невозможно;
    • РазрешитьNull = Истина означает, что в данное поле может быть записано значение NULL;
    • ЗначениеЗаполнения содержит стандартное значение этого поля (если такое существует).

    Эти свойства вы (при описании таблиц вручную) или платформа (при создании таблиц конструктором) можете использовать следующим образом.

    • ТолькоЧтение = Истина устанавливать, например, для представлений (view), таблиц, получаемых на основе выражения (результат функции) и подобных. Данные в таких таблицах изменять нельзя;
    • ТолькоЧтение = Истина указывать для полей, устанавливаемых автоматически (AUTOINCREMENT), вычисляемых полей и подобных. Данные в таких полях изменять нельзя;
    • РазрешитьNull = Истина устанавливать для всех полей, кроме ключевых, и тех, которые во внешнем источнике описаны как NOT NULL;
    • ЗначениеЗаполнения поля устанавливать в том случае, когда во внешнем источнике указано стандартное значение этого поля (значение DEFAULT).

    Добавлять, изменять и удалять данные во внешних источниках можно с помощью встроенного языка или интерактивно. Во встроенном языке для этого используются следующие методы менеджера таблицы:

    • СоздатьНаборЗаписей() - для необъектных таблиц;
    • Новый метод СоздатьОбъект() - для объектных таблиц.

    Соответственно у объектов ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаОбъектпоявились новые методы Записать() и Удалить().

    Добавление данных

    При добавлении данных во внешний источник вы создаёте объект (или набор записей), устанавливаете значения полей и записываете. При этом есть некоторые особенности, о которых полезно знать.

    Например, при попытке установить значение поля, у которого ТолькоЧтение = Истина, будет выдана ошибка. А при непосредственной записи в базу данных в выражении INSERT такие поля будут пропущены. В остальные поля записываются те значения, которые вы им присвоили. Поэтому значения Null и значения по умолчанию нужно присваивать полям в явном виде.

    Далее представлен небольшой пример. В нём данные добавляются в объектную таблицу shop_feature, у которой существует два поля:

    • id (РазрешитьNull = Истина);
    • name (РазрешитьNull = Истина);

    Выполнение оператора Записать() приведёт к тому, что сначала будет вызван обработчик события ПередЗаписью, затем выполнена физическая запись в таблицу внешнего источника (INSERT), затем будет вызван обработчик события ПриЗаписи.

    С ключевым полем таблицы внешнего источника вы можете поступать следующим образом. Если ключевое поле доступно для изменения, то тогда вы «вручную» задаёте его значение перед записью. Если изменение ключевого поля запрещено, то платформа самостоятельно получит ключ в INSERT или непосредственно после. Вы можете вмешаться в этот процесс с помощью метода УстановитьСсылкуНового() до физической записи (в обработчике события ПередЗаписью) или непосредственно после физической записи (в обработчике события ПриЗаписи).

    Изменение данных

    При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь.

    Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().

    Удаление данных

    При удалении данных выполняется непосредственное удаление строки из таблицы базы данных. При этом поиск ссылок на удаляемый объект не выполняется. Если такая функциональность нужна, вы можете запрограммировать её самостоятельно в обработчике события ПередУдалением().

    Транзакции

    Чтение данных внешних источников, как и ранее, выполняется вне транзакции, а при записи платформа открывает неявную транзакцию. При этом и чтение, и запись вы можете выполнять и в явных транзакциях с помощью методов объектаВнешнийИсточникДанныхМенеджер:

    Блокировки

    Для управления блокировками рекомендуется использовать свойство внешнего источникаРежимУправленияБлокировкойДанных:

    а также свойство таблицы внешнего источника УровеньИзоляцииТранзакций:


    Кроме этого, можно самостоятельно задать уровень блокировок в методе НачатьТранзакцию().

    Дополнил типовую статью примерами) Будет больше времени - добавлю больше примеров.

    В новой редакции платформы 1С 8.2.14 появилась возможность устанавливать связь с внешними источниками данных. У меня была идея написать программу для прямой работы с базой данных на нашем сайте из 1С:Предприятия 8

    По шагам надо сделать следующее:

    1. Скачиваем ODBC коннектор с сайта поставщика mysql .
    2. Устанавливаем его на компьютер.
    3. Заходим в конфигуратор 1С и добавляем новый внешний источник данных.


    4. Добавляем внешнюю таблицу:


    5. Указываем режим автоматического формирования списка таблиц


    6. Указываем параметры соединения. Пишем руками:

    и вбиваем логин и пароль для доступа к базе mysql

    7. Если все ок, то мы увидим список таблиц из базы данных сайта.


    8. Выбираем нужную таблицу галочкой


    9. И получаем ее в дереве метаданных.


    10. Создаем обработку для тестирования с одной процедурой:

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

    11. Ставим точку останова на конец процедуры и запускаем обработку в режиме предприятия.


    p.s. мы получили данные из внешней таблицы mysql средствами языка 1С. Что самое интересное, внешние таблицы доступны в конструкторе запроса.

    upd: как можно изменять данные через ODBC я написал в этом посте.

    Специальные предложения

    Electronic Software Distribution

    Интеграция 1С с системой Меркурий

    Алкогольная декларация

    Готовые переносы данных

    54-ФЗ

    Управление проектом на Инфостарте

    Траектория обучения 1С-разработчика

    В новой редакции платформы 1С 8.2.14 появилась возможность устанавливать связь с внешними источниками данных. У меня была идея написать программу для прямой работы с базой данных на нашем сайте из 1С:Предприятия 8

    Очень интересная возможность новой платформы, да все никак руки не доходят ее попробовать.
    Хочется уточнить один вопрос: если я установлю драйвер MySQL, а потом настрою его в "Администратор источников данных ODBC" где-нибудь в "Пользовательский DSN" или "Системный DSN", соответственно прописав там параметры подключения - смогу ли я потом подключаться к этому источнику просто по имени этой настройки? И понадобится ли заново прописывать настройки подключения к источнику данных в каждой обработке при таком подключении? (1) я экспериментировал, параметры подключения вводил дважды:
    1) в режиме конфигуратора для автоматического создания структуры таблиц
    2) в режиме предприятия для отображения динамического списка записей таблиц.
    Параметры вводились только один раз, они запоминаются в каком-то менеджере внешних источников данных, который доступен через "все функции" -> Стандартные -> Управление внешними источниками данных (3) Автор пишет "Тут необходимо понимать что в обработке надо обязательно заново прописывать параметры соединения с внешней базой данных, они не хранятся в конфигурации.". Получается, что хранятся? И как потом строка подключения из обработки выглядит? Можно пример? (5) Спасибо за дополнительную информацию. Только Ваше подключение практически идентично авторскому. И парочка примечаний "Важно". Выходит к внешнему источнику данных через подключение, описанное в (1), встроенными средствами платформы обратиться нельзя.
    Ладно, пока сам не попробую приставать больше не буду. (1) V_V_V, насчёт подключения с использованием DSN: там просто строка подключения будет иметь вид "DSN=<Имя-DSN>;".
    Теоретически, так можно избавиться от необходимости указывать логин/пароль в коде. Это я не пробовал, надо промоделировать :) Пока я прописываю параметры в каждой обработке. очень полезная возможность новой версии платформы представлена наглядно в очень полезной публикации этого сообщества :) спасибо :) Да, все это безусловно хорошая вещь - внешние источники данных.
    Я вначале сильно обрадовался когда узнал что 1С сделала такой механизм.
    Но потом был сильно огорчен когда узнал что с этими источниками можно работать только на чтение.:(

    (9) Spacer,
    Ну собственно не совсем понятно в чем беда. Изменять данные через ODBC вроде всегда можно было. А тут вся фишка в том что с таблицей через запросы можно работать. Вроде запросы всегда только на чтение в 1С использовались :)

    Набросаю сегодня завтра пример как я на сайте в данные меняю. Дам ссылку тут.

    upd. На инфостарт не в силах перепостить сейчас, потому кому интересно как менять данные через ODBC, смотрите тут .
    Попозже оформлю на инфостарте статью.

    Да, все это безусловно хорошая вещь - внешние источники данных.

    Я вначале сильно обрадовался когда узнал что 1С сделала такой механизм.

    Но потом был сильно огорчен когда узнал что с этими источниками можно работать только на чтение.:(


    Обидно что только на чтение, я уже размечтался что базу данных своего сайта смогу прикрутить и из 1С грузить информацию на сайт Как то еще на тестовом релизе пытался связать с базой данных под управлением СУБД LETODB.Так и не получилось победить грабли вида иррациаональных чисел, и если среди DBF файлов базы имелись "пароленные" dbfки их прочитать так и не удалось, пока dbf редактором не исправил заголовок файла. а была такая надежда :( За статью безусловно плюс. Как только появился 14 релиз 8.2 я пыталась подключить через внешние таблицы екселевский файл, пока результат отрицательный. У кого-нибудь получилось? мне бы было интересно как подключиться к файлу базы данных на сайте (например sqlite) - не задавались таким вопросом?

    (15) aximo,
    Я думаю что принцип соединения аналогичный.
    Сначала качаем ODBC драйвер для sqlite.

    Потом из 1С прописываем сотроку соединения по аналогии

    Под рукой нет такой базы чтобы проверить, но суть примерно такая.

    sqlite - это файл. допустим он лежит на запароленном фтп. мне кажеться, что подключение будет несколько иное. кто знает - отпишитесь

    Если база на запороленном ftp то надо вероятно другими средствами делать доступ, например поднимать ssh тонель и через него самбой шарить файл базы данных. Ну и строка подключения будет какой то такой.

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

    А они там не хранятся :)

    Потестировал на MySQL. Вывод, бестолковая приблуда, зачем промежуточный механизм? какие плюсы использования. А может вы где-нибудь описание таблиц и полей bitrix выложите? Раз уже занимались этой темой.

    Парни что я делаю не так? поставил себе последнюю платформу(8.3.5.1146), подключил базу через внешний источник данных. Если в конструкторе запросов выбираю поле без нижнего подчеркивания - то все работает. Если выбираю поле с нижним подчеркиванием, то выдает ошибку:

    : Ошибка при вызове метода контекста (Выполнить)
    Таблица = Запрос.Выполнить().Выгрузить();
    по причине:
    Ошибка выполнения запроса
    по причине:
    Ошибка внешней базы данных:
    ошибка при выполнении запроса
    по причине:
    Ошибка ODBC. SQLSTATE: 42000
    Номер ошибки: 1064
    Описание: [MySQL][ODBC 5.1 Driver][mysqld-5.5.25]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"section_id"
    FROM lesson_article T1' at line 2

    Читайте также: