+7 499 990-10-21

Может сделать раздел, посвященный POSTGRESQL

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение amur-admin » 10 окт 2012, 05:09

Спасибо. На этой неделе будем всё тестировать в комплексе.
И еще сразу хочу задать вопрос по поводу выгрузки-загрузки напрямую через запросы SQL. База данных 1C 7.7 работает в MSSQL. Можно ли автоматизировать выгрузку-загрузку данных с базы Дэнси-Касса(Postgres) напрямую в MSSQL или нет. Есть ил у вас какие то готовые наработки по этому вопросу.
как вариант - 1) Выгружать номенклатуру напрямую из таблицы в Постгри
SELECT SC84.ROW_ID AS ROW_ID,
SCID.ROW_ID AS PARENTID,
SC84.DESCR AS DESCR,
SC84.CODE AS CODE,
SC84.DESCR AS SP101
FROM SC84
LEFT OUTER JOIN
SC84 SCID ON SCID.ID = SC84.PARENTID
LEFT JOIN Hierarchy ON Hierarchy.NodeID=SC84.ID
WHERE (SC84.ISFOLDER = 1)
ORDER BY Hierarchy.sort ASC
amur-admin
 
Постов: 43
Зарегистрирован: 26 сен 2012, 14:16

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение PavelShu » 10 окт 2012, 07:31

amur-admin писал(а):Спасибо. На этой неделе будем всё тестировать в комплексе.
И еще сразу хочу задать вопрос по поводу выгрузки-загрузки напрямую через запросы SQL. База данных 1C 7.7 работает в MSSQL. Можно ли автоматизировать выгрузку-загрузку данных с базы Дэнси-Касса(Postgres) напрямую в MSSQL или нет. Есть ил у вас какие то готовые наработки по этому вопросу.
как вариант - 1) Выгружать номенклатуру напрямую из таблицы в Постгри
SELECT SC84.ROW_ID AS ROW_ID,
SCID.ROW_ID AS PARENTID,
SC84.DESCR AS DESCR,
SC84.CODE AS CODE,
SC84.DESCR AS SP101
FROM SC84
LEFT OUTER JOIN
SC84 SCID ON SCID.ID = SC84.PARENTID
LEFT JOIN Hierarchy ON Hierarchy.NodeID=SC84.ID
WHERE (SC84.ISFOLDER = 1)
ORDER BY Hierarchy.sort ASC


Мы делали такую технологию:

Скрипт написанный на Perl стрелял в mssql и при разборе
полученного рекорсета делал запросы в PgSql.

Скрипт вешался на cron и работал по заданному расписанию.
Другой вариант - удаленный запуск скрипта через web сервер.

Пример загрузки из фйла:
Код: Выделить всё
#!/usr/bin/perl

use DBI;

$dbname = "dnc";
$username = "postgres";
$filename = "./f.txt";

$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=localhost","$username","123", {PrintError => 0});

if ($DBI::err != 0) {
  print "!Ошибка ".$DBI::errstr . "\n";
  exit($DBI::err);
};

open FP, $filename;

while (<FP>)
{
   my ($shortcut, $price) = split("\t");
    print $shortcut;
   
   $query = "INSERT INTO ware(price,shortcut)VALUES($price,'$shortcut')";

$rv = $dbh->do($query);
if (!defined $rv) {
  print "При выполнении запроса '$query' возникла ошибка: " . $dbh->errstr . "\n";
  exit(0);
}

}
$dbh->disconnect();
PavelShu
 
Постов: 67
Зарегистрирован: 08 июн 2012, 10:09

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение amur-admin » 10 окт 2012, 10:36

C загрузкой номенклатуры из MSSQL в Postgres всё понятно. А как обстоят дела насчет выгрузки транзакций(чеков) напрямую в MSSQL-ную базу 1С 7.7. реально ли именно это автоматизировать?
Если есть примеры "прямых" выгрузок(запросов) или каких то других скриптов запускающих "это" покажите пожалуйста.
amur-admin
 
Постов: 43
Зарегистрирован: 26 сен 2012, 14:16

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение PavelShu » 10 окт 2012, 17:54

amur-admin писал(а):C загрузкой номенклатуры из MSSQL в Postgres всё понятно. А как обстоят дела насчет выгрузки транзакций(чеков) напрямую в MSSQL-ную базу 1С 7.7. реально ли именно это автоматизировать?
Если есть примеры "прямых" выгрузок(запросов) или каких то других скриптов запускающих "это" покажите пожалуйста.


Из линукса писать напрямую в документ 1с77 не получится, можно только создать отдельную таблицу в базе MSSQL, переносить в нее транзакции,
а из 1с читать эту таблицу и строить отчеты.

Другой вариант, в 1с77 использовать для доступа к базе PG внешнюю
компоненту 1с++. Вычитывать данные и создавать документ средствами
1с или просто показывать отчет напрямую из PostGres.

PS Существует еще проблемка с перекодировкой UTF8 в WIN1251, но все решаемо.
PavelShu
 
Постов: 67
Зарегистрирован: 08 июн 2012, 10:09

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение amur-admin » 13 окт 2012, 16:08

Вариант №2 более реальный. Если есть пример то покажите пожалуйста.
amur-admin
 
Постов: 43
Зарегистрирован: 26 сен 2012, 14:16

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение PavelShu » 19 окт 2012, 07:51

amur-admin писал(а):Вариант №2 более реальный. Если есть пример то покажите пожалуйста.

Код: Выделить всё
Процедура Сформировать()
   
   ЗагрузитьВнешнююКомпоненту("1CPP.dll");
   
   СтрокаПодключения = "Driver={PostgreSQL ANSI};Server=kassa;Port=5432;Database=LinCash;Uid=postgres;Pwd=;";
   
   _Содинение = СоздатьОбъект("ODBCDataBase");
   _Содинение.Соединение(СтрокаПодключения);
   
   _ЗапросКПостГрессу = СоздатьОбъект("ODBCRecordSet");
   _ЗапросКПостГрессу.Отладка(1);
   _ЗапросКПостГрессу.УстБД(_Содинение);
   
   тз = _ЗапросКПостГрессу.ВыполнитьИнструкцию("select * from ware");

   тз.ВыбратьСтроку();
КонецПроцедуры


Для работы нужно:

1. Открыть доступ на postgree для внешних соединений (postgresql.conf и pg_hba.conf)
2. Скачать и установить драйвер ODBC под Win (ftp://ftp.postgresql.org/pub/odbc/versions/msi/)
PavelShu
 
Постов: 67
Зарегистрирован: 08 июн 2012, 10:09

Re: Может сделать раздел, посвященный POSTGRESQL

Сообщение monoreals » 25 апр 2015, 20:58

Alexander писал(а):Вариант решения:
1. Устанавливаете язык plperl (имя пакета postgresql-plperl). Например, для 32бит
2. Добавляете язык, функцию и триггер в БД Transaction:
Код: Выделить всё
CREATE LANGUAGE 'plperlu';

CREATE OR REPLACE FUNCTION exec_on_close_check() RETURNS trigger AS $$
if ($_TD->{new}{"tr_type"} eq 55) {
  system("/usr/bin/dnc_after_closecheck");
  return;
}
return;
$$ LANGUAGE plperlu;

CREATE TRIGGER exec_on_close_check AFTER INSERT ON "transaction" FOR EACH ROW execute procedure exec_on_close_check();

3. Размещаете в /usr/bin/ скрипт с именем dnc_after_closecheck примерно такого содержания:
Код: Выделить всё
touch /var/Exchange/report.flr
chmod 666 /var/Exchange/report.flr


В приложении - примеры соответствующих скриптов.
Если брать их за основу, то изменения в БД можно внести командой
psql Transaction < ./realtime_unload.sql

P.S. В данном примере триггер будет срабатывать только на транзакцию с типом "55" (закрытие чека). Если надо что-то еще (отмена чека, отложенный чек, Z-отчет и т.п.) - надо добавить условия на колонку tr_type


Простите за мой тупизм.. а как эти транзакции преобразовать в Чеки в 1с УТ 10.3, а те в свою очередь в "Отчет о продажах" по закрытию смены???
Язык програмирования 1С вызывает у меня безумие, так-что строго не судите..
monoreals
 
Постов: 17
Зарегистрирован: 24 ноя 2014, 13:00

Пред.

Вернуться в Ваши предложения

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


cron

Кто сейчас на конференции

Сейчас посетителей на конференции: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1 (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (170) здесь было 16 май 2020, 01:50

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1