Что такое каналы?
Введение
Каналы в системе OpenPIM представлены в виде выполняемых модулей созданных на произвольном языке программирования. Канал работает с записями и позволяет выгружать, преобразовывать и передавать записи из системы OpenPIM в файл или в другую внешнюю систему.
Отправка записей в канал
Записи в канал можно отправлять по одной или несколько сразу из табличного вида, который доступен для записей с вложенными записями или со страницы результатов поиска. Для оправки одной записи в канал выберите пункт Отправить в Канал в меню Отправить:
В новом окне выберите канал из списка доступных каналов и нажмите кнопку Выбрать:
После этого действия запись автоматически будет отправлена в выбранный канал.
Для отправки большого количества записей в канал используйте табличную форму отображения записей, например в режиме поиска записей. Выполните поиск записей в системе OpenPIM по интересующим вас критериям. В заголовке таблицы с результатами поиска выберите значок Отправить и пункт Отправить в Канал

В новом окне выберите канал из списка доступных каналов и нажмите кнопку Выбрать:
После отправки записей в канал у них появляется атрибут с названием канала и статусом обработки. Существуют следующие статусы обработки записей в канале:
- Статус В очереди: Запись отправлена в обработку
- Статус ОК: Запись успешно обработана
- Статус Ошибка: Произошла ошибка при обработке записи
Пользовательский Интерфейс Канала
Вы можете просматривать информацию о канале в разделе Каналы, который доступен в основном меню системы OpenPIM:
В разделе Каналы доступна следующая информация:

Дашборд: Отображает состояние записей оправленных в канал
Запуски: Содержит список запусков канала с временем начала и окончания запуска, статусом для каждого запуска, ссылкой на файл с результатами работы канала и информацией о ходе выполнения запуска. В данном разделе доступны действия с каналом:
Обновить: Позволяет обновить данные о состоянии канала
Запустить: Выполняет запуск канала вручную
Очистить очередь: Сбрасывает атрибут отправки в канал для всех записей в очереди данного канала.
Настройки канала
Создание и настройка канала осуществляется в разделе Настройки, который доступен в основном меню системы OpenPIM:
После перехода в раздел Настройки необходимо выбрать пункт Каналы из меню расположенного в левой части экрана:

При выборе пункта Каналы в правой части экрана доступен список существующих каналов для редактирования и возможность создать новый канал. Для создания нового канала выберите + символ напротив названия Каналы:

При создании нового канала необходимо указать следующие значения:
- Идентификатор - уникальной идентификатор канала.
- Наименование - произвольное наименование канала
- Закладка Свойства
- Выбрать Активный для нового канала
- Выбрать тип канала из списка. Для базовой версии системы доступен тип канала Внешний
- Выбрать режим запуска канала из 4 возможных вариантов
- Указать для каких типов объектов системы данный канал будет доступен
- Указать для какого уровня объектов системы данный канал будет виден
- Выбрать Показывать статус канала у объекта для отображения статуса канала в карточке товара
- Закладка Конфигурация
- Указать полный путь к запускаемой программе в поле Запускаемая программа
- Указать имя файла в поле Генерируемое имя файла, которое будет сгенерировано по результату успешного запуска канала
- Указать mime тип для файла в поле Mime тип генерированного файла, который будет сгенерирован по результату успешного запуска канала
Пример канала
Рассмотрим в качестве примера написание нового выполняемого модуля для канала на Node JS. Для начала работы канала необходимо выбрать все записи в БД, которые были отправлены в канал. Для этого необходимо выполнить следующие действия:
- Создать соединение с БД. В примере ниже создается соединение с БД "openpim" для процесса, запущенного в Docker контейнере к серверу БД запущенному на том же хосте, что и Docker контейнер. Для соединения используется пользователь "postgres" с паролем "sa".
import * as pg from 'pg'
const { Pool } = pg.default
const pool = new Pool({
host: '172.17.0.1',
database: 'openpim',
password: 'sa',
user: 'postgres',
port: '5432'
})
2
3
4
5
6
7
8
9
- Выбрать все записи из таблицы items у которых есть признак отправлено в канал. Поиск записей осуществляется по идентификатору канала ('channel_identifier') и статусу равному 1, что значит запись была отправлена в канал. Идентификатор канала находится в настройках канала. Результат запроса возвращается в формате JSON, в котором найденные записи доступны в поле "rows".
const channel = 'demoChannel'
let sql = `
SELECT i.*
FROM items i
WHERE i.channels##>>'{${channel}, status}' = '1'
`
const itemsForProcessing = await pool.query(sql)
console.log(`Найдено ${itemsForProcessing.rows.length} для обработки в канале.`)
2
3
4
5
6
7
8
- Обработка списка полученных записей. Для примера обработки полученных записей используется функция (writeItemsToCSV) для создания CSV файла. В данную функцию передается массив записей, найденных на предыдущем шаге (itemsForProcessing.rows). В качестве выходного файла используется имя файла, передаваемое из настроек канала (поле "Генерируемое имя файла")
const fs = require('fs')
const path = require('path')
const { parse } = require('json2csv')
// Функция для записи массива itemsForProcessing в CSV файл
function writeItemsToCSV(items, outputFilePath) {
// Определение заголовка CSV
const fields = ['identifier', 'name']
opts = { fields }
try {
// Конвертация массива в CSV формат
const csv = parse(items, opts)
// Запись данных в файл
fs.writeFileSync(outputFilePath, csv)
console.log('CSV файл создан успешно:', outputFilePath);
return true
} catch (err) {
console.error('Ошибка при создании CSV файла:', err);
return false
}
}
// Вызов функции для обработки записей
const processingResult = writeItemsToCSV(itemsForProcessing.rows, outputFilePath);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- По окончании обработки записей необходимо выполнить изменение статуса записей на следующие значения:
- status = 2: значит запись была успешно обработана выполняемым модулем канала.
- status = 3: значит, что произошла ошибка при обработке записи.
- Для примера можно использовать значение, возвращаемое функцией writeItemsToCSV и для всех записей массива выставить соответствующее значение статуса.
if (processingResult) {
itemsForProcessing.rows.forEach(item => {
const sql1 = `update items set channels = jsonb_set(channels, '{${channel}}', channels->'${channel}' || '{"status" : 2, "syncedAt" : ${Date.now()} }') where identifier = '${item.identifier}'`
pool.query(sql1)
})
}else {
itemsForProcessing.rows.forEach(item => {
const sql1 = `update items set channels = jsonb_set(channels, '{${channel}}', channels->'${channel}' || '{"status" : 3, "syncedAt" : ${Date.now()} }') where identifier = '${item.identifier}'`
console.log(`DEBUG: sql = ${sql1}`)
pool.query(sql1)
})
}
2
3
4
5
6
7
8
9
10
11
12
Результат работы канала доступен в разделе Каналы -> <Имя Канала> -> Запуски:

Выполняемый код демо канала вы можете найти по ссылке. Для запуска демо канала выполните следующие действия:
- В настройках системы OpemPIM создайте новый канал со следующими характеристиками:
- Закладка Свойства
- Идентификатор: demoChannel
- Наименование: Demo канал
- Активный: Выбрано
- Тип: Внешний
- Запуск канала вручную
- Укажите типы и видимо от в зависимости от модели данных
- Показывать статус канала у объекта: выбрано
- Закладка Конфигурация
- Запускаемая программа: node /filestorage/jobs/demoChannel/demoChannel.js {outputFile}.
- Генерируемое имя файла: demoProducts.csv
- Mime тип генерированного файла: text/csv
- Закладка Свойства
- Сохраните изменения для нового канала.
- Скопируйте содержимое архива в директорию на сервере. В параметрах запуска Docker контейнера с системой OpenPIM используется маппинг локальной директории на сервере с /filestorage в Docker контейнере. В этой локальной директории создайте новую директорию "jobs" и в ней директорию для канала: "demoChannel" куда и скопируйте содержимое архива.
- В пользовательском интерфейсе системы OpemPIM перейдите в раздел Каналы, выберите Demo канал и нажмите Запустить