1. Главная страница » Компьютеры

1С внешние источники данных sql

Автор: | 16.12.2019

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

Однако в работе частенько складывается ситуация, когда часть данных хранится где-то еще.

  • Интернет магазин (хранит данные обычно во внешней MySQL/SQL базе)
  • Загрузка данных из файлов Excel
  • Другая база.

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

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

  • теперь специальные механизмы получения данных создавать не нужно
  • к таким данным можно обращаться обычным запросом 1С
  • такие данные можно просматривать в списках 1С.

Внешний источник данных 1С – внешняя база SQL

Допустим у нас есть база SQL, в которой хранятся нужные нам данные. Попробуем прочитать данные из нее с помощью механизма Внешний источник данных 1С.

Добавим внешний источник данных 1С. Нужно зайти в конфигуратор, внешние источники данных находятся в окне конфигурации, в самом низу дерева объектов 1С.

1. Подключение

Добавим новый внешний источник данных 1С, назовем произвольно.

База данных состоит из таблиц. Нам нужно добавить их внутри добавленного внешнего источника данных. Нажмите на нем правой кнопкой мыши и выберите Добавить таблицу.

В первый раз он предложит указать строку подключения. Ее можно ввести вручную, или сформировать, для чего нужно нажать на кнопку «…».

В качестве драйвера в нашем конкретном случае выберем «SQL Server»

Заполним основные параметры подключения к SQL. Имя сервера можно вписать или выбрать из списка.

1С выполнит соединение с SQL и предложит выбрать из списка конкретную базу данных.

После этого 1С отобразит список таблиц в этой базе данных и их колонок. Нужно галочками выбрать требуемые таблицы.

Таблицы и колонки будут добавлены. Названия будут такие, как они определены в удаленной базе. В 1С Вы можете их переименовать (в свойствах).

Вот пример добавленной таблицы:

Вот пример добавленной колонки:

Чтобы платформа 1С работала с внешней таблицей также, как она делает со справочниками 1С, в таблице можно указать дополнительные параметры:

  • В свойстве Поле ключа – указать одну из колонок, которая будет обеспечивать уникальную идентификацию строки; если уникальность обеспечивают несколько строк – то данный способ не работает (аналог поля Код)
  • В свойстве Поле представления – указать одну из колонок, которая будет обеспечивать краткое представление строки (аналог поля Наименование)
  • В свойстве Тип данных таблицы – указать Объектные данные.

2. Просмотр

Соединение с удаленной базой не производится автоматически. Чтобы подключиться, нужно выбрать типовое меню Все функции.

В ветке Стандартные расположена специальная команда Управление внешними источниками данных, которая позволяет указывать параметры соединения (свои для режима 1С Предприятия) и проводить подключение.

Сначала нужно указать параметры соединения с базой.

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

Скопируйте строку соединения и укажите ее в режиме 1С Предприятие.

После этого необходимо произвести собственно подключение.

После того, как произведено подключение, возможно работать со списками.

3. Использование в языке 1С

Подключение можно производить и из кода программы на языке 1С.

Параметры подключения указываются так:
ПараметрыСоединения = ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.ПолучитьОбщиеПараметрыСоединения();

ПараметрыСоединения.АутентификацияСтандартная = Истина;
ПараметрыСоединения.ИмяПользователя = «sa»;
ПараметрыСоединения.Пароль = «пароль»;
ПараметрыСоединения.СтрокаСоединения = «строка соединения из конфигуратора»;
ПараметрыСоединения.СУБД = «MSSQLServer»;

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

Запросить данные из базы данных можно с помощью обычного запроса 1С. Пример текста запроса для внешнего источника НашВнешнийИсточник и таблицы ТаблицаВнешнегоИсточника :

ВЫБРАТЬ
ТаблицаВнешнегоИсточника.ИмяПоля
ИЗ
ВнешнийИсточникДанных.НашВнешнийИсточник.Таблица.ТаблицаВнешнегоИсточника»

Внешний источник данных 1С – работа с файлом Excel

Попробуем другой вариант – работу с файлом Excel через внешний источник данных 1С.

Создадим простой файл Excel.

Добавим внешний источник, назовем произвольно ФайлExcel. В него добавим таблицу «Лист1$». Как несложно заметить – это имя листа в Excel с добавлением символа «$».

