новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Прямые запросы из 1С к базе на PostgreSQL

  • Добавить свою публикацию
  • для этого требуется регистрация

Недавно передо мной встала задача: из 1С нужно было подключаться к базе, лежащей на сервере PostgreSQL и получать из неё данные для дальнейшей их обработки. Материала по данной теме в сети я нашел не очень много, и на практике мне пришлось столкнуться с вещами, о которых в найденных мною источниках умалчивалось. После того, как задача была успешно решена, я решил собрать все свои наблюдения воедино. Вот что из этого получилось.

Сразу предупрежу - делал я всё это на 32-разрядной Windows, для 64-разрядной всё может быть по-другому. Кстати, у меня у самого на компьютере установлена Windows 7 - для решения задачи я пользовался виртуальной машиной VMWare с установленной на неё Windows XP.

А теперь обо всём по порядку.

У меня был удаленный доступ к компьютеру с Postgres-базой клиента. Работать удаленно и с рабочей базой мне очень не хотелось, и я решил перенести базу к себе на компьютер.

Для этого мне сначала нужно было установить на нем PostgreSQL.

Дистрибутив PostgreSQL я скачал с официального сайта (делается это совершенно бесплатно).

Во время установки есть несколько нюансов, на которые стоит обратить внимание. Вот они:

В окне, представленном на рисунке 1, я ввел пароль пользователя Postgres (это супер-пользователь или администратор СУБД). Данные об этом пользователе, в дальнейшем понадобятся при подключении к базе Postgres из 1С.

Изображение

Рисунок 1. Установка пароля супер-пользователя 

 

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

 Изображение

Рисунок 2. Установка порта сервера PostgreSQL 

 

После установки программа предложила мне установить дополнительные инструменты, драйвера и т.п. Я согласился, т.к. мне нужен был драйвер для работы с базой PostgreSQL . 

Изображение

Рисунок 3 

 

Следующим шагом я выбрал сервер, который был создан на первом этапе установки (рисунок 4). 

 Изображение

Рисунок 4 

 

А затем, среди предлагаемых программой установки компонент я выбрал компоненту psqlODBC, как показано на рисунке 5. 

 Изображение

Рисунок 5. 

 

Из того, я получил в папке PostgreSQL после установки, меня интересовал только значок, на котором присутствуют слова pgAdmin. Это что-то вроде консоли для управления серверами PostgreSQL (рисунок 6) 

 Изображение

Рисунок 6 

 

При нажатии на ярлык у меня открылось окно как на рисунке 7.  Я зашел на сервер, используя пароль супер-пользователя.  

 Изображение

Рисунок 7 

 

А затем зашел в ветку Базы данных, выбрал нужную базу (рисунок 8). 

Изображение

Рисунок 8 

 

После этого необходимо было перенести данные с компьютера клиента на мой компьютер. Здесь возникла проблема, т.к. после получасовых поисков я не нашел на машине клиента папки PostgreSQL/data, в которой должны были лежать все его базы.

Обошел я это так: на своем компьютере, в pgAdmin создал новую базу с точно таким же именем, как у базы, которую нужно было перенести.

Установил у неё точно такие же настройки, как и у базы-источника. Сделал это так: правой кнопкой мыши щелкнул на базе, выбрал пункт Свойства. Очень важно в этом месте было указать такие же пользователя-владельца и кодировку, как и в базе-источнике. Пользователя Admin в выпадающем списке не было, я создал его в ветке Роли входа (рисунок 9)

Изображение

Рисунок 9. Свойства базы данных 

 

Далее я сделал резервную копию базы-источника. Для этого - щелкнул правой кнопкой мыши на базе в консоли серверов клиента, выбрал пункт Резервная копия. В появившемся окне указал путь сохранения и поставил формат tar.

Затем созданный файл перенес на свой компьютер и щёлкнул на базе-приёмнике - Восстановить. Выбрал только что скопированный файл и запустил процесс, после выполнения которого на моем компьютере появилась нужная база со всеми данными (рисунок 10).

 Изображение

Рисунок 10. Таблицы базы данных 

 

Следующим шагом я создал источник данных ODBC. Сделал это в Панели управления. Далее Администрирование - Источники данных (ODBC). После этого на вкладке Пользовательский DNS нажал на кнопку Добавить. Открылось окошко добавления источника данных, в котором я выбрал драйвер PostgreSQL ODBC Driver (UNICODE) (рисунок 11) 

Изображение

Рисунок 11. Выбор драйвера источника данных

 

После выполнения предыдущего шага открылось окошко для ввода настроек. Я его заполнил как показано на рисунке 12. 

Изображение

Рисунок 12. Настройки источника данных ODBC

 

Все настройки были корректными, поэтому при нажатии на кнопку Test вывелось сообщение «Connection successful». 

Изображение

Рисунок 13

 

После этого я сохранил источник данных и перешел в 1С.

Далее я создал внешнюю обработку со строковыми реквизитами Порт, База, Пользователь, Пароль и в ней для подключения к базе написал следующий код:

 

Connection = Новый COMОбъект("ADODB.CONNECTION");
Connection.Provider	= "MSDASQL.1";
Connection.ConnectionString = "Driver={PostgreSQL Unicode};data source=Postgre1;Server="+Сервер+";Port=" + 
							   Порт+";Database="+База+";Uid="+Пользователь+";Pwd="+Пароль+";STMT="+"utf8";		
Попытка		    
	Состояние("Подключение к базе PostgreSQL...");
	Connection.open();		    
	Сообщить("База PostgreSQL подключена");
Исключение		    
	Сообщить("Не могу подключиться к базе PostgreSQL ");
КонецПопытки;

 

, где Сервер, Порт, База, Пользователь и Пароль указываются те же, что и в источнике данных ODBC.

После подключения к базе данные из неё я получил с помощью следующего кода:

 

НаборЗаписей = Новый ComObject("ADODB.RecordSet");
Команда = Новый COMОбъект("ADODB.Command");
Попытка    
	Команда.ActiveConnection = Connection;    
	Команда.CommandText = ПолучитьТекстЗапроса();    
	НаборЗаписей = Команда.Execute();    
	Состояние("Данные получены.");
Исключение    
	Сообщить("Нет данных.");    
	Возврат;
КонецПопытки;

ВременнаяТаблица = Новый ТаблицаЗначений;

//Добавление колонок во временную таблицу
Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count - 1 Цикл                 
	ИмяСтолбца = НаборЗаписей.Fields.Item(НомерСтолбца).Name;                
	ВременнаяТаблица.Колонки.Добавить(ИмяСтолбца);
КонецЦикла;

Пока НЕ НаборЗаписей.EOF Цикл        
		
	// Заполнение временной таблицы таблицы                 
	НоваяСтрока = ВременнаяТаблица.Добавить();                
	Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count-1 Цикл                               
		НоваяСтрока.Установить(НомерСтолбца, СокрЛП(НаборЗаписей.Fields(НомерСтолбца).Value));                
	КонецЦикла;                

	НаборЗаписей.MoveNext();

КонецЦикла; 

 

, где функция ПолучитьТекстЗапроса() возращает текст запроса на языке SQL.

После исполнения данного кода, я работал с таблицей значений ВременнаяТаблица, которая и содержала нужные данные из PostgreSQL.

 
0
Читайте также
Разработки
Журнал регистрации 1С в отдельной SQL-базе
Ведение журнала регистрации в 1С 8.1 в SQL базе
Монитор дисковых ресурсов
Мониторинг ресурсов диска
1Скрипт-менеджер
"Конфигурация, позволяющая решать проблемы с обслуживанием баз данных в фирмах, использующих MSSQL"
Еще от автора
≡ к списку статей