1с на линукс подключение кодом к ms sql odbc

Обновлено: 30.06.2024

В этой статье описывается, как можно создать подключение к базе данных SQL Server.

Свойства подключения

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

При подключении к базе данных, которая использует зеркальное отображение базы данных (имеет партнера по обеспечению отработки отказа), не указывайте имя базы данных в строке подключения. Вместо этого отправьте команду useимя_базы_данных, чтобы подключиться к базе данных перед выполнением запросов.

Значение, передаваемое в ключевое слово Driver, может быть одним из следующих:

именем, использованным при установке драйвера;

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

Использовать имена DSN не обязательно. Вы можете использовать имя DSN для определения ключевых слов строки подключения с именем DSN с последующим созданием соответствующей ссылки в строке подключения. Чтобы создать имя DSN, создайте (при необходимости) и измените файл

/.odbc.ini ( .odbc.ini в домашнем каталоге) для имени DSN пользователя, доступного только для текущего пользователя, или /etc/odbc.ini для системного имени DSN (требуются права администратора). Ниже приведен пример файла, который показывает минимальное количество необходимых записей для имени DSN:

Чтобы подключиться с помощью приведенного выше имени DSN в строке подключения, следует указать ключевое слово DSN следующим образом: DSN=MSSQLTest;UID=my_username;PWD=my_password .
Строка подключения выше будет эквивалентна строке подключения, определенной без ключевого слова DSN , например: Driver=ODBC Driver 17 for SQL Server;Server=tcp:localhost,1433;UID=my_username;PWD=my_password .

При необходимости можно указать протокол и порт для подключения к серверу. Например, Server = tcp: имя_сервера ,12345. Обратите внимание, что единственным протоколом, поддерживаемым драйверами Linux и macOS, является tcp .

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

Кроме того, можно добавить сведения о DSN в файл шаблона и выполнить следующую команду, чтобы добавить его в

Полную документацию по INI-файлам и odbcinst см. в документации unixODBC. Сведения о записях в файле odbc.ini , характерных для ODBC Driver for SQL Server и поддерживаемых в Linux и macOS, см. в статье Ключевые слова и атрибуты строки подключения и имени DSN.

Можно проверить, что драйвер работает, используя isql для проверки подключения или следующую команду:

  • bcp master.INFORMATION_SCHEMA.TABLES out OutFile.dat -S <server> -U <name> -P <password>

Использование TLS/SSL

Для шифрования подключений к SQL Server можно использовать протокол TLS, ранее называемый SSL. TLS защищает имена пользователей и пароли SQL Server по сети. Кроме того, TLS проверяет идентификатор сервера для защиты от атак "злоумышленник в середине".

Включение шифрования повышает безопасность за счет снижения производительности.

Независимо от параметров для Encrypt и TrustServerCertificate учетные данные входа на сервер (имя пользователя и пароль) всегда шифруются. Следующая таблица показывает эффект от параметров Encrypt и TrustServerCertificate .

Данные, передаваемые между клиентом и сервером, шифруются.

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

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

Платформа Минимальная версия OpenSSL Расположение хранилища доверия сертификатов по умолчанию
Debian 10 1.1.1 /etc/ssl/certs
Debian 9 1.1.0 /etc/ssl/certs
Debian 8.71 1.0.1 /etc/ssl/certs
OS X 10.11, macOS 1.0.2 /usr/local/etc/openssl/certs
Red Hat Enterprise Linux 8 1.1.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 7 1.0.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 6 1.0.0-10 /etc/pki/tls/cert.pem
SUSE Linux Enterprise 15 1.1.0 /etc/ssl/certs
SUSE Linux Enterprise 11, 12 1.0.1 /etc/ssl/certs
Ubuntu 20.04, 21.04 1.1.1 /etc/ssl/certs
Ubuntu 18.04 1.1.0 /etc/ssl/certs
Ubuntu 16.04, 16.10, 17.10 1.0.2 /etc/ssl/certs
Ubuntu 14.04 1.0.1 /etc/ssl/certs

Можно также указать шифрование в строке подключения с помощью параметра Encrypt при использовании SQLDriverConnect для подключения.

Настройка параметров поддержания активности TCP

Начиная с ODBC Driver версии 17.4, можно настроить частоту отправки драйвером пакетов проверки активности и их пересылки, если ответ не получен. Чтобы настроить, добавьте следующие параметры в раздел драйвера в odbcinst.ini или в раздел имени DSN в odbc.ini . При подключении с помощью имени DSN драйвер будет использовать параметры в разделе имени DSN, если они есть. В противном случае или если подключение выполняется только со строкой подключения, драйвер будет использовать параметры из раздела драйвера в odbcinst.ini . Если параметр отсутствует в обоих расположениях, драйвер использует значение по умолчанию. Начиная с версии 17.8 драйвера ODBC в строке подключения можно указать ключевые слова KeepAlive и KeepAliveInterval .

KeepAlive=<integer> управляет частотой попыток протокола TCP проверить работоспособность неактивного подключения путем отправки пакета keep-alive. Значение по умолчанию — 30 секунд.

KeepAliveInterval=<integer> определяет интервал, разделяющий повторные передачи пакета keep-alive, пока не происходит получение ответа. Значение по умолчанию составляет 15 секунд.

Добрый день. Подскажите как можно подключить базу расположенную на My SQL через код 1С, без использования внешних источников данных, т.к. нужно предоставить возможность пользователю настраивать параметры подключения к базе MySQL.
Платформа: 8.3.10.2168
ОС (1С Сервер): Debian 9.

Напрямую никак.
Обходные варианты.
1) прокладка в виде вебсервиса на каком ни будь пхп
2) Из виндового клиента.

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

