Изменение информации на удаленном веб сайте из 1С через ODBC драйвер для mysql

В статье описана технология взаимодействия с mysql базой данных из 1С:Предприятия через ODBC драйвер.

В продолжение статьи о использовании внешних источников данных в 1С.

 

У меня появилась интересная задача. Необходимо на интернет сайте держать список актуальных телефонов клиентов компании. Самый актуальный список этих телефонов есть в нашей CRM системе.

Задача простейшая.
Скачиваем свежий ODBC драйвер для mysql с сайта производителя.

В 1С создаем обработку с следующим кодом.

Код

СтрокаСоединенияСАстерискСервером   =   "
|DRIVER={MySQL ODBC 5.1 Driver};
|SERVER=wwwhost_na_korotom_stoit_mysql_base;
|DATABASE=imya_database_s_telefonami;
|UID=user_s_pravami_zapisi_v_database;
|PWD=password_usera_s_provami_zapisi;
   
Соединение = Новый COMОбъект("ADODB.Connection");
   
Соединение.ConnectionString = (СтрокаСоединенияСАстерискСервером);
   
Попытка
      Соединение.Open();
      Сообщить("MySQL база подключена!!!");
Исключение
      Сообщить("Не могу подключиться к базе!!! ");
КонецПопытки;

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

Очищаем все записи из таблицы с телефонами

Код

Попытка
      Соединение.Execute("truncate table callerid;");
      Сообщить("Мы успешно все подчистили!");
Исключение
      Сообщить("Что то пошло не так :( ");
КонецПопытки;

Добавляем новую строчку с контактной информацией

Код

АбонентТранслит = "Vaisya Pupkin";
НомерТелефона  = "74952293042";

Стр = "INSERT INTO `callerid` SET `number`  ="+""""+НомерТелефона+ """"+",  `name`  ="+""""+АбонентТранслит+"""";

Попытка
      Соединение.Execute(Стр);
      Сообщить("Запись с Васей добавлена в базу сайта");
Исключение
      Сообщить("Что то пошло не так :( ");
КонецПопытки;

p.s. В реальной жизни этим методом я ежедневно обновляю информацию на нашей АТС (asterisk) о контактных телефонах клиентов. Задача выполняется фоновым заданием на сервере 1С. Около 1200 записей заливается 12 секунд.

13 Comments

  1. cool.vlad4

    Я бы добавил, что это не для всех «удаленных веб сайтов «. По причинам безопасности ODBC закрывают на удаленных веб сайтах, да и к тому же размещают внутри сети — т.е. по хорошему напрямую через интернет БД не должна быть видна. Так, что можно добавить способ через туннелирование — ssh, http. ssh — через putty. а http через скрипт на сайте.

    Reply
  2. cool.vlad4

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

    Reply
  3. jorikfon

    (1) cool.vlad4, Конечно вы правы, просто вопросы безопасности я вынес за рамки стати для ее упрощения. Ведь механизмов удаленного взаимодействия с сайтом действительно много, да и сама субд позволяет настраивать авторизацию по IP. В моем конкретном случае сайт находится внутри локальной сети в DMZ зоне и я имею все инструменты безопасного доступа к нему из LAN.

    (2) cool.vlad4, К сожалению, я не владею языком запросов MYSQL. Если кто-то в комментариях напишет пример, я допишу его в пост. По сути описанным способом можно выполнять любой произвольный MYSQL запрос. Меня в этом случае всегда выручает гугл. 🙂

    Reply
  4. salexdv

    Добавьте еще выборку данных и как сказано в (2) пакетную вставку данных, ибо вставлять по одной записи, когда база MySQL висит в вебе — кощунство 🙂

    Reply
  5. jorikfon

    (4) Alxd, Выборку делаем через внешние источники используя язык запросов 1С.

    Вставлять группами наверное не проблема, дайте текст запроса, я проверю и допишу в статью. Не умею, не пробовал 🙂

    Reply
  6. salexdv
    // Выборка данных
    RS = Новый COMОбъект(«ADODB.Recordset»);
    RS.ActiveConnection = Connection;
    
    query = «SELECT бла-бла-бла»
    
    Попытка
    RS.Open(query);
    Исключение
    Предупреждение(ОписаниеОшибки());
    Возврат Ложь;
    КонецПопытки;
    
    Если RS.EOF() И RS.BOF() Тогда
    (результат запроса пустой)
    Предупреждение(«Нет запрашиваемых данных.»);
    Иначе
    RS.MoveFirst();
    Пока НЕ RS.EOF() Цикл
    Поле1 = RS.Fields.Item(«BlaBla»);
    RS.MoveNext();
    КонецЦикла;
    КонецЕсли;
    RS.CLOSE();

    Показать

    Как-то так делается выборка

    Reply
  7. salexdv

    Пакетная вставка

    query = «INSERT INTO products_
    |(product_id , product_name )
    |VALUES
    |(‘1’, ‘Товар №1’),
    |(‘2’, ‘Товар №2’),
    |(‘3’, ‘Товар №3’)»;
    Попытка
    Соединение.Execute(query);
    Сообщить(«Мы успешно все вставили!»);
    Исключение
    Сообщить(«Что то пошло не так 🙁 «);
    КонецПопытки;

    Показать

    Reply
  8. salexdv

    (5) Попробуйте, вам понравится 🙂

    Reply
  9. fr.myha

    Спасибо большое!

    Reply
  10. CrazyDave

    (3) насчёт odbc. Делал тут одному мужику, который офигенно любит автономоность во всём, внешнюю компоненту для связи MySQL c 1C. Компонента работает без установленных на клиенте odbc драйверов и т.п, позволяет выполнять как select запросы к БД — результат возвращается как ТаблицаЗначений так и insert delete update. Как вы думаете — стоит такое поделие выложить или нет? )))) Просто одно portable-чудо уже выложил (делал изначально тому же человеку)- http://infostart.ru/public/125392/ — ну так , ни шатко ни валко))))

    Reply
  11. Jatz

    (10) CrazyDave, компонента в 64х системе работает?

    Reply
  12. atol_zlat

    Спасибо за пакетную вставку, 2500 тысячи записей вставляются за 2 сек. Спасибо.

    Reply
  13. Nkolp

    Не могу подключиться с MS Server 2012 к базе MySQL на удаленном виртуальном сервере (ни по IP, ни по имени сайта)

    ODBC на сервере MS настроил (Тест подключения в панели управления — проходит, список баз выдает).

    Хочу подключить внешний источник данных 1С, тестирую по ADODB.

    АДО = Новый ComОбъект(«ADODB.Connection»);
    СтрокаСоединения = »
    // |Provider=MSDASQL;
    |DRIVER={MySQL ODBC 5.3 Unicode Driver};
    |Server=95.ььь.ььь.ььь;
    |PORT=3306;
    |DATABASE=…….;
    |User=…….; // сначала пробовал UID и PWD соответственно
    |Password=……;
    //|Socket=MySQL;
    |Option=3;
    |»;
    Попытка
    АДО.Open(СтрокаСоединения);

    Показать

    … Попытка не проходит …

    Пробовал разные варианты с сайта http://www.connectionstrings.com/mysql/#mysql-connector-odbc-5-1

    Reply

Leave a Comment

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