1C + MySQL

Опубликовано Опубликовано в рубрике 1C Программирование

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

Итак, перед нами стоит задача: существует некоторая база данных предприятия на 1С, в которой есть справочник товаров и подчиненный ему справочник цен, необходимо выгрузить эти данные в базу MySQL на сервере, для дальнейшего представления их в виде прайс-листа. База данных MySQL находится на определенном веб сайте, ну скажем golubec.com.ua и имеет имя baza, в которой находится две таблицы products и category, так же нам известно имя и пароль пользователя для доступа к БД.

Во первых для реализации данной задачи нам потребуется установить в систему библиотеку ODBC, которая позволит нам обращаться к базе данных MySQL. Данная библиотека является общедоступной, соответственно я не нарушая лицензии на авторское право, могу разместить ее прямо СДЕСЬ. Итак выкачиваем библиотеку, инсталируем, перезагружаем компьютер.

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

Что необходимо знать для получения доступа к данным базы MySQL:

Адрес сервера, на котором расположена база данных MySQL — {Сервер}
Имя базы данных — {БазаСервера}
Имя пользователя БД — {ПользовательСервера}
Пароль пользователя БД — {ПарольСервера}
Что необходимо проделать чтоб получить соединение с БД:

Сервер=»golubec.com.ua»;
ПользовательСервера=»username»;
ПарольСервера=»userpassword»;
БазаСервера=»baza»;

Соединение = CreateObject(«ADODB.Connection»);
Соединение_param = «driver={MySQL ODBC 3.51 Driver}; server=»+СокрЛП(Сервер)+»; uid=»+СокрЛП(ПользовательСервера)+»; pwd=»+СокрЛП(ПарольСервера)+»; database=»+СокрЛП(БазаСервера)+»; port=3306; STMT=SET CHARACTER SET cp1251″;
Try
Соединение.open(Соединение_param);
Except
DoMessageBox(«Отсутствует связь с базой!»);
return;
EndTry;

Когда мы получаем доступ к БД мы имеем возможность выполнять запросы на языке SQL непосредственно к самой БД, например:

Вышеуказанные запросы позволяют очистить все даные из таблиц products и category

Запрос = «TRUNCATE TABLE products»;
Соединение.Execute(Запрос);
Запрос = «TRUNCATE TABLE category»;
Соединение.Execute(Запрос);

Когда я только начал работать с БД MySQL из 1С у меня возникло много проблем с данными на русском языке, так как БД была в одной кодировке, 1С выгружает в другой, а программа формирующая прайс-лист на сайте в третей. И как результат этого бардака на сайте вместо букв я увидел набор знаков вопросов ?????????

Немного поигравшись я пришел к вот такому решению, на каждом шагу необходимо явно задавать в какой кодировке мы работаем, к примеру при создании таблиц на сервере MySQL было явно указанно для ячеек содержащих русские символы хранить их в кодировке «cp1251_general_ci», несмотря на то что вся остальная база и таблицы находятся в кодировке «utf8_general_ci», при соединении с БД MySQL из 1С в параметрах указывать кодовую страницу соединения: «…STMT=SET CHARACTER SET cp1251», ну и напоследок перед началом запросов на обновление или вставку данных производить запрос:

И наконец я наведу пример запроса позволяющего вставить данные в БД MySQL:

Запрос = «SET NAMES cp1251»;
Соединение.Execute(Запрос);

Как вы понимаете, для правильного написания запросов к базе данных MySQL, как минимум необходимо знать элементарные комманды языка SQL, но это выходит за рамки данного обзора.

Try
Запрос = «INSERT INTO category ( ID , name , Lv1 , Lv2 , Lv3 )VALUES (‘»+Ном+»‘, ‘»+СокрЛП(Спр.Наименование)+»‘ , ‘»+Лв1+»‘ , ‘»+Лв2+»‘ ,'»+Лв3″‘);»;
Соединение.Execute(Запрос);
Except
DoMessageBox(«Отсутствует связь с базой!»);
return;
EndTry;

Try
Запрос = «INSERT INTO products ( ID , name , categoryID , price_1 ,price_2 , price_3 , price_4 , price_5 , sklad , rezerv , prognoz ,kod1c) VALUES (‘»+Ном+»‘, ‘»+СокрЛП(Спр.ПолнНаименование)+»‘, ‘»+Катег+»‘»+Цены+» , ‘»+Склад+»‘ , ‘»+Резерв+»‘ , ‘»+Прогноз+»‘ , ‘»+Спр.Код+»‘);»;
Соединение.Execute(Запрос);
Except
DoMessageBox(«Отсутствует связь с базой!»);
return;
EndTry;

Для завершения работы с БД необходимо закрыть соединение:

В принципе я указал все необходимые сведения для написания правильной программы по работе с БД MySQL из под 1С предприятия.

Соединение.close();

В своем случае я реализовал выполнение данной обработки с определенной периодичностью и таким образом добился регулярного обновления данных для формирования прайс-листа на сайте комапнии. Ну и напоследок вот пример моей обработки.