Каталог решений - 1C# – 1С моей мечты

1C# – 1С моей мечты

1C# – 1С моей мечты

В наличии

Встроенных в платформу 1С возможностей не всегда хватает для построения сложных интеграционных схем между различными 1С и не-1С-решениями на базе MS SQL Server. Как сделать интеграцию между SQL-базами более гибкой с помощью платформы 1С# на конференции Infostart Event 2019 Inception рассказал Дмитрий Жичкин.

Категория:

Описание

Добрый день, друзья. Меня зовут Жичкин Дмитрий. Я – программист широкого профиля. Сразу скажу, что проект решения, про которое я буду рассказывать, размещен на GitHub https://github.com/zhichkin/one-c-sharp, там есть подробная видеоинструкция, благодаря которой вы сможете начать использовать проект уже через 15 минут после её просмотра.

Развитие проекта можно найти здесь: DaJet QL — расширяемый язык запросов и JSON в запросах DaJet QL

 

Интеграция – это просто!

 

 

Основная идея проекта – интеграция должна быть настолько простой, насколько это возможно. В частности, платформу 1C# отличает очень легкое и быстрое создание веб-сервисов, а также получение данных из различных источников без обменов и COM-соединений – в одном запросе.

Кратко идею проекта можно выразить таким оператором SQL, как:

SELECT FROM ЛюбойИсточникДанныхИлиИхКомбинация INTO ВебСервис

На слайде вы видите иконку 1С7.7. Это не просто так, благодаря 1С# 1С7.7 теперь тоже умеет веб-сервисы.

 

 

Платформа 1C# состоит из трех компонент – это:

  • метаданные в терминах метаданных 1С;
  • запросы, которые также конфигурируются в терминах метаданных 1С восьмой версии (несмотря на то, что мы работаем с различными источниками – 7.7, 8.x, не-1С-ные базы, с любыми источниками работаем именно в терминах метаданных 1С);
  • и платформенный веб-сервер 1C#

 

 

Чтобы создать веб-сервис на платформе 1С#, нужно сделать три простых действия:

  • создать в метаданных объект «Запрос данных»;
  • сконфигурировать его при помощи дизайнера запросов;
  • и начать пользоваться.

 

Модель метаданных 1С#

 

 

Теперь немного теории о каждом компоненте.

Платформа 1С# основана на метаданных – ровно так же, как и 1С. Но она имеет свою собственную универсальную модель метаданных, которую вы видите на слайде. Она очень простая. И именно за счет этого достигается возможность моделировать любые структуры данных – 7.7, 8.х, не 1С-ных баз – любых реляционных баз.

 

 

Платформа 1С# имеет конфигуратор, что не удивительно. Выглядит он примерно так, как показано на слайде:

  • слева мы видим панель метаданных, которые отображаются ровно так же, как и в 1С – вам это будет сразу понятно и привычно;
  • а справа мы видим рабочую панель, где можно конфигурировать запрос, просматривать свойства метаданных – в данном случае мы видим метаданные SQL-сервера, тут выведен какой-то регистр сведений.

Как метаданные 1С попадают в конфигуратор 1C#?

Они туда попадают точно так же, как и в «Конвертацию данных» – есть обработка на управляемых и неуправляемых формах, которая выгружает метаданные 1С в виде XML-файла, и мы его потом загружаем в конфигуратор 1C# и дальше пользуемся.

Но попутно конфигуратор 1С# загружает еще и метаданные SQL-сервера – типы данных полей и прочее. Таким образом, мы имеем в платформе данные прикладных объектов в виде метаданных и метаданные SQL.

 

Дизайнер запросов 1C#

 

 

На эту информацию опирается дизайнер запросов. Он работает в терминах метаданных 1С восьмой версии. Его особенность – в запросе мы можем обратиться к любому источнику данных, к любой базе. Например, у нас есть база Торговли и Бухгалтерии, мы можем одним запросом обратиться к двум базам и получить оттуда какие-то сведения.

Мы можем взять в качестве источников 7.7, 8.х, SQL-базу произвольного формата, и в одном запросе всю информацию из них соединением получить.

 

 

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

  • на правой рабочей панели мы видим некий конструктор запросов, его задача – просто сконфигурировать запрос;
  • а слева в метаданных мы видим созданный объект.

Обратите внимание, что дизайнер запросов 1С# несколько расширяет привычный нам язык запросов 1С – в частности, здесь используются табличные хинты, которых иногда не хватает в языке запросов 1С.

 

 

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

Другими словами, на платформе 1С# запрос фактически равен веб-сервису.

При этом генерируется автоматически REST API и пр.

 

Web сервер 1С#

 

 

Третий компонент платформы – это веб-сервер. Он построен на базе Kestrel, это кроссплатформенное решение.

Для тех, кто не знает, что такое Kestrel – это как Node.js, только быстрее. Он просто работает – обрабатывает запросы и отдает данные в JSON.

 

Пример использования 1С#

 

 

Давайте на небольшом практическом примере рассмотрим, как можно создать веб-сервис на платформе 1С#.

Допустим, мы хотим сверить два справочника в разных базах («Управление торговлей» и «Бухгалтерия предприятия») – пусть это будут справочники валют.

Одним запросом мы их соединим FULL JOIN и результат отдадим по REST API в виде JSON.

 

Шаг 1. Определяем URL

 

 

Первый шаг – в конфигураторе 1С# в панели метаданных мы создаем структуру URL. Готовый URL видно на слайде в правом верхнем углу.

При этом есть возможность разделять REST API по версиям (пространствам имен) – можно создать «версию 1», «версию 2», «версию для тестирования», а потом из «версии для тестирования» перенести запрос в рабочую ветку.

Это делается очень просто, за несколько секунд – URL задан.

 

Шаг 2. Редактируем запрос

 

 

Далее – мы правой кнопкой щелкаем на объекте метаданных ЗапросДанных, в контекстном меню выбираем «Редактировать»

 

 

У нас открывается шаблон SELECT.

 

 

В поле FROM подставляем данные справочника из базы «Управление торговлей» (перетаскиваем его из дерева метаданных с помощью Drag and Drop). Добавляем таблички из «Управления торговлей» и из «Бухгалтерии».

В качестве соединения выбираем FULLL JOIN. В качестве варианта чтения выбираем nolock (в MS SQL Server это называется READUNCOMMITED).

 

 

Добавляем условие соединения – в данном случае, по коду.

 

 

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

 

 

Теперь нужно сохранить запрос в метаданных – нажимаем кнопку Save.

И можем тут же проверить результат запроса нажатием кнопки Execute, в стиле Microsoft SQL Server Management Studio.

 

 

Результат запроса сервер 1C# показывает нам сразу в табличном виде – мы видим это в интерфейсе.

Здесь мы видим, что:

  • рубли у нас есть в обоих базах;
  • в «Управлении торговлей» у нас есть китайские юани – их нет в «Бухгалтерии»;
  • в «Бухгалтерии» есть доллар и евро – их нет в «Управлении торговлей».

Работает.

 

Шаг 3. Пользуемся

 

 

И третье действие – пользуемся. Когда мы обратимся по тому URL, который мы сконфигурировали, наши табличные данные будут представлены в виде вот такого JSON – мы их получим запросом к веб-серверу 1С#.

Вот так просто создается веб-сервис на платформе 1С#.

 

Запросы к метаданным

 

 

Но это еще не все.

Структура хранения 1С# предполагает хранение метаданных так же, как и всех остальных объектов. Есть специальная информационная база – Metadata, где в табличках хранятся метаданные. Соответственно, это дает возможность обращаться с запросами к метаданным. Зачем это нужно? Казалось бы, это избыточно. Но на самом деле, это очень удобный инструмент, и я им пользуюсь довольно часто.

Например, на слайде сконфигурирован запрос – сейчас мы подробнее разберем, что он делает.

 

 

Допустим, это может быть полезно для BI. Предположим, бизнес-аналитик приходит к 1С-нику, говорит: «Мне нужно получить названия всех таблиц справочников Номенклатура во всех базах 1С, которые зарегистрированы на сервере 1С#».

С помощью дизайнера запросов можно сконфигурировать такой запрос и прямо здесь по кнопке Execute посмотреть его результат в табличном виде. На слайде видно, как называется эта таблица в базе «Бухгалтерии», и как – в «Управлении торговлей».

Также можно получить эти данные по REST API в виде JSON – справа в верхнем углу на слайде видны параметры, которые были отданы в запросе к REST.

И с этим можно сразу же начинать работать – не нужно ничего придумывать. Можно сразу что-то перегружать в OLAP и прочее (как один из вариантов использования).

Лично я этим пользуюсь, чтобы быстро находить названия таблиц, либо, наоборот, из названия SQL-таблиц понимать, каким объектам метаданных это соответствует – это очень удобно.

 

 

Практика применения этой технологии очень широкая. Здесь перечислены некоторые возможные примеры.

