PDA

Просмотр полной версии : Подружить 1С и MySQL - реально?


Тарифы: МТС, Билайн, МегаФон
Выгодные непубличные тарифы МТС, Билайн, МегаФон, Безлимитный интернет ✅
MacLEOD
16-08-2004, 23:39
Ни для кого не секрет что использование SQL повышает производительность 1С, видимо в основе прироста скорости стоит решение извечной проблемы «перелопачивания» СУБД всей базы данных по узким каналам связи да еще и в режиме разделения этого канала с парой-тройкой других станций.
Для меня было особенно интересно выполнить контроль остатков ТМЦ на компоненте «Бухгалтерский учет» 1С 7.7. Но насмотревшись на ее реализацию стандартными методами через хранение движений в справочниках («А че, какая разница где хранить – в регистрах или в справочниках?») и тормоза связанные с этим, решил откопать что-нибудь о хранении данных в MySQL. Достоинств привинчивания именно МайСиквела масса, в основном лицензионная чистота. Оказалось, что (то ли лыжи не едут, то ли плохо искал…) такой информации кот наплакал во всем инете. Что-то где-то когда-то. В общем примера нет.
Скомпилировал из огрызков собственных знаний и кусков примеров.

Создается обработка. Как назвать – не важно, важно потом найти ее в куче других обработок. На форму кидается Таблица и обзывается, например, MySQL_Таблица. Далее (ах да, забыл – MySQL-то стоит? Если нет – www.mysql.com, милости просим) создается база в MySQL и называется, предположим, 1c_base. Устанавливается пакет MySQL_ODBC (берется с официального сайта). Создается системный DSN (Data Source Name, в Control Panel ищется) с именем «1c», который указывает на базу данных MySQL. Создается таблица users:

# Host: localhost
# Database: 1c
# Table: 'users'
#
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(100) NOT NULL default '',
`family` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`,`name`,`family`)
) TYPE=MyISAM CHARSET=koi8r COLLATE=koi8r_general_ci;


Потом берется MySQL_ControlCenter и заполняется всякой лабудой – для проверки этого хватит.

Дальше дело техники – используем объекты ADO (Active Database Object - … хм… вообще-то забыл еще один шаг – скачивание и установка файла mdac_typ***** с официального сайта МелкоСофта – если будет ошибки давать попробуйте, у меня это требовалось только в Вин98), создаем объект Connection, открываем его, создаем RecordSet, цепляем его за созданный ранее Connection, и выполняем запрос из RecordSet (у Connection есть метод Execute, но он напоминает чем-то UDP-пакеты в TCP/IP – односторонний какой-то, результат фиг возьмешь). Результат хватается, бросается по строкам таблицы, объекты закрываются. Пьем пиво.

//*******************************************
Процедура ЗаполнитьТаблицу()
MySQL_Таблица.Очистить();
MySQL_Таблица.НоваяКолонка("Id");
MySQL_Таблица.НоваяКолонка("Name");
MySQL_Таблица.НоваяКолонка("Family");
Соединение = CreateObject("ADODB.Connection");
Соединение_param = "dsn=1c;server=localhost;uid=root;database=1c_base;port=3306";
Соединение.open(Соединение_param);
РекордСет = СоздатьОбъект("ADODB.Recordset");
РекордСет.ActiveConnection = Соединение;
РекордСет.Open("select * from users");
Пока РекордСет.EOF = 0 Цикл
MySQL_Таблица.НоваяСтрока();
MySQL_Таблица.Id = РекордСет.Fields("id").Value;
MySQL_Таблица.Name = РекордСет.Fields("name").Value;
MySQL_Таблица.Family = РекордСет.Fields("family").Value;
РекордСет.MoveNext();
КонецЦикла;
РекордСет.close();
Соединение.close();
КонецПроцедуры

Процедура Выполнить()
ЗаполнитьТаблицу();
КонецПроцедуры

//*******************************************

Работало на ура пока не внедрил все это хозяйство в форме справочника «Номенклатура». Тормозааа… Не так чтобы уж очень, работать можно (при использовании справочников еще не так тормозило!), но скрытые резервы существуют очевидно.
Замер производительности показал, что 56% времени обработка занята открытием соединения. Убыстрение делается опять-таки элементарно – одно-единственное Соединение открывается при открытии справочника Номенклатуры и при закрытии оного закрывается. Вроде полегчало – пошустрее забегал справочник. Снова прилипаем к любимому пенному напитку.
Тот же фокус с РекордСетом заметного прироста производительности не дал – не более 10%.

ЗЫ: Данная статья не претендует на «последнюю инстанцию», просто ликвидирует некоторую брешь в поиске нужной информации в инете.

apache
17-08-2004, 11:57
нереально их на друг друга натравить...гы :D

Kolos
17-08-2004, 12:04
нахер надо?
вообще 7.7 использует скл сервер наскока я понял совершенно неправильно. 1с просто заменили файлы дбф таблицами на серевере, никаких процедур на самом же сервере нет

K_I_R_K
17-08-2004, 12:27
не понял в чём смысл? какое нах убыстрение, какая в ж производительность. уж не хочешь ли ты сказать что скл работает быстрее дбфа? я имею в виду 1с?

K_I_R_K
17-08-2004, 12:29
верно. просто генерится структура хранения данных. и точно также по сети они гоняются (данные).

Kolos
17-08-2004, 12:56
правда в новой версии говорят что вроде как полноценную трехзвенку зделали, но хз, не видел не щупал

K_I_R_K
17-08-2004, 14:46
да, только скл не имеет к этому никикого отношения. движок у них теперь свой.

Kolos
17-08-2004, 14:49
что ты имееши ввиду под словом движок?
восьмерка памойму на мелкомягком серваке арбайтен

MacLEOD
21-08-2004, 01:33
Замеров производительности не производил, но субьективно - да, быстрее. Разве нет? Если нет - разве технология 1С-запросов при переходе на MSSQL не начинает транслироваться в SQL?

maxxam
26-03-2006, 15:15
http://www.move.net.ua/1CEndMySQL.html

MacLEOD
03-04-2006, 10:25
Занятная статейка...
Интересный вопрос был поднят недавно на моем совещании с одним из клиентов - можно ли сделать веб-страницу с остатками ТМЦ, причем без выгрузок/загрузок в MySQL или куда бы еще? Просто - обращение к 1С из PHP.

Neyron
03-04-2006, 10:28
хи хи хи

Tims
03-04-2006, 10:47
1С -> MySQL можно
MySQL -> 1C - куй там! ( в редких исключениях можно) теоретически не возможно... база то реляционная

MacLEOD
04-04-2006, 09:09
Ты на дату посмотри - 16-08-2004. Мне щас самому смешно ;) Наибольшая скорость при работе с доп. реквизитами справочника достигается не подключением внешней базы а использованием внутренних полей справочника, правда иногда без извратов не обойтись.
ЗЫ: Интересно смотреть на график загрузки процессора в моменты перелистывания справочника "Номенклатура" со включенными колонками остатков по нескольким складам. ;)

Ne_pridymal
29-12-2008, 06:24
Необходимо в 1С for SQL написать в модуле синтаксисом SQL, как это выглядит подскажите? И еще на синтаксисе 1С разве не пойдет?
Заранее спасибо...