Не нужно изучать язык платформы 1С без необходимости. Теперь все отчеты и интеграционные механизмы с другими системами можно запрограммировать на любом удобном и привычном языке!


Наша технология позволяет программировать отчеты из базы данных 1С на стандартном SQL с привычными рускоязычными наименованиями используемых объектов. Для этого необходимо установить модифицированную версию СУБД PostgreSQL, которую можно взять здесь (собрано для PostgreSQL 8.3.8), на сайте 1С (PostgreSQL 8.3.1) или собрать самостоятельно из дистрибутива и предоставляемых 1С патчей. После этого, в соответствии с документацией на 1С, конфигурации и базы данных 1С хранятся на сервере в PostgreSQL. Наша Java-программа обрабатывает предложенную ей конфигурацию 1С и создает в той же базе данных дополнительные объекты, которые служат расшифровками для закодированных объектов 1С. В результате можно читать и писать данные стандартными средствами SQL из любого языка программирования или интегрированной оболочки. В частности, мы применили данную технологию для автоматического импорта биржевых котировок и курсов валют в конфигурацию "1С-Рарус:Паевые инвестиционные фонды, редакция 2". Помимо получения возможности пакетной (неинтерактивной) обработки данных на сервере наша технология позволила ускорить импорт данных в сотни (!) раз по сравнению со стандартным для 1С интерактивным способом.



Database Structure

Дистрибутив PostgreSQL 8.3.8 для работы с 1С 8.1 в среде Linux OpenSuse 11.1

Полностью автоматический разбор конфигурации 1С Java-программой

./create_metadata.sh
Database: gl
URL: jdbc:postgresql:gl
Username: postgres
Password:
/usr/bin/java -jar md.jar org.postgresql.Driver jdbc:postgresql:gl postgres password
CREATE FUNCTION
ALTER FUNCTION
 drop1cviews
 -------------
 
 (1 record)
 
 DROP TABLE
 DROP TABLE
 DROP TABLE
 Driver loaded: org.postgresql.Driver@82701e
 Connected to jdbc:postgresql:gl as user postgres
 Create db objects table... 6305 objects to read estimated
 done
 Processing accounts... done
 Processing account registers... done
 Processing accumulation registers... done
 Processing documents... done
 Processing document journals... done
 Processing enumerations... done
 Processing calculation kinds... done
 Processing chrc... done
 Processing information registers... done
 Processing nodes... done
 Processing references... done
 Processing sequences... done
 Create db schema table and scripts... 865 tables were found in configuration... done
 Create comments... done
 Build views... done
 Congratulations!
 
 
Example of 1C Metadata Table

В помощь работе с GUID (PostgreSQL v < 8.3): guid.tar

Пример того как выглядит SQL-процедура импорта в таблицу 1С котировок задаваемой параметром бумаги из таблицы avn.micex_quotes, в которую котировки, в свою очередь, загружаются с биржи ММВБ сторонними средствами в нужное время:

CREATE OR REPLACE FUNCTION avn.load_micex_quotes( in quote varchar )
  RETURNS void AS
$BODY$
DECLARE
  inforeg TEXT;
  statement TEXT;
BEGIN
  
  -- Здесь мы определяем имя таблицы 1С, связанной с view 'иКотировки'
  -- Внутренние имена объектов конфигурации 1С могут изменяться при каждом изменении этой конфигурации
  SELECT table_name INTO STRICT inforeg FROM information_schema.view_table_usage
    WHERE view_schema = 'avn' AND view_name = 'иКотировки';

  statement := 'insert into '||inforeg||
   ' SELECT a.date::timestamp as period,
       b.id as "ЦеннаяБумага",
       c.id as "Биржа",
       COALESCE(a.waprice, ''0'')::numeric as Average,
       0 as average_ch,
       COALESCE(a.low,''0'')::numeric as min_price,
       COALESCE(a.high,''0'')::numeric as max_price,
       COALESCE(a.open,''0'')::numeric as open_bid,
       COALESCE(a.open,''0'')::numeric as open_ask,
       0 as bid,
       0 as ask,
       COALESCE(a.vol,''0'')::numeric as volume,
       0 as trades_num,
       0 as usd_volume,
       COALESCE(a.close,''0'')::numeric as last_price,
       0 as Nkd,
       COALESCE(a.waprice, ''0'')::numeric as "ПризнаваемаяКотировка",
       COALESCE(a.waprice, ''0'')::numeric as "РыночнаяЦена",
       COALESCE(a.waprice, ''0'')::numeric as "Оценка",
       COALESCE(a.waprice, ''0'')::numeric as "РыночнаяЦена2",
       d.id as "ВалютаКотировки"
    FROM avn.micex_quotes a, avn."сЦенныеБумаги" b, avn."сБиржи" c, avn."сВалюты" d
    WHERE mvarchar_in(textout(a.ticker)) = b."ДопКод1" 
      AND c.code = ''MICEX''
      AND d.code = ''810''
      AND a.waprice IS NOT NULL
      AND a.waprice <> 0
      AND a.vol IS NOT NULL
      AND a.ticker = '''||$1||'''
      AND a.date > (SELECT COALESCE( MAX( e.period ), ''2003-12-31'' )::date 
                      FROM avn."иКотировки" e, avn."сБиржи" f, avn."сЦенныеБумаги" g
                      WHERE f.code = ''MICEX'' AND e."Биржа" = f.id AND g.id=e."ЦеннаяБумага" AND g."ДопКод1" = '''||$1||''')';
  EXECUTE statement;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION avn.load_micex_quotes( varchar ) OWNER TO postgres;


Обсудить решение на форуме

Подробная информация в статье: Ануфриев В.Н. Интеграция решений на платформе "1С" в гетерогенную корпоративную среду. Раскодирование метаданных. Прямые обращения к базе данных посредством языка SQL PDF File // 11 марта 2010

Написать автору: avn@avnsite.com