Ни для кого не секрет что использование 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%.
ЗЫ: Данная статья не претендует на «последнюю инстанцию», просто ликвидирует некоторую брешь в поиске нужной информации в инете.