Как и в случае с SQL, добавим колонки. Их можно добавить вручную. Важно следить за соответствием типов добавляемых колонок, иначе позже можно получить ошибку вида «Несоответствие типов данных».

Для колонки нужно указывать имя в 1С и имя в источнике данных.

Для Excel существует особенность (ошибка вида «Слишком мало параметров. Требуется 3»):

  • Если в первой строке таблицы Excel расположены названия колонок, то нужно указывать просто имя этой колонки, например «Код».
  • Иначе нужно указывать полное имя с именем таблицы «Лист1$.Код», но в параметрах добавить «HDR=NO;».

Параметры соединения для файла Excel выглядят вот так:

Михаил Сайко

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

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

Раньше разработчикам 1С, чтобы достать эту информацию, приходилось писать собственные инструменты с нуля и разрабатывать процедуры импорта. В платформе под номером 8.2.14 появился стандартный аналог этих механизмов – внешние источники данных. И теперь стало намного проще получать необходимые данные из основных объектов:

  • Таблицы из баз данных SQL;
  • Excel;
  • Access;
  • Файлы формата DBF, TXT,CSV;
  • Других баз 1С.

Данный механизм может применяться для следующих задач:

  • Хранение в 1С ссылки на поля стороннего ресурса с данными;
  • Выполнение команд или функций объекта, к которому подключаются;
  • Составление отчетов по данным извне информационной базы 1С;
  • Получение и выгрузка данных во внешние источники данных.

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

Рассмотрим на примере задачу получения из таблицы SQL данных по номенклатуре на складе через механизм подключения внешнего источника данных. Настройка нового объекта в 1С 8.3 происходит через режим конфигуратора. Находим в структуре конфигурации последний пункт – «Внешние источники данных» и видим все существующие в базе связи. Добавляем новый объект с помощью стандартной кнопки добавить и дать ему «говорящее» название.

Затем нам надо в разделе «Данные» добавить таблицы, из которых мы будем брать информацию. Разработчики 1С предусмотрели достаточно удобный конструктор, в котором мы можем указать лишь строку соединения и тип СУБД. Для типового подключения к таблице MS SQL используется строка по следующему шаблону: «DRIVER=;SERVER=_NameServ_;Trusted_Connection=yes;DATABASE=_NameBase_;LANGUAGE=русский». Вместо «_NameServ_» и «_NameBase_» необходимо вставить имя сервера и базы данных, соответственно.

Если вся строка была написана без ошибок, то вы увидите перечень таблиц с полями, существующими в базе. Отметьте галками те таблицы и реквизиты в них, которые нужны в 1С. На данном этапе обязательно проверьте, верно ли 1С определила ключевые реквизиты, и выберите представление в 1С данных – «Поле представления». Настройка на этом закончена – можно обновлять конфигурацию и запускать базу в режиме «Предприятие».

Использование внешних источников данных

Связь с внешними источниками данных осуществляется не на автомате при запуске системы. Чтобы получить доступ к данным, предстоит сделать несложные манипуляции уже в режиме «Предприятие»:

  1. Открываем в меню «Все функции» раздел «Стандартные», а далее форму «Управление внешними источниками данных». Перед нами откроется список всех созданных в конфигурации объектов;
  2. К сожалению, на этом этапе вам придется повторно занести строку соединения в настройки. Откройте меню «Администрирование» и выберите «Изменить общие параметры». Скопируйте из конфигуратора строку соединения и вставьте ее в соответствующий реквизит на форме. После подтверждения изменения общих параметров нажмите «Подключиться»;
  3. В результате вы увидите зеленую галку, подтверждающую, что все сделано правильно. Такому алгоритму необходимо следовать при каждом подключении, что не слишком удобно;
  4. Чтобы работать с данными из внешнего источника данных, откройте таблицу из раздела «Внешние источники данных», входящего в меню «Все функции».

Но существует и еще один способ подключиться к внешнему источнику данных – программный. Использовать его можно в любой модуле, где предполагается работа с данными из внешних источников. Рассмотрим пример алгоритма:

    Указываем, к какому объекту произойдет подключение;

  • Заполняем параметры;
  • Устанавливаем соединение с внешним источником.
  • Запрашивать данные вы сможете обыкновенным запросом на языке 1С, обращаясь к таблице подобным образом:

    Однако существуют ограничения на работу подобных запросов и использование в них временных таблиц. Это еще один недостаток внешних источников данных в 1С 8.3. Также необходимо упомянуть еще и тот факт, что они работают только на управляемых формах. Они уже давно появились, но многие компании все еще используют обычные формы и им придется писать процедуры импорта, как раньше.

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

    ВИД (внешние источники данных) в 1С – это объекты конфигурации, позволяющие использовать информацию из внешних ODBC-источников (баз данных), не основанных на 1С:Предприятии, внутри прикладного решения так же, как будто бы она хранится в самой информационной базе.

    В качестве ODBC-драйвера был выбран пакет FreeODBC, т.к. он бесплатный и его везде используют.

    В процессе гугления использовались источники:

    Подробное описание работы с ВИД (да и вообще хороший блог о работе с 1С)

    Запись во внешний источник данных из 1С 8.3 (используя хранимые процедуры MS SQL Server)

    Установка

    Достаточно установить пакет tdsodbc (разрядность должна совпадать с сервером 1С!):
    # apt install tdsodbc:i386 (дополнительно установятся: libodbc1 odbcinst odbcinst1debian2)

    В файл odbcinst.ini добавить (если не добавилось автоматически) секцию для FreeTDS:

    # nano /etc/odbcinst.ini
    [FreeTDS]
    Description = FreeTDS
    Driver = /libtdsodbc.so
    Setup = /libtdsS.so
    FileUsage = 1
    UsageCount = 1

    • Для 32-битного пакета: /usr/lib/i386-linux-gnu/odbc
    • Для 64-битного пакета: /usr/lib/x86_64-linux-gnu/odbc

    Если этого не сделать, или поставить пакет не той же разрядности, что сервер 1С, то будет ошибка:
    [unixODBC][Driver Manager]Can’t open lib ‘FreeTDS’ : file not found

    А вот такая ошибка будет, если неверно указали путь к либам:
    /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so file not found

    При нажатии на кнопку “…” конфигурация выдаст последний вскрик в виде окошка с ошибкой и благополучно покрашится. Что это за НЛО непонятно, но на нашем серваке оно поселилось, видать, надолго:

    "Ошибка аутентификации клиента 1cv8 средствми операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе"

    Как я понял, поключаться и работать с ВИД можно двумя способами:
    1) Подключаться программно.
    Пример:
    (Спасибо caponid за инфу о поле СУБД):
    Соед = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
    Соед.СтрокаСоединения = "Строка_соединения";
    Соед.АутентификацияОС = Ложь;
    Соед.ИмяПользователя = Пользователь;
    Соед.Пароль = Пароль;
    Соед.СУБД = "MSSQLServer"; //Явно указываем, потому что тот тип, что указали в строке соединения, игнорируется;
    Источник = ВнешниеИсточникиДанных["НазваниеИсточника"];
    Источник.УстановитьПараметрыСоединенияСеанса(Соед);
    Источник.УстановитьСоединение();

    Но тут у меня не получилось запихнуть проинициализированный объект ВИД в запрос:
    Запрос.Текст =
    "ВЫБРАТЬ
    | Источник.Поле
    |ИЗ
    | &ВИД КАК Источник
    |";
    Запрос.Параметры.Вставить("ВИД", ВИД);

    2) Использовать механизм подключения в режиме Предприятия. Параметры подключения хранятся тут:
    РегистрСведений.НастройкиПодключенияКВнешнемуИсточникуДанных
    или
    Все функции -> Стандартные -> Управление внешними источниками данных

    Строка подключения выглядит так:
    "Driver=; Server=SERVER,1433; Database=BASE; User >
    Пользователя и пароль я запихивал в отдельные поля.

    Если в режиме предприятия будут отсутствовать параметры подключения к внешнему источнику данных, то будет ошибка:
    "[unixODBC][Driver Manager]Data source name not found, and no default driver specified"

    Названия Таблиц и полей в конфигураторе могут быть какими угодно, а вот к полям “Имя в источнике данных” нужно присмотреться внимательнее. Если в именах полей БД MS SQL есть, к примеру, символ “_”, то будет вот такая ошибочка:
    "[FreeTDS][SQL Server]Incorrect syntax near ‘t_ticket_id’"

    “Если значение, находящееся в свойстве Имя в источнике данных заключено в одинарные кавычки, то в SQL-запрос к базе данных это значение попадает без преобразований, вне зависимости от состава символов.”

    Т.е. названия таблиц и полей MS SQL в поле “Имя в источнике данных” нужно указать в одинарных кавычках.

    Дату нужно форматировать перед добавлением, например, так:

    Формат(ТекущаяДата(), "ДФ=’yyyy-MM-dd HH:mm:ss’")

    "[FreeTDS][SQL Server]Conversion failed when converting date and/or time from character string."

    Для добавления новых записей поле идентификатора с автоинкременом нужно установить в “Только чтение”, иначе будет:

    "[FreeTDS][SQL Server]Cannot insert explicit value for identity column in table ‘t_logs’ when IDENTITY_INSERT is set to OFF."

    При добавлении таблицы с помощью помощника, поля с внешними ключами (foreign_key) будут по-умолчанию устанавливаться в тип объекта, а не Число. Мне это небыло нужно, поэтому вручную менял тип.

    Нужно быть внимательным с поиском записи с помощью функции НайтиПоПолю(). Значение должно совпадать с типом поля в таблице. Например, строку перегонять в число:

    По поводу поиска вхождений записей в список значений в запросе:
    table.id В(&СписокЗаявки) – не прокатит (СписокЗаявки – это СписокЗначений со значениями – строками, а id – число)
    table.id В("+СтрокаЗаявки+") – прокатит (СтрокаЗаявки – строка со значениями через запятую)
    Сейчас пишу и не понимаю почему не попробовал значения списка СписокЗаявки привести к численному типу, но проверять уже лень.

    Чтобы не выводить таблицы в командный интерфейс раздела (подсистемы) в свойствах таблицы нужно убрать галку “Использовать стандартные команды“.

    Что не получилось

    Не получилось сделать поля выбора (а-ля combobox) с выпадающим списком значений из ВИД. Ставишь реквизиту формы тип таблицы ВИД, переносишь его на форму. Все ок, элемент (контрол) создается, но не отображается. Заморачиваться не стал, вводил вручную id-шники записи, этого было достаточно.

    Выполнить хранимую процедуру. До этого хранимыми процедурами в БД не пользовался, хотя хорошая вещь.
    Но как ни крутил я этот функционал в конфигураторе, ничего не вышло (а тут и тут работало).
    Какие были ошибки…:
    1)
    2)

    1) FuncName
    2) [FreeTDS][SQL Server]Invalid column name ‘FuncName’.

    1) dbo.FuncName
    2) [FreeTDS][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.FuncName", or the name is ambiguous.

    1) SELECT
    2) [FreeTDS][SQL Server]Incorrect syntax near the keyword ‘SELECT’.

    1) EXECUTE
    2) [FreeTDS][SQL Server]Incorrect syntax near the keyword ‘EXECUTE’.

    1) * from dbo.FuncName()
    2) Обращение к процедуре объекта как к функции (FuncName)

    Так же не решился вопрос с кириллицей. А точнее, при создании записей из 1С в MS SQL текст на русском языке превращался в кракозябры, например:

    " 0:@KB85 70O2:8 87 1!, >

    Параметры сортировки базы: Cyrillic_General_CI_AS.
    Что пытался сделать:
    1) настроить FreeTDS, всунув в его конфиг параметр charset в секцию [global]:
    # nano /etc/freetds/freetds.conf
    client charset = UTF8
    2) добавить параметр charset в строку подключения:
    "Driver=; Server=SERVER,1433; Database=BASE; charset=UTF8;"

    Не получилось. Еще есть вариант 3:
    3) сменить API ODBC
    Но придется делать все заново. Поэтому, ограничился записью текста на инглише.

    Нужно больше прав.

    При нехватке прав при выполнении запроса к таблицам ВИД будет ошибка:
    Ошибка при вызове метода контекста (Выполнить): Недостаточно прав для работы с таблицей "ВнешнийИсточникДанных.БДTickets.Таблица. "
    Нужно добавить права:
    На ВИД: Использование
    На таблицы в запросе: Чтение

    Для выполнения функции .НайтиПоПолю() нужно добавить права (иначе “Нарушение прав доступа!”):

    На ВИД: Использование
    На таблицы в запросе: Чтение, Изменение

    Для функции .СоздатьОбъект() соответсвенно: Использование, Чтение и Добавление.

    Кстати, стандартная роль “Запуск внешнего соединения” не понадобилась, для меня осталось загадкой ее назначение (разобраться не пытался).

    Читайте также:  Ped tampered pls input pwd

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *