Для кого это может быть полезно:
- для тех, кто знает, что такое Java, и немного умеет писать на Java;
- для тех, кто знает, что такое 1С и хочет делать плагины для EDT;
- даже если вы совсем ничего не знаете про Java, но вам нравится сама идея плагинов EDT – я надеюсь, вы сможете потом это пересмотреть и разобраться во всем самостоятельно.
Содержание:
Что такое target-платформа Eclipse RCP, и как ее использовать
Пример создания плагина с помощью конструктора
Документация для разработчика плагинов EDT
Бонус: два видео по созданию плагинов для 1С:EDT
Target-платформа (Eclipse RCP)
Рассмотрим, что такое Eclipse.
- Eclipse еще часто называют Eclipse RCP (Rich Client Platform – богатая клиентская платформа). Подробнее об основных возможностях Eclipse можно прочитать по ссылке https://ru.wikipedia.org/wiki/Eclipse_RCP.
- На Eclipse сделаны две основные в данном контексте IDE, которые мы будем использовать:
- JDT (Java Dev Tool);
- 1C:EDT (1C:Enterprise Dev Tool).
- Кроме этого на Eclipse сделано гигантское количество приложений – есть ссылка https://en.wikipedia.org/wiki/List_of_Eclipse-based_software, где даже согласно моим знаниям представлены не все приложения на Eclipse.
- Еще на базе Eclipse сделано очень много проектов, которые включаются в ту или иную сборку/поставку или поставляются как отдельные приложения. По ссылке https://projects.eclipse.org/ можно увидеть 20 страниц проектов – это очень богатая разветвленная сеть, здесь можно что-то взять и переиспользовать потом у себя.
Структура Eclipse RCP
Разберемся, из чего состоит платформа Eclipse RCP. Я не нашел об этом доступной и понятным языком написанной информации, кроме единственной картинки на английском языке, которая чуть-чуть отражает суть. Потом я нарисовал свою картинку – следом покажу.
Платформа Eclipse RCP представляет собой набор фреймворков, таких, как:
- UI-часть – это:
- оконная система,
- SWT (Standard Widget Toolkit) – библиотека стандартных виджетов (кнопки, поля ввода, таблицы и пр.);
- более высокоуровневая UI-часть – JFace и другие классы, которые делают создание интерфейса более приятным и удобным;
- система Workspace (вы, как EDT-шники, должны знать, что воркспейс – это отдельный проект);
- Debug – это отладка;
- Team – это все, что касается версионирования и работы в команде, сюда относится не только Git, но и другие варианты версионирования и взаимодействия;
- и большая система хэлпа.
Это – базовая часть, которая относится к платформе Eclipse.
На основе платформы Eclipse сделаны:
- JDT (Java Development Tools);
- для JDT реализована система разработки плагинов PDE (Plug-in Development Environment);
- и здесь справа еще нарисованы ваши «Инструмент 1», «Инструмент 2» и «Инструмент 3».
Что такое 1С:EDT и JDT
Давайте попробуем перенести все это на EDT и JDT.
На Инфостарте есть замечательная статья, где коллега-первопроходец рассказывает, как установить target-платформу внутрь EDT и разрабатывать плагины внутри самой EDT. Большое спасибо, что автор не постеснялся, рассказал, как сделать первый плагин – я знаю, что некоторые ребята научились на этом делать плагины. Но я бы не сказал, что он выбрал правильный путь для разработки, и теперь попытаюсь рассказать со своей колокольни, как разрабатывать плагины, и что собой представляют 1С:EDT и JDT.
Итак, у нас есть:
- Java Runtime Environment, необходимая для исполнения Java-приложений;
- какая-то часть Eclipse Platform;
- JDT – среда для разработки на Java и PDE, позволяющая разрабатывать плагины для нее;
- отдельно идет EDT – она относится только к Eclipse Platform и никакого отношения к JDT не имеет.
- и точно так же любые ваши приложения (ваши DT), которых может быть очень много – они все используют какую-то часть платформы Eclipse и не имеют прямого отношения к JDT или к EDT.
Поэтому сборки, которые сделаны на основе платформы Eclipse или каких-то компонентов, могут собираться по-разному.
Здесь на слайде обведено, как собирается стандартная JDT.
А вот так собирается и поставляется EDT – это немного неточно, поскольку сама Java Runtime не входит в состав поставки, но используется EDT так, как показано на слайде.
Какая-нибудь другая DT будет тоже включать платформу (или какую-то ее часть) и какие-то еще дополнительные инструменты и собираться соответствующим образом.
Нас сегодня интересует часть, которая показана на слайде, потому что плагины для EDT мы будем разрабатывать именно на платформе JDT, используя PDE и опираясь на возможности target-платформы.
Соответственно, target-платформа (целевая платформа) – это EDT вместе с Eclipse Platform.
Именно для нее мы будем разрабатывать плагин, используя PDE и JDT.
Окружение разработчика
Для разработки плагина EDT необходимо установить :
- Java11 – неважно, чьей она сборки, но нам нужна полная сборка с Open JFX.
- Дальше нужно установить Eclipse IDE. На официальном сайте Eclipse несколько вариантов установщиков для Java, которые компонуются с разным количеством инструментов. Вариант выбора – это всего лишь набор компонент, которые вы ставите при первой установке. Все остальное можно доставить отдельно, и получится ровно та же поставка:
- У меня используется Eclipse IDE for Committers – это Eclipse JDT и PDE вместе взятые, больше там ничего особого нет.
- Есть еще Eclipse for RCP and RAP Developers – он тоже подходит, у него единственное отличие – это редактор XML и какие-то дополнительные возможности для XML, но для наших задач это сегодня не нужно.
- Кроме этого нам потребуются плагины:
- Enhanced Class Decompiler – заменяет стандартный декомпайлер от Eclipse и делает просмотр скомпилированных классов более удобным;
- PDE Source Lookup – позволяет автоматически подтягивать исходники, которые есть в публичных репозиториях;
- Sonarlint – 1С-ники должны знать, что это такое;
- ResourceBundle Editor – реализует UI интерфейс для редактирования property-файлов Java (файлов свойств, которые нужны для локализации на нескольких интерфейсах);
- и несколько других плагинов, которые можно использовать, а можно и не использовать.
Где взять target-платформу
Target-платформу, которая входит в состав EDT, со всеми ее компонентами можно взять по ссылкам https://edt.1c.ru/releases/sapphire/2020.2/ или https://edt.1c.ru/releases/sapphire/2020.3/. Эти ссылки можно найти в примере плагина для EDT на GitHub.
В профиле компании «1С» на GitHub есть репозиторий dt-example-plugins с примером плагина для EDT.
В свойстве «repository» файла default.target находится ссылка на репозиторий текущей target-платформы – я ее просто отсюда скопировал.
Эту ссылку в репозитории регулярно обновляют, по этому же адресу лежит и платформа 2020.3.
Установка target-платформы
Теперь, когда вам в общих чертах понятно, что target-платформа – это список бандлов, которые входят в состав EDT, давайте разберемся, как с этой сборкой работать.
Создадим новый проект.
В данном случае, нам нужен просто обычный проект Project (он находится в группе General).
Проект, содержащий target-платформу, в мире Eclipse обычно называется target. Или можно с префиксом вашего текущего проекта, и в конце target. В данном случае у нас один проект в репозитории, поэтому назовем его просто target.
Чтобы добавить в этот проект target-платформу, нам нужно опять вызвать мастер создания (File-New-Other).
В мастере создания раскрыть группу Plug-in Development (здесь находятся все необходимые компоненты для того, чтобы создавать плагины) и выбрать здесь Target Definition – это как раз наша target-платформа.
Разместим ее в нашем текущем проекте и назовем default.
В разделе инициализации оставим переключатель «Nothing Start with an empty target definition» (стартовать с пустой target-платформой). Другие варианты нужны, если мы разрабатываем для самой JDT (например, можно использовать текущую запущенную платформу как базу для нашей будущей платформы).
У нас открывается пустой редактор Target Definition. В списке Locations добавляем элемент и указываем, что будем брать target-платформу с определенного сайта.
Здесь в поле Work with мы вбиваем адрес, откуда будет скачиваться target-платформа – в нашем случае, это https://edt.1c.ru/releases/sapphire/2020.3/.
Поскольку платформа является платной, нам необходимо ввести логин и пароль, после чего начнется скачивание всей основной информации о target-платформе.
Информация скачалась, но в таблице доступных бандлов мы здесь ничего не видим. Это потому, что в текущей публикации нет никаких категорий для бандлов, а у нас стоит галочка «Разобрать по категориям».
Снимаем эту галочку и видим абсолютно все, что входит в нашу target-платформу.
Нажимаем кнопку «Select All» и выбираем здесь все – хуже от этого не будет.
Сразу могу обратить ваше внимание на галочку «Include required software» (включать обязательный софт, который требуется другим компонентам). Ее нужно снять, иначе, если вдруг какой-нибудь зависимости в этой target-платформе нет, она не скачается. Такое поведение часто встречается – например, у репозиториев maven.
И нажимаем кнопку «Finish» – этим действием мы говорим, что для нашего воркспейса сейчас необходимо скачать всю target-платформу, которая есть на определенном сайте (этот сайт для разных версий EDT меняется).
Здесь важный момент – та версия Eclipse, на которой мы сейчас разрабатываем в JDT, не обязана совпадать с целевой target-платформой, поэтому я вначале рассказал о том, что я выбрал 2020.03 JDT, но внутри target-платформы для EDT на самом деле платформа Eclipse другой версии. И возможно, когда-нибудь при каких-то обстоятельствах вы можете напороться на то, что различающиеся платформы текущего Eclipse и EDT приведут к каким-нибудь странностям. В нашем примере ничего плохого не будет, но просто на будущее советую внимательнее изучить, что такое версии target-платформы, как их отдельно скачать, как скачать определенную версию JDT. Я специально не стал на это сегодня обращать внимание – есть куча вариантов с разными возможностями, мы сейчас на них останавливаться не будем. Пока нам для сегодняшнего примера вариант с отличающейся в JDT версией Eclipse от нашей target-платформы ничем мешать не будет, но этот момент нужно помнить и учитывать, что когда-то это может сыграть определенную роль.
Дальше нам нужно нажать кнопку «Reload Target Platform», которая применяет текущую скачанную target-платформу из этого файла и делает ее активной в нашем воркспейсе.
После того как мы скачали target-платформу, нам нужно настроить конфигурацию отладки и вообще конфигурацию запуска.
Мы создаем конфигурацию отладки – ее нужно отнаследовать от пункта «Eclipse Application» в дереве конфигураций запуска.
Из того, что нужно еще дополнительно настроить отдельно – нужно выбрать здесь в пункте «Run as product» значение com._1c.g5.v8.dt.product.application.rcp. В остальном – все стандартно.
Обратите внимание на галочку «Clear the configuration area before launching» – она должна стоять, это обычно помогает.
Убедитесь, что в поле «Execution environment» стоит нужная JDK 11-й версии.
И можно запускать отладку по кнопке Debug.
Первый запуск говорит, что есть какие-то проблемы с локализационными фрагментами. Но они нам не важны, поэтому будем игнорировать эти диагностики. Нажимаем «Continue».
Стартует проект с демо-примером – мы проверили, что target-платформа запускается, и в ней можно использовать отладку.
Пример создания плагина с помощью конструктора
Напомню, мы хотели реализовать плагин с помощью конструктора. Давайте сделаем это, чтобы вы поняли, насколько быстро и легко создать плагин.
В Eclipse есть очень много разных конструкторов, которые позволят вам создать самые различные плагины, используя возможности target-платформы Eclipse.
Может быть и EDT когда-нибудь будет выпускать свои примеры, а пока что для создания проекта плагина у нас есть возможность использовать стандартные шаблоны Eclipse. Создадим в мастере новый проект с типом Plug-in Project.
Назовем его test-ui.
На втором шаге все настройки оставим стандартно, нас это сейчас не интересует.
На третьем шаге есть некоторое количество шаблонов, которые генерируют готовые плагины – их выбор доступен при включенной галочке «Create a plug-in using one of the templates».
При выборе пункта «Custom plug-in wizard» мы можем выбрать и даже скомбинировать различные примеры.
Также в этом окне мы можем выбрать пример команды «Hello, World Command» – справа показано описание того, что этот пример делает и как это реализовано.
Это усложненный пример простой команды, запускаемой из меню – он специально сделан более сложно для того, чтобы показать все особенности того, как можно использовать команды в UI.
Оставляем все по умолчанию и нажимаем кнопку Finish.
У нас создался проект плагина test-ui – давайте его сразу и запустим.
Этот пример реализует добавление пункта меню и команды, при вызове которой открывается диалоговое окно. На примере этого плагина мы посмотрим, как происходит встраивание нашего кода в IDE.
У нас появился пункт меню Sample Menu, и в него добавилась команда Sample Command
При нажатии на эту команду мы получаем диалоговое окно с надписью «Hello, Eclipse world».
Что такое «точки расширения»
Давайте теперь разберемся, как все это работает изнутри.
В файле SampleHandler у нас есть обработчик команды, в котором вызывается метод MessageDialog.openInformation() – при этом создается определенный класс UI-диалога, этот диалог открывается, и в нем выводится «Hello, Eclipse World».
По кнопке F3 можно перейти в исходники и посмотреть, что на самом деле запускает эта фабрика.
Здесь видно, как она создает MessageDialog и открывает его.
Как это подключается в нашу систему?
Eclipse, как и любая расширяемая система, построена на определенных механизмах расширения. Вариант того, как коннектить между собой какие-то определенные компоненты, в Eclipse называется «Точки расширения» (ExtentionPoints). Это очень богатый механизм, который позволяет сделать очень многое – в Eclipse Platform есть огромное количество точек расширения для UI, куда можно встроиться.
Поскольку EDT построено на Eclipse Platform, соответственно, мы уже можем использовать все точки расширения UI, описанные для Eclipse Platform. В данном случае мы не задействовали ничего абсолютно специфичного для EDT, а задействовали только часть, которая относится к самой платформе.
В этом списке выведены используемые точки расширения. И мы сюда добавляем какие-то данные, которые зачитывают механизм точек расширения.
Чтобы нам добавить в наш плагин еще какую-то точку расширения, мы можем нажать в этом списке Add и поискать здесь, что нам нужно.
Можно снять галочку «Show only extension points from the required plug-ins», и тогда мы будем искать по всем доступным точкам расширения, а не только по тем точкам расширения, для которых у нашего плагина в target-платформе есть зависимость – это очень важно, мы этот момент потом рассмотрим.
В точках расширения описывается то, что и как мы делаем, и по каждой точке расширения можно открыть справку.
Не по всем точкам расширения справка написана хорошо. Это не касается Eclipse или EDT, а зависит только от того, может ли разработчик конкретной функциональности писать справку или не может. Часто бывает такое, что читаешь, и не понимаешь. Поэтому иногда приходится гуглить.
В интернете очень много примеров того, как это использовать. Но тут важно понимать, что вы ищете, и какие вопросы писать. Например, по запросу «как расширить меню в EDT» вы ничего не найдете. Но если вы напишете «Eclipse UI commands extension point», примеров будет очень много.
Как вы видите, все это может помочь нам при написании плагинов для EDT.
Итак, мы сначала регистрируем нашу команду:
- у нее есть какой-то идентификатор;
- принадлежность к категории;
- здесь можно указать обработчик по умолчанию и т.д.
В этом примере нам обработчик по умолчанию указывать не нужно – обработчик команды регистрируется отдельно, чтобы показать, что любой обработчик команды можно переопределить. Вы можете взять какую-нибудь стандартную уже существующую команду и переопределить ее обработчик. Например, навесить на команду Ctrl+C (Ctrl+V) какое-то свое поведение в своей форме. Или в зависимости от какой-нибудь панельки, которую вы добавляете к себе из какого-то другого плагина, переопределить поведение какой-нибудь чужой команды.
Как видите, возможности в UI получаются очень богатые и сложные, поэтому есть и простой вариант, а есть и посложнее.
Биндинги – это сочетания клавиш на клавиатуре, на которые будет реагировать ваша команда. Их также можно переопределять, дополнять и т.д.
После регистрации команды можно указать, в каких меню она должна отображаться,.
И здесь тоже, прочитав справку от EDT, можно найти информацию о том, где должна отображаться ваша зарегистрированная команда, как заполнять значения параметров меню и нашей команды – можно добавлять сюда еще всякие параметры для UI-редактирования и т.д.
Как мы видим, наша команда отображается на тулбаре и в дополнительном меню.
Документация для разработчика плагинов для 1C:EDT
Теперь давайте разберемся с документацией для разработчика плагинов для 1С:EDT.
Часто на канале EDT меня спрашивают: «Почему разработчики не поставляют документацию?»
На самом деле поставляют, и она очень большая. Она всегда идет в поставке вместе с EDT в файле index.html, который находится в папке plugin-development\documentation-html.
В ней несколько больших разделов, а также приведены все основные ссылки, прочитав которые вы почерпнете много важного и полезного.
Сегодня мы будем обращать внимание в основном на два раздела:
- раздел «Модель встроенного языка», поскольку наш сегодняшний пример – это валидация;
- и раздел «Возможности по работе со встроенным языком».
В частности, нас интересует описание точек расширения встроенного языка.
Понятно, что, если вы в первый раз столкнулись с точками расширения, представленной здесь информации мало. Но разобравшись с тем, что такое точки расширения, и как ими пользоваться – информации, представленной здесь, оказывается достаточно, чтобы продолжить работу.
Конечно, для компании, которая выпускает EDT, написание документации – это деньги, которые придется потратить вместо исправления ошибок или новой нужной функциональности. И поскольку это сейчас не в приоритете, документация в EDT в таком спартанском виде.
Но эта документация вполне приличная, ее хватает на все ближайшие задачи.
Здесь есть описание модели встроенного языка – что это такое, что каждый класс означает, какие у них основные методы, с информацией абсолютно по всем типам данных во встроенном языке.
Эта информация может понадобиться в частности для валидации модели данных BSL-модуля.
Кроме этого, есть пример плагина dt-example-plugins, который дает дополнительные знания о модели взаимодействия, редактировании модуля и т.д.
Бонус: два видео по созданию плагинов для 1С:EDT
Что такое таргет-платформа Eclipse и как с ней работать
Создание плагина для 1С:EDT с помощью конструктора
В следующей части рассмотрим создание плагина проверок/валидаций для 1С:EDT.
****************
Статья подготовлена совместно с редакцией Инфостарта на основе серии обучающих видео по созданию плагинов для 1С:EDT.