В том числе, давайте представим такую ситуацию – например, у нас есть какая-то оперативная база, в которой нам нужно принимать какие-то решения по взаиморасчетам на основании данных из другой базы (например, из «Бухгалтерии»).

При этом «Бухгалтерию» дорабатывать нельзя – веб-сервисы 1С на нее вешать нельзя, изменять ее никак нельзя. И обмены данными мы с ней никакие делать не хотим – не хотим соединяться с ней по COM-соединению и т.д. (допустим, эти базы вообще в разных городах, так тоже бывает).

Можно быстро накидать запрос, подцепить бухгалтерскую базу к 1С#, сделать REST API, и все. Это можно сделать буквально за несколько минут и использовать в нашей оперативной базе.

А потом, если вдруг это станет ненужным – бизнес часто меняет свои требования – вы просто отключили, и все. И никаких обменов, артефактов не осталось. Так тоже можно делать.

 

Плюсы 1С#

 

 

Плюсы.

  • Один из плюсов, который я вижу – это очень низкий порог входа. Достаточно знать основы метаданных 1С и немного язык запросов, этого достаточно, чтобы создавать веб-сервисы, вообще не зная, что это такое. Сконфигурировал запрос, нажал кнопку Save – и получил готовый веб-сервис.
  • Можно создавать витрины данных – mashup-приложения, получающие данные из нескольких баз (на примере с «Бухгалтерией» и с «Управлением торговлей»). Можно соединять данные из разных баз в едином интерфейсе безо всяких обменов – показывать их и делать какие-то витрины.
  • Создание микросервисов – понятно (Kestrel очень быстрый).
  • И хотелось бы особенно отметить еще один плюс – это расширение возможностей языка запросов. Не все возможности SQL-сервера используются в языке запросов 1С. Это можно исправить, например, при помощи платформы 1С#.

 

Планы развития 1С#

 

 

Планы развития

  • Когда вы голосовали за мой доклад, у меня было задекларировано, что я покажу, как организовать при помощи 1С# переносы данных (это INSERT, UPDATE, DELETE и т.д.). К сожалению, я не успел это реализовать к конференции. Но думаю, что до конца года я это точно успею сделать, и в платформе 1С# еще появятся операторы модификации данных.
  • Кроме этого, у меня в планах сделать объект метаданных «Очередь сообщений», чтобы это работало по аналогии, как сейчас работают веб-сервисы – мы делаем какой-то запрос, и в качестве INTO указываем имя очереди сообщений. И запрос просто кладет туда данные. Можно будет дергать такой запрос по REST API, дернули – и у нас в очередь что-то упало.
  • Интеграция 1С# и OneScript мне кажется очень перспективной, потому что по метаданным 1С# можно генерировать прикладные объекты для OneScript. Это даст возможность разрабатывать конфигурации на OneScript. И вообще работать с прикладными объектами 1С из OneScript.

А если развить мысль дальше, то можно придумать еще более интересные варианты:

  • берем Kubernetes – контейнеризируем туда 1C#;
  • подцепляем базу 1С;
  • к веб-сервисам 1С# цепляем веб-интерфейс «Цифрового Кота»;
  • потом прикручиваем Jenkins и весь DevOps;
  • вместо РИБ – Kafka или RabbitMQ.

Вот такой интересный Inception у меня по итогам конференции получился.

Если кому-то проект интересен, то все желающие приглашаются участвовать в нем, разрабатывать. Ссылка на GitHub – https://github.com/zhichkin/one-c-sharp

Продолжение развития проекта – новые возможности языка запросов 1C# в публикации //sale.itcity.ru/public/1226230/.

 

Вопросы:

 

  • У меня есть вопрос по обновлению метаданных вместе с обновлением баз. Как это реализовано? Через «Конвертацию данных» или как-то еще?
  • Да, в платформе 1С# есть возможность обновлять метаданные. Я об этом не стал в докладе рассказывать – хотелось просто сфокусироваться на главном. Мы той же самой обработкой выгружаем метаданные в XML, и есть специальная компонента. Дело в том, что 1C# — это модульная система. Этого модуля здесь на слайдах в интерфейсе не было видно – там, когда подключаешь еще один модуль, в меню появляется еще одна кнопка – и этот модуль умеет мержить и обновлять метаданные. Он делает это в интерфейсе примерно так же, как мы делаем в конфигураторе «Сравнение-объединение».
  • Я услышал в докладе плюсы, но не услышал минусы. Меня беспокоит вопрос – что по этому поводу думает 1С в части лицензионной политики?
  • Я ждал этот вопрос. Мне его задают последние лет 10, наверное. Я каждый раз отвечаю на этот вопрос по-разному, и уже устал отвечать. Можно я не буду отвечать?
  • Вы сейчас начали говорить о других операциях – не только SELECT, а INSERT, UPDATE и т.д. А вы не боитесь конфликтов с 1С:Предприятием? Когда люди там работают, как в основной системе, и здесь вдруг вы решаете со стороны – начинаете кидать куда-то данные. Как вы это собираетесь разруливать?
  • Когда вы пользуетесь ножом, у вас всегда есть риск порезаться. Поэтому любой инструмент требует аккуратного обращения. Вы абсолютно правы – все подряд не нужно такими операциями обрабатывать. Надо думать, что делаешь. Но иметь такую возможность очень приятно во многих случаях. Такие случаи в 1С есть.
  • RLS поддерживается?
  • Нет, не поддерживается, потому что запросы летят напрямую в SQL. Соответственно, если очень хочется, я не вижу препятствий, чтобы взять RLS из 1С и просто к каждому запросу его подцеплять. Это можно сделать. Если кто-то подключится к разработке, я буду очень благодарен – то, что вы сейчас видели, я делал в свободное от работы время.
  • Насколько видно из презентации, ваш инструмент в итоге генерит просто SQL-запрос, как есть. И отдает его SQL-серверу. А вопросы безопасности – такие, как выполнение запроса под разными пользователями, выполнение запроса на разных SQL-серверах – это, получается, уже нужно спускать на уровень системных администраторов?
  • У нас с SQL базой данных работает сервер 1С под одной учеткой всегда. Здесь можно сделать то же самое. От Kestrel работать под одной учеткой. Можно навернуть еще что-то. Я этим вопросом пока не озадачивался. Это – концепция.
  • Это – перекладывание запроса. Фактически мы из уровня прикладного 1С спускаемся на уровень прямых запросов SQL. Соответственно, нам нужно уже подтягивать DBA на то, чтобы разруливать эти запросы.
  • Если вернуться к вопросу о безопасности, я еще раз повторяю – платформа 1С# работает с какой-то строкой соединения. Ничто не мешает в эту строку соединения заложить имя конкретного пользователя и пароль. Это будет работать точно так же, как работает сервер 1С. Я понимаю, что есть еще система безопасности более высокого уровня, которую обеспечивают роли 1С и т.д. Но никто не мешает на Kestrel логиниться и там все это разруливать. Соответственно, можно сделать, что каким-то пользователям какие-то веб-сервисы видны, а какие-то не видны. Эту подсистему, конечно, нужно делать. Ее сейчас нет.
  • Хочу уточнить по поводу источников данных. Базы 7.7 – понятно, базы 8.х – понятно. А в качестве прочих источников подразумеваются какие-то сторонние базы на платформе SQL?
  • Вообще любые, но именно MS SQL Server. Это все сейчас работает только с MS SQL Server. Если в сообществе найдется кто-то, кто хорошо знает Postgres и С# – пожалуйста, можно сделать и для Postgres, и для чего угодно. Просто лично я Postgres не очень хорошо знаю. Там просто есть строка подключения, и в частности, с SQL-сервером работает не ODBC, а Native Client. С другими базами так же. Если у вас базы лежат на разных инстансах, это работать в одном запросе не будет. Чтобы подружить MS SQL Server и Postgres – надо будет что-то делать. Если делаются запросы к разным базам, то базы должны лежать на одном инстансе – иначе не получится. Зато можно сделать два веб-сервера на разных серверах и потом они могут между собой общаться. Я пока не допилил запросы 1С#, чтобы он сам кого-то спрашивал – пока его спрашивают. Но можно допилить, чтобы еще и он кого-то спрашивал. И еще никто не отменяет линкованные сервера. SQL это позволяет, значит, это позволяет 1С#. Концепция такая – все, что позволяет MS SQL Server (большинство востребованных возможностей), должен позволять 1C#.
  • Поддерживаются ли параметризированные запросы?
  • Да, на одном из слайдов, где я показывал интерфейс дизайнера запросов, там наверху было видно, что можно указывать параметры запроса. И когда я рассказывал про запросы к метаданным, там тоже в правом верхнем углу были параметры, которые передавались в запрос в виде JSON.
  • Подскажите, а есть ли возможность консольной загрузки метаданных, выгруженных из 1С?
  • Нет, консольной утилиты нет. Но можно доработать.

 

****************

Данная статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART EVENT 2019. Больше статей можно прочитать здесь.

В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.

Выбрать мероприятие

has been added to your cart:
Оформление заказа