Внешние источники данных на Linux-серверах 1С

Не знаю, все ли внешние источники, изображенные на картинке, можно использовать в 1С, но многие из них точно можно прикрутить к 1С, в том числе и установленном на сервере под управлением замечательной свободной ОС LINUX.

Свобода выбора — необходимое преимущество

Добрый день, уважаемые товарищи! Господам тоже доброго времени суток, ежели вы к нам с Парижу понаехали. Речь ныне пойдет о замечательном инструменте, доступном в 1С — внешних источниках данных. Для того, чтобы разобраться в принципиальных моментах связи с ними, попробуем подключить два варианта внешних источников: MySQL и PostgreSQL. Для этого нам понадобится сервер под управлением ОС LINUX (у меня уже есть «сервер» в лице домашнего ноутбука — на нем и будем тренироваться), на котором установлен сервер 1С и, например, PostgreSQL с патчами от 1С (лично я использую замечательную сборку от Postgres PRO).

Вообще, можно подключить множество разных источников данных к 1С, включая MS SQL (из Linux). Подробности о других источниках можно нагуглить самостоятельно, а вот о MySQL и PostgreSQL я расскажу подробно и с картинками.

Теоретическая часть

Собственно, 1С работает со внешними источниками посредством соединения с ними через механизм ODBC (Open Database Connectivity, т.е. открытый коннектор к базам данных). Для windows все просто — качаем где-нибудь нагугленный дистриб с коннектором, молимся, чтобы в нем не было троянов с руткитами и на свой страх и риск ставим (да, сгущаю краски). В Linux все уже находится в репозитариях с цифровой подписью и сертификатами, степень защищенности которых пользователям M$ и не снилась, а код которых открыт, как душа ребенка. В итоге не надо ничего искать в гугле — достаточно набрать $ apt-caсhe search:

$ apt-cache search odbc
libiodbc2 - iODBC Driver Manager
odbc-mdbtools - MDB tools ODBC driver
odbcinst - Helper program for accessing odbc ini files
odbcinst1debian2 - Support library for accessing odbc ini files
unixodbc - Basic ODBC tools
erlang-odbc - Интерфейс Erlang/OTP к базам данных SQL
freetds-common - конфигурационные файлы для клиентских библиотек FreeTDS SQL
libiodbc2-dev - iODBC Driver Manager (development files)
libodbc1 - Библиотека ODBC для Unix
libreoffice-base-drivers - Database connectvity drivers for LibreOffice
libreoffice-sdbc-firebird - Firebird SDBC driver for LibreOffice
...

В общем много всего — экрана три-четыре. Обратите внимание на FreeTDS — это драйвер для MS SQL! Может кому пригодиться…

Практическая часть

Итак, для того, чтобы подключить внешний источник, нам необходимо установить пакет поддержки ODBC под Linux. Для mysql достаточно выполнить команду:

$ sudo apt-get install libmyodbc

После чего необходимо откорректировать файл /etc/odbcinst.ini, в котором добавить секцию:

[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup           = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage       = 1

Для PostgrqSQL достаточно такой команды (и файлы править не надо):

$ sudo apt-get install odbc-postgresql

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

 

Тут мы подключили внешний источник из СУБД MySQL. База данных test, сервер — по-умолчанию localhost. После того, как мы нажмем «Ок», у нас на экране появится список таблиц данной БД и их поля. Можно выбрать, какие поля нам нужны, и нажать готово.

Дальше если мы зайдем в саму таблицу, то увидим знакомую картину, практически аналогичную справочнику. Можно использовать характеристики, устанавливать роли полей (для ключа и представления), в модуле менеджера можно указать функции для получения полей представления и самого представления. В модуле объекта доступны функции «ПередЗаписью», «ПриКопировании», «ПередУдалением» и т.д. и т.п. Также есть флаги для указания, что таблица доступна только для чтения… В общем и целом картина приятная у меня складывается.

При открытии 1С у нас данный внешний источник попадет в ту подсистему, в которую мы его добавим. Например, сюда:

Вот наша табличка «TestTbl». Но для того, чтобы увидеть сей чудный скрин, нужно еще кое-что сделать, а именно снова прописать наше соединение к БД, т.е. еще раз повторить те же действия, что мы делали в конфигураторе (не совсем понимаю логику разработчиков 1С, ну да и ладно):

Если Ваш источник находится на другом сервере 1С, то Вем нужно будет, сами понимаете, указать параметр Server. Т.к. у меня All In One, то мне так париться незачем.

Давайте проделаем то же самое с PostgreSQL. Тут следует обратить внимание на то, что при подключении к БД 1С, нужно указать драйвер PostgreSQL Unicode. Строка соединения в моем случае будет выглядеть так:

DRIVER={PostgreSQL Unicode};Database=jim;Server=localhost;

Подключение источника прошло успешно, но после попытки обновить данные (F5) мы видим такое вот сообщеньице:

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

Заключение

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

1. Найти с помощью apt-caсhe search нужный пакет (по слову «odbc» в идеале совмещенному с | grep dbname) и установить. Если так не нашлось — погуглить.

2. Проверить, появилась ли запись в файлике /etc/odbcinst.ini на данную тему. Если нет — добавить, обнаружив библиотеки в /usr/lib/x86_64-linux-gnu/odbc/ (вы же используете 64-битную систему, да?)

3. Зайти в конфигуратор и добавить внешний источник.

4. Добавить таблицу источника и задать строку подключения, имя пользователя и пароль (обычно убрав аутентификацию ОС).

5. Если что-то не подключается — проверить строку подключения и погуглить на эту тему.

6. Профит!

34 Comments

  1. lustin

    (0) все хорошо для начала — но не хватает двух вещей

    1. упоминания http://www.unixodbc.org/ — потому как любые проблемные сиутаций придется разруливать гугля/яндекся именно это словосочетание. На русском я обычно даю вот такую ссылку http://www.rldp.ru/mysql/myodbc/unixodbc.htm

    2. отображение наименования в режиме динамического списка, а не в режиме прямого просмотра, связано c типом mchar который сделан в виде расширения к PG, на самом деле это баг и по моему он зарегистрирован даже на bugboard.

    Reply
  2. starik-2005

    (1) lustin, спасибо за коммент. Материал в принципе расчитан на тех, кто интересуется использованием внешних источников на linux. По поводу юниксодбц, то для строки подключения это не нужно особо знать, а по поводу отображения источника из постгри, то если не выбирать колонки с типом byte — все отображается в новых релизах, если не забыть про ключ и представление.

    А вот при добавлении записей с русскими буквами, то при их сохранении в mysql источниках имеется проблеика. Не знаете, как решить?

    Reply
  3. EmpireSer

    (0) Интересно.

    Но поправте русский, пожалуйста. Например у вас: «демонического списка», «то Вем нужно».

    Reply
  4. konikamif

    (2) Нужно при подключении указать локаль. либо в настройках клиента, либо первый запрос должен быть SET NAMES [локаль]

    локаль — cp1251 или utf8.

    попробуйте подобрать. нет под рукой на чем попробовать

    Reply
  5. konikamif

    (2) по ссылочке которую дал lustin.

    есть пример для настройки кодировки в файле /etc/odbcinst.ini

    CLIENT_LOCALE=

    DB_LOCALE=

    Reply
  6. starik-2005

    (3) EmpireSer, по поводу «Демонический» — то так и есть правильно))) По остальным поводам поправлю.

    (4) konikamif, подскажите, как передать SET NAMES … при обращении к источнику внешних данных из 1С?

    (5) konikamif, у меня так не работает. А Вы пробовали или по ссылочке прочитали?

    Reply
  7. Ibrogim

    Круто. а будет ли работать с таблицами ms access?

    Reply
  8. konikamif

    (6)Не пробовал. Но у вас точно проблема с кодировками.

    Можно результаты запроса SHOW VARIABLES LIKE ‘character%’; и SHOW VARIABLES LIKE ‘collation%’;

    Reply
  9. starik-2005

    (7) Ibrogim, http://www.easysoft.com/products/data_access/odbc-access-driver/ — тут есть драйвер, но он пропиетарный с пробным периодом 14 дней. Попробуйте.

    Reply
  10. starik-2005

    (9) konikamif, доберусь до дома — проверю. Но т.к. русские буквы отображаются в динамическом списке внешнего источника и проблема проявляется только при попытке записи, то предположу, что узкое место — это передача из 1С данных в ODBC. Таблица была создана через «CREATE TABLE tabletbl (ID INT(10) UNIQUE AUTO_INCRIMENT, name VARCHAR(100) CHARACTER SET utf8);»

    Reply
  11. Ibrogim

    (8) за 600 баксов меня ваш аватар задушит

    Reply
  12. starik-2005

    (11) Ibrogim, ну Вам за две недели надоест с аксессом мучиться и перетащите базу в аксессе на какой-нить скул (там есть подключение тех же внешних источников хранения) вместо внутреннего хранилища. И уже в тот скул через ODBC будете обращаться.

    Reply
  13. aximo

    хотелось бы пояснений об sqlite

    Reply
  14. starik-2005

    (13) aximo, а инструкция на что?

    sergey@sergey-K53SC:~$ apt-cache search sqlite | grep odbc
    libghc-hsql-odbc-dev — UnixODBC driver of the HSQL library for GHC
    libghc-hsql-odbc-doc — API documentation of the hsql-odbc library for Haskell
    libghc-hsql-odbc-prof — UnixODBC driver of the HSQL profiling library for GHC
    libgnadeodbc-dbg — GNat Ada Database Environment — ODBC debugging symbols
    libgnadeodbc2 — GNat Ada Database Environment — ODBC interface
    libgnadeodbc2-dev — GNat Ada Database Environment — ODBC programming interface
    libsqliteodbc — ODBC driver for SQLite embedded database
    sergey@sergey-K53SC:~$ sudo apt-get install libsqliteodbc
    $ cat /etc/odbcinst.ini
    [SQLite]
    Description  = SQLite ODBC Driver
    Driver  = libsqliteodbc.so
    Setup  = libsqliteodbc.so
    UsageCount  = 1
    
    [SQLite3]
    Description  = SQLite3 ODBC Driver
    Driver  = libsqlite3odbc.so
    Setup  = libsqlite3odbc.so
    UsageCount  = 1
    

    Показать

    Reply
  15. starik-2005

    (14) кстати, под Linux не стала работать sqlite3. Т.е. она работает, но строки получаются без четных букв. Т.е. вместо «Новый объект» выходит «Нвйоък». Не смог забороть — хоть драйвер переписывай.

    Reply
  16. Ibrogim

    (12)

    ну Вам за две недели надоест с аксессом мучиться и перетащите базу в аксессе на какой-нить скул (

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

    Сейчас есть файловые базы 1с играющие роль конструктора отчётов через внешние источники и разных EDI шлюзов, но беда в их файловости (нет нормальных регламентных заданий)

    Reply
  17. starik-2005

    (16) Ibrogim, а не думали о мелкософтовском конструкторе отчетов M$ BI (или как его там?) — он умеет собирать из внешних источников данные и рисовать красивые графики и таблички? Или, как вариант, экспорт данных из аксесса в SQL (тот же MS, express), а потом подключение к нему 1С-ок.

    Reply
  18. Ibrogim

    (17) У меня и так 1С (в рамках данной задачи) это прокладка. если ещё предварительно выгружать в sql то их уже становится две. тем более придётся придумывать что то чтоб данные были актуальны в этой промежуточной SQL.

    А на счёт отчётов конечно можно и в эксель подрубить таблицы акцеса (я и 1С подключал) но не только отчётами едиными жива эта «база прокладка» . Говорю же там всякие ЕДИ и т.д. т.е. различный функционал прикручен внешний.

    Reply
  19. starik-2005

    (18) Ibrogim, я это имел ввиду.

    Reply
  20. Serginio

    Добавлю про альтернативу

    1С, Linux, Excel, Word, OpenXML, Net Core

    Кроме того есть множество провайдеров к различным базам данных, как MS SQL так и другим, в том числе NoSQL

    Приведу пример доступа к MS SQL
    СборкаSqlClient=ъ(Врап.Сборка(«System.Data.SqlClient.dll»));
    SqlConnection=ъ(СборкаSqlClient.GetType(«System.Data.SqlClient.SqlConnection»));
    SqlCommand=ъ(СборкаSqlClient.GetType(«System.Data.SqlClient.SqlCommand»));
    
    connection =ъ(Врап.Новый(SqlConnection.ПолучитьСсылку(),ConnectionString));
    connection.Open();
    
    ТекстЗапроса = «Select Номенклатура.DESCR Наименование  From sc84 Номенклатура where DESCR Like ‘%’+@Строка+’%’
    |order by Номенклатура.DESCR»;
    
    
    command = ъ(Врап.Новый(SqlCommand.ПолучитьСсылку(),ТекстЗапроса,connection.ПолучитьСсылку()));
    
    Parameters=ъ(command.Parameters);
    Parameters.AddWithValue(«@Строка», «ДСП»);
    dr = ъ(command.ExecuteReader());
    
    Пока dr.Read() Цикл
    Сообщить(dr.get_Item(«Наименование»));
    КонецЦикла;
    

    Показать

    При этом можно сделать обертку DynamicObject над SqlDataReader и использовать так

    Пока dr.Read() Цикл
    Сообщить(dr.Наименование);
    КонецЦикла;
    Reply
  21. starik-2005

    (20) Serginio, по поводу Excel, то, полагаю, для 8.3 это уже не нужно — платформа умеет читать оный формат в табличный документ. А 8.2 на Linux-сервере некоторым образом работает не очень хорошо, да и с Postgres’ом она не на столько хорошо дружит, как 8.3.

    Ну и правильно бы было сразу привести функцию ъ()

    Функция Ъ(Ссылка)
    // Создаем объект по ссылке полученной из методов .Net классов
    //Физически это строка ёЁ<Ьъ>№_%)Э?&2 содержащее 12 символов для отделения их от других строк
    //и индекс в спике исполуемых объектов на стороне .Net
    
    рез = Новый(«AddIn.NetObjectToNative.NetObjectToNative»);
    // И установим ссылку
    рез.УстановитьСсылку(Ссылка);
    возврат  рез
    КонецФункции // СоздатьОбъектПоСсылке()

    Показать

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

    Reply
  22. Serginio

    (21)

    Я же т напмсал >> Добавлю про альтернативу

    Я задал вопрос 1С Linux. Что не хватает по сравнению с Windows?

    http://forum.infostart.ru/forum26/topic157263/message1610545/#message1610545

    http://www.forum.mista.ru/topic.php?id=779135

    Ответов очень мало. Суть то в том, что бы избавиться от ъ, нужна поддержка 1С.

    Но по сути то это 60 мегабайт .Net Core на разрядность. Но можно использовать все стандартные классы .Net Core и плюс огромную кучу сторонних библиотек.

    И если ввести наряду с ComОбъект и Вэб Сервисам то можно писать

    connection = new Net.System.Data.SqlClient.SqlConnection(ConnectionString);
    
    command = new Net.System.Data.SqlClient.SqlCommand(ТекстЗапроса,connection);
    

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

    Для меня является загадкой чем использование .Net Классов отличается от использования COM объектов или вэб сервисов?

    Reply
  23. ineshyk

    А под Ubunu 16.04 есть инструкция для 32 битной 1с на 64х машине

    Reply
  24. starik-2005

    (23) а с какой целью Вы в 2017-м почти году хотите 32-битную систему поставить? В Linux есть возможность использовать мультиархитектуру https://wiki.debian.org/Multiarch/HOWTO

    Reply
  25. ineshyk

    (24) Так исторически сложилось, что сервер 1с 32битный. Работать с х64 драйвером он не будет.

    Reply
  26. ineshyk

    подключаюсь в Firebird базе

    такой конфиг odbc

    [baseName]
    Description = Firebird
    Driver = Firebird
    Dbname = dbname
    User = SYSDBA
    Password = masterkey
    Role =
    CharacterSet =
    ReadOnly = No
    NoWait = No

    Показать

    Почему-то не отображаетя кириллица.

    Что нужно еще указать в конфиге, чтобы все было ок?

    Reply
  27. starik-2005

    (26)

    Что нужно еще указать в конфиге, чтобы все было ок?

    Сложно сказать без возможности проверить, но мысль о «CharacterSet = [Кодировка в базе, например, UTF-8]». Но предположу, что вдоску виндузятники, создавая базу файрберда, указали там cp1251…

    Reply
  28. ineshyk

    (26) указываю в строке подключения CharacterSet=win1251, не помогло.

    База в win1251, но при подключении все равно не читает кириллицу. В чем еще может быть проблема?

    Reply
  29. log777

    У меня на 32х разрядной 1с заработало с версией драйвера Firebird ODBC 2.0.0 с CharacterSet=UNICODE_FSS. База в кодировке Win1251. Локаль Linux UTF8.

    Reply
  30. ivoryblade

    Добрый день! Столкнулся со схожей проблемой. Сервер Предприятия на Ubuntu необходимо подключаться к базе Firebird на удаленном компе с Windows. До этого стоял старый сервер на Windows Server и обработка работала нормально. Сейчас же ни в какую из 1С подключаться не хочет, хотя в консоли сервера isql подключается нормально к нужной базе. Сервер 1С х64 ОС соответственно тоже.

    /etc/odbc.ini

    [Firebird]
    Description  = Firebird/InterBase® driver
    Driver  = /usr/lib/x86_64-linux-gnu/odbc/libOdbcFb.so
    Setup  = /usr/lib/x86_64-linux-gnu/odbc/libOdbcFb.so
    FileUsage  = 1
    UsageCount  = 5
    

    /etc/odbcinst.ini

    [Terra]
    Description  = Firebird/InterBase® driver
    Driver  = Firebird
    Dbname  = xx.xx.xx.xx/3050:C:WindowsSystem32vesterm.fdb
    User  = SYSDBA
    Password  = ********
    Role  =
    CharacterSet  = WIN1251
    ReadOnly  = No
    NoWait  = No
    Dialect  = 3
    QuotedIdentifier  = Yes
    SensitiveIdentifier  = No
    AutoQuotedIdentifier  = No
    

    Показать

    Строка соединения которую я использую в 1C

    DRIVER={Firebird};UID=SYSDBA;PWD=******;DATABASE=xx.xx.xx.xx/3050:C:WindowsSystem32vesterm.fdb

    Пробовал использовать alias базы эффект тот же… Помогите пожалуйста разобраться что я не так делаю.

    Reply
  31. 1c_nik923

    19 год на дворе а я только открыл для себя данный инструмент! За статью +

    Reply
  32. 1c_nik923

    Хотя нашел интересную ошибку, если знаете как решить, подскажите.

    Reply
  33. starik-2005

    (32) Я бы в сторону кодировки смотрел. Ошибка не гуглится вообще, слово «occurred» неверно написано даже))) Попробуйте простой запрос на селект и установите в соединении кодировку (смотрите, что там со строкой соединения) utf-8 (мало ли в оригинальной таблице кодировка виндовая, например, или еще какая).

    https://www.connectionstrings.com/mysql/

    Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
    CharSet=utf8;
    — Protocol=memory;Shared Memory Name=MYSQL;
    Reply
  34. VVi3ard

    Может кто встречал способ использовать odbc в linux без внешних источников, например через NativeVK или хотя бы командную строку.

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

    Reply

Leave a Comment

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