Цель данной статьи – показать принципы обмена данными между базой 1С и внешним источником данных на конкретном примере.
Причем тип внешнего источника данных здесь не так уж и важен. Источником могут выступать базы данных, работающие под управлением MS SQL Server или других СУБД, таблиц Exсel, а также других источников, к которым можно подключиться с помощью строки соединения ODBC.
Задачи синхронизации и обмена данными с внешней БД возникают практически на любом предприятии, это может быть:
- Загрузка данных о заказах и online-оплатах с сайта
- Загрузка данных из внешней системы (произведенная продукция, НСИ, бюджеты)
- Обмен данными с внешней системой – передача данных о заказах.
- Формирование отчетности, основанной на данных внешнего источника или на данных различных источников (например, базы 1С и базы SQL Server).
В этой статье мы рассмотрим возможность хранения данных внешней СУБД в объекте «1С:Предприятие 8». Например, к справочнику можно добавить реквизит, который будет ссылаться на таблицу внешнего источника. Таким образом данные внешнего источника становятся частью информационной базы 1С.
Кроме того, мы рассмотрим синхронизацию (двухсторонний обмен), основанную на совместном хранении данных из разных источников в базе 1С. То есть в базе 1С будут храниться настройки сопоставления данных базы 1С и таблицы внешнего источника для последующей загрузки по нашим правилам.
Штатные механизмы платформы «1С:Предприятие 8»
В версии платформы 8.2.14 появился объект метаданных Внешние источники данных.
У этого объекта существует множество применений:
- Различные интеграционные решения, основанные на хранении в реквизитах объектов 1С ссылки на таблицу из внешнего источника данных
- Получение информации из таблиц внешних источников данных
- Получение аналитических данных из внешних источников данных по технологии OLAP (доступно с версии платформы 8.3.5)
- Выполнение функций и хранимых процедур внешнего источника данных (доступно с версии платформы 8.3.4)
- Запись во внешние источники данных (доступно с версии платформы 8.3.5)
- Использование в отчетах на СКД, причем для каждого набора данных может быть указан свой источник. Например, один набор может получать данные из базы 1С, а другой из базы MS SQL Server, затем эти наборы соединяются и выводятся в один отчет
- Использование в качестве источника данных для динамических списков.
Ранее задачи по получению информации из внешних источников данных решались с помощью подключения через COM-соединение. Для простого переноса данных (например, из таблицы Excel) он и сейчас используется, так как в этом случае не нужно вносить изменения в конфигурацию и можно использовать этот механизм во внешних обработках или отчетах.
Но для других, более сложных, задач по интеграции рекомендуется использовать внешние источники данных. Разработчики платформы реализовали удобный функционал для быстрой интеграции 1С с другими СУБД.
Хотя в некоторых случаях, например, при удаленном подключении к внешней информационной базе (это может быть интернет-магазин, СУБД на MySQL), лучше использовать web-сервисы или http-сервисы. При их использовании нет прямого доступа к базе, а только предоставляются нужные сервисы, что значительно лучше в плане безопасности.
Другое преимущество веб-сервисов – работа в модели клиент-сервер, когда клиент посылает запрос, а сервер мгновенно его обрабатывает и передает результат обратно.
Решаемая задача
Рассматриваемая задача является учебной и внешний источник данных в ней используется как инструмент для синхронизации и загрузки данных в базу 1С.
Задача будет решаться в конфигурации – Демо «Управляемое приложение» 8.3, а в качестве внешнего источника данных будет использоваться учебная база MS SQL Server – «AdventureWorks».
Если кто-то захочет воспроизвести данный пример на своем компьютере, то конфигурацию и учебную базу можно легко найти в интернете. Пробную версию MS SQL Server (Evaluation) можно установить бесплатно (на 180 дней) или использовать бесплатную версию Express.
Суть решаемой задачи в том, чтобы перенести данные по товарам из учебной базы SQL Server в базу 1С, причем каждый товар должен быть помещен в определенную группу в зависимости от настроек в базе 1С.
Рассмотрим структуру таблицы MS SQL Server, а также связи между ними. В базе «AdventureWorks» используются таблицы Production.Product, Production.ProductSubcategory и Production.ProductCategory – это товары и их классификация по категориям и субкатегориям.
Связи между таблицами приведены ниже на схеме:
Содержимое связанных таблиц можно посмотреть с помощью запроса:
Use AdventureWorks2014; – изменить на свою базу, в зависимости от версии SELECT P.Name AS Product, P.ProductSubcategoryID AS SubcategoryID, PSubCateg.Name AS SubCategory, PCateg.ProductCategoryID AS CategoryID, PCateg.Name AS Category FROM AdventureWorks2014.Production.Product AS P JOIN Production.ProductSubcategory AS PSubCateg ON P.ProductSubcategoryID = PSubCateg.ProductSubcategoryID JOIN Production.ProductCategory AS PCateg ON PSubCateg.ProductCategoryID = PCateg.ProductCategoryID WHERE P.ProductSubcategoryID IS NOT NULL;
Результат выполнения представлен на скриншоте:
Нам нужно для каждой строки таблицы создать в базе 1С элемент справочника «Товары» с наименованием из колонки «Product». Значение поля «SubCategory» мы будем хранить в новом реквизите со ссылкой на таблицу внешнего источника данных, а по значению колонки «Category» помещать созданные элементы в определенную группу.
Таблица «ProductCategory» хранит категории товаров, от которых и зависит, в какую группу мы будем записывать товар. Но зависимость здесь не прямая: группа из «ProductCategory» сопоставляется с существующей группой из справочника «Товары» в регистре сведений.
Например, таблица «ProductCategory» содержит следующие значения:
В 1С заполнен регистр сведений:
Тогда строки из таблицы «Product» с категорией «Bikes» попадают при загрузке в уже существующую в справочнике «Товары» группу «Велосипеды», «Clothing» – в группу «Одежда» и т.д.
Подключение к базе MS SQL Server
Сейчас, когда определена общая концепция решения задачи, можно переходить к ее реализации. В первую очередь нужно подключиться к внешнему источнику данных и настроить его таблицы.
Настроить подключение к внешнему источнику данных в 1С достаточно просто, хотя, конечно, и здесь есть свои особенности.
После добавления внешнего источника данных в конфигураторе (в дереве объектов раздел «Внешние источники данных»), нужно также добавить таблицы, с которыми предстоит работать. Сделать это очень удобно с помощью конструктора, который появляется при добавлении таблицы. С помощью конструктора можно настроить строку подключения, указать логин и пароль для подключения к СУБД.
Для MS SQL Server (при стандартной аутентификации) строка подключения выглядит так:
«DRIVER={SQL Server}; SERVER=ServerName;UID=UserName;PWD=Psw;DATABASE=BaseName;
LANGUAGE=русский»
В данном случае ServerName, UserName, Psw, BaseName – это имя сервера, логин, пароль и имя базы данных, к которой подключаемся. Если аутентификация выполняется средствами ОС, то строка подключения будет выглядеть иначе:
«DRIVER={SQL Server};SERVER=ServerName;Trusted_Connection=yes;DATABASE=BaseName;LANGUAGE=русский»
Логин и пароль здесь не используются, но включен параметр Trusted_Connection. Для получения строки подключения к другим источникам данных (Excel, Access, другие СУБД) можно воспользоваться сайтом https://www.connectionstrings.com (на английском языке).
Если подключение проходит успешно, то на следующем шаге отображается конструктор таблиц с перечнем таблиц и полей подключенного источника данных.
Здесь следует отметить таблицы, которые нам нужны, а также обязательно проверить правильность определения системой ключевых полей (в данном случае оно должно совпадать с полем первичного ключа таблицы MS SQL Server).
Если не указать поле ключа, то данная таблица считается необъектными данными, т.е. таблицей, в которой нельзя однозначно идентифицировать строку по какому-либо полю. В нашем случае каждая строка таблицы идентифицируется первичным ключом в SQL Server, поэтому это будут объектные данные, что и нужно обязательно указать.
Кроме того, можно указать поле представления, если нужно, чтобы система выводила это поле в качестве представления ключевого поля. В нашем примере поле Name будет отображаться в форме выбора таблицы внешнего источника данных и в регистре сведений, поэтому нужно обязательно указать его в качестве представления.
В общем, можно сказать, что ключевое поле и представление таблицы внешнего источника данных аналогичны ссылке и представлению объектов 1С, например справочника.
По условию задачи для хранения настроек сопоставления используется регистр сведений с измерением «Группа товаров» (тип – справочник «Товары») и ресурсом «Категория» (тип – ссылка на таблицу категорий внешнего источника данных). Значение свойства «Выбор групп и элементов» для измерения «Группа товаров» установлено в «Группы», т.к. выбор элементов нам не нужен.
Для хранения подкатегории из таблицы «ProductSubcategory» базы SQL Server в справочнике «Товары», мы добавим реквизит «ПодкатегорияВИД», который будет ссылаться на данные внешнего источника данных (тип – ВнешнийИсточникДанныхТаблицаСсылка.Демо.Production_ProductSubcategory).
После того как добавлены необходимые объекты в конфигурацию и выполнены настройки подключения к базе MS SQLServer, казалось бы, можно двигаться дальше, однако это еще не все.
Настроить подключение к внешнему источнику данных в режиме конфигуратора недостаточно для работы. Также нужно указать настройки подключения в пользовательском режиме и подключиться к внешнему источнику данных в режиме «1С:Предприятие». Вызывается диалог подключения через команду «Все функции».
Настройки подключения из конфигуратора сюда не переносятся, нужно указывать все по-новому.
Этот способ никак нельзя назвать удобным, т.к. при каждом запуске «1С:Предприятие 8» приходится выполнять подключение.
Как вариант, можно хранить настройки подключения в регистре сведений и подключаться к внешнему источнику данных программно при запуске конфигурации.
В данном случае в конфигурацию был добавлен общий модуль «Интеграция» и регистр сведений для хранения настроек подключения. Регистр сведений состоит из четырех ресурсов: «Сервер», «Логин», «Пароль», «ИмяВнешнейБД» и «АутентификацияОС». В модуль «Интеграция» включены функция и процедура для подключения:
Функция ПолучитьПараметрыПодключенияКВнешнейИБ() Экспорт; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НастройкиПодключения.Сервер, | НастройкиПодключения.Логин, | НастройкиПодключения.Пароль, | НастройкиПодключения.ИмяВнешнейБД, | НастройкиПодключения.АутентификацияОС |ИЗ | РегистрСведений.НастройкиПодключенияКВнешнемуИсточникуДанных КАК НастройкиПодключения"; Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Сообщить("Не указаны настройки для подключения к внешнему источнику данных"); Возврат Неопределено; КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); ПараметрыПодключения = Новый Структура; Если Выборка.АутентификацияОС Тогда ПараметрыПодключения.Вставить("СтрокаСоединения", "DRIVER={SQL Server};SERVER="+Выборка.Сервер+";Trusted_Connection=yes;DATABASE="+Выборка.ИмяВнешнейБД+";LANGUAGE=русский"); ПараметрыПодключения.Вставить("Логин", ""); ПараметрыПодключения.Вставить("Пароль", ""); Иначе ПараметрыПодключения.Вставить("СтрокаСоединения", "DRIVER={SQL Server};SERVER="+Выборка.Сервер+";"+"UID="+Выборка.Логин+";PWD="+Выборка.Пароль+";DATABASE="+Выборка.ИмяВнешнейБД+";LANGUAGE=русский"); ПараметрыПодключения.Вставить("Логин", Выборка.Логин); ПараметрыПодключения.Вставить("Пароль", Выборка.Пароль); КонецЕсли; ПараметрыПодключения.Вставить("АутентификацияОС", Выборка.АутентификацияОС); Возврат ПараметрыПодключения; КонецФункции Процедура ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer(СтрокаСоединения, Логин, Пароль, АутентификацияОС) Экспорт ПараметрыСоединения = ВнешниеИсточникиДанных.Демо.ПолучитьОбщиеПараметрыСоединения(); ПараметрыСоединения.АутентификацияСтандартная = Не АутентификацияОС; ПараметрыСоединения.АутентификацияОС = АутентификацияОС; ПараметрыСоединения.ИмяПользователя = Логин; ПараметрыСоединения.Пароль = Пароль; ПараметрыСоединения.СтрокаСоединения = СтрокаСоединения; ПараметрыСоединения.СУБД = "MSSQLServer"; Попытка ВнешниеИсточникиДанных.Демо.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(),ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьПараметрыСоединенияСеанса(ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьСоединение(); Сообщить("Подключение к внешнему источнику данных выполнено успешно"); Исключение Сообщить("Не удалось подключиться к внешнему источнику данных"); КонецПопытки КонецПроцедуры
В модуль управляемого приложения, для события «ПриНачалеРаботыСистемы» был добавлен код:
ПараметрыПодключения = Интеграция.ПолучитьПараметрыПодключенияКВнешнейИБ(); Если ПараметрыПодключения <> Неопределено Тогда Интеграция.ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer(ПараметрыПодключения.СтрокаСоединения, ПараметрыПодключения.Логин, ПараметрыПодключения.Пароль, ПараметрыПодключения.АутентификацияОС); КонецЕсли;
Теперь при запуске приложения подключение выполняется автоматически. То есть сейчас можно настроить соответствия в регистрах сведений и приступить непосредственно к написанию программного кода по загрузке данных.
Загрузка данных из внешнего источника данных
Одно из основных ограничений внешних источников данных, на мой взгляд, это то, что нельзя в рамках одного запроса использовать разные источники данных. То есть нельзя использовать в одном запросе обращение к таблицам внешних источников данных и таблицам информационной базы 1С.
В запросах можно использовать временные таблицы, но с ограничениями, а в контексте данной задачи одно из ограничений очень существенное. Суть его в том, что временная таблица создается в базе данных внешнего источника, а значит, использовать ее совместно с таблицами базы 1С нельзя.
Здесь я сделаю небольшое отступление, чтобы осветить этот момент более подробно.
Временную таблицу нельзя создать в базе 1С, т.е. конструкция запроса ПОМЕСТИТЬ ВТ работать не будет. Создать временную таблицу можно только в СУБД внешнего источника, следующей командой:
ПОМЕСТИТЬ ВнешнийИсточникДанных.<ИмяВнешнегоИсточникаВКонфигураторе>.ВременнаяТаблица.<ИмяВТ>, например: ВнешнийИсточникДанных.Демо.ВременнаяТаблица.Продукция.
Стоит отметить, что создавать временные таблицы можно только в СУБД, где поддерживается эта возможность, например в MS SQL Server.
Возвращаясь к задаче, вспоминаем, что, для того чтобы сопоставить данные из базы 1С и MS SQL Server, нам нужно обойти ограничение при использовании соединения таблиц разных источников, вопрос – как это сделать?
Было принято решение использовать выгрузку таблицы внешнего источника данных в таблицу значений с последующей загрузкой и помещением ее во временную таблицу (базы 1С). В данном случае временная таблица создается в базе 1С и ничто не мешает ее использовать в соединениях с другими таблицами. Создаем нужную нам таблицу значений, используя следующий код:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100 | Production_Product.Name КАК Товар, | Production_ProductSubcategory.Ссылка КАК ПодкатегорияИД, | Production_ProductSubcategory.ProductCategoryID КАК КатегорияИД |ИЗ | ВнешнийИсточникДанных.Демо.Таблица.Production_Product КАК Production_Product | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.Демо.Таблица.Production_ProductSubcategory КАК Production_ProductSubcategory | ПО Production_Product.ProductSubcategoryID = Production_ProductSubcategory.Ссылка |ГДЕ | Production_Product.ProductSubcategoryID ЕСТЬ НЕ NULL "; ТЗ_Товары = Запрос.Выполнить().Выгрузить();
Здесь выполняется запрос, соединяющий таблицы внешнего источника данных, причем запрос возвращает не только наименование товара, но и его подкатегорию и категорию. Затем результат запроса выгружается в таблицу значений. Для демонстрации выгружаются только первые 100 строк.
Далее справочник «Товары» соединяется с полученной таблицей значений с помощью следующего запроса:
Запрос.Текст = "ВЫБРАТЬ | ТЗ.Товар, | ТЗ.КатегорияИД, | ТЗ.ПодкатегорияИД |ПОМЕСТИТЬ ВТ_ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Товары.Товар, | ВТ_Товары.ПодкатегорияИД, | ЕСТЬNULL(НастройкаСоответствий.ГруппаТоваров, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК ГруппаТоваров, | ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК НайденныйТовар |ИЗ | ВТ_ТЗ КАК ВТ_Товары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаСоответствийСВнешнимИсточникомДанных КАК НастройкаСоответствий | ПО ВТ_Товары.КатегорияИД = НастройкаСоответствий.Категория | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары | ПО (ВТ_Товары.Товар = Товары.Наименование | И НЕ Товары.ЭтоГруппа)"; Запрос.УстановитьПараметр("ТЗ", ТЗ_Товары); Выборка = Запрос.Выполнить().Выбрать();
Данный запрос возвращает наименование и подкатегорию товара из внешнего источника данных, а также группу справочника «Товары», в которую нам нужно добавить создаваемый элемент. Группа товара была определена исходя из настройки соответствий в регистре сведений «НастройкаСоответствийСВнешнимИсточникомДанных».
Также запрос осуществляет поиск по наименованию товара, чтобы определить, существует элемент справочника «Товары» с таким наименованием или нет. Если элемент найден (не равен пустой ссылке), то мы не будем создавать дубль в справочнике «Товары», а модифицируем найденный элемент справочника.
Пока Выборка.Следующий() Цикл Если ЗначениеЗаполнено(Выборка.НайденныйТовар) Тогда ЭлТовары = Выборка.НайденныйТовар.ПолучитьОбъект(); Иначе ЭлТовары = Справочники.Товары.СоздатьЭлемент(); ЭлТовары.Наименование = Выборка.Товар; КонецЕсли; ЭлТовары.Вид = Перечисления.ВидыТоваров.Товар; ЭлТовары.Родитель = Выборка.ГруппаТоваров; ЭлТовары.ПодкатегорияВИД = Выборка.ПодкатегорияИД; ЭлТовары.Записать(); КонецЦикла;
После завершения загрузки мы получаем следующий результат:
Товары из таблицы SQL Server «Production.Product» были успешно перенесены в справочник «Товары» и помещены в указанную нами в регистре сведений группу. При этом реквизит «Подкатегория» был заполнен ссылкой на строку таблицы подкатегорий внешнего источника данных «Production_ProductSubcategory».
Подведение итогов
В данной учебной задаче мы рассмотрели перенос данных из базы MS SQL Server, а также реализацию синхронизации (сопоставления) информации внешнего источника с данными базы 1С.
Этот способ можно применять и в других случаях, когда нужно выполнять обмен и синхронизацию с внешними источниками данных. Например, при загрузке элементов справочника номенклатуры или любого другого, где сложно настроить соответствие по какому-либо полю.
При этом изначально соответствия определяются автоматически, например по наименованию. Но на последнем этапе загрузки пользователь может вмешаться и переопределить эти соответствия самостоятельно в окне обработки. Например, указав, что номенклатура с похожим наименованием – это одна и та же номенклатура, а значит, нужно обновить информацию по ней, а не создавать дубли.
Альтернативные инструменты
Подводя итоги, я бы хотел еще сравнить данный способ с альтернативным, например с использованием «Конвертации 2.0». Там также можно работать с данными информационных баз других типов (не 1С), подключаясь к ней с помощью COM-соединения и используя произвольный алгоритм в правиле выгрузки данных. У этого способа есть свои плюсы и минусы.
К плюсам можно отнести то, что данные также будут загружаться по нажатию одной кнопки, при этом не нужно вносить изменения в конфигурацию, что может быть критично, если конфигурация находится на полной поддержке. С другой стороны, в конфигурации не изменяются существующие объекты, а только добавляются новые, поэтому конфликтов при типовом обновлении не будет.
Минус здесь в настройке синхронизации, т.к. во многих случаях нельзя однозначно сопоставить значения из базы 1С и внешнего источника данных, например по коду. Значит, в данном случае придется делать сопоставление по наименованию, что, конечно, не всегда корректно и может приводить к дублям.
Ограничения внешних источников данных
К сожалению, ничто не бывает идеальным, поэтому и у внешних источников данных есть свои ограничения в использовании. Привожу их в виде списка:
- Поддерживаются только управляемые формы (для объектов внешних источников данных можно создавать только управляемые формы).
- Ограничение при использовании временных таблиц в запросах (временные таблицы создаются в базе данных внешнего источника, и если СУБД не поддерживает эту возможность, будет вызвано исключение).
- В одном запросе нельзя использовать данные из разных источников, например из базы 1С и базы сторонней СУБД.
- Так как временные таблицы внешних источников данных создаются не на стороне 1С, то совместно с данными базы 1С в одном запросе их использовать нельзя.
- Запись во внешние источники данных доступна только с версии 8.3.5
- Получение аналитических данных по технологии OLAP также доступно только с версии 8.3.5
- Механизм внешних источников данных требует доработки конфигурации, а значит, не получится его использовать, если конфигурация находится на полной поддержке.
Об авторе
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)
Добрый день, Дмитрий! Спасибо за статью, и позвольте вопрос.
Я писал загрузки и через добавленные в конфигурацию ВИД, а также через COM “ADODB.Connection”. К сожалению, небольшой объем загружаемых данных не позволял сделать вывод о том, какой способ работает быстрее при прочих равных условиях – например некая выборка с таблицы БД в ТЗ. А вообще, чисто теоретически, есть данные, какой способ быстрее? Пока нет возможности осуществить замер производительности в обоих случаях самостоятельно.
Спасибо.
Добрый день!
1. Можно использовать функцию ТекущаяУниверсальнаяДатаВМиллисекундах(), для того чтобы замерять длительность менее секунды, либо если это конфигурация включает в себя БСП, то использовать подсистему БСП ОценкаПроизводительности
2. Если все равно этого недостаточно, то можно создать таблицу по внешней БД, заполнить ее большим объемом произвольных данных и выполнять замеры для нее
А как связать внешний источник данных со справочником в 1С: Предприятие? Хочу сделать мобильное приложение с возможностью работы с MS SQL Server
Возможно сделать реквизит справочника с указанием на таблицу внешнего источника, при условии что для таблицы указано поле ключа и тип данных таблицы “Объектные данные”, как это описано в статье.
Здравствуйте, попробовал так сделать, создал тестовый документ и добавил реквизит с ссылкой на таблицу во внешнем источнике. После публикации в мобильном приложении не отображен реквизит, и запись не могу провести никак – “Internal error”. Работают ли вообще внешние источники данных с мобильным приложением 1С?
Связать внешний источник данных со справочником в 1С:Предприятие не получится, так как мобильная платформа не поддерживает внешние источники.
Если вы переключите конфигурацию в режим ТОЛЬКО мобильной разработки, то внешние источники будут не доступны. Связано это как раз с тем, что в мобильниках нет таких вот универсальных драйверов для соединения.
Спасибо большое на ответ, теперь мне пора менять тему моей ВКР)))
Весьма интересная статья (до сих пор :))
Колупаюсь с хранимой процедурой MSSQL, которая возвращает значение. Подключил как функцию во внешние источники данных. Когда ставлю Возвращает значение, то выдаёт ошибку: “Не удалось найти столбец “dbo”, определяемую пользователем функцию или агрегатную функцию. Также возможно, имя является неоднозначным”. Через OUTPUT параметры значение в 1С не доходит. Есть какие-то варианты, кроме подключаться через ADO?
“Загрузка данных из внешнего источника данных”
В это главе несколько примеров кода. А в какой модуль его записали?
При запуске 1С автоматически подключение источника данных настроили – это понятно. А дальше?
Код подключения к внешнему источнику располагается в общем модуле Интеграция, код по загрузке из внешнего источника можно вставить во внешнюю обработку.
При запуске 1С автоматически подключение источника данных настроили – это понятно. А дальше? – после подключения выполнили загрузку данных из внешнего источника
Где? В каком модуле?
Функция ПолучитьПараметрыПодключенияКВнешнейИБ() и процедура ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer расположены в общем серверном модуле Интеграция (с возможностью вызова сервера), который нужно добавить в конфигурацию.
Далее в модуле управляемого приложения вызывается эта функция и процедура:
Если ПараметрыПодключения <> Неопределено Тогда
Интеграция.ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer(ПараметрыПодключения.СтрокаСоединения, ПараметрыПодключения.Логин, ПараметрыПодключения.Пароль, ПараметрыПодключения.АутентификацияОС);
КонецЕсли;
Этот код нужно добавить для события “ПриНачалеРаботыСистемы”
Вы серьёзно? Я в первом комментарии писал, что это понятно.
Запрос и другой код где писать?
Я писал ранее, что код по загрузке из внешнего источника можно вставить во внешнюю обработку.
Регистр сведений состоит из четырех ресурсов: «Сервер», «Логин», «Пароль», «ИмяВнешнейБД» и «АутентификацияОС»
Из пяти всё-таки?
Да, точно здесь опечатка, правильно из пяти
Я правильно понимаю?
В статье, которая называется “Интеграция” есть информация о том, как настроить “интеграцию” с внешней базой данных, но прикол в том, что это не интеграция, а получение информации из внешней базы данных. В статье не описана возможность отправлять данные во внешнюю базу данных.
В статье об этом не ни слова
Добрый день
Есть сторонняя БД на postgresql, с таблицей объектного типа (имеется ключевое поле id), необходимо в эту базу периодически добавлять записи, добавляю посредством СоздатьОбъект(), но приходится поле id самому высчитывать следующее значение и добавлять, подскажите что нужно сделать чтобы ключевое поле автоматически подставлялось? есть ли стандартная процедура установки следующего значения id?
Добрый день! Про Postgres не могу точно сказать, возможно стоит использовать хранимые процедуры как в этой статье (их аналог в Postgres):
http://курсы-по-1с.рф/articles/запись-во-внешние-источники/
Смысл, в том, чтобы строка таблицы добавлялась средствами СУБД, а не 1С.
Если поле типа autoincrement или guid, то в запросе вставки записи это поле просто не надо указывать, SQL Server его сам заполнит. Если это делается из 1С, то думаю тоже надо просто убрать это поле из запроса, пусть сам рулит. А при выборке данных это поле уже достаете и используете как ключ, оно будет заполнено. В MSSQL такие поля могут быть также индексом в т.ч. кластерным, не знаю как в postgresql
Спасибо за статью!
Очень полезный материал.
Хотелось бы сохранить ее в удобном формате, доступ к группе в ВК – это единственная возможность получать статьи в удобном формате?
Да, сохранить статью может только подписчик нашей группы ВКонтакте.
Здравствуйте.
Большое спасибо за стратью.
Подскажите пожалуйста, возможно ли посмотреть и изменить настройки подключения таблицы, которые указываются в конструкторе при добавлении этой таблицы?
У нас следующая ситуация: внешний источник данных исправно работал с таблицей MS SQL.
Теперь внешняя база переезжает на MySQL.
Как перенаправить внешний источник данных в 1С на другую базу?
Изменение строки подключения в режиме пользователя не помогло. Похоже, что сама таблица помнит, что она относится к MS SQL и соответствующим образом строит текст запроса – подключение к MySQL выполняется хорошо, но при выполнении запроса вылетает ошибка.
Добрый день! У меня была похожая ситуация и я решал ее созданием нового внешнего источника в конфигураторе. Я тоже не нашел как можно изменить источник для уже созданного внешнего источника данных, по видимому так сделать нельзя. Настройки подключения в пользовательском режиме оказывается недостаточно, так как таблицы и поля настраиваются именно в конфигураторе.
Чтобы не перелопачивать все запросы, попробуйте в тестовой базе старый источник данных MSSQL удалить, и добавить новый на MySQL, и затем заново вытащить все таблицы и поля.
Если структура почти полностью совпадает, то вероятно остальные запросы и отчеты заработают без изменений.
Спасибо за статью. Легко читается и отлично написано.
Вопрос по авторизации под пользователем ОС.
Я подключаюсь тонким клиентом в серверном режиме. Но при этом получаю ошибку, что login failed для пользователя, от которого работает клиент. Разве сервер не должен подключаться с теми же правами, от которых он запущен?
Если сервер работает не в файловом режиме, а клиент-сервер, это же служба windows и она работает под тем пользователем под которым вы настроили при установке, или вручную можно поменять на другого. К пользователю клиентской части это не имеет отношения, а также не забывайте что есть стандартная аутентификация 1С, которую еще надо как-то прокинуть в операционку. Конечно можно добиться запустить клиента под тем же пользователем что сервер, но в общем случае удобнее некоторые вещи делать именно под серверным пользователем, у которого может быть больше прав чем у клиента, и запрос через серверную часть выполнится, даже если клиенту такие права не давать (и это хорошо).
Немного критики.
Статья написана слабовато. Тема интересная, но не раскрыто истинное предназначение объекта. Показанный пример можно было сделать и без ВИ. Язык повествования рассчитан на новичков.
Хотя интересные вещи есть и автор явно профессионал.
Александр, спасибо, для меня это скорее не критика, а похвала
:))
Я тренерам обычно вот это показываю: http://www.forum.mista.ru/topic.php?id=541746, чтобы ко всему были готовы :))
Вот этого “Практически любой курс – это выбрасывание денег на ветер, если человек хочет чему нить научится – он научится сам (по книгам по инету и т.п.) а если нет – то никакие курсы ему не помогут тем более местных пиарщиков.” – отлить в граните надо просто!
Серьезно?
Мне не показалось?? :)))
Человек, последовательно купивший 20+ курсов, подписывается за тезис “Практически любой курс — это выбрасывание денег на ветер” ??? :)))
Ну, не знаю. У меня когнитивный диссонанс.
Могу разве что подстраховать Вас от будущих потерь и заблокировать все рассылки и скидки :)
А то вдруг сорвётесь и в очередной, 20-й раз выбросите деньги на ветер :)
Директор франча, который устал покупать своим сотрудникам курсы и не получать отдачи?)
Это был сарказм, безусловно.
В дополнении к статье: не описано как ведет себя система при выполнении запросов к таким источникам.
1с-ка не умеет передавать параметр (NOLOCK).
Делали подключение к 1с 7.7 на Ms-Sql 2008. Несмотря на то, что для всех таблиц участвующих в обмене стоит галка – только чтение пошли “висяки”.
Так-что любителям внешних источников: если вы коннектитесь к работающей в продуктив системе внимательно проверяйте какие запросы вы пишете. Может зависать капитально.
Побольше таких статей, очень подробно и с вариантами примеров помогает сократить время на поиски решений
Алексею Васильеву благодарность за статью
Вам спасибо за отзыв)
А можно про Excel поподробнее? Очень даже может пригодиться.
У подключения к Excel есть свои особенности и подключиться к нему, как это не странно, сложнее чем к какой-нибудь СУБД. Автоматический выбор таблицы в конструкторе (по крайне мере у меня) не работает, поэтому я создавал таблицы вручную. То есть сначала задавал колонки листа таблицы Excel в конфигураторе, а потом уже подключался к внешнему источнику в режиме 1С “Предприятие”. Для таблицы указывается “Имя в источнике данных” в формате ИмяЛиста$, например Лист1$. Затем в таблицу добавляются поля для каждой колонки таблицы, например в моем случае это были Дата, Номер, Комментарий (в таблице Excel было 3 колонки с аналогичными названиями в ПЕРВОЙ строке). Важно, что первая строка обозначает имена колонок и должна совпадать с реквизитом “Имя в источнике данных” для каждого поля таблицы внешнего источника, иначе работать не будет. Затем в режиме предприятия подключаемся к внешнему источнику используя строки подключения:
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx; – для Office 2007 или выше
а также
Driver={Microsoft Excel Driver (*.xls)}; DriverID=790; DBQ=D:\ФайлExcel.xls; – для более младших версий офиса
После таких вот манипуляций, все должно работать
Добрый день. Если не ошибаюсь, то много лет назад Евгений Гилев рассказывал, как работать с внешними данными в своем курсе по системе компоновки данных. Кстати, всем рекомендую его найти и ознакомиться. Несмотря на солидный возраст, материал ничуть не утратил актуальность.
<>
Получится. Через маленькую конфу с внешним ИД и внешнюю обработку.
Цитата не вставилась – это движок сайта пошутил? :)
Попробуйте добавить еще раз.
*** Механизм внешних источников данных требует доработки конфигурации, а значит, не получится его использовать, если конфигурация находится на полной поддержке. ***
Получится. Через маленькую конфу с внешним ИД и внешнюю обработку.
Николай, я имел в виду, что не получится добавить внешний источник данных в конфигурацию как объект, если она находится на полной поддержке.
А, понятно :)
Добрый день. А можно подключиться к внешнему источнику СУБД ORACLE из базы которая развернута на сервере 1С на CentOS?
Спасибо.
http://v8.1c.ru/overview/Term_000000795.htm
Тут написано что можно. Там правда не конкретно про CentOS а про Linux в принципе.
Да. Получилось настроить связку. 1С сервер на CentOS, подключается к внешнему источнику СУБД Oracle. На сервере 1С нужно установить и настроить ораклиный ODBC драйвер – это помогли сделать специалисты по ораклу у заказчика. Но там тоже на целую статью можно написать о настройке клиента ODBC на linux.
Как вариант, можно хранить настройки подключения в регистре сведений и подключаться к внешнему источнику данных программно при запуске конфигурации.
А зачем именно в регистре сведений?
Вариантов масса. Я к примеру делал план обмена и на узле хранил сведения для подключения.
Да и подключатся каждые раз зачем? Вдруг подключен уже?
Пример
——–
Узел = ПланыОбмена.ОбменСВнешнимиИсточниками.НайтиПоНаименованию(“ВнешняяБаза”);
Если ПроверкаПодключенияКВнешнейСистеме(Узел)=”Отключен” Тогда
//Сообщить(“Нет подключения к базе “”ВнешняяБаза””!”);
Возврат;
КонецЕсли;
——–
//Проверяем подключение
Функция ПроверкаПодключенияКВнешнейСистеме(Узел)
Если Строка(ВнешниеИсточникиДанных.ВнешняяБаза.ПолучитьСостояние())=”Отключен” Тогда
//Нужно подключить
ПараметрыБД = ВнешниеИсточникиДанных.ВнешняяБаза.ПолучитьОбщиеПараметрыСоединения();
ПараметрыБД.АутентификацияСтандартная = Истина;
ПараметрыБД.СУБД=”MSSQLServer”;
ПараметрыБД.СтрокаСоединения=Узел.СтрокаСоединения;
ПараметрыБД.ИмяПользователя = Узел.ИмяПользователя;
ПараметрыБД.Пароль = Узел.Пароль;
ВнешниеИсточникиДанных.ВнешняяБаза.УстановитьОбщиеПараметрыСоединения(ПараметрыБД);
ВнешниеИсточникиДанных.ВнешняяБаза.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), ПараметрыБД);
ВнешниеИсточникиДанных.ВнешняяБаза.УстановитьПараметрыСоединенияСеанса(ПараметрыБД);
ВнешниеИсточникиДанных.ВнешняяБаза.УстановитьСоединение();
Возврат ВнешниеИсточникиДанных.ВнешняяБаза.ПолучитьСостояние();
Иначе
Возврат “Подключен”;
КонецЕсли;
КонецФункции
Согласен, на рабочей базе для этих целей заводить целый регистр сведений не стоит. Но это ведь учебный пример, и в данном случае я использовал РС для упрощения, чтобы излишне не усложнять задачу.
Спасибо за статью. А возможно из 1С записать данные в базу SQL (обратный метод)?
Если точнее: есть база на SQL. Мне нужно к ней подключиться из 1С, прочитать и проанализировать данные, затем согласно анализа, изменить, удалить или добавить записи в SQL.
Только закончил делать примерно то о чем вы спрашиваете. Могу сказать что если у вас платформа 8.3.5, (а лучше старше),попробовать можно, но без костылей не обойтись. Лично у меня возникли сложности с !чтением! Только что добавленных записей с полями типа date, datetime, time. С реквизитом регистра сведений с типом “мой внешний источник(ВИ)” тоже возникли сложности, т.к ключ ВИ был автоинкрементом и не желал генерироваться у новых записей. Пришлось добавлять хранимую процедуру во ВИ… Ну как-то так это из личного,
Из личного:
1. Предпочитаю только читать через ВИ.
2. Не делаю “объектные поля”, т.е. описываю только примитивные типы.
Причины:
1. так исторически сложилось, на момент разработки писать было нельзя. В общем привычка, и как мне кажется правильная. Нет лишней прослойки.
2. Несколько раз ловил очень не удобные для СУБД запросы на не маленьких таблицах.
ЗЫ Каждый механизм под свои задачи :)
Есть очень хорошая статья на эту тему:
http://курсы-по-1с.рф/articles/запись-во-внешние-источники/
Фарит, спасибо за интересный материал!
А почему Вы выбрали группу ВКонтакте?
Там при регистрации требуют номер телефона…
Самая популярная социальная сеть в России. А так скоро и Facebook нужно будет подключать.
учитывая что ваш сайт с Украины открывается только под vpn то зеркало сайта не мешало б тоже сделать.
Таких планов нет.
Добрый день!
Подскажите пож-та, а не лучше использовать:
DRIVER={SQL Server Native Client 11.0} вместо DRIVER={SQL Server}?
Если используется MSSQLServer2012 и старше?
Конечно лучше.
Если такой драйвер установлен.
Он знает о новых типах данных, в отличие от старого
Прошу ответить на вот такой вопрос. В статье написано, что при помещении выборки из таблицы внешнего источника в вт – данная вт якобы создаётся в субд внешнего источника. 1. Как выборку из внешнего источника поместить в ВТ? Можно увидеть текст запроса? У меня данное действие не получилось выполнить. Платформа 8.3.8. 2. На сознание временных таблиц на сервере субд могут требоваться роли у пользователя, который к субд коннектится. Такой роли может и не быть. То есть селекты делать можно, все остальное – нет. Можно увидеть скриншот созданной временной таблицы на стороне субд при помещении выборки из внешнего источника в вт? 3. Если внешний источник – файловая база, к примеру аксцесс – какие там временные таблицы и где они? Итак, на чем основано это утверждение? Просьба привести наглядные доказательства…
“В статье написано, что при помещении выборки из таблицы внешнего источника в вт — данная вт якобы создаётся в субд внешнего источника.” – она создается, проверено опытным путем на SQL Server и базе демо, которая описана в статье. У меня запрос выглядит так:
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
“ВЫБРАТЬ
| Production_Product.Ссылка
|ПОМЕСТИТЬ ВнешнийИсточникДанных.Демо.ВременнаяТаблица.Продукция
|ИЗ
| ВнешнийИсточникДанных.Демо.Таблица.Production_Product КАК Production_Product”;
Менеджер временных таблиц здесь нужен обязательно, иначе не работает. Кстати, если поставить точку останова после Запрос.Выполнить(), то можно увидеть созданную временную таблицу в базе TempDB.
“3. Если внешний источник — файловая база, к примеру аксцесс — какие там временные таблицы и где они?” – по информации с сайта ИТС: “В запросе к внешнему источнику данных возможно использование временных таблиц. При этом производится попытка создания временной таблицы непосредственно в базе данных, связанной с внешним источником данных. Если СУБД не поддерживает создание внешних источников данных – будет вызвано исключение.” Соответственно, в СУБД Access временные таблицы создать не получится.
Вот это вы молодцы!
То что надо, эту тему давно пора начинать раскручивать.
А из какого это нового курса который готовиться?
Сейчас в проработке курс по Интеграции.
Но какие-то детали пока дать не можем :)
Очень хорошее решение, курс по Интеграции давно нужен, спасибо!
Это замечательно, по интеграции куплю не раздумывая.
я тоже хотел бы поучиться на таком курсе