1. Развертывание приложения

1.1 Системные требования

  • Операционная система: Windows 7 x64 / Windows 10 x64 / DEB-based Linux x64
  • 1C:Предприятие 8 - версия 8.3.9

1.2 Общая схема развертывания

Процесс развертывания DataReducer Console состоит из следующих этапов:
  • Публикация интерфейса OData информационных баз на веб-сервере.
  • Запуск интерпретатора R и сервера Rserve в Docker-контейнере.
  • Установка и настройка приложения DataReducer Console.
Схема развертывания

1.3 Публикация интерфейса OData информационных баз на веб-сервере

Для интеграции с «1С:Предприятием» DataReducer Console использует протокол OData. Для работы с ним стандартный интерфейс OData каждой из информационных баз должен быть опубликован на веб-сервере.

Шаг 1. В меню Конфигуратора «Администрирование → Публикация на веб-сервере» поставьте флажок «Публиковать стандартный интерфейс OData». Более подробную информацию о настройке веб-сервера можно получить на сайте 1С:ИТС.

Шаг 2. Выберите объекты информационной базы, доступ к которым может быть предоставлен через автоматический REST-сервис. Это осуществляется с помощью типовой обработки «Настройка автоматического REST-сервиса». В некоторых конфигурациях эта обработка может быть не представлена. В этом случае для включения объектов в состав стандартного интерфейса OData следует воспользоваться методом глобального контекста УстановитьСоставСтандартногоИнтерфейсаOData(). Соответствующий код может быть выполнен во внешней обработке. Например,

&НаСервере
Процедура КомандаНаСервере()
    МассивОбъектов = Новый Массив();

    МассивОбъектов.Добавить(Метаданные.РегистрыРасчета.Начисления);
    МассивОбъектов.Добавить(Метаданные.РегистрыРасчета.Удержания);

    Для Каждого Справочник Из Метаданные.Справочники Цикл
        МассивОбъектов.Добавить(Справочник);
    КонецЦикла;

    УстановитьСоставСтандартногоИнтерфейсаOData(МассивОбъектов); 
КонецПроцедуры

1.4 Запуск интерпретатора R и сервера Rserve в Docker-контейнере

Для удобства развертывания среды R для работы с DataReducer Console подготовлен Docker-образ datareducer/rserve. Образ включает интерпретатор R, сервер Rserve, ряд других библиотек и пакетов.

«Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет "упаковать" приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.» — Википедия.

Шаг 1. Скачайте с официального сайта дистрибутив Docker для вашей операционной системы и установите его.

Шаг 2. Создайте Docker-контейнер. Для этого откройте терминал (для Windows 7 - Docker Quickstart Terminal) и введите следующую команду:

$ docker run -d --name rserve -p 6311:6311 -v $(pwd):/home/docker datareducer/rserve

Docker загрузит образ datareducer/rserve и запустит его в новом контейнере.

Если указана опция -v $(pwd):/home/docker, то текущий каталог (например, домашний каталог пользователя) будет примонтирован к файловой системе контейнера в точке /home/docker. Этот каталог можно использовать для обмена файлами между R и хостом. Вместо $(pwd) может потребоваться ввести абсолютный путь к нужному каталогу хост-системы.

Опция -p 6311:6311 указывает на то, что порт 6311, который используется Rserve, должен быть проброшен в хост-систему.

Если вы используете Docker Toolbox (в Windows 7), хостом Docker-контейнеров является виртуальная машина Oracle VirtualBox, и для подключения к Rserve нужно использовать IP-адрес этой виртуальной машины (либо пробросить порты самой виртуальной машины средствами VirtualBox). Для того, чтобы узнать IP-адрес виртуальной машины в Docker Toolbox, введите команду

$ docker-machine ip default

Полученный IP-адрес далее будет использоваться для конфигурации DataReducer Console (см. п. 1.5).

Для того, чтобы убедиться, что контейнер запущен, введите команду

$ docker ps -a

Опция указывает на то, что требуется вывести список всех контейнеров, зарегистрированных в системе. Без этой опции команда «ps» отобразит только запущенные в настоящий момент контейнеры.

Шаг 3. Для повышения уровня безопасности сервер Rserve при подключении требует аутентификации. Данные для аутентификации Rservе считывает из файла /etc/R/rserve.pwd, который необходимо создать. Для этого можно воспользоваться командой «exec»:

$ docker exec rserve bash -c "echo 'change_login change_password' > /etc/R/rserve.pwd"

, где change_login и change_password — это произвольные логин и пароль.

Запуск и остановка Docker-контейнера

После того как контейнер создан и запущен командой «run», его можно остановить командой «stop» или повторно запустить командой «start»:

$ docker start rserve

Установка дополнительных пакетов R

Образ datareducer/rserve включает некоторые предустановленные пакеты R: xlsx, ggplot2, Cairo и другие. Для установки дополнительных пакетов следует воспользоваться командой «exec», например:

$ docker exec rserve R -e "install.packages('data.table')"

Для получения более подробной информации о работе с Docker обратитесь к официальной документации.


1.5 Установка и настройка DataReducer Console

После установки дистрибутива DataReducer Console перейдите в каталог приложения и отредактируйте конфигурационный файл datareducer.properties.

В Windows: %USERPROFILE%\AppData\Local\DataReducerConsole\app\datareducer.properties
В Linux: /opt/DataReducerConsole/app/datareducer.properties

В этом файле перечислены настройки подключения к Rserve и к OrientDB:

rserve-host
IP-адрес сервера Rserve. В зависимости от того, используете ли вы Docker Toolbox или нет, это может быть, соответственно, IP-адрес Docker Machine (см. п. 1.4, шаг 2), либо IP-адрес хоста, на котором установлен Docker.
rserve-user
Имя пользователя Rserve (см. п. 1.4, шаг 3)
rserve-password
Пароль пользователя Rserve (см. п. 1.4, шаг 3)
orientdb-engine
Тип сервера OrientDB. Поддерживаются значения «memory» и «remote»
orientdb-server
IP-адрес удаленного сервера OrientDB. Игнорируется, если значение параметра orientdb-engine равно «memory»
orientdb-user
Имя пользователя OrientDB
orientdb-password
Пароль пользователя OrientDB

Значения по умолчанию параметров orientdb-* в общем случае изменять не требуется.

Запустите DataReducer Console и проверьте подключение к Rserve. Для этого в главном меню программы выберите «Инструменты → Проверить подключение к Rserve». При успешном подключении вы увидите версию R. В противном случае будет выведено сообщение об ошибке.

Проверка подключения

2. Работа с приложением

2.1 Подключение информационных баз и загрузка метаданных

В DataReducer Console вы можете одновременно работать с данными нескольких информационных баз. Для того, чтобы открыть окно подключения информационной базы, выберите пункт главного меню «Правка → Добавить базу 1С» или нажмите соответствующую кнопку на панели списка информационных баз.

Окно подключения ИБ

Дерево метаданных подключённой информационной базы загружается при её выделении в списке информационных баз или при выборе пункта «Загрузить метаданные» в контекстном меню этого списка.

Форма списка ИБ

В дереве метаданных отображаются только те объекты, которые пользователь включил в состав стандартного интерфейса OData данной информационной базы (см. п. 1.3).


2.2 Интерфейс главного окна программы

Главное окно программы
  1. Список информационных баз
  2. Дерево метаданных
  3. Вкладка скрипта R
  4. Наборы данных скрипта R
  5. Область вывода сообщений
  6. Таблица данных
  7. Область вывода графики

2.3 Формирование наборов данных

Для того, чтобы создать новый скрипт R, выберите пункт главного меню «Правка → Добавить скрипт R» или нажмите соответствующую кнопку на панели списка скриптов R. При создании нового скрипта автоматически открывается его вкладка.

Для создания набора данных, содержащего данные объектов информационной базы «1С:Предприятия», воспользуйтесь контекстным меню дерева метаданных.

Создание набора данных

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

Двойным кликом по строке списка наборов данных скрипта R откройте окно созданного набора для его редактирования.

Доступные настройки зависят от типа объекта, которому соответствует набор данных.

Ниже приведены описания общих для всех объектов настроек.

Панель настроек и параметров

Панель настроек и параметров

Наименование набора данных — идентификатор, по которому будет осуществляться обращение к набору данных в теле скрипта R.

Время кэширования (минут) — время хранения результатов выполнения запроса в кэше. Устанавливается отдельно для каждого набора данных. Например, для Констант имеет смысл установить более продолжительное время кэширования.

Вы можете отключить кэширование данного набора данных, введя в это поле значение «0».

Учитывать ограничения доступа — выборка только тех объектов информационной базы, к которым пользователь имеет доступ.

Панель выбора полей (измерений)

Панель выбора полей (измерений)

По умолчанию в запрос включаются все поля объекта. Для ограничения их состава оставьте в правой таблице только выбранные поля.

Отметьте флажок «Представление», если вы хотите, чтобы в набор данных было включено представление поля. Например, для поля «Организация_Key» с типом GUID в набор данных будет включена колонка с именем «Организация____Presentation», содержащая наименования организаций.

Панель отбора

Панель отбора

Панель содержит инструменты для создания и редактирования дерева разбора логического выражения отбора данных. Для того, чтобы добавить к отбору простое логическое выражение, нажмите кнопку «Добавить фильтр».

Фильтры могут быть сгруппированы. Для этого выделите два или более фильтра с помощью клавиши «Ctrl» и нажмите кнопку «Сгруппировать».

Колонки:

  1. Колонка группы — логический оператор, выбирается из выпадающего списка из значений «И», «Или». Может принимать значение «Не», если логическое выражение инвертировано. Для инверсии фильтра (или группы) выделите строку фильтра (или группы) и нажмите кнопку «Инвертировать».
  2. Поле — выбирается из выпадающего списка. После имени поля в квадратных скобках указан его тип. Для обозначения полей составного типа к имени типа добавляется символ «c», например, «[string, c]». (Для полей составных типов предусмотрен специальный формат значения, см. далее).
  3. Оператор — оператор сравнения. Выбирается из выпадающего списка.
  4. Значение — вводится вручную в соответствии с типом поля. Для полей с типом «boolean» принимаются значения «true» или «false». Значения полей составных типов вводятся с использованием функции «cast». Например, cast(guid'd341d2be-b3b1-11dc-a100-0011d85708ff', 'Catalog_СтатьиДвиженияДенежныхСредств'). Предусмотрен графический инструмент ввода значений полей составных типов.

  5. Ввоз значения составного типа

    Вместо значения в колонку значения поля любого типа может быть введено имя параметра (см. п. 2.4).

  6. Комментарий — произвольный комментарий к фильтру. Например, расшифровка значения с типом GUID.

После окончания настройки набора данных нажмите кнопку «Загрузить» и проверьте результат выполнения запроса к сервису OData.

Окно набора данных

Сформированный URL-адрес ресурса выводится в области вывода сообщений в главном окне программы.


2.4 Параметры скрипта R

Параметры могут быть введены:
  • в теле скрипта
  • в полях параметров запроса на панели настроек и параметров набора данных
  • в колонке значения на панели отбора набора данных.

Имена параметров должны начинаться с символа «&». Например, «&periodBegin».

Значения параметров вводятся на панели «Параметры» формы скрипта R.

Список параметров скрипта

При нажатии на кнопку «Дозаполнить параметры» в таблицу будут добавлены параметры, для которых ещё не введены значения (и удалены отсутствующие параметры).

Пространство имён параметров общее для всех наборов данных одного и того же скрипта.

Предопределенные параметры

&name
наименование скрипта
&description
описание скрипта

2.5 Конструкции языка R для выполнения типовых задач

Вывод результата выполнения скрипта (таблицы данных)

DataReducer Console выводит в главном окне программы ту таблицу данных, идентификатор которой является последним оператором скрипта R.

Чтение файлов Excel

Docker-образ datareducer/rserve содержит пакет xlsx для работы с таблицами Excel. Для чтения файла Excel воспользуйтесь функцией read.xlsx(). Например,

library(xlsx)
plan <- read.xlsx('/home/docker/План_1кв.xlsx', 1)

Первый аргумент функции в примере — путь к файлу в каталоге /home/docker Docker-контейнера (см. п. 1.4). Второй аргумент — индекс листа.

Запись в файл Excel

Для записи таблицы данных в файл Excel воспользуйтесь функцией write.xlsx(). Например,

library(xlsx)
write.xlsx(pf, '/home/docker/ПланФакт.xlsx', row.names = FALSE)

Вывод диаграммы на экран

Для работы с графикой используется пакет Cairo. Для вывода диаграммы на экран после функции print() введите dev.off(). Также рекомендуется указать используемый в диаграмме шрифт:

CairoFonts(regular='Free Helvetian:style=Regular')
print(chart)
dev.off()

Ширина и высота диаграммы вводится в соответствующих полях области вывода графики главного окна программы.

Запись диаграммы в файл

Для этого воспользуйтесь функцией CairoPNG(), после которой, так же как и для вывода графики на экран, нужно ввести print() и dev.off():

CairoPNG('/home/docker/chart.png', width=520, height=360)
print(chart)
dev.off()

Ширина и высота диаграммы в этом случае вводятся в качестве аргументов функции CairoPNG().


3. Пример использования DataReducer Console

Для демонстрации работы с программой «DataReducer Console» решим следующую задачу:

Требуется выполнить план-фактный анализ поступлений денежных средств компании за квартал. Компания состоит из двух юридических лиц — организаций «УноФарма» и «ПортоФарма». Бухгалтерский учёт организаций ведётся в двух разных информационных базах «1С:Бухгалтерия предприятия 3.0».

Отчет Факт УноФарма Отчет Факт ПортоФарма

Запланированные значения поступлений необходимо получить из таблицы Excel, в которой отражены суммарные данные по всем организациям.

Отчет План

Шаги решения поставленной задачи в программе «DataReducer Console»

  1. Добавляем настройки подключения к информационным базам «УноФарма» и «ПортоФарма». Интерфейс OData этих баз предварительно должен быть опубликован на веб-сервере и настроен в соответствии с документацией платформы «1С:Предприятие» (см. п. 1.3). С помощью «DataReducer Console» можно одновременно работать с данными любого количества информационных баз. Список подключенных баз отображается в главном окне программы (см. п. 2.2).
  2. После подключения информационной базы, «DataReducer Console» выводит дерево её метаданных. Дерево метаданных включает все сущности, доступные через интерфейс OData (справочники, регистры, виртуальные таблицы и пр.). Для свойств сущностей выводится их тип. Для свойств с ссылочным типом выводится связанная сущность.
  3. Создаём новый скрипт R и открываем его. Каждый скрипт открывается в отдельной вкладке.
  4. Находим в дереве метаданных информационной базы «УноФарма» виртуальную таблицу оборотов регистра бухгалтерии «Хозрасчётный» и через контекстное меню добавляем её в наборы данных скрипта R. Повторяем для информационной базы «ПортоФарма». Любой набор данных можно открыть в отдельном окне и загрузить данные для просмотра.

  5. Окно набора данных
  6. Поочерёдно открываем окна созданных наборов данных и вводим настройки запросов. Перечень доступных настроек зависит от типа объекта, которому соответствует набор данных. Начало и конец периода получения оборотов регистра бухгалтерии «Хозрасчетный» задаём в виде параметров «&periodBegin» и «&periodEnd». Значения этих параметров будут общими для всех наборов данных скрипта R (см. п. 2.4).
  7. Пишем код на языке R (см. листинг). Обращение к наборам данных осуществляется по их именам.
  8. Выполняем скрипт. На экран выводятся сообщения о ходе выполнения, в том числе сформированные запросы REST-сервису «1С:Предприятия». В области вывода графики выводится построенная диаграмма. Результаты выполнения скрипта (таблицу данных и диаграмму) можно сохранить в файлы, используя методы языка R (см. п. 2.5).

Листинг

# Обрабатываем данные информационной базы ООО "УноФарма".

# Создаём таблицу данных, выбирая нужные нам поля набора данных "AccountingRegister_Хозрасчетный_Turnover1" 
# (соответствующего виртуальной таблице оборотов регистра бухгалтерии "Хозрасчетный").

ib1 <- AccountingRegister_Хозрасчетный_Turnover1[c('ExtDimension1____Presentation',
     'ExtDimension1_Type', 'ExtDimension2____Presentation', 'ExtDimension2_Type', 'СуммаTurnoverDr')]

# Статья движения д/с может быть записана в разные реквизиты - Субконто1 или Субконто2.
# Разбиваем данные на два набора, соответствующих первому и второму случаю.
# Затем, объединяя эти наборы, получаем таблицу данных с отдельным столбцом статей движения д/с.

ib1_1 <- subset(ib1, ib1$ExtDimension1_Type == 'StandardODATA.Catalog_СтатьиДвиженияДенежныхСредств',
     select=c(ExtDimension1____Presentation, СуммаTurnoverDr))

ib1_2 <- subset(ib1, ib1$ExtDimension2_Type == 'StandardODATA.Catalog_СтатьиДвиженияДенежныхСредств',
     select=c(ExtDimension2____Presentation, СуммаTurnoverDr))

fact1 <- merge(ib1_1, ib1_2, by.x=c('ExtDimension1____Presentation', 'СуммаTurnoverDr'),
     by.y=c('ExtDimension2____Presentation', 'СуммаTurnoverDr'), all = TRUE)

# Выполняем те же операции для информационной базы ООО "ПортоФарма".

ib2 <- AccountingRegister_Хозрасчетный_Turnover2[c('ExtDimension1____Presentation',
     'ExtDimension1_Type', 'ExtDimension2____Presentation', 'ExtDimension2_Type', 'СуммаTurnoverDr')]

ib2_1 <- subset(ib2, ib2$ExtDimension1_Type == 'StandardODATA.Catalog_СтатьиДвиженияДенежныхСредств',
     select=c(ExtDimension1____Presentation, СуммаTurnoverDr))

ib2_2 <- subset(ib2, ib2$ExtDimension2_Type == 'StandardODATA.Catalog_СтатьиДвиженияДенежныхСредств',
     select=c(ExtDimension2____Presentation, СуммаTurnoverDr))

fact2 <- merge(ib2_1, ib2_2, by.x=c('ExtDimension1____Presentation', 'СуммаTurnoverDr'),
     by.y=c('ExtDimension2____Presentation', 'СуммаTurnoverDr'), all = TRUE)

# Объединяем данные двух информационных баз и суммируем значения поступлений по статьям.

fact <- merge(fact1, fact2, , all=TRUE)

if (nrow(fact) > 0) fact <- aggregate(fact[, 2], by=list(fact[, 1]), sum)

# Переименовываем столбцы.

names(fact)[1] <- 'СтатьяДДС'
names(fact)[2] <- 'Факт'

# Считываем фактические данные поступлений д/с из файла Excel.
# Файл расположен в каталоге, примонтированном к Docker-контейнеру сервиса Rserve в точке /home/docker.

library(xlsx)
plan <- read.xlsx('/home/docker/План_1кв.xlsx', 1)

# Объединяем таблицы плановых и фактических данных.

pf <- merge(plan, fact, by=1, all=TRUE)

# Рассчитываем абсолютные и относительные отклонения фактических значений от плановых
# и помещаем результаты в новые колонки.

pf$ОтклонениеАбс <- pf$Факт - pf$План
pf$ОтклонениеОтн <- round((pf$Факт - pf$План) / pf$Факт, digits = 2)

# Подготавливаем данные для построения диаграммы.

# Приводим таблицу данных к нужному формату 
# (функция melt() преобразует данные в такой формат, что переменные "План" и "Факт"
# располагаются в собственных строках вместе с переменными "СтатьяДДС", их идентифицирующими.

library(reshape2)
names(pf)[1] <- 'СтатьяДДС'
pf.m <- melt(pf[,1:3], id.var='СтатьяДДС')

# Для экономии места на диаграмме разбиваем названия статей по словам.

pf.m$СтатьяДДС <- gsub("\\s","\n", pf.m$СтатьяДДС)

# Строим столбчатую диаграмму. Указываем вид диаграммы - с группировкой, 
# горизонтальное расположение и размер шрифта.

library(ggplot2)
chart <- ggplot(pf.m, aes(x = СтатьяДДС, y = value, fill = variable)) + geom_bar(stat='identity', position = 'dodge') +
    coord_flip() + theme(text = element_text(size=13))

# Указываем шрифт, используемый в диаграмме.
# Шрифт должен быть установлен в системе (или в Docker-контейнере сервиса Rserve)

CairoFonts(regular='Free Helvetian:style=Regular')

# Выводим диаграмму на экран.

print(chart)
dev.off()

# Создаем каталог для хранения файлов в точке монтирования /home/docker

analysisDir <- '/home/docker/analysis'
dir.create(analysisDir)

# Записываем диаграмму в файл.

chartFile <- paste(analysisDir, 'chart.png', sep='/')
CairoPNG(chartFile, width =520, height=360)
print(chart)
dev.off()

# Записываем таблицу данных в файл Excel.

xlsxFile <- paste(analysisDir, 'ПланФакт.xlsx', sep='/')
write.xlsx(pf, xlsxFile, row.names = FALSE)

# Выводим таблицу данных.
pf

Результат

На данном примере были продемонстрированы основные инструменты программы «DataReducer Console» для импорта данных информационных баз «1С:Предприятия» и некоторые методы языка R для обработки этих данных. Были получены и агрегированы данные из трёх разных источников: двух информационных баз «1С: Бухгалтерия предприятия 3.0» и файла Excel. С помощью пакета ggplot2 была построена столбчатая диаграмма, отображающая отклонения фактических значений показателей от плановых.

Диаграмма

О логотипе

Логотип программы — это видоизмененное изображение логотипа R, автором которого является организация R Foundation. Изменение заключается в замене латинской буквы "R" на кириллическую "Р" и символизирует адаптацию программы под потребности пользователей "1С: Предприятия". Логотип R и логотип DataReducer Console распространяются на условиях лицензии CC-BY-SA 4.0.