Ткните носом, где идеологически не верно сделано
соединяюсь с базой
глБД=СоздатьОбъект("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с?