Code Monkey home page Code Monkey logo

foxylink's Introduction

FoxyLink

Smooth, intuitive, and powerful subsystem for faster and easier integration development
based on "1C:Enterprise 8" platform
Explore FoxyLink docs »

FoxyLink Integrations · Blog


Table of contents

Quick start

It's easy to start using it with any configuration on "1C:Enterprise 8" platform, requirements:

  • Platform version:
    • 8.3.10.2772 (minimal, SocialNetwork subsystem unsupported)
    • recommended 8.3.11.2924 and higher
  • Data lock control mode: Managed
  • Compatibility mode: 8.3.10 and higher
  • «1C:Enterprise 8» server cluster and Database server for the best performance

FoxyLink subsystem is available as configuration, so you can install it using command: 1C:Enterprise 8 -> Designer -> Configuration -> Compare and merge with configuration from file....

Status

Telegram Quality Gate

Overview

FoxyLink provides an unified programming model to handle integration tasks in a reliable way and run them on 1C:Enterprise server cluster. You can start with a simple setup and grow computational power for integration jobs with time for these scenarios:

  • incredibly easy way to output reports in JSON, CSV, XML, etc.
  • integration with different business intelligence systems
  • fire-and-forget jobs
  • mass notifications/newsletters
  • export data to JSON, CSV, XML, etc.
  • export data with arbitrary hierarchy
  • creation of messages for message exchange systems
  • plugins support
  • ...and so on

Data composition schema output process

Bugs and feature requests

Open-source projects develop more smoothly when discussions are public.

If you've discovered a bug, please report it to the FoxyLink GitHub Issues. Detailed reports with stack traces, actual and expected behaviours are welcome.

If you have any questions, problems related to the FoxyLink subsystem usage or if you want to discuss new features, please visit the chatroom Slack.

Documentation

Function OutputInJSON(DataCompositionSchema, DataCompositionSettings)
    
    DataCompositionTemplate = FL_DataComposition.NewTemplateComposerParameters();
    DataCompositionTemplate.Schema   = DataCompositionSchema;
    DataCompositionTemplate.Template = DataCompositionSettings;
    
    OutputParameters = FL_DataComposition.NewOutputParameters();
    OutputParameters.DCTParameters = DataCompositionTemplate;
    OutputParameters.CanUseExternalFunctions = True;
    
    StreamObject = DataProcessors.FL_DataProcessorJSON.Create();
    Stream = New MemoryStream();
    StreamObject.Initialize(Stream);
	
    FL_DataComposition.Output(StreamObject, OutputParameters);

    StreamObject.Close()
    
    Return GetStringFromBinaryData(Stream.CloseAndGetBinaryData());
   
EndFunction // OutputInJSON()

Copyright and license

Copyright © 2016-2023 Petro Bazeliuk.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/agpl-3.0.

Legal

By submitting a Pull Request, you disavow any rights or claims to any changes submitted to the FoxyLink project and assign the copyright of those changes to Petro Bazeliuk.

If you cannot or do not want to reassign those rights (your employment contract for your employer may not allow this), you should not submit a PR. Open an issue and someone else can do the work.

This is a legal way of saying "If you submit a PR to us, that code becomes ours". 99.9% of the time that's what you intend anyways; we hope it won't scare you away from contributing.

Happy Customers

foxylink's People

Contributors

johnydeath avatar pbazeliuk avatar yakravets avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

foxylink's Issues

Подписки на определенные события не восстанавливаются в дереве просмотра

  • Для выбранных ранее событий должны восстанавливаться трех-позиционные флажки при повторном открытии формы для добавления\редактирования новых\старых подписок на события.

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

Тесты проверки корректности вывода при декларативном описании JSON

Описание

Необходимо создать тесты для проверки декларативного описания JSON

  • Sequential output - тип "string"
  • Fast output - тип "string"
"Create"
  • Sequential output - тип "number"
  • Fast output - тип "number"
15.3
  • Sequential output - true
  • Fast output - true
true
  • Sequential output - false
  • Fast output - false
false
  • Sequential output - null
  • Fast output - null
null
  • Sequential output - тип "Object"
  • Fast output - тип "Object"
{
	"Id": "1231",
	"SyncToken": "SyncToken",
	"Name": "Garden Supplies",
	"Sku": "01254001",
	"ItemCategoryType": "Goods",
	"PurchaseCost": 100,
	"MetaData": {
		"CreateTime": "2013-05-05T00:00:00",
		"LastUpdate": "2017-05-05T00:00:00"
	},
	"IncomeAccountRef": {
		"value": 12313,
		"name": "pikabu"
	}
}

Управлять моментом формирования сообщения (в момент события или после события)

Описание

  • #18 В зависимости от настройки обмена, сообщение может быть сформировано и сохранено во время самого события или если возможность после завершения события
  • #18 События которые имеют природу, что их нельзя описать постфактум, должны формироваться в момент события

Добавить возможность распространения настроек

  • Добавить возможность сохранять настройки в файл
  • Если в файле есть каналы пытаться их подключить или сообщить что канал не доступен
  • Загружать подписки на события и проверять все ли метаданные доступны в данной конфигурации
  • Добавить возможность переносить настройки между конфигурациями как поставляемые настройки. Из панели администрирования налаживать интеграцию (Обмены+Каналы+Авторизация+События).

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

  • Модуль преобразования значений, выполняет поиск в предоставленном объекте (произвольного типа) необходимого поля для Параметров СКД и корректно их сериализирует для использования в СКД и\или в объекте отложенного выполнения события;
  • Должны поддерживаться примитивные типы;
  • Должны поддерживаться ссылочные типы;
  • Списки значений ограниченные определенным типом;
  • Таблицы значений, соответствие типа определяется по типу колонки+наименования;
  • Возможно, необходимо разделить QueryParameters на параметры SubscriberParameters (параметры подпищиков), PublisherParameters (параметры для восстановления состояния события, для отложенного выполнения).

Добавить возможность кэширования для DataCompositionTemplate

Как оказалось существует возможность работы напрямую с макетом, без использования компоновщика настроек и самой схемы компоновки, так же есть возможность управлять очень просто параметрами и фильтрами не используя НастройкиПоУмолчанию(), НастройкиКомпоновкиДанных, и КомпоновкщикНастроек, но настройки компоновки данных необходимы для определения кэша вывода в поток (StreamObject).

Программное получение настроек обмена

Описание

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

  • Получения настроек обмена по Exchange Name (Имени обмена) и Method (Методу)
  • Получения настроек обмена при возникновении определенного события, другими словами получение подписчиков на данное событие

Bug: при выводе типа Array

Если все элементы попадают на уровень группировки массива, тогда схема вывода процессора компоновки данных изменяется из:
Begin; Begin; BeginAndEnd; Begin; Begin; на Begin; BeginAndEnd; Begin;

И соответственно массив выводиться не верно в JSON

Декларативное описания формата обмена (JSON) для API Method (Метода)

Описание

Необходима возможность декларативного описания формата обмена (JSON) для API Method (Метода).

  • Конструктор декларативного описания формата должен быть в обработке, которая включена в подсистему Plugins
  • Если обработка поддерживает функцию декларативного описания формата, в обработке должны присутствовать Форма: APICreationForm и реквизит обработки APISchema
  • MemorySavingOutput и FastOutput в модуле обработки должны: обрабатывать ситуации когда есть описание формата и когда оно отсутствует (в этом случае вывод должен быть по умолчанию)
  • Передача APISchema из табличной части Methods справочника IHL_ExchangeSettings должна происходить следующим образом:
    StreamObject = Catalogs.IHL_ExchangeSettings.NewFormatProcessor(
        FormatProcessorName, Object.BasicFormatGuid);
    StreamObject.Initialize(APISchema);
  • Необходимо внести изменения в процедуру инициализации формата обмена (JSON) для обработки данных APISchema. Такой метод инициализации гарантирует что будет возможность использовать произвольный тип данных, а так же использовать различные версии схем для обратной совместимости
// Constructor of stream object.
//
// Parameters:
//  OpenFile - String - output filename.
//             Default value: Empty string.
//
Procedure Initialize(OpenFile = "") Export
    
    RefTypesCache = New Map;
    
    StreamWriter = New JSONWriter;
    If IsBlankString(OpenFile) Then 
        StreamWriter.SetString();
    Else
        
    EndIf;
    
EndProcedure // Initialize()
  • #10 Реализовать базовый вывод базовых типов формата JSON
  • #11 Вывод свойства с типом "Object" при декларативном описании формата JSON
  • #12 Тесты проверки корректности вывода при декларативном описании JSON
  • Реализация иерархического вывода должна быть выполнена в таком виде: каждая колонка макета СКД на любом уровне - соответствует Свойству в формате обмена (JSON) на этом же уровне
  • если Свойство формата обмена (JSON) имеет тип: Array или Object необходимо найти макет СКД подчиненный текущему макету СКД у которого Имя совпадает с именем свойства JSON

Bug: Ошибка обработки события для ссылочных типов

Модуль: FL_Events.EnqueueEvent

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

ElsIf FL_CommonUse.IsReferenceTypeObjectByMetadataObjectName(
    InvocationData.MetadataObject) Then
        
    InvocationData.SourceObject = Source.Ref;
        
EndIf;

Модуль: FL_BackgroundJob.FillParameterValueFromArguments

Не верное условие, если параметр содержит искомый тип, значение не должно обнулятся

If Parameter.ValueType.ContainsType(TypeOf(Value)) Then
    Value = Undefined;
EndIf;

Вывод свойства с типом "Object" при декларативном описании формата JSON

Описание

В схеме компоновки данных должны присутствовать группировка в структуре отчета с указанным именем RootItem, а так же поля в выбранных полях с таким же псевдонимами как заданы в декларативном описании.
Если в декларативном описание есть вложенные свойства с типом Object тогда в структуре отчета должны быть дополнительные группировки подчиненные RootItem (или другим группировкам). Результат выполнения схемы компоновки данных должен содержать только один элемент иначе будет ошибка вывода в формат JSON.

  • Если RootItem имеет тип Object выводить его наименование не нужно, это приведет к ошибке формата JSON.
  • Необходим контроль вывода свойств в Object, дублирования свойств быть не должно
  • Если свойство в макете схемы компоновки данных на определенном уровне отсутствует должно быть вызвано исключение

Необходимо проработать систему с использованием статусов сообщений

Описание

#18 Сообщения должны отправляться только в транзакции, если TransactionActive() возвращает False, должна быть вызвана исключительная ситуация

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

  • При работе в файловом варианте (уровень изоляции транзакции: Serializable) при создании сообщений (не имеет значения тип объекта БД) блокировка устанавливается на всю Таблицу (не имеет значения Автоматические или Управляемые блокировки) и соответственно все параллельные транзакции которые могут формировать сообщения будут в ожидании, эту проблему можно минимизировать для файлового варианта работы если реализовать систему статусов сообщений при их обработке.
  • Для файловой базы необходимо выполнять чтение настроек сообщения (элемент справочника настройки обменов) в транзакции, после того как данные получены транзакцией ее необходимо завершать для минимизации времени блокировки данных. Основная цель это избежать Dirty Read.

Функция GroupNames должна возвращать, не только структуру групп, но и их иерархию

// Recursively fills the structure of group names from nested data composition 
// layouts in main data composition template. 
//
// Note:
//  Return value is type of "Structure", not "Map".
//  The main reason is that "Structure" was faster then "Map" on test system 
//  in ~17.62% or ~1967 ms for 100000 executions.
// 
// Parameters:
//  Mediator     - Arbitrary - reserved, currently not in use.
//  DataCompositionTemplate - DataCompositionTemplate - main data composition template, for which is needed to create 
//                                           a structure with the names of groups nested in data composition layouts. 
//  DataCompositionTemplateBody - DataCompositionTemplateBody - the body of current data composition layout. 
//  GroupNames    - Structure - group names that were set early in the report strucure 
//                              with help of context menu command "Set name...".
//                  Default value: Undefined.
//
// Returns:
//  Structure - group names that were set early in the report strucure with help of context menu command "Set name...".
//      * Key   - String - the name of nested data composition layout.
//      * Value - String - the name of body element group in nested data composition layout. 
//                          It will be used as a name of array during output process execution. 
//
Function GroupNames(Mediator, DataCompositionTemplate, 
    DataCompositionTemplateBody, GroupNames = Undefined)

Это необходимо для верного расчета размещения при декларативном описании формата #16

Необходимо фильтровать события

При выборе событий на которые подписывается обмен, необходимо иметь возможность фильтрации. Например, в системе QB покупатели (customers) и поставщики (vendors) разные справочники, а в конфигурации Small Business / 1C:Drive / SERP это один объект который разделяется специальным флагом.

Catalogs.FL_Exchanges.Events добавить поля EventFilterDCSchema, EventFilterDCSettings

Catalogs.FL_Messages.QueryTextExchangeEndpoint и Catalogs.FL_Messages.QueryTextExchangeEndpoints должны так же возвращать настройки фильтров, если они есть.

Catalogs.FL_Messages.RouteToEndpoints если задана схема компоновки данных фильтра и настройки компоновки данных фильтра, должна быть выполнена проверка с десериализированными ключами как расширение фильтра ComposerSettings.Settings.Filter, если в результате запроса с учетом всех фильтров есть записи задания должны быть зарегистрированы.

События регистра сведений должны формировать несколько сообщений

При записи набора записей регистра сведений, должно быть создано:

  • Событие Create для записей которых не было при обработке события ПередЗаписью, и которые появились при обработке событияПриЗаписи набора.
  • Событие Update для записей которые были при обработке события ПередЗаписью, и которые присутствуют при обработке события ПриЗаписи набора.
  • Событие Delete для записей которые были при обработке события ПередЗаписью, и которые исчезли при обработке события ПриЗаписи .
  • Важно анализировать только измерения

Изменить метод НормализироватьИмяКолонки

Поскольку метод предусматривает не все возможные варианты использованных символов, предлагаю альтернативную реализацию. Единственное я удалил преобразование символов после пробелов в верхний регистр. Если надо восстановите самостоятельно, мне лично это оказалось ни к чему. Я все равно вместе с данными передаю информацию о колонках, типах и других свойствах.

Для проверки использовал имя поля данных "[~' йо'{' ё'}"жик"|/?><.,]". Можно туда добавить числа и латиницу, но в принципе это уже не существенно.

`// Возвращает нормализированное имя колонки, например, "Товары.Сумма"
// к виду: "ТоварыСумма". СКД допускает большой набор символов в именах,
// но преобразовывает не цифры и буквы к , а пробелы удаляет.
//
// Параметры:
// ПутьКДанным - Строка - колонка имя которой необходимо нормализировать.
//
// Возвращаемое значение:
// Строка - нормализированное имя колонки.
//
Функция ПолучитьИмяКолонки(ПутьКДанным) Экспорт
Диапазоны = Новый Массив;
Диапазоны.Добавить(Новый Структура("Мин,Макс", 48, 57)); // цифры
Диапазоны.Добавить(Новый Структура("Мин,Макс", 65, 90)); // латиница большие
Диапазоны.Добавить(Новый Структура("Мин,Макс", 97, 122)); // латиница маленькие
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1040, 1103)); // кириллица
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1025, 1025)); // символ "Ё"
Диапазоны.Добавить(Новый Структура("Мин,Макс", 1105, 1105)); // символ "ё"
Диапазоны.Добавить(Новый Структура("Мин,Макс", 95, 95)); // символ "
"

УдаляемыеСимволы = Новый Массив;
УдаляемыеСимволы.Добавить(КодСимвола(Символы.НПП));
УдаляемыеСимволы.Добавить(КодСимвола(" "));
УдаляемыеСимволы.Добавить(КодСимвола("."));

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

ИмяКолонки = "";
Для Индекс = 1 По СтрДлина(ПутьКДанным) Цикл
	ЗначениеСимвола = Сред(ПутьКДанным, Индекс, 1);
	КодСимвола		= КодСимвола(ЗначениеСимвола);
	Если УдаляемыеСимволы.Найти(КодСимвола) <> Неопределено Тогда
		ЗначениеСимвола = "";
	ИначеЕсли ДопустимыеСимволы.Найти(КодСимвола) = Неопределено Тогда
		ЗначениеСимвола = "_";
	КонецЕсли;
	
	ИмяКолонки = ИмяКолонки + ЗначениеСимвола;
КонецЦикла;

Возврат ИмяКолонки;

КонецФункции`

Добавить панель администрирования

Панель администрирования должна позволять:

  • принять лицензию
  • получить быстрый доступ к справочниками
  • активировать доступ к подсистеме
  • выполнить первоначальное заполнение

Необходимо добавить настройки для формата JSON

  • Добавить опцию контроля правильности вывода формата сообщения (опция должна размещаться в справочнике FL_Exchanges).
  • Добавить настройку обработки неопределенных значений
  • Исправить, вывод в формат JSON. Например, ожидался вывод числового значения в поле, а пришло значение Булево будет выведено не то что ожидалось. Необходимо пытаться в конвертировать значение в ожидаемый тип при обработке API схемы и выводе в JSON
Ожидаемый тип Значение 1С Возможные значения JSON
String Undefined null, ""
String Null null, ""
Number Undefined null, minvalue, maxvalue
Number Null null, minvalue, maxvalue
Integer (draft-07) Undefined null, minvalue, maxvalue
Integer (draft-07) Null null, minvalue, maxvalue
Boolean Undefined null, true, false
Boolean Null null, true, false

Ошибка создания событий

Когда есть 2 различных обмена, один из которых отключен, события регистрируется для всех каналов для каждого обмена. Правильное поведение события регистрируются только для включенного канала.

Необходима возможность мышкой перетягивать части описания формата в APICreationForm

  • В дереве APISchema необходимо дать возможность пользователю произвольно перетягивать части формата JSON

  • Контроль результата должен соответствовать описанию RFC

Это изменения необходимо для упрощения редактирования формата.

Реализовать возможность подписки на события справочников и документов

Описание

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

  • Подписка на событие создание элемента справочника
  • Подписка на событие изменение элемента справочника
  • Подписка на событие удаление элемента справочника
  • Подписка на событие создание нового документа
  • Подписка на событие изменение документа
  • Подписка на событие удаление документа
  • Выбрать один из типов объектов конфигурации для реализации подписки на события (ПланОбмена или РегистрСведений)
  • Нельзя обрабатывать событие пока не завершена транзакция. Для режима Автоматических блокировок должно быть запрещено грязное чтение.

Необходимо заполнять media-type для элементов справочника Jobs

Например, application/json.
Это необходимо, если каналу нужно конвертировать содержимое в свой формат или он не поддерживает доступный формат.

Media-Type должен заполнятся при создании нового обмена, если он не был заполнен ранее он должен заполнится при записи обмена.

Так же должен быть механизм регистрации обработчиков чтения медиа типов

Добавить подсистему отправки сообщений

Описание

Для полноценного функционирования подсистемы необходимо добавить подсистему отправки сообщений

  • Добавить справочник сообщений, позволит минимизировать влияние блокировок при отправке данных в транзакции
  • Сообщения должны отправляться только в транзакции, если TransactionActive() возвращает False, должна быть вызвана исключительная ситуация
  • При возникновении события сообщение должно быть записано в справочник сообщений
  • В зависимости от настройки обмена, сообщение может быть сформировано и сохранено во время самого события или если возможность после завершения события
  • События которые имеют природу, что их нельзя описать постфактум, должны формироваться в момент события
  • Сообщение должно знать в какой канал оно должно быть отправлено и какие настройки обмена были использованы при создании этого сообщения
  • Если в настройках обмена несколько каналов для каждого канала должно быть сформировано отдельное сообщение. Это необходимо что бы каналы не могли влиять на друг друга

Необходимо доработать справочник FL_Jobs

Справочник на данный момент работает с единичными значениями в таблице DCSParameters, а необходимо работать со значениями СписокЗначений или Таблицей значений. Это необходимо для того чтобы можно было отслеживать события по целым наборам записей и\или табличным частям объектов которые изменяются.

Это позволит формировать полноценно верные события и даст возможность избежать:

  • Негативного события редактирования документов\движений в том случае если набор до записи и после различаются по набору измерений;

Транзакции это важно для консистенции данных, необходимо минимизировать время создания сообщения (в статусе: Enqueued), а обработку сообщения выполнять вне транзакции.

Реализовать базовый вывод базовых типов формата JSON

Описание

В схеме компоновки данных должны присутствовать группировка в структуре отчета с указанным именем RootItem, а так же поле в выбранных полях с таким же псевдонимом (RootItem). Результат выполнения схемы компоновки данных должен содержать только один элемент иначе будет ошибка вывода в формат JSON.

  • string - для формата JSON вывод "Строка" является корректным выводом
  • number - для формата JSON вывод 15.5 является корректным выводом
  • true - для формата JSON вывод true является корректным выводом
  • false - для формата JSON вывод false является корректным выводом
  • null - для формата JSON вывод null является корректным выводом

Добавить модуль авторизации

Описание

Необходима возможность использовать определенный канал обмена, который работает с помощью базовой авторизации.

  • Реализация модуля базовой авторизации должен быть в обработке, которая включена в подсистему Channels
  • Данные базовой авторизации должны шифроваться поставляемым общим модулем FL_Encryption без исходного текста для сохранения ключей шифрования
  • Данные базовой авторизации сохраняются в настройках обмена (FL_Exchanges) в зашифрованном виде и расшифровываются в модуле FL_Encryption в момент передачи данных в канал обмена

Ошибка формата при выводе в формат JSON

Описание

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

  • При использовании последовательного вывода, если вложенная группировка имеет одинаковое наименование как и поле на этом же уровне, может быть выведено два поля с одинаковым наименованием на текущем уровне, что противоречит формату JSON.

  • Контроль декларативного описания формата должен соответствовать RFC.

  • Контроль должен происходит при попытке передать через хранилище значений дерево формата

ExchangeSettings должны содержать в себе объект StreamObject

Это необходимо что бы не было необходимости создавать объект чтения\записи формата несколько раз.

Базовый свойства необходимо создавать на уровне Trigger и должны дополнятся при оповещении каналов NotifyChannels.

Вынести функционал каналов из справочника обмена

Описание

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

  • Для каждого канала обмена существует отдельный элемент справочника
  • Каждый канал должен содержать все необходимые данные доступа к каналу в зашифрованном виде
  • Для канала необходимо указать какие типы методов поддерживает канал
  • Когда в справочнике настроек обменов выбирается канал, должен быть предложен список из активных каналов
  • Создание нового канал должно сопровождаться выбором из дополнительных обработок которые включены в подсистему IHL -> Plugins -> Channels

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.