Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Аналог регистра остатков во внешней базе postgresql (число прочтений - 3109 )
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Аналог регистра остатков во внешней базе postgresql
02. Июля 2015 :: 07:41
Печать  
Ткните носом, где идеологически не верно сделано

соединяюсь с базой
Код
Выбрать все
глБД=СоздатьОбъект("ODBCDatabase");
глБД.Соединение("DSN=PostgreSQL30; Uid=role1c; Pwd=qwe;"); 



Создаю класс РегистрPGSQL, из 1с обращение к новому регистру выглядит так (простейший приход):

Код
Выбрать все
	РегистрПГ=СоздатьОбъект("РегистрPGSQL");
	РегистрПГ.ИмяРегистра="ОстаткиБезнал";
	РегистрПГ.Инициализация();
	РегистрПГ.Отладка=0;
	РегистрПГ.ТекущийДокумент=ТекущийДокумент();

	ВыбратьСтроки();
	Пока ПолучитьСтроку()=1 Цикл
		РегистрПГ.СписокАтрибутов.Установить("Партия",Партия);

		РегистрПГ.СписокАтрибутов.Установить("Товар",Товар);
		РегистрПГ.СписокАтрибутов.Установить("Количество",Количество);
		РегистрПГ.СписокАтрибутов.Установить("Склад",Склад);
		РегистрПГ.СписокАтрибутов.Установить("ВалСумма",Сумма);
		РегистрПГ.ПривязыватьСтроку=НомерСтроки;
		РегистрПГ.ДвижениеПриходВыполнить();
	КонецЦикла; 



В классе РегистрPGSQL в процедуре инициализация проверяется наличие таблицы с именем регистра в базе, если такая таблица отсутствует, генерируется запрос вида:

Код
Выбрать все
CREATE TABLE остаткибезнал(
id SERIAL PRIMARY KEY,
бронь character varying(13),
партия character varying(13),
товар character varying(13),
склад character varying(13),
количество NUMERIC(13,1),
валсумма NUMERIC(19,4),
регистратор  character varying(13),
регистратордата  date,
номерстроки  bigint) 



Запрос генерируется по метаданным 1с, реквизиты берутся из 1с. Имена реквизитов не окончательные..

Функция ДвижениеПриходВыполнить() генерирует запрос по списку значений "СписокАтрибутов" вида

Код
Выбрать все
INSERT INTO остаткибезнал (партия, товар, количество, склад, валсумма, регистратор, регистратордата, номерстроки) VALUES ('  EG   PCFТП ', '  2O   AO1ТП ', '120', '  1H     1   ', '848400', '  JJ   HTBТП ', '21.05.15', '14') 



Значения 1с (справочники и документы) преобразовываю при помощи MetaDataWork ЗначениеВДлиннуюСтрокуБД() (13ти символьные строки)

Есть ещё метод для получения всех записей из таблицы

Код
Выбрать все
 	ТекстЗапроса="SELECT * FROM "+ИмяРегистра;

 	РезультатЗапроса=СоздатьОбъект("ТаблицаЗначений");

 	Попытка
 		РезультатЗапроса = глРС.ВыполнитьИнструкцию(ТекстЗапроса);
 		//Сообщить(РезультатЗапроса);
 	Исключение
 		Сообщить("Ошибка выполнения запроса: " + глРС.ПолучитьОписаниеОшибки());
 	КонецПопытки; 




Вот тут начинается геморой...
Возвращается таблица с 13-ти символьными значениями, создаю таблицу с копией текущей (названия колонок), и в цикле поэлементно преобразовываю значения MetaDataWork ЗначениеИЗДлиннойСтрокиБД("Справочник",Зн) или ЗначениеИЗДлиннойСтрокиБД("Документ",Зн)

Если хоть раз вызвать ЗначениеИЗДлиннойСтрокиБД("Справочник",Зн) для документа или ЗначениеИЗДлиннойСтрокиБД("Документ",Зн) для справочника, получается такой косяк со значениями в таблице: Документы или справочники выводятся как <Объект не найден>(23087/ТП), хотя объекты открываются нормально, лечится только перезапуском..

Подскажите как правильно хранить во внешней базе справочники и документы, и типизировать получение данных в запросе или преобразовывать из строки 13 в объекты 1с?
  
Наверх
 
IP записан
 
Mink Snopes
Junior Member
**
Отсутствует


bookkeeping considered
harmful

Сообщений: 30
Местоположение: Dombabwe
Зарегистрирован: 05. Ноября 2013
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #1 - 02. Июля 2015 :: 08:16
Печать  
Хранить 20-символьное представление. Есть функция ЗначениеВСамуюДлиннуюСтрокуБД
http://www.1cpp.ru/docum/icpp/html/ODBC.html#valuetosuperlongdbstring
Есть ли обратная функкция типа ЗначениеИзСамойДлиннойСтрокиБД, я не в курсе, экспериментируйте
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #2 - 02. Июля 2015 :: 10:07
Печать  
Цитата:
"Справочник" ... для документа
"Документ" ... для справочника

а это зачем так?
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #3 - 02. Июля 2015 :: 10:11
Печать  
А типизировать параметры и значения в результате можно точно также, как и при работе с "родной" базой - метаименами.
Метапарсеру как бы все равно на какую СУБД уйдет запрос и откуда пришел результат
  

1&&2&&3
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #4 - 02. Июля 2015 :: 10:15
Печать  
А почему настолько геморно?
Может попробовать вместо
Цитата:
SELECT * FROM ...

написать
Цитата:
SELECT партия [партия $Документ], товар [товар $Справочник]  FROM ...
  
Наверх
ICQ  
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #5 - 02. Июля 2015 :: 10:54
Печать  
Спасибо, то что надо.
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #6 - 02. Июля 2015 :: 10:56
Печать  
trad писал(а) 02. Июля 2015 :: 10:07:
Цитата:
"Справочник" ... для документа
"Документ" ... для справочника

а это зачем так?


а это просто в лоб было сделано, не хотелось типы тянуть, думал универсально получится. От полученного результата ужаснулся..
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #7 - 02. Июля 2015 :: 11:53
Печать  
Ещё пару вопросов по типу данных, простите гуру за возможную туповатость.. :
1. как правильно сохранять в базу SLQ объекты? Какой тип должен быть у столбца? character varying(13) не подходит, судя по коду ошибки, тип целочисленный? В 1с в 1cv7.dd

При выполнении запроса:
Код
Выбрать все
SELECT партия [Партия $Справочник], товар [Товар $Справочник], склад [Склад $Справочник], количество, валсумма  FROM остаткибезнал 



Ошибка выполнения запроса: State 42804, native 7, message ОШИБКА: тип character varying - не массив и для него нельзя указать индекс элемента; Error while executing the query

Похоже с синтаксисом что-то не то. Тип в 1с "с 13" из dd файла кусок
# Name      |Descr               |Type|Length|Precision
F=PERIOD   |Period Registr   |D   |8     |0        
F=SP761     |(P)Партия        |C   |13    |0        
F=SP762     |(P)Товар          |C   |9     |0        
F=SP763     |(P)Склад          |C   |9     |0        
F=SP764     |(P)Количество  |N   |14    |1        
F=SP765     |(P)ВалСумма    |N   |20    |4  

если дописать as
Код
Выбрать все
SELECT партия as [Партия $Справочник], товар as [Товар $Справочник], склад as [Склад $Справочник], количество, валсумма  FROM остаткибезнал 



Ошибка такая Ошибка выполнения запроса: State 42601, native 7, message ОШИБКА: ошибка синтаксиса (примерное положение: "[");
Error while executing the query..
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #8 - 02. Июля 2015 :: 13:55
Печать  
Работает если взять в кавычки

Код
Выбрать все
SELECT партия as "[Партия $Справочник]", товар as "[Товар $Справочник]", склад as "[Склад $Справочник]", регистратор as "[Документ $Документ]", количество, валсумма  FROM остаткибезнал
 



а в 1с почему-то попадают колонки таблицы в таком виде:
[Партия      [Товар      [Склад      [Документ      количество      валсумма

Данные запрос получает корректно.

Как избавиться от скобки "[" в имени колонки?
Это особенности postgres?
  
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #9 - 02. Июля 2015 :: 14:11
Печать  
Код
Выбрать все
SELECT партия as Партия_1c_type_Справочник, товар as Товар_1c_type_Справочник, склад as Склад_1c_type_Справочник, регистратор as Документ_1c_type_Документ, количество, валсумма  FROM остаткибезнал 



в таком варианте запроса и данные гут, и колонки с нормальными названиями.

Подскажите это pg дурака валяет или на кого плохо думать?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #10 - 02. Июля 2015 :: 14:47
Печать  
нет, pg дурака не валяет. Синтаксис запросов отличается от t-sql
и советы в (3) и (4) не подойдут
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #11 - 02. Июля 2015 :: 14:49
Печать  
Цитата:
Партия_1c_type_Справочник
- элегантный способ обмана парсера Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
Boris_1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 127
Зарегистрирован: 29. Января 2007
Re: Аналог регистра остатков во внешней базе postgresql
Ответ #12 - 02. Июля 2015 :: 14:51
Печать  
Спасибо, случайно получилось))
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать