Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) PostgreSQL и типизация (число прочтений - 5163 )
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
PostgreSQL и типизация
11. Мая 2011 :: 17:30
Печать  
Сразу извиняюсь что не в "Прямые запросы", раздел не открывается.

У меня вопрос-просьба в следующем:
в последнее время большая часть информации выбрасывается из 1С (дбф-версия) на внешний сервер. В качестве сервера на данный момент выбран PostgreSQL.
Однако возникли некоторые сложности с типизацией к родным типам 1С. В частности, постгри не любит в тексте запросов квадратные скобки. Победить "в лоб" можно, но на выходе получатся достаточно громоздкая конструкция:
Код
Выбрать все
Метадата	= СоздатьОбъект("MetaDataWork");
Текст= Метадата.ОбрМетаСКЛ(Текст);
Текст= СтрЗаменить(Текст,"[","""");Текст= СтрЗаменить(Текст,"]","""");
 


т.е. по сути дела нужно квадратные скобки поменять на двойные кавычки.
Аналогичный же вопрос по парсеру - почему-то при разборе комбинация типа
Код
Выбрать все
[Справочник.Контрагенты] 


приводится к виду
Код
Выбрать все
[Справочник_1c_dot_Контрагенты] 


хотя символа $ там нет. Как-то расходится с документацией.
Таки в итоге хотелки:
1. Для парсера указать какой-то флаг по доп.обработке текста запроса
2. Для флага=обработке постги заменять в тексте запроса квадратные скобки на двойные кавычки
3. Не обрабатывать парсером квадратные скобки без $

ЗЫ.. Надеюсь я не сильно нагло прошу, имеет право на жизнь такая конструкция?  Смущённый
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #1 - 12. Мая 2011 :: 01:39
Печать  
А где ты взял квадратные скобки?
У меня исторически сложилось использование двух типов внешних СУБД - FireBird (используется именно как внешнее) и PostgreSQL (обмен с восьмеркой через ее же БД).
Проблемы есть только с баксами, т.е. нет возможности обращения к системным таблицам огнептицы, но это не так уж и обязательно (нельзя создавать объекты БД из 1С, а также читать параметры самой БД, но это же чисто административные функции, легко решаемые через IBExpert).

Есть подозрение, что кто-то по наивности мечтает получить запросом из ПГ объекты 1С, но это же фантастика ... это нереально ... единственное, что возможно, - работать с кодами или уникальными идентификаторами и преобразовывать их уже после выполнения запроса ...
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #2 - 12. Мая 2011 :: 05:56
Печать  
Dmitry The Wing писал(а) 12. Мая 2011 :: 01:39:
Есть подозрение, что кто-то по наивности мечтает получить запросом из ПГ объекты 1С, но это же фантастика ... это нереально ... единственное, что возможно, - работать с кодами или уникальными идентификаторами и преобразовывать их уже после выполнения запроса ...

Ну вообще не по наивности, реальная задача, которая уже работает. Синхронизация данных 1С и постгри - это другой вопрос. Во внешней базе хранятся ID объектов 1С и типизация работает очень даже прекрасно, потому как к 1С-ным типам приводятся именно по ним. Проблема именно в том, что типизацию делать крайне хлопотно.
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #3 - 12. Мая 2011 :: 06:27
Печать  
Т.е. можно реально выполнить запрос к любой СУБД так, что метапарсер ничего с ним не сделает?
Поясни, например, как скорректировать код, чтобы выполнить запрос?
Код
Выбрать все
	БД = СоздатьОбъект("OLEDBData");
		Соединение = "DRIVER=Firebird/InterBase(r) driver; DBNAME=" + Сервер + ":" + ИмяБД
			+ "; UID=" + ПользовательБД + "; PWD=" + Пароль + ";";
ТекстЗапроса = "SELECT * FROM mon$database";
	Попытка
		БД.Соединение(Соединение);
		Команда = БД.СоздатьКоманду();
		Команда.Отладка(Отладка);
				Результат = Команда.ВыполнитьИнструкцию(ТекстЗапроса);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки; 

  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #4 - 12. Мая 2011 :: 06:40
Печать  
Dmitry The Wing писал(а) 12. Мая 2011 :: 06:27:
Т.е. можно реально выполнить запрос к любой СУБД так, что метапарсер ничего с ним не сделает?

Я этого не говорил, сам когда-то заводил ветку, когда боролся с парсером на системных таблицах в FireBird'е.
Я говорю о таких конструкциях:
Код
Выбрать все
Запрос.ВыполнитьИнструкцию("CREATE TABLE ""Справочник.Контрагенты""(ID CHAR(9),CODE CHAR(8),NAME CHAR(50),PRIMARY KEY(ID)) WITH (OIDS=FALSE)");
Запрос.ВыполнитьИнструкцию("INSERT INTO ""Справочник.Контрагенты""(ID,CODE,NAME)VALUES(:ID,:CODE,:NAME)");
Запрос.ВыполнитьИнструкцию("SELECT ID [Элемент $Справочник.Контрагенты],CODE [Код $Строка], NAME [Name $String]
|FROM ""Справочник.Контрагенты"" ORDER BY NAME"); 


Постгри такую конструкцию не принимает из-за наличия квадратных скобок.
Запрос парсером разворачивается в примерно такое:
Код
Выбрать все
SELECT ID	[Элемент_1c_type_Справочник_1c_dot_Контрагенты],
	 CODE    [Код_1c_type_Строка],
	 NAME    [Name_1c_type_String]
FROM "Справочник.Контрагенты" ORDER BY NAME 


но если его дополнительно обработать и заменить квадратные скобки на кавычки (тем более что русские имена нужно в кавычках указывать):
Код
Выбрать все
SELECT ID	"Элемент_1c_type_Справочник_1c_dot_Контрагенты",
	 CODE    "Код_1c_type_Строка",
	 NAME    "Name_1c_type_String"
FROM "Справочник.Контрагенты" ORDER BY NAME 


то на выходе получаем колонку ТЗ "Элемент" с типом = "Справочник.Контрагенты".
На FireBird'е не факт что все запросы будут работать. На постгри у меня заработали только при указании кодировки WIN1251. У него ограничение на имя колонки 63 символа, но в юникоде получается меньше и имя колонки обрезается, соответственно парсер не может определиться с типом колонки
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #5 - 12. Мая 2011 :: 07:07
Печать  
Честно говоря, не вижу проблемы в том, чтобы заменить скобки на кавычки, а за информацию спасибо. Это вполне можно использовать...
Я уж подумал, что есть способ как-то обойти парсер при выполнении запроса...

А какого типа должно быть поле для хранения ID? Строка в 9 / 13 / 23 символа?

И еще ... нафик ты преобразовываешь посгресовскую строку в одноэсовую?
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #6 - 12. Мая 2011 :: 07:10
Печать  
Dmitry The Wing писал(а) 12. Мая 2011 :: 07:07:
Честно говоря, не вижу проблемы в том, чтобы заменить скобки на кавычки, а за информацию спасибо. Это вполне можно использовать...
Я уж подумал, что есть способ как-то обойти парсер при выполнении запроса...

Да проблема не страшная по сути, но гемора добавляет существенно. А соответственно и вероятности ошибок. Плюс еще не тестировал с поставщиками для ТП, там наверняка то же самое выйдет.
  
Наверх
ICQ  
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #7 - 12. Мая 2011 :: 07:16
Печать  
Dmitry The Wing писал(а) 12. Мая 2011 :: 07:07:
А какого типа должно быть поле для хранения ID? Строка в 9 / 13 / 23 символа?

Да все аналогично родным таблицам 1С, т.е. в каком виде хранится в 1С, в таком можно и во внешней хранить. Разница только в источнике данных.

Dmitry The Wing писал(а) 12. Мая 2011 :: 07:07:
И еще ... нафик ты преобразовываешь посгресовскую строку в одноэсовую?

Ну это вообще привычка, каждая колонка должна быть типизирована, так и читать запросы легче, и вероятность ошибиться мала.

ЗЫ... вообще основная задача - вынести из 1С нужные справочники и регистры, минимизировать операции записи в 1С, а всю основную обработку вынести на внешний сервер.
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #8 - 12. Мая 2011 :: 07:30
Печать  
Chieftain писал(а) 12. Мая 2011 :: 07:16:
ЗЫ... вообще основная задача - вынести из 1С нужные справочники и регистры, минимизировать операции записи в 1С, а всю основную обработку вынести на внешний сервер.

У меня это уже давно сделано (где-то 2 года). В 1С хранятся только те данные, которые участвуют в движениях и необходимы для ссылок, а все остальное во внешних хранилищах. И база не пухнет и скорость работы на порядок выше. А большая чатсь кода вынесена в классы, что позволяет его менять, не выгоняя юзверей.
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #9 - 12. Мая 2011 :: 07:38
Печать  
Dmitry The Wing писал(а) 12. Мая 2011 :: 07:30:
Chieftain писал(а) 12. Мая 2011 :: 07:16:
ЗЫ... вообще основная задача - вынести из 1С нужные справочники и регистры, минимизировать операции записи в 1С, а всю основную обработку вынести на внешний сервер.

У меня это уже давно сделано (где-то 2 года). В 1С хранятся только те данные, которые участвуют в движениях и необходимы для ссылок, а все остальное во внешних хранилищах. И база не пухнет и скорость работы на порядок выше. А большая чатсь кода вынесена в классы, что позволяет его менять, не выгоняя юзверей.

Ну вот и меня окончательно на эту тему подсадило, база дбф, не очень-то и большая, но за год прирост около 2-3 гигов, поэтому резать приходится. А отчеты формируют в разных базах. Плюс некоторые заморочки учета, в связи с которыми не закрываются пара достаточно больших регистров. От firebird-а отказался в основном по причине проблем с системными таблицами. Плюс на постгри понравилось наследование таблиц, удобно периоды дробить не теряя целостности.
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #10 - 12. Мая 2011 :: 07:48
Печать  
Chieftain писал(а) 12. Мая 2011 :: 07:38:
Ну вот и меня окончательно на эту тему подсадило, база дбф, не очень-то и большая, но за год прирост около 2-3 гигов, поэтому резать приходится. А отчеты формируют в разных базах. Плюс некоторые заморочки учета, в связи с которыми не закрываются пара достаточно больших регистров. От firebird-а отказался в основном по причине проблем с системными таблицами. Плюс на постгри понравилось наследование таблиц, удобно периоды дробить не теряя целостности.

Я от FB не отказывался, а на PG попал только потому, что на нем растет восьмерка, что позволяет не создавать новые внешние хранилища, а использовать ту же БД, но с добавленными таблицами ... т.е. в семерке у меня FB, а в восьмерке PG... PG несколько неуклюж по сравнению с FB, кроме того, я не смог найти для PG столь же удобной приблуды, как IBExpert ... может, это и есть основаня причина ... ни тебе отладки, ни удобного редактора ...
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #11 - 12. Мая 2011 :: 10:41
Печать  
С поставщиком немного попробовал - вроде работает, дальше время покажет.
А вот с парсером что делать? Уважаемые разработчики в мою ветку не ходят Печаль
  
Наверх
ICQ  
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #12 - 13. Мая 2011 :: 13:45
Печать  
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #13 - 18. Мая 2011 :: 04:12
Печать  
Ну вот ... попробовал я сделать по твоему совету, чтобы в дальнейшем не пробегать лишний раз по ТЗ, сразу получая типизированные значения, а не коды ... но не типизируются данные из FB  Плачущий
Код
Выбрать все
	//Сначала беру опорное значение
	Спр = СоздатьОбъект("Справочник.Сотрудники");
	Спр.НайтиПоКоду("00000439");

	Отл = СоздатьОбъект("Отладка"); //Это для отображения

	//Для проверки получаю сначала через 1sqlite

	БазаДанных = СоздатьОбъект("SQLiteBase");
	БазаДанных.Открыть(":memory:");
	Запрос				= БазаДанных.НовыйЗапрос();

	ТекстЗапроса = "
	|SELECT
	|@Парам [Парам :Справочник.Сотрудники]
	|, id [id :Справочник.Сотрудники]
	|FROM [Справочник.Сотрудники]
	|WHERE id = @Парам";

	Запрос.Отладка();
	Запрос.Подготовить(ТекстЗапроса);
	Запрос.УстановитьПараметр("@Парам", Спр.ТекущийЭлемент());
	тзРез = Запрос.Выполнить();
	Отл.Показать(тзРез,, 1); //Здесь вижу два столбика с одинаково отображенным элементом справочника

	//Теперь FB

	БД = СоздатьОбъект("OLEDBData");
	Соединение = "DRIVER=Firebird/InterBase(r) driver; DBNAME=" + Сервер + ":" + ИмяБД
	+ "; UID=" + ПользовательБД + "; PWD=" + Пароль + ";";
	БД.Соединение(Соединение);
	Команда = БД.СоздатьКоманду();

	ТекстЗапроса = "
	|SELECT
	|:Парам [Парам $Справочник.Сотрудники]
	|, :Парам ""Без_Типизации""
	|FROM single_line";
	Метадата     = СоздатьОбъект("MetaDataWork");
	Метадата.УстановитьТекстовыйПараметр("Парам", Спр.ТекущийЭлемент());
	ТекстЗапроса = Метадата.ОбрМетаСКЛ(ТекстЗапроса);
	ТекстЗапроса = СтрЗаменить(СтрЗаменить(ТекстЗапроса, "]", """"), "[", """");
	тзРез = Команда.ВыполнитьИнструкцию(ТекстЗапроса);
	Отл.Показать(тзРез,, 1); // Здесь вижу пустой столбец и нетипизированное значение 

single_line - это вспом.хранимка, которая возвращает одну строку, - пока не стал создавать таблиц. это же еще только проба...

Поясни, что я делаю не так?
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #14 - 19. Мая 2011 :: 00:41
Печать  
Вообще странно, у меня раньше норм.получалось.
Сейчас попробовал - та же история. Однако из 13-символьного ИД нормально получает. Попробуй
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|:Парам~ [Парам $Справочник.Сотрудники]
	|, :Парам~ ""Без_Типизации""
	|FROM single_line"; 



либо вариант:
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|$ВидСправочника.Сотрудники||:Парам [Парам $Справочник.Сотрудники]
	|, $ВидСправочника.Сотрудники||:Парам ""Без_Типизации""
	|FROM single_line"; 

  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: PostgreSQL и типизация
Ответ #15 - 19. Мая 2011 :: 00:45
Печать  
Помогло! Спасибо! Это решает много проблем. Убирает лишние циклы преобразований.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать