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 в Москве.