1С как источник данных для вероятностно-статистических исследований

Эта статья расскажет, как получить данные из 1С для последующей обработки в среде R.
На протяжении последних двадцати лет в России куплены и инсталлированы десятки, если не сотни, тысяч копий информационной бизнес-платформы 1С различных конфигураций.
Даже в соседнем магазине шаговой доступности площадью 50 кв. метров скорее всего есть 1С, которая частично отражает логистику, и очень достоверно отражает продажи (иначе зачем она нужна).
Понятно, что большая часть из этих инсталляций - это бухгалтерские версии 1С. Но и эти данные можно использовать для формирования начальных метрик предприятия.
Платформы и среды:

  • 1С 8.1 (клиент-серверный вариант) version 8.1.15.14
  • СУБД PostgreSQL version 8.3.8
  • pgAdmin III version 1.18.1
  • среда для вероятностно-статистических исследований R version 3.2.3
  • RStudio version 0.99.489
Версии 1С и PostgreSQL не самые последние, что, впрочем, не мешает продемонстрировать принцип работы в R с самой массовой в России информационной платформой.
Важно!!!
Не подключайтесь к базе данных, которую 1С использует непосредственно для OLTP.
Для работы в R cоздайте отдельную исследовательскую базу данных и настройте ее синхронизацию с основной базой при помощи проверенных, гарантированно не влияющих на исходные данные, инструментов в том объеме и с той частотой обновления, которые считаете необходимыми и достаточными.
Для получения данных будет использовано непосредственное подключение к базе данных на сервере в той же локальной сети, в которой находится компьютер с R.
Для этого мы получим структуру данных 1С, создадим представление в базе данных, логически объединяющее несколько таблиц, и подключимся из R к созданному представлению, чтобы получить данные для дальнейших исследований.

Получение структуры данных 1С.
Для начала работы нам необходимо получить структуру данных 1С. Для этого скачаем готовую обработку (так в терминологии 1С называются небольшие подпрограммы, выполняющие некоторые законченные действия в среде 1С).
Код обработки:
Процедура ВывестиСтруктуруТаблиц(Команда)

МассивИменМетаданных = Новый Массив();

// Если нужна структура таблиц только некоторых объектов конфигурации
// их можно перечислить в массиве имен метаданных

//МассивИменМетаданных.Добавить("Справочник.Номенклатура");
//МассивИменМетаданных.Добавить("Документ.РеализацияТоваровУслуг");

ТекстовыйДокумент = ПолучитьСтруктуруТаблицНаСервере(МассивИменМетаданных);

ТекстовыйДокумент.Показать( "Структура хранения базы данных");

КонецПроцедуры

Функция ПолучитьСтруктуруТаблицНаСервере(МассивИменМетаданных)

ТекстовыйДокумент = Новый ТекстовыйДокумент;

// Таблица значений, содержащая таблицы указанного объекта
Таблицы = ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных);

Для Каждого Таблица Из Таблицы Цикл

ТекстовыйДокумент.ДобавитьСтроку("" );

ТекстовыйДокумент.ДобавитьСтроку( "Таблица : " + Таблица.ИмяТаблицы +
", Имя таблицы хранения: " + Таблица.ИмяТаблицыХранения +
", Назначение: " + Таблица.Назначение);

ТекстовыйДокумент.ДобавитьСтроку("- поля: " );
ПоляТаблицы = Таблица.Поля;
Для Каждого Поле Из ПоляТаблицы Цикл

ТекстовыйДокумент.ДобавитьСтроку(" " + Поле.ИмяПоля +
" (" + Поле.ИмяПоляХранения + ")");

КонецЦикла;

ТекстовыйДокумент.ДобавитьСтроку("- индексы: " );
ИндексыТаблицы = Таблица.Индексы;
Для Каждого Индекс Из ИндексыТаблицы Цикл

ТекстовыйДокумент.ДобавитьСтроку(" " + Индекс.ИмяИндексаХранения);

СтрокаИндекса = "";
СтрокаХраненияИндекса = "";
ПоляИндекса = Индекс.Поля;
Для Каждого ПолеИндекса Из ПоляИндекса Цикл