(2) Почему что?
В 1 уже написали, что только в виндовом клиенте доступно.
Ты запостил статью, в которой дано решение только для виндового клиента.

Ошибка при выполнении запроса.
по причине:
Ошибка получения данных
по причине:
по причине:
Ошибка при исполнении запроса набора данных
по причине:
Ошибка выполнения запроса
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Описание: [MySQL][ODBC 5.1 Driver][mysqld-5.1.53-community]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 '45
T1.id,
T1.id,
T1.time,
T1.time2,
T1.number,
T1."cam_name",
T1."cam_id"
FROM n' at line 1

Поэтому и спрашиваю нет ли аналога для вот этого кода:
Connection = Новый COMОбъект("ADODB.Connection");

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

(7) Проблема в том, что он ругается на тип "Строка", но выборочно. Поле "number" проходит (Строка 10), а поля cam_name и cam_id не проходят (Строка 45).

Я понял 1С не может прочитать данные, где имя колонки содержит символ "_".

Только как решить эту проблему? Имя колонок в базе MySQL менять нельзя.

Решение установили коннектор версии 5.3 и проблема ушла. Всем спасибо за помощь.

В 90-е, когда IT-специалисты получили возможность легко обмениваться информацией благодаря Интернету, мир пребывал в эйфории. Еще бы, столько полезных концепций ринулись в общий котел, превращаясь на глазах в могущественный сплав, позволявший решить (как тогда казалось) любые проблемы. Вот и реляционные базы данных повыползли из полузакрытых корпоративных лабораторий и превратились в повседневное средство решения программистских проблем. Только вот баз данных много, форматы данных и соединений с ними у всех производителей разные… В воздухе витала идея о том, что хорошо бы сделать нечто, позволяющее абстрагироваться от частностей и обращаться к любым базам данных одинаковым способом. Ведь в конечном итоге все они поддерживают SQL-запросы.

И тут самое время вспомнить цитату из "Компьютерной Библии": «Билл был хитрее всех зверей полевых»…

Да, именно Microsoft первой внедрила в свою ОС концепцию ODBC — универсального способа связи с базами данных, когда настроив один раз доступ к источнику данных и запомнив его имя, программист может сосредоточиться на работе именно с данными, а не въезжать в особенности той или иной платформы. Тут справедливости ради нужно сказать, что даже Sun выпустила аналогичный стандарт — JDBC — несколько позднее. Как говорится, не всё то «не золото», что Microsoft.

Со временем поклонники Linux тоже захотели обзавестись таким удобным механизмом. Так появился проект unixODBC, который и по сей день себя неплохо чувствует. Я этот проект знаю примерно с 2001 года и до сих пор этим механизмом пользуются многие разработчики, хотя к настоящему времени появилась масса альтернатив (ADO, например).

К чему весь этот высокохудожественный исторический экскурс? Да к тому, что сейчас, когда приложения для Windows активно переносятся на Linux, ODBC может стать «прокладкой», через которую, например, программа 1С может синхронизировать свои данные с какой-то другой, производственной базой данных, причем в реальном времени: внесли изменения в форму 1С — они сразу же попали в другую базу (добавились или обновились).

Особенно приятно то, что Wine умеет представлять Windows-приложениям юниксовый ODBC как виндовый, так что никакой дополнительный огород городить не надо. Итак, как настроить ODBC на Linux-компьютере, на котором через Wine будет запускаться, скажем, 1С и обращаться через ODBC к другим базам.

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


разве что архив нужно распаковывать «по-старинному»:


а то MC его раскрывать отказался.

Затем нужно установить ODBC-драйвер для нужной базы данных. Возьмем для примера тот же PostgreSQL. Его ODBC-драйвер можно взять здесь. Собирается и устанавливается всё так же:


Итак, платформа готова. Нужно соединиться с конкретной базой данных, точнее говоря настроить один раз соединение (логин, пароль, хост и т.п.), чтобы потом к нему обращаться просто по имени. У ODBC есть общесистемные настройки и пользовательские. Имена файлов, в которых они хранятся, разнятся от системы к системе. Чтобы их выяснить нужно ввести команду:


Её вывод будет примерно таким:

Нас интересует здесь /usr/local/etc/odbcinst.ini, где прописываются имеющиеся драйвера, и /home/username/.odbc.ini, где лежат настройки для баз, с которыми дозволено соединяться пользователю. Неплохое руководство по настройке ini-файлов находится здесь. Пример файла odbcinst.ini:

Всё, можно пользоваться. Для проверки прилагается утилита isql:

Теперь попробуем убедиться, что ODBC работает из-под Wine. Для этого скачаем проверочную программку TestConn. Распакуем и запустим ее под Wine:



Как видите, Windows-программа видит соединение с базой данных, установленное через связку Wine/Linux/ODBC.

«А дальше? Как писать обработки для 1С, использующие такое соединение?», — спросит иной йуный падаван. А дальше, ребятушки, бубен вам в руки — и вперед, на танки с саперными лопатками. Я, чай, всё описанное тоже не во сне увидел.



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

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

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

Установка

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

(дополнительно установятся: libodbc1 odbcinst odbcinst1debian2)

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

  • Для 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 Password=PASS;"
Пользователя и пароль я запихивал в отдельные поля.

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

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

"[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) будут по-умолчанию устанавливаться в тип объекта, а не Число. Мне это небыло нужно, поэтому вручную менял тип.

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

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

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

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 <FuncName>
2) [FreeTDS][SQL Server]Incorrect syntax near the keyword 'SELECT'.

1) EXECUTE <FuncName>
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]:

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