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

Опубликовал Николай Бекетов (jorikfon) в раздел Обмен - Интеграция с WEB

В статье описана технология взаимодействия с 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 секунд.

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
1. Ийон Тихий (cool.vlad4) 41 22.09.11 10:38 Сейчас в теме
Я бы добавил, что это не для всех "удаленных веб сайтов ". По причинам безопасности ODBC закрывают на удаленных веб сайтах, да и к тому же размещают внутри сети - т.е. по хорошему напрямую через интернет БД не должна быть видна. Так, что можно добавить способ через туннелирование - ssh, http. ssh - через putty. а http через скрипт на сайте.
2. Ийон Тихий (cool.vlad4) 41 22.09.11 10:40 Сейчас в теме
Да и для общего интереса можно рассмотреть техники генерации запросов для пакетной вставки, для обновления данных.
3. Николай Бекетов (jorikfon) 289 22.09.11 10:51 Сейчас в теме
(1) cool.vlad4, Конечно вы правы, просто вопросы безопасности я вынес за рамки стати для ее упрощения. Ведь механизмов удаленного взаимодействия с сайтом действительно много, да и сама субд позволяет настраивать авторизацию по IP. В моем конкретном случае сайт находится внутри локальной сети в DMZ зоне и я имею все инструменты безопасного доступа к нему из LAN.

(2) cool.vlad4, К сожалению, я не владею языком запросов MYSQL. Если кто-то в комментариях напишет пример, я допишу его в пост. По сути описанным способом можно выполнять любой произвольный MYSQL запрос. Меня в этом случае всегда выручает гугл. :)
4. Alxd (salexdv) 22.09.11 10:54 Сейчас в теме
Добавьте еще выборку данных и как сказано в (2) пакетную вставку данных, ибо вставлять по одной записи, когда база MySQL висит в вебе - кощунство :-)
5. Николай Бекетов (jorikfon) 289 22.09.11 10:57 Сейчас в теме
(4) Alxd, Выборку делаем через внешние источники используя язык запросов 1С.
Вставлять группами наверное не проблема, дайте текст запроса, я проверю и допишу в статью. Не умею, не пробовал :)
6. Alxd (salexdv) 22.09.11 11:01 Сейчас в теме
// Выборка данных
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();
...Показать Скрыть


Как-то так делается выборка
7. Alxd (salexdv) 22.09.11 11:04 Сейчас в теме
Пакетная вставка
query = "INSERT INTO products_
        |(product_id , product_name )
	|VALUES 
        |('1', 'Товар №1'),
        |('2', 'Товар №2'),
        |('3', 'Товар №3')";
Попытка
      Соединение.Execute(query);
      Сообщить("Мы успешно все вставили!");
Исключение
      Сообщить("Что то пошло не так :( ");
КонецПопытки;
...Показать Скрыть
jorikfon; +1 Ответить
8. Alxd (salexdv) 22.09.11 11:13 Сейчас в теме
(5) Попробуйте, вам понравится :-)
9. muha muhaha (fr.myha) 27.03.12 12:20 Сейчас в теме
10. Игорь Баринов (CrazyDave) 02.05.12 16:06 Сейчас в теме
(3) jorikfon, насчёт odbc. Делал тут одному мужику, который офигенно любит автономоность во всём, внешнюю компоненту для связи MySQL c 1C. Компонента работает без установленных на клиенте odbc драйверов и т.п, позволяет выполнять как select запросы к БД - результат возвращается как ТаблицаЗначений так и insert delete update. Как вы думаете - стоит такое поделие выложить или нет? )))) Просто одно portable-чудо уже выложил (делал изначально тому же человеку)- http://infostart.ru/public/125392/ - ну так , ни шатко ни валко))))
11. Евгений Дубовик (Jatz) 16.05.12 11:40 Сейчас в теме
(10) CrazyDave, компонента в 64х системе работает?
12. Антон Скакалин (atol_zlat) 28.05.15 07:40 Сейчас в теме
Спасибо за пакетную вставку, 2500 тысячи записей вставляются за 2 сек. Спасибо.
13. Nike K (Nkolp) 13 11.09.15 14:54 Сейчас в теме
Не могу подключиться с 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