Если СтрокаИндекса <> "" Тогда
СтрокаИндекса = СтрокаИндекса + " + ";
КонецЕсли;
СтрокаИндекса = СтрокаИндекса + ПолеИндекса.ИмяПоля;

Если СтрокаХраненияИндекса <> "" Тогда
СтрокаХраненияИндекса = СтрокаХраненияИндекса + " + ";
КонецЕсли;
СтрокаХраненияИндекса = СтрокаХраненияИндекса + ПолеИндекса.ИмяПоляХранения;

КонецЦикла;

ТекстовыйДокумент.ДобавитьСтроку(" " + СтрокаИндекса +
" (" + СтрокаХраненияИндекса + ")");

КонецЦикла;

КонецЦикла;

Возврат ТекстовыйДокумент;

КонецФункции
Осталось подключить процедуру ВывестиСтруктуруТаблиц к обработчику на кнопке формы и запустить ее. В итоге выполнения этой обработки получим текстовый файл с описанием структуры данных для конфигурации 1С Розница, редакция 1.0 (1.0.6.4), что позволит создать представление в базе данных.

Создание представления с данными розничных продаж при помощи утилиты pgAdmin III.
При помощи pgAdmin III cоздаем представление, которое предоставит данные из документов типа ОтчетОРозничныхПродажах за период, начиная с 1 января 2013 года.
Конечно, согласно идеологии 1С, получать данные лучше из таблиц регистров (объекты 1С - таблицы, где хранится специальным образом обработанная информация), но в данном случае это не принципиально и нас устроит вариант получения данных из документов.
Имена таблиц и полей взяты из описания структуры данных 1С и соответствуют стандартной конфигурации 1С Розница, редакция 1.0 (1.0.6.4).
-- View: "saleView"
-- DROP VIEW "saleView";
CREATE OR REPLACE VIEW "saleView" AS
SELECT
_document63._date_time AS datetimeofdoc,
_reference32._description AS title,
_reference32._fld430 AS article,
_document63_vt906._fld913 AS price,
_document63_vt906._fld914 AS cost
FROM _document63
LEFT JOIN _document63_vt906
ON _document63_vt906._document63_idrref = _document63._idrref
LEFT JOIN _reference32
ON _reference32._idrref = _document63_vt906._fld908rref
WHERE _document63._date_time > to_date('2012-12-31', 'YYYY-MM-DD');
ALTER TABLE "saleView"
OWNER TO postgres;
GRANT ALL ON TABLE "saleView" TO postgres;
В запросе на создание представления были использованы операторы левого соединения.

Подключение к базе и получение данных о продажах в среде R.
При использовании кода в среде R устанавливайте собственные параметры подключения.
#подключим пакет sqldf, который позволит работать с postgreSQL
#путь к пакету - для исключения ошибки, пользуйтесь подключением пакетов из интерфейса RStudio
library("sqldf", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.2")
#установите свои параметры подключения к базе данных postgreSQL
options(sqldf.RPostgreSQL.user ="your_DB_user",
sqldf.RPostgreSQL.password ="your_DB_password",
sqldf.RPostgreSQL.dbname ="your_dbname",
sqldf.RPostgreSQL.host ="your_ip_address_host",
sqldf.RPostgreSQL.port =5432)
#получим данные из postgreSQL в среду R
#обратите внимание на кавычки - если имя представления не будет обрамлено кавычками, то запрос не выполнится
myTableSale <- sqldf('SELECT * FROM "saleView"', drv='RPostgreSQL')

Весь программный код, представленный в статье, протестирован и полностью работоспособен в соответсвующих для этого средах.

Резюме В статье показано, как использовать платформу 1С в качестве источника данных для последующих статистических исследований в среде R.
Схема с подключением к представлению позволяет уже на этапе получения данных производить предварительную кластеризацию данных средствами sql-запросов, гибко формируя выборку по параметрам, не перегружая R лишними данными.
В свою очередь среда R, обладая мощными аналитическими средствами, позволит очень быстро и качественно провести анализ и выявить скрытые закономерности, или уточнить уже формализованные метрики.

06.01.2016