<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.dote.ru/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.dote.ru/index.php?feed=atom&amp;namespace=0&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B</id>
		<title>DevelopmenOnTheEdge - Новые страницы [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.dote.ru/index.php?feed=atom&amp;namespace=0&amp;title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%9D%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B"/>
		<updated>2026-06-21T06:21:27Z</updated>
		<subtitle>Материал из DevelopmenOnTheEdge</subtitle>
		<generator>MediaWiki 1.23.3</generator>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL</id>
		<title>Сборка BE4 и BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BE4_%D0%B8_BE-SQL"/>
				<updated>2016-08-16T07:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Uuinnk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Сборка BE-SQL ==&lt;br /&gt;
&lt;br /&gt;
BE-SQL — полноценный Maven-проект. Смотрите настройку доступа в Maven(Nexus) [https://sites.google.com/a/developmentontheedge.com/wiki/home/sistemnoe-administrirovanie/maven-repozitorij-nexus во внутренней вики]. Все этапы сборки выполняются с помощью maven, включая компиляцию javacc-грамматики. Для сборки новой версии:&lt;br /&gt;
&lt;br /&gt;
* Выкачать проект dote/dote_modules&lt;br /&gt;
* Зайти в dote_modules/sql&lt;br /&gt;
* Изменить номер версии в pom.xml:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Запустить mvn deploy.&lt;br /&gt;
&lt;br /&gt;
После этого новая версия попадёт в Nexus-репозиторий и будет доступна для других разработчиков. Деплоить одну и ту же версию дважды не выйдет. Если что-то пошло не так, увеличивайте номер версии снова и деплойте заново.&lt;br /&gt;
&lt;br /&gt;
Чтобы воспользоваться новой версией BE-SQL в BE4, вам придётся выпустить также новую версию BE4 с обновлёнными зависимостями (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Структура BE4 ==&lt;br /&gt;
&lt;br /&gt;
Проект BE4 состоит из двух частей. Исходный код по историческим причинам лежит вместе, но разделён по проектам:&lt;br /&gt;
&lt;br /&gt;
* BE4 Core: ядро BE4, необходимое для работы через [[Использование ant|Ant]]. Состоит из пакетов (включая подпакеты):&lt;br /&gt;
** com.beanexplorer.enterprise.be4core&lt;br /&gt;
** com.beanexplorer.enterprise.metadata&lt;br /&gt;
* BE Eclipse IDE: плагины для Eclipse, реализующие пользовательский интерфейс. Включает в себя все остальные пакеты и зависит от BE4 Core.&lt;br /&gt;
&lt;br /&gt;
BE4 Core содержит меньше зависимостей и является полноценным Maven-проектом (все зависимости есть в Maven). Pom-файл расположен в be4/pom/pom.xml.&lt;br /&gt;
&lt;br /&gt;
BE Eclipse IDE собирается через Eclipse с помощью Ivy. При этом некоторые зависимости присутствуют явно в виде jar (каталоги be4/lib и be4/plugins — кое-что из BioUML), но большая часть зависимостей выкачивается автоматом через Ivy. Конфигурация ivy в be4/src/ivy.xml. Проект в Eclipse настроен так, что зависимости скачиваются в каталог be4/dep и потом оттуда используются. По факту с точки зрения сборки BE Eclipse IDE включает в себя BE4 Core.&lt;br /&gt;
&lt;br /&gt;
== Добавление/обновление зависимости в BE4 ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим как обновить версию зависимости BE4 на примере BE-SQL. Предположим, требуется обновить версию BE-SQL с 0.0.24 на 0.0.25.&lt;br /&gt;
&lt;br /&gt;
1. Обновите версию в be4/pom/pom.xml (необходимо для сборки BE4 Core; этот шаг не нужен для зависимостей, которые требуются только BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
   &amp;lt;groupId&amp;gt;com.developmentontheedge&amp;lt;/groupId&amp;gt;&lt;br /&gt;
   &amp;lt;artifactId&amp;gt;sql&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
   &amp;lt;version&amp;gt;0.0.24&amp;lt;/version&amp;gt; --&amp;gt; 0.0.25&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Обновите версию в be4/src/ivy.xml (необходимо для компиляции BE Eclipse IDE)&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.24&amp;quot; /&amp;gt;&lt;br /&gt;
  --&amp;gt;&lt;br /&gt;
  &amp;lt;dependency org=&amp;quot;com.developmentontheedge&amp;quot; name=&amp;quot;sql&amp;quot; rev=&amp;quot;0.0.25&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Обновите версию в be4/META-INF/MANIFEST.MF в разделе Bundle-ClassPath (необходимо для работы BE Eclipse IDE):&lt;br /&gt;
&lt;br /&gt;
 dep/sql-0.0.24.jar, --&amp;gt;  dep/sql-0.0.25.jar,&lt;br /&gt;
&lt;br /&gt;
Следует делать все изменения одновременно. Даже если вы не используете Eclipse-версию, пользователи Eclipse могут пострадать, если ограничиться первым пунктом.&lt;br /&gt;
&lt;br /&gt;
После любых изменений зависимостей, как и после изменений исходного кода, необходимо выпустить новую версию BE4, чтобы другие пользователи могли увидеть ваши изменения (см. ниже). Исключение составляют только пользователи BE Eclipse IDE, которые не обновляются с Update-site, а используют режим с двумя Eclipse-инсталляциями. Желательно со временем перевести этих пользователей на Eclipse Update site.&lt;br /&gt;
&lt;br /&gt;
== Сборка версии BE4 ==&lt;br /&gt;
&lt;br /&gt;
Предположим, последняя выпущенная версия 0.1.46 и мы хотим выпустить версию 0.1.47.&lt;br /&gt;
&lt;br /&gt;
1. Сборка Maven-артефакта. Аналогично BE-SQL: идём в файл be4/pom/pom.xml, меняем версию &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.46&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;version&amp;gt;0.1.47&amp;lt;/version&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; и запускаем команду mvn deploy. После этого BE4 попадает в Nexus.&lt;br /&gt;
&lt;br /&gt;
2. Обновление версии по умолчанию. Ant-скрипты по умолчанию пользуются версией BE4, которая указана в файле be4/src/be4version.properties, который выглядит так:&lt;br /&gt;
&lt;br /&gt;
 BE4_VER=0.1.46&lt;br /&gt;
&lt;br /&gt;
Чтобы все пользователи перешли на новую версию, замените здесь на 0.1.47 и закоммитьте. Если вдруг в новой версии обнаружатся критические проблемы, достаточно будет просто вернуть здесь версию на стабильную. Также при запуске любого ant-таргета можно указать версию явно. Например, так: &amp;lt;code&amp;gt;ant -DBE4_VER=0.1.46&amp;lt;/code&amp;gt;. Таким образом можно сравнивать поведение в разных версиях.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что хотя Java-код BE4 используется из стабильных сборок, опубликованных через Maven (код из Git не используется), ftl-макросы используются из be4/macro. Поэтому там ошибки повлияют на работу коллег.&lt;br /&gt;
&lt;br /&gt;
3. Обновление Eclipse Update Site. Для этого делаются следующие шаги:&lt;br /&gt;
&lt;br /&gt;
3.1. Обновляем версию в be4/META-INF/MANIFEST.INF в строчке Bundle-Version:&lt;br /&gt;
&lt;br /&gt;
 Bundle-Version: 0.1.46&lt;br /&gt;
&lt;br /&gt;
3.2. Импортируем в Eclipse проекты be4/.project, be4/com.beanexplorer.be4.feature/.project, be4/com.beanexplorer.be4.site/.project&lt;br /&gt;
&lt;br /&gt;
3.3. Открываем /com.beanexplorer.be4.feature/feature.xml в Feature Manifest Editor. &lt;br /&gt;
&lt;br /&gt;
3.4. Во вкладке Overflow меняем версию 0.1.46.qualifier на 0.1.47.qualifier.&lt;br /&gt;
&lt;br /&gt;
3.5. Во вкладке Plugins нажимаем правой кнопкой на com.beanexplorer.enterprise.eclipse, Synchronize Versions, Copy versions from plug-in and fragment manifests, Finish&lt;br /&gt;
&lt;br /&gt;
3.6. Сохраняем feature.xml (обязательно сейчас, не позже!)&lt;br /&gt;
&lt;br /&gt;
3.7. Открываем /com.beanexplorer.be4.site/site.xml в Site Manifest Editor&lt;br /&gt;
&lt;br /&gt;
3.8. Во вкладке Site Map разворачиваем beanexplorer4 и удаляем features/com.beanexplorer.be4.feature_0.1.46.qualifier.jar. Затем нажимаем Add feature, пишем com.beanexplorer и выбираем в списке com.beanexplorer.be4.feature.&lt;br /&gt;
&lt;br /&gt;
3.9. Сохраняем и нажимаем Build All.&lt;br /&gt;
&lt;br /&gt;
3.10. После этого каталог be4/com.beanexplorer.be4.site является полноценным update site'ом Eclipse. Скопируйте его в \\logrus.dote.ru\pub2\be4\com.beanexplorer.be4.site (лучше старую версию переименовать, чтобы если что можно было откатиться.&lt;br /&gt;
&lt;br /&gt;
== beanexplorerdev, beanhelpers для be4 ==&lt;br /&gt;
&lt;br /&gt;
  cd BeanExplorer/release/    &lt;br /&gt;
  mvn deploy:deploy-file -DgroupId=com.beanexplorer -DartifactId=beanhelpers -Dversion=0.0.3 -Dpackaging=jar -Dfile=beanhelpers.jar -Durl=http://nexus.dote.ru/nexus/content/repositories/releases/ -DrepositoryId=dote    &lt;br /&gt;
  mvn deploy:deploy-file -DgroupId=com.beanexplorer -DartifactId=beanexplorerdev -Dversion=0.0.3 -Dpackaging=jar -Dfile=beanexplorer_dev.jar -Durl=http://nexus.dote.ru/nexus/content/repositories/releases/ -DrepositoryId=dote&lt;br /&gt;
&lt;br /&gt;
TODO может деплоить snapshots?&lt;br /&gt;
&lt;br /&gt;
  mvn deploy:deploy-file -DgroupId=com.beanexplorer -DartifactId=beanhelpers -Dversion=0.0.4-SNAPSHOT -Dpackaging=jar -Dfile=beanhelpers.jar -Durl=http://nexus.dote.ru/nexus/content/repositories/snapshots/ -DrepositoryId=dote&lt;br /&gt;
  mvn deploy:deploy-file -DgroupId=com.beanexplorer -DartifactId=beanexplorerdev -Dversion=0.0.4-SNAPSHOT -Dpackaging=jar -Dfile=beanexplorer_dev.jar -Durl=http://nexus.dote.ru/nexus/content/repositories/snapshots/ -DrepositoryId=dote&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4</id>
		<title>Установка BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_BeanExplorer4"/>
				<updated>2016-06-21T11:03:14Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для установки BeanExplorer4 надо иметь установленный Eclipse Luna и воспользоваться Eclipse Update Site по следующему адресу:&lt;br /&gt;
&lt;br /&gt;
\\logrus.dote.ru\pub2\be4\com.beanexplorer.be4.site &lt;br /&gt;
&lt;br /&gt;
Help -&amp;gt; Install New Software -&amp;gt; Add..., указать любое имя и этот путь:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationUpdateSite.png]]&lt;br /&gt;
&lt;br /&gt;
Если ничего не видно, снять галочку Group items by category. Должно быть такое окошко:&lt;br /&gt;
&lt;br /&gt;
[[Файл:BE4InstallationInstall.png]]&lt;br /&gt;
&lt;br /&gt;
Выделить BeanExplorer4Feature, нажать Next, со всем согласиться, установить и перезапустить Eclipse.&lt;br /&gt;
&lt;br /&gt;
После установки можно почитать [[BeanExplorer4|вводную статью про BeanExplorer4]].&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5_API</id>
		<title>BeanExplorer5 API</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5_API"/>
				<updated>2015-11-25T05:46:06Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Основные интерфейсы и классы API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Backend ==&lt;br /&gt;
&amp;lt;big&amp;gt;BeanExplorer5 проект - это OSGi бандл, поддерживающий расширения через &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При сборке BeanExplorer5 проекта он воспринимается как OSGi бандл, поэтому у него должен быть манифест &amp;lt;code&amp;gt;META-INF/MANIFEST.MF&amp;lt;/code&amp;gt;. В этом манифесте указывается, от каких бандлов зависит данный бандл. Основные классы API находятся в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;, поэтому его необходимо указать в манифесте.&lt;br /&gt;
&lt;br /&gt;
Помимо этого в структуру BeanExplorer5 проекта входит &amp;lt;code&amp;gt;plugin.xml&amp;lt;/code&amp;gt;, в котором возможно объявлять свои компоненты, используя точку расширения &amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt;, которая объявлена в бандле &amp;lt;code&amp;gt;com.beanexplorer.be5&amp;lt;/code&amp;gt;. Пример объявления компонента:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;extension point=&amp;quot;com.beanexplorer.be5.component&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;component&lt;br /&gt;
     class=&amp;quot;com.beanexplorer.enterprise.components.Menu&amp;quot;&lt;br /&gt;
     id=&amp;quot;menu&amp;quot;&lt;br /&gt;
     name=&amp;quot;Menu&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указанный класс должен реализовывать интерфейс &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 package com.beanexplorer.enterprise.components;&lt;br /&gt;
 &lt;br /&gt;
 public interface Component {&lt;br /&gt;
   void generate(ComponentParameters parameters);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.beanexplorer.be5.component&amp;lt;/code&amp;gt; - это единственная точка расширения BeanExplorer5, она позволяет регистрировать свои backend компоненты, которые будут доступны по следующим URL:&lt;br /&gt;
&lt;br /&gt;
 //domain/app/main/:componentId&lt;br /&gt;
 //domain/app/main/:componentId/:any/:path&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu&lt;br /&gt;
 http://localhost:8080/biostore_be5/main/menu/withIds&lt;br /&gt;
&lt;br /&gt;
При запросе к веб-приложению по этим запросам будет создан новый экземпляр компонента и вызван его метод generate. Для того, чтобы узнать путь после имени компонента (&amp;lt;code&amp;gt;:any/:path&amp;lt;/code&amp;gt;), нужно вызвать метод &amp;lt;code&amp;gt;parameters.getRequestUri()&amp;lt;/code&amp;gt;. В случае пустого пути возвращается пустая строка. В случае наличия пути, он возвращается без начального слеша.&lt;br /&gt;
&lt;br /&gt;
=== Основные интерфейсы и классы API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Component&amp;lt;/code&amp;gt; - главный интерфейс, который должны реализовывать BE5 компоненты. Поскольку проще всего общаться с frontend посредством пересылки JSON, существуют абстрактные классы, которые упрощают написание таких компонентов:&lt;br /&gt;
** &amp;lt;code&amp;gt;JsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий строку, представляющую собой JSON.&lt;br /&gt;
** &amp;lt;code&amp;gt;NetSfJsonComponent&amp;lt;/code&amp;gt; - при наследовании этого класса необходимо только реализовать один метод, возвращающий &amp;lt;code&amp;gt;net.sf.json.JSONObject&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComponentParameters&amp;lt;/code&amp;gt; - всё, что необходимо компоненту. Если необходимо что-то ещё, то либо мы что-то забыли или не предусмотрели (и об этом непременно стоит сообщить нам), либо вы неправильно используете API BeanExplorer5. К чему возможно доступиться из этого компонента:&lt;br /&gt;
** &amp;lt;code&amp;gt;Project&amp;lt;/code&amp;gt; - BE4 проект.&lt;br /&gt;
** &amp;lt;code&amp;gt;Meta&amp;lt;/code&amp;gt; - полезные методы для работы с BE4 проектом.&lt;br /&gt;
** &amp;lt;code&amp;gt;UserService&amp;lt;/code&amp;gt; - работа с сессиями, ролями, выбором языка.&lt;br /&gt;
** &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt; - формирование текстового ответа. Необходимо только для абстрактных компонентов, обеспечивающих обмен текстовыми сообщениями в каком-нибудь формате (JSON, XML и т.п.).&lt;br /&gt;
** &amp;lt;code&amp;gt;HttpServletRequest&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;HttpServletResponse&amp;lt;/code&amp;gt; - предполагается, что в обычной ситуации они не используются. Необходимы только для реализации абстрактных компонентов, обеспечивающих работу с каким-нибудь протоколом на низком уровне. Для обмена текстом достаточно &amp;lt;code&amp;gt;ResponseService&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Обратите внимание на то, что другие классы не являются частью API, в т.ч. класс Be5 и классы, связанные с реализацией конкретных компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Частью API также '''не''' являются соглашения о том, какие данные возвращают компоненты, поскольку эти соглашения используются обмена сообщениями между frontend и backend частями компонентов. Исключением являются соглашения о том, какие данные возвращают компоненты, описанные в разделе [[#REST API|REST API]].&lt;br /&gt;
&lt;br /&gt;
== Frontend ==&lt;br /&gt;
&amp;lt;big&amp;gt;Компоненты BE5 на frontend - это React.js компоненты.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты подключаются через SystemJS, при этом используется синтаксис ES2015 или метод &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 import Component from 'components/component';&lt;br /&gt;
&lt;br /&gt;
 define([ 'components/component' ], function(Component) {&lt;br /&gt;
   // use(Component)&lt;br /&gt;
   // ...&lt;br /&gt;
   return {};&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Кнопки и ссылки на компоненты (в частности запросы и формы) в BE5 не должны писаться вручную. &lt;br /&gt;
&lt;br /&gt;
Не всё, что находится в проекте be5-frontend, является частью API.&lt;br /&gt;
&lt;br /&gt;
=== Основные части API ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; - ядро frontend. Функции, являющиеся частью API:&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.net.request: function(path, params, success, failure)&amp;lt;/code&amp;gt; - делает асинхронный POST запрос к ''вашему'' backend компоненту (&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;componentId/any/path&amp;lt;/code&amp;gt;).&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.registerAction: function(actionName, fn)&amp;lt;/code&amp;gt; - регистрирует действие, которое будет вызвано при клике по кнопке или ссылке. Вызов действия является следствием смены hash url, при этом адрес разбирается на позиционные и именованные параметры. В зарегистрированную функцию передаются все позиционные параметры, за которыми идёт объект с именованными параметрами. Именованными параметрами считаются части URL, которые содержат символ '=', а позиционными считаются все остальные.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.registerDocumentType: function(type, creator)&amp;lt;/code&amp;gt; - регистрирует новый вид документа. Функция, переданная вторым параметром в &amp;lt;code&amp;gt;registerDocumentType&amp;lt;/code&amp;gt; обычно вызывает &amp;lt;code&amp;gt;React.createElement&amp;lt;/code&amp;gt; и возвращает результат вызова. Результат будет помещён в стандартное для проекта место отображения документа. На данный момент на backend невозможно добавлять свои виды документов, но документ возможно создать посредством вызова &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt; - пересоздаёт документ. В качестве аргумента передаётся объект с двумя полями: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. Первое указывает тип документа, второе - значение документа, которое интерпретируется обработчиком документа, зарегистрированным посредством вызова &amp;lt;code&amp;gt;be5.ui.registerDocumentType&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.ui.createDocument&amp;lt;/code&amp;gt; - похож на &amp;lt;code&amp;gt;be5.ui.recreateDocument&amp;lt;/code&amp;gt;, однако позволяет встраивать документы в произвольное место страницы. Полезно, если тип документа заранее неизвестен.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.load.css(path)&amp;lt;/code&amp;gt; - подгружает CSS динамически, это необходимо во frontend компонентах, которым нужен CSS. &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; - путь к файлу CSS, например &amp;lt;code&amp;gt;css/menu.css&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;be5.messages&amp;lt;/code&amp;gt; - объект с локализованными сообщениями (русский и английский язык).&lt;br /&gt;
&lt;br /&gt;
==== Другой способ определения действий ====&lt;br /&gt;
Вы также можете определить действие неявным способом не вызывая &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;. Для этого создаётся файл с именем &amp;lt;code&amp;gt;/actions/yourAction.js&amp;lt;/code&amp;gt;, который определяет AMD модуль посредством метода &amp;lt;code&amp;gt;define&amp;lt;/code&amp;gt;. Объявдяемым элементом в этом модуле является функция, которая используется так же, как и функция, регистрируемая вызовом &amp;lt;code&amp;gt;be5.registerAction&amp;lt;/code&amp;gt;, однако при этом подгрузка компонента произойдёт лениво - при первом его использовании.&lt;br /&gt;
&lt;br /&gt;
=== Компоненты ===&lt;br /&gt;
&amp;lt;big&amp;gt;API React компонентов описывается в соответствующих файлах в &amp;lt;code&amp;gt;propTypes&amp;lt;/code&amp;gt; React компонентов.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Компоненты, не указанные ниже, не являются частью API. По соглашениям именования мы сопоставляем имя компонента &amp;lt;code&amp;gt;ComponentName&amp;lt;/code&amp;gt; SystemJS модулю &amp;lt;code&amp;gt;component/componentName&amp;lt;/code&amp;gt;, который находится в файле &amp;lt;code&amp;gt;component/componentName.js&amp;lt;/code&amp;gt; (или &amp;lt;code&amp;gt;component/componentName.jsx&amp;lt;/code&amp;gt;, если для вашего проекта настроена компиляция JSX).&lt;br /&gt;
&lt;br /&gt;
==== Be5Block ====&lt;br /&gt;
Простая таблица внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5Form ====&lt;br /&gt;
Простая форма внутри Bootstrap 4 Card.&lt;br /&gt;
&lt;br /&gt;
==== Be5View ====&lt;br /&gt;
Обобщённый компонент для таблиц, форм и статических страниц.&lt;br /&gt;
&lt;br /&gt;
==== SimpleTable ====&lt;br /&gt;
Простая таблица.&lt;br /&gt;
&lt;br /&gt;
==== SimpleForm ====&lt;br /&gt;
Простая форма.&lt;br /&gt;
&lt;br /&gt;
==== Document ====&lt;br /&gt;
Место для любого документа, в т.ч. формы или таблицы.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
Запросы отсылаются с телом &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== document ===&lt;br /&gt;
Пример запроса (здесь указано содержимое тела запроса - на самом деле оно выглядит несколько иначе, поскольку кодируется в &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 category: servers&lt;br /&gt;
 page: All records&lt;br /&gt;
 values:&lt;br /&gt;
&lt;br /&gt;
Пример таблицы:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;table&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Servers: All records&amp;quot;,&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;servers&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;operations&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Edit&amp;quot;,&lt;br /&gt;
       &amp;quot;visibleWhen&amp;quot;: &amp;quot;anySelected&amp;quot;,&lt;br /&gt;
       &amp;quot;requiresConfirmation&amp;quot;: false,&lt;br /&gt;
       &amp;quot;isClientSide&amp;quot;: false&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;selectable&amp;quot;: true,&lt;br /&gt;
     &amp;quot;columns&amp;quot;: [ &amp;quot;Edit&amp;quot;, &amp;quot;Provider&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;Name&amp;quot;, &amp;quot;Address&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Products&amp;quot;, &amp;quot;Remote address&amp;quot; ],&lt;br /&gt;
     &amp;quot;rows&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;id&amp;quot;: &amp;quot;3&amp;quot;,&lt;br /&gt;
       &amp;quot;cells&amp;quot;: [ &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;html&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot; ]&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;length&amp;quot;: 20,&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;totalNumberOfRows&amp;quot;: 20&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== document/count ===&lt;br /&gt;
Запрос выглядит так же, как и у &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 { &amp;quot;value&amp;quot;: 3 }&lt;br /&gt;
&lt;br /&gt;
=== form ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 values:&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;type&amp;quot;: &amp;quot;form&amp;quot;,&lt;br /&gt;
   &amp;quot;value&amp;quot;: {&lt;br /&gt;
     &amp;quot;category&amp;quot;: &amp;quot;groups&amp;quot;,&lt;br /&gt;
     &amp;quot;page&amp;quot;: &amp;quot;All records&amp;quot;,&lt;br /&gt;
     &amp;quot;action&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;title&amp;quot;: &amp;quot;Insert&amp;quot;,&lt;br /&gt;
     &amp;quot;selectedRows&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
     &amp;quot;fields&amp;quot;: [ {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;language&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Language&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;comboBox&amp;quot;,&lt;br /&gt;
       &amp;quot;options&amp;quot;: [ {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Afar&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;aa&amp;quot;&lt;br /&gt;
       }, ..., {&lt;br /&gt;
         &amp;quot;name&amp;quot;: &amp;quot;Zulu&amp;quot;,&lt;br /&gt;
         &amp;quot;value&amp;quot;: &amp;quot;zu&amp;quot;&lt;br /&gt;
       } ],&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;en&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;description&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Description&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: false,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textArea&amp;quot;,&lt;br /&gt;
       &amp;quot;columns&amp;quot;: 40,&lt;br /&gt;
       &amp;quot;rows&amp;quot;: 4,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     }, {&lt;br /&gt;
       &amp;quot;name&amp;quot;: &amp;quot;maxUsers&amp;quot;,&lt;br /&gt;
       &amp;quot;title&amp;quot;: &amp;quot;Max Users&amp;quot;,&lt;br /&gt;
       &amp;quot;isReadOnly&amp;quot;: false,&lt;br /&gt;
       &amp;quot;canBeNull&amp;quot;: true,&lt;br /&gt;
       &amp;quot;type&amp;quot;: &amp;quot;textInput&amp;quot;,&lt;br /&gt;
       &amp;quot;value&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
     } ],&lt;br /&gt;
     &amp;quot;parameters&amp;quot;: {},&lt;br /&gt;
     &amp;quot;isViewParameters&amp;quot;: false&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== form/apply ===&lt;br /&gt;
Пример запроса:&lt;br /&gt;
&lt;br /&gt;
 category: groups&lt;br /&gt;
 page: All records&lt;br /&gt;
 action: Insert&lt;br /&gt;
 selectedRows:&lt;br /&gt;
 values: [{&amp;quot;name&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;language&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;description&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;a&amp;quot;,&amp;quot;required&amp;quot;:true},{&amp;quot;name&amp;quot;:&amp;quot;maxUsers&amp;quot;,&amp;quot;value&amp;quot;:&amp;quot;5&amp;quot;,&amp;quot;required&amp;quot;:false}]&lt;br /&gt;
 isViewParameters: false&lt;br /&gt;
&lt;br /&gt;
Пример ответа:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
   type: &amp;quot;formResult&amp;quot;,&lt;br /&gt;
   value: {&lt;br /&gt;
     content: &amp;quot;&amp;quot;,&lt;br /&gt;
     redirect: &amp;quot;table/groups/All records&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Сборка BeanExplorer5 проекта</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_BeanExplorer5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2015-11-23T11:56:54Z</updated>
		
		<summary type="html">&lt;p&gt;Dimka: /* Подготовка BeanExplorer5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Для сборки BeanExplorer5 проекта необходимо сначала подготовить BeanExplorer5 для сборки.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Подготовка инструментов ==&lt;br /&gt;
* Необходим Ant. Для установки под Windows необходимо скачать Ant с [http://ant.apache.org/ официального сайта].&lt;br /&gt;
* Необходим NPM. Для установки под Windows необходимо скачать Node.js с [https://nodejs.org/en/ официального сайта]. Мы используем 4 версию.&lt;br /&gt;
* Необходим Gulp. &amp;lt;code&amp;gt;npm install --global gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Подготовка BeanExplorer5 ==&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5_build&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;ant prepareworkspace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;.&lt;br /&gt;
* В папке &amp;lt;code&amp;gt;be5/be5-frontend&amp;lt;/code&amp;gt; вызвать &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt;, затем &amp;lt;code&amp;gt;gulp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Работа с проектом ==&lt;br /&gt;
* При первой сборке вызывается &amp;lt;code&amp;gt;ant be5.deploy&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* При изменении frontend проекта вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; в папке проекта.&lt;br /&gt;
* Не предусмотрено Ant цели для вызова при изменении backend кода.&lt;br /&gt;
* Если вы редактируете &amp;lt;code&amp;gt;be5-frontend&amp;lt;/code&amp;gt;, то необходимо вызвать &amp;lt;code&amp;gt;gulp watch&amp;lt;/code&amp;gt; и ''помимо этого'' после редактирования вызывать &amp;lt;code&amp;gt;ant be5.frontend&amp;lt;/code&amp;gt; из папки BeanExplorer5 проекта.&lt;br /&gt;
&lt;br /&gt;
== При создании проекта ==&lt;br /&gt;
Пример frontend проекта находится в &amp;lt;code&amp;gt;be5/be5-demo&amp;lt;/code&amp;gt;, он содержит пример настройки Gulp для инкрементальной сборки.&lt;br /&gt;
&lt;br /&gt;
Пример объявления целей be5.deploy и be5.frontend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.deploy&amp;quot; depends=&amp;quot;prepare&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;compileapp&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;modules&amp;quot; value=&amp;quot;${MODULES}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;usedatasource&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appencoding&amp;quot; value=&amp;quot;UTF-8&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;SRCDIR&amp;quot; value=&amp;quot;${appabsolutepath}/src&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;PROJECT_SOURCE&amp;quot; value=&amp;quot;${PROJECT_SOURCE}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
     &amp;lt;ant antfile=&amp;quot;${COMMONDIR}/makefiles/be_webxml.xml&amp;quot; target=&amp;quot;install_context&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;available property=&amp;quot;tomcat.is.installed&amp;quot; file=&amp;quot;${TOMCAT_HOME}/webapps&amp;quot; type=&amp;quot;dir&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;target name=&amp;quot;be5.frontend&amp;quot; depends=&amp;quot;tomcat,check_for_tomcat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;property name=&amp;quot;appabsolutepath&amp;quot; location=&amp;quot;..&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;ant dir=&amp;quot;../../be5&amp;quot; target=&amp;quot;fastfrontend&amp;quot; inheritAll=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appname&amp;quot; value=&amp;quot;${PROJECT_NAME}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;property name=&amp;quot;appdir&amp;quot; value=&amp;quot;${appabsolutepath}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ant&amp;gt;&lt;br /&gt;
 &amp;lt;/target&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer5</id>
		<title>BeanExplorer5</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer5"/>
				<updated>2015-11-23T11:32:35Z</updated>
		
		<summary type="html">&lt;p&gt;Uuinnk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;Это основная статья о BeanExplorer5.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку эта основная статья недописана, остальная её часть для тех, кто будет дорабатывать BeanExplorer5, а не использовать.&lt;br /&gt;
&lt;br /&gt;
==Концепции и технологии==&lt;br /&gt;
&lt;br /&gt;
Основные технологии, которые мы используем - это Java, Java Servlet, OSGi, React, SystemJS, ES2015 через Babel.&lt;br /&gt;
&lt;br /&gt;
===Frontend===&lt;br /&gt;
&lt;br /&gt;
Основные frontend компоненты написаны на React, но могут быть написаны на чём угодно. Поскольку React - это лишь &amp;quot;V&amp;quot; из MVC, то часть функционала полноценного frontend framework было необходимо реализовать, и этот функционал находится в be5/be5-frontend/src/scripts/be5.js (или просто be5 - далее буду писать имена скриптов кратко). Это покрывает функционал routing, requests, frontend localization. Также полезный базовый функционал находится в be5/bus, be5/createStore, be5/createSimpleStore, be5/ext.&lt;br /&gt;
* bus - сообщения (брокер из паттерна pub/sub); например, bus.fire('DocumentChange', value), bus.listen('DocumentChange', value =&amp;gt; ...);&lt;br /&gt;
* ext - расширения;&lt;br /&gt;
* createStore - создание store для управления данными на frontend; позволяет подписаться на его изменения;&lt;br /&gt;
* createSimpleStore - создание store, полным состоянием которого является результат GET запроса.&lt;br /&gt;
&lt;br /&gt;
Необходимые части frontend подгружаются динамически с помощью SystemJS.&lt;br /&gt;
&lt;br /&gt;
JSX+ES2015 скрипты компилируются с помощью Babel при сборке проекта.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* frontend подготовлен, но не переведён на [https://github.com/reactjs/react-redux redux], а это необходимо для упрощения работы с React компонентами (без redux или Flux бывает довольно нетривиально управлять состоянием React компонентов);&lt;br /&gt;
* be5.js требует разделения на небольшие части, также, как выделены bus и ext;&lt;br /&gt;
* невозможно отказаться от компиляции ES2015, даже если она будет поддерживаться всеми браузерами. SystemJS проверяет наличие ES2015 синтаксиса в скриптах, и в случае его наличия пытается использовать транслятор в браузере, даже если явно указано, что транслятора нет.&lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* используйте [https://github.com/reactjs/react-redux redux], [https://facebook.github.io/react/docs/two-way-binding-helpers.html React two-way binding], [https://github.com/JedWatson/classnames React classNames].&lt;br /&gt;
&lt;br /&gt;
===Backend===&lt;br /&gt;
&lt;br /&gt;
Основные части API находятся в com.beanexplorer.enterprise.api. Проще всего начать знакомство с BE5, посмотрев на содержимое этого пакета и его подпакетов. В com.beanexplorer.enterprise.api.experimental.v1 хранятся маленькие полезности. Если они становятся не экспериментальными, а доказавшими полезность, можно переносить их в другие подпакеты api. v1 в названии пакета необходимо для поддержки разного API для одинакового функционала, если невозможно быстро отрефакторить код с экспериментальным функционалом или если хочется проверить, какой подход окажется полезнее.&lt;br /&gt;
&lt;br /&gt;
Сердце всего BE5 - это ServiceProvider. ServiceProvider доступен компонентам, а в конструкторы сервисов инжектируются другие сервисы или сам ServiceProvider.&lt;br /&gt;
&lt;br /&gt;
Good practices:&lt;br /&gt;
* Разделяем модельные элементы на бины без логики, сервисы и репозитории.&lt;br /&gt;
* Презентационный код пишется в компонентах. Если в компоненте много строчек кода, то что-то пошло не так.&lt;br /&gt;
&lt;br /&gt;
Нерешённые проблемы:&lt;br /&gt;
* При написании operation почти любая строчка кода приводит к увеличению зависимости от наличия метаданных в БД, а также ухудшению возможности что либо протестировать, равно как и невозможности переиспользовать написанный код. Необходимо новое API для операций, полагающееся на сервисы - содержимого com.beanexplorer.enterprise.api.experimental и com.beanexplorer.enterprise.api.experimental.v1 недостаточно.&lt;br /&gt;
* Нет предусмотренного сетапа для тестирования.&lt;br /&gt;
* Нет API для запросов из БД, которое покрывает все возможные SQL запросы.&lt;br /&gt;
* Мы не избавились от метаданных в базе данных, поскольку BeanExplorer5 использует legacy код, который полагается на наличие метаданных в базе данных.&lt;br /&gt;
* Нет стандартного способа взять запрос из Query (той, что определена в YAML) и запустить его. Дело в том, что концептуально сейчас Query - это запросы, которые используются как запросы для таблиц, которые может увидеть пользователь. Такие запросы помечаются набором ролей, обладатели которых могут запускать запросы. Однако бывает необходимость описать запрос на BE-SQL и запустить его из Java. На мой взгляд не только роли должны игнорироваться, но и вообще такие запросы должны либо где-то в другом месте лежать (например, namedQueries.yaml), либо быть приписанными к Entity и не находиться в разделе queries, а, например, находиться в разделе &amp;quot;systemQueries&amp;quot; (причём поскольку это новые запросы, они никогда не должны попадать в БД, а быть только в in-memory meta/project; сейчас запустить обычную Query через BE-SQL игнорируя роли можно так: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
executorService.createExecutor(meta.getQueryIgnoringRoles(&amp;quot;entityName&amp;quot;, &amp;quot;queryName&amp;quot;), request).execute())&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Tips на будущее:&lt;br /&gt;
* Можно ресширить функционал ServiceProvider добавлением способности обрабатывать аннотированные поля сервисов - это избавит от проблем обхода циклических зависимостей сервисов и написания boilderplate в конструкторах. Также возможно попробовать сэмулировать поведение из Spring Core или Google Guice - это бы позволило просто перйти на них при возможности (см. следующее).&lt;br /&gt;
* Можно даже использовать Google Guice или переиспользовать Spring Core, если найдётся хороший способ регистрации сервисов из разных OSGi модулей (сам BE5 и BE5 приложение - в разных OSGi модулях).&lt;br /&gt;
* В идеальном случае было бы хорошо не писать репозитории, да и сервисы для запросов - для этого есть Hibernate, реализации JPA и другие ORM. А ещё лучше - попробовать переиспользовать Spring Data (объявлять интерфейсы с методами, описывающими запрос, без необходимости писать сам код запроса - как personRepository.findByEmailAndActive(&amp;quot;email&amp;quot;, true) - вызов метода из интерфейса, реализацию которого подкладывает Spring).&lt;br /&gt;
* Или хотя бы доделать SQL builder (SqlBuilder) и SQL Service (SqlService), потому что они сейчас не позволяют делать запросы с LEFT JOIN и WITH RECURSIVE.&lt;br /&gt;
* В таком случае было бы хорошо реализовывать код репозиториев с использованием одного универсального парсера из ResultSet в бины (при этом он должен работать по принципу fail-fast, а не как Dynamic.assign(Object bean, DynamicPropertySet dynamicProperties), который игнорирует все ошибки).&lt;br /&gt;
&lt;br /&gt;
==Сборка BeanExplorer5==&lt;br /&gt;
См. [[Сборка BeanExplorer5 проекта|Сборка BeanExplorer5 проекта]].&lt;br /&gt;
&lt;br /&gt;
==BeanExplorer5 API==&lt;br /&gt;
См. [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BeanExplorer5]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BE-SQL</id>
		<title>BE-SQL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BE-SQL"/>
				<updated>2015-11-19T10:19:07Z</updated>
		
		<summary type="html">&lt;p&gt;Uuinnk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BE-SQL''' — диалект SQL, который поддерживается BeanExplorer SQL Parser. Поддерживаются только запросы SELECT. Больше всего он похож на PostgreSQL, но некоторые конструкции из других диалектов тоже поддерживаются. Он также должен понимать различные BE-специфичные теги вроде &amp;lt;if&amp;gt;, &amp;lt;unless&amp;gt; и т. д. В данный момент находится в разработке: не все реальные запросы из проектов успешно разбираются BE-SQL.&lt;br /&gt;
&lt;br /&gt;
Соответствие FreeMarker-конструкций и BE-SQL конструкций:&lt;br /&gt;
&lt;br /&gt;
* chr(...) — CHR() или CHAR()&lt;br /&gt;
* concat(...) — CONCAT() или ||&lt;br /&gt;
* coalesce(...) — COALESCE() или IFNULL()&lt;br /&gt;
* round(...) — ROUND()&lt;br /&gt;
* length(...) — LENGTH() или LEN()&lt;br /&gt;
* lpad(...) — LPAD()&lt;br /&gt;
* replace(...) — REPLACE()&lt;br /&gt;
* substring(...) — SUBSTR() или SUBSTRING()&lt;br /&gt;
* if(...) — IF() (может транслироваться в предложение CASE WHEN ...)&lt;br /&gt;
* ?dateFormat — FORMAT_DATE()&lt;br /&gt;
* ?dateTimeFormat — FORMAT_DATETIME()&lt;br /&gt;
* ?dateFormatRus — FORMAT_DATE_RUS()&lt;br /&gt;
* ?asInt — CAST(x AS BIGINT), TO_NUMBER(x)&lt;br /&gt;
* ?asVarChar — CAST(x AS CHAR), CAST(x AS VARCHAR), TO_CHAR(x)&lt;br /&gt;
* ?asDate — CAST(x AS DATE), TO_DATE(x)&lt;br /&gt;
* ?asPK — CAST(x AS KEY), TO_KEY(x)&lt;br /&gt;
* ?lower — LOWER()&lt;br /&gt;
* ?upper — UPPER()&lt;br /&gt;
* ?monthStart — DATE_TRUNC('MONTH', x)&lt;br /&gt;
* ?yearStart — DATE_TRUNC('YEAR', x)&lt;br /&gt;
* ?year — YEAR(), EXTRACT(YEAR FROM x)&lt;br /&gt;
* ?month — MONTH(), EXTRACT(MONTH FROM x)&lt;br /&gt;
* ?day — DAY(), EXTRACT(DAY FROM x)&lt;br /&gt;
* ?indexOf — INSTR(string, subString) или POSITION(subString IN string)&lt;br /&gt;
* ?str — просто пишите в 'одинарных кавычках', экранируйте одинарную кавычку с помощью '\'&lt;br /&gt;
* ?quote — просто пишите в &amp;quot;двойных кавычках&amp;quot; или в `обратных кавычках`, оба варианта должны сработать и транслироваться при необходимости&lt;br /&gt;
* currentDateTime — CURRENT_TIMESTAMP или NOW()&lt;br /&gt;
* currentDate — CURRENT_DATE&lt;br /&gt;
* addMonths(date,mon) — ADD_MONTHS(date, mon)&lt;br /&gt;
* addDays(date, days) — ADD_DAYS(date, days)&lt;br /&gt;
* addMillis(date, ms) — ADD_MILLIS(date, ms)&lt;br /&gt;
* fromFakeTable — FROM DUAL или можно не писать FROM вообще&lt;br /&gt;
&lt;br /&gt;
Для ограничения количества записей можно просто писать SELECT ... LIMIT 1: это транслируется в соответствующий диалект SQL.&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых SQL-функций ===&lt;br /&gt;
&lt;br /&gt;
В скобках указываются синонимы&lt;br /&gt;
&lt;br /&gt;
 CONCAT, COALESCE (IFNULL), COUNT, SUM, MAX, MIN, SUBSTR (SUBSTRING), LENGTH (LEN), UPPER, LOWER, CHR (CHAR), TO_CHAR, TO_NUMBER, TO_DATE, TO_KEY,&lt;br /&gt;
 REPLACE, RTRIM, LTRIM, TRIM, LPAD, ROUND, TRUNC (TRUNCATE), INSTR (STRPOS), IF, NOW, FORMAT_DATE (=TO_CHAR(x, 'YYYY-MM-DD')), YEAR, MONTH, DAY, &lt;br /&gt;
 FORMAT_DATETIME (=TO_CHAR(x, 'YYYY-MM-DD HH24:MI:SS')), FORMAT_DATE_RUS (=TO_CHAR(x, 'DD.MM.YYYY')), FORMAT_DATE_RUS_SHORT (=TO_CHAR(x, 'DD.MM.YY')), &lt;br /&gt;
 FORMAT_MONTHYEAR(=TO_CHAR(x, 'month YYYY')), FORMAT_FMDAYMONTH, FORMAT_FMDAYMONTH, FORMAT_HOURMINUTE, FORMAT_DAY_OF_WEEK, FORMAT_YYYYMMDD,&lt;br /&gt;
 FORMAT_YYYYMM, DATE_TRUNC, POSITION, DATE_ADD, ADD_MONTHS, ADD_DAYS, ADD_MILLIS, LAST_DAY, TIMESTAMPDIFF, YEARDIFF, MONTHDIFF, DAYDIFF, HOURDIFF,&lt;br /&gt;
 MINUTEDIFF, SECONDDIFF, LEAST, GREATEST, GROUPING, ROW_NUMBER, RANK, RIGHT, LEFT, NULLIF, ABS, AVG, DECODE, TRANSLATE (DB2, Oracle, PostgreSQL),&lt;br /&gt;
 REGEXP_LIKE (MySQL, Oracle, PostgreSLQ), REGEXP_REPLACE (DB2, Oracle, PostgreSQL), STRING_AGG (с поддержкой DISTINCT: MySQL, PostgreSQL; без: DB2, Oracle).&lt;br /&gt;
&lt;br /&gt;
=== Функции для работы с датами и временем ===&lt;br /&gt;
&lt;br /&gt;
==== Форматирование даты ====&lt;br /&gt;
&lt;br /&gt;
Для форматирования даты в строку можно использовать &amp;lt;code&amp;gt;TO_CHAR(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;DATE_FORMAT(дата, &amp;lt;строка_формата&amp;gt;)&amp;lt;/code&amp;gt;. Строка формата должна быть одной из предопределённых констант из списка, иначе будет ошибка:&lt;br /&gt;
&lt;br /&gt;
* 'YYYY-MM-DD' или '%Y-%m-%d' (также можно использовать функцию FORMAT_DATE())&lt;br /&gt;
* 'YYYY-MM-DD HH24:MI:SS' или '%Y-%m-%d %H:%i:%S' (также можно использовать функцию FORMAT_DATETIME())&lt;br /&gt;
* 'DD.MM.YYYY' или '%d.%m.%Y' (также можно использовать функцию FORMAT_DATE_RUS())&lt;br /&gt;
* 'DD.MM.YY' или '%d.%m.%y' (также можно использовать функцию FORMAT_DATE_RUS_SHORT())&lt;br /&gt;
* 'month YYYY' или '%M %Y' (также можно использовать функцию FORMAT_MONTHYEAR())&lt;br /&gt;
* 'FMDD.MM' или '%e.%c' (режим заполнения, также можно использовать функцию FORMAT_FMDAYMONTH())&lt;br /&gt;
* 'DD.MM' или '%d.%m' (также можно использовать функцию FORMAT_DAYMONTH())&lt;br /&gt;
* 'HH24:MI' или '%H:%i' (также можно использовать функцию FORMAT_HOURMINUTE())&lt;br /&gt;
* 'YYYYMMDD' или '%Y%m%d' (также можно использовать функцию FORMAT_YYYYMMDD())&lt;br /&gt;
* 'YYYYMM' или '%Y%m' (также можно использовать функцию FORMAT_YYYYMM())&lt;br /&gt;
* 'D' или '%w' (также можно использовать функцию FORMAT_DAY_OF_WEEK())&lt;br /&gt;
* 'YYYY' или '%Y'&lt;br /&gt;
* 'MM' или '%m'&lt;br /&gt;
* 'DD' или '%d'&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE&lt;br /&gt;
 ----------------------- -----------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATETIME(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATETIME&lt;br /&gt;
 ----------------------- -------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:38&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS&lt;br /&gt;
 ----------------------- ---------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.2016&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), FORMAT_DATE_RUS_SHORT(NOW());&lt;br /&gt;
 &lt;br /&gt;
 NOW                     FORMAT_DATE_RUS_SHORT&lt;br /&gt;
 ----------------------- ---------------------&lt;br /&gt;
 2016-03-04 11:12:38.360 04.03.16&lt;br /&gt;
&lt;br /&gt;
 SELECT TO_CHAR(NOW(), 'YYYY');&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Для получения числа, месяца или года заданной даты в виде числа используются функции &amp;lt;code&amp;gt;DAY(дата)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MONTH(дата)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;YEAR(дата)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT YEAR(CURRENT_DATE);&lt;br /&gt;
 -&amp;gt; 2016&lt;br /&gt;
&lt;br /&gt;
Аналогично можно использовать &amp;lt;code&amp;gt;EXTRACT(YEAR FROM CURRENT_DATE)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Разница между датами ====&lt;br /&gt;
&lt;br /&gt;
Для получения разницы между датами в годах, месяцах, днях, часах, минутах или секундах используются следующие функции:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;YEARDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MONTHDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(MONTH FROM AGE(endDate, startDate)) + 12 * EXTRACT(YEAR FROM AGE(endDate, startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DAYDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(DAY FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;HOURDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 3600)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;MINUTEDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;FLOOR(EXTRACT(EPOCH FROM(endDate - startDate)) / 60)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;SECONDDIFF(startDate, endDate)&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;EXTRACT(EPOCH FROM(endDate - startDate))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SELECT EXTRACT(YEAR FROM AGE('2015-05-01', '2013-02-01'));&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT YEARDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 2&lt;br /&gt;
&lt;br /&gt;
 SELECT MONTHDIFF('2013-02-01', '2015-05-01');&lt;br /&gt;
 -&amp;gt; 27&lt;br /&gt;
&lt;br /&gt;
Также можно использовать функцию &amp;lt;code&amp;gt;TIMESTAMPDIFF(&amp;lt;интервал&amp;gt;, startDate, endDate)&amp;lt;/code&amp;gt;, где в качестве интервала должно быть YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(DAY, '2016-01-01', '2017-01-01');&lt;br /&gt;
 -&amp;gt; 366&lt;br /&gt;
&lt;br /&gt;
 SELECT TIMESTAMPDIFF(SECOND, '2016-01-01', '2016-01-02' );&lt;br /&gt;
 -&amp;gt; 86400&lt;br /&gt;
&lt;br /&gt;
==== Добавление интервала к дате ====&lt;br /&gt;
&lt;br /&gt;
Для добавления к дате месяцев, дней или миллисекунд используются функции &amp;lt;code&amp;gt;ADD_MONTHS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_DAYS(дата, количество)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ADD_MILLIS(дата, количество)&amp;lt;/code&amp;gt; соответственно:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_MONTHS(CURRENT_DATE, 2);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_MONTHS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-05-04&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, ADD_DAYS(CURRENT_DATE, 7);&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE ADD_DAYS&lt;br /&gt;
 ------------ ----------&lt;br /&gt;
 2016-03-04   2016-03-11&lt;br /&gt;
&lt;br /&gt;
 SELECT NOW(), ADD_MILLIS(NOW(), 3000);&lt;br /&gt;
 &lt;br /&gt;
 NOW                     ADD_MILLIS&lt;br /&gt;
 ----------------------- ----------------------- &lt;br /&gt;
 2016-03-04 11:12:38.360 2016-03-04 11:12:41.360&lt;br /&gt;
&lt;br /&gt;
==== Последний день месяца ====&lt;br /&gt;
&lt;br /&gt;
Для получения последнего дня месяца используется функция &amp;lt;code&amp;gt;LAST_DAY(дата)&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 SELECT CURRENT_DATE, LAST_DAY(CURRENT_DATE) &amp;quot;Last&amp;quot;, LAST_DAY(CURRENT_DATE) - CURRENT_DATE &amp;quot;Days Left&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 CURRENT_DATE Last       Days Left&lt;br /&gt;
 ------------ ---------- ---------&lt;br /&gt;
 2016-03-04   2016-03-31        27&lt;br /&gt;
&lt;br /&gt;
=== Список всех поддерживаемых операций ===&lt;br /&gt;
&lt;br /&gt;
 +, -, *, /, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, = (или ==), != (или &amp;lt;&amp;gt;), || (конкатенация строк), OR, AND (или &amp;amp;&amp;amp;), NOT (или !), LIKE, FLOOR, MOD (или %),&lt;br /&gt;
 &amp;amp; (побитовое и), | (побитовое или), ~ (соответствие регулярному выражению; MySQL, Oracle, PostgreSQL).&lt;br /&gt;
&lt;br /&gt;
=== Что точно не работает пока ===&lt;br /&gt;
&lt;br /&gt;
Использование этих возможностей скорее всего приведёт к ошибке валидации. В некоторых случаях к некорректному переформатированию в другом движке.&lt;br /&gt;
&lt;br /&gt;
* BE-теги &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в некоторых нетривиальных местах. Так как в BE-SQL строится синтаксическое дерево, подобные теги нельзя размещать где угодно. Точно работает &amp;lt;if&amp;gt;/&amp;lt;unless&amp;gt; в следующих местах:&lt;br /&gt;
** В списке колонок (&amp;lt;code&amp;gt;SELECT a, &amp;lt;if ...&amp;gt;b,&amp;lt;/if&amp;gt; c FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для UNION SELECT (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;UNION SELECT b FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;, а также &amp;lt;code&amp;gt;&amp;lt;if ...&amp;gt;SELECT a FROM table UNION&amp;lt;/if&amp;gt; SELECT b FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения FROM (&amp;lt;code&amp;gt;SELECT a &amp;lt;if ...&amp;gt;FROM table&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего предложения WHERE (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;WHERE b = c&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего и в списке колонок внутри GROUP BY (&amp;lt;code&amp;gt;SELECT * FROM table GROUP BY a,&amp;lt;if ...&amp;gt;b, c,&amp;lt;/if&amp;gt; d&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для всего и в списке колонок внутри ORDER BY (&amp;lt;code&amp;gt;SELECT * FROM table ORDER BY a DESC &amp;lt;if ...&amp;gt;, b, c&amp;lt;/if&amp;gt;, d&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одной (не самой первой) из веток CASE WHEN (&amp;lt;code&amp;gt;SELECT CASE WHEN x &amp;gt; 5 THEN 'a' &amp;lt;if ...&amp;gt;WHEN x &amp;gt; 10 THEN 'b'&amp;lt;/if&amp;gt;ELSE 'c' END FROM table&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для одного или нескольких предложений JOIN (&amp;lt;code&amp;gt;SELECT a FROM table &amp;lt;if ...&amp;gt;JOIN table2 ON (...) JOIN table3 ON (...)&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента булевого выражения, начинающегося с AND или OR (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; 2 &amp;lt;if ...&amp;gt;AND y &amp;gt; 3&amp;lt;/if&amp;gt;&amp;lt;if ...&amp;gt;OR z &amp;gt; 4&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для фрагмента конкатенации строк через ||, начинающегося с || (&amp;lt;code&amp;gt;SELECT a || b &amp;lt;if ...&amp;gt;|| c || d&amp;lt;/if&amp;gt; || e&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Для простого выражения, обязательно с альтернативой (&amp;lt;code&amp;gt;SELECT a FROM table WHERE x &amp;gt; &amp;lt;if ...&amp;gt;5&amp;lt;else&amp;gt;6&amp;lt;/if&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Внутри строкового литерала (&amp;lt;code&amp;gt;'&amp;lt;a href=&amp;quot;/test?&amp;lt;if parameter='xyz'&amp;gt;xyz=true&amp;amp;&amp;lt;/if&amp;gt;abc=true&amp;quot;&amp;gt;'&amp;lt;/code&amp;gt;)&lt;br /&gt;
* genericRef, joinGenericRef&lt;br /&gt;
&lt;br /&gt;
=== Создание макросов ===&lt;br /&gt;
&lt;br /&gt;
Предусмотрена возможность создания собственных макросов. Определение макроса начинается с &amp;lt;code&amp;gt;MACRO&amp;lt;/code&amp;gt;. За ним идет имя макроса и список аргументов в скобках, который может состоять из обязательных и следующих за ними аргументов с заданным по умолчанию значением. В случае отсутствия аргументов скобки нужно оставить пустыми. Далее следуют выражения, которые будут подставляться при вызове макроса, в их числе могут быть другие макросы, подстановки параметров, условные выражения. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 MACRO MY_MACRO(arg1, arg2='000000')&lt;br /&gt;
 CONCAT(SUBSTR(arg1, 1, 5 ), arg2)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Вызываются макросы как обычные функции:&lt;br /&gt;
&lt;br /&gt;
 SELECT MY_MACRO(code) FROM table t;&lt;br /&gt;
&lt;br /&gt;
Такой запрос будет преобразован в &amp;lt;code&amp;gt;SELECT CONCAT(SUBSTR(code, 1, 5 ), '000000') FROM table t&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Определение СУБД-специфичных функций ===&lt;br /&gt;
&lt;br /&gt;
Определение СУБД-специфичных функций начинается с &amp;lt;code&amp;gt;DBMS_TRANSFORM&amp;lt;/code&amp;gt;. За ним идет название функции и список аргументов в скобках. В случае отсутствия аргументов скобки необходимо оставить пустыми. Далее следует выражение &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;, в котором в блоках &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; перечисляются СУБД, а в блоках &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; указывается возвращаемое выражение при трансляции в соответствующую СУБД. Это выражение может содержать функции, которые не были определены ранее, однако это не сделает возможным их дальнейшее использование вне трансляции. Если функцию необходимо транслировать как есть, после &amp;lt;code&amp;gt;THEN&amp;lt;/code&amp;gt; указывается &amp;lt;code&amp;gt;AS IS&amp;lt;/code&amp;gt;. В блоке &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt; ожидаются названия из списка: &amp;lt;code&amp;gt;'db2'&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'mysql'&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'oracle'&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'postgres'&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'sqlserver'&amp;lt;/code&amp;gt;. Если СУБД, в которую необходимо выполнить трансляцию функции, отсутствует во всех условиях &amp;lt;code&amp;gt;WHEN&amp;lt;/code&amp;gt;, произойдет ошибка. Заканчивается определение ключевым словом &amp;lt;code&amp;gt;END&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 DBMS_TRANSFORM LPAD(str, size, fill)&lt;br /&gt;
 CASE WHEN 'postgres', 'oracle', 'mysql', 'db2' THEN AS IS&lt;br /&gt;
      WHEN 'sqlserver' THEN RIGHT(REPLICATE(fill, size) + str, size)&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Запрос &amp;lt;code&amp;gt;SELECT LPAD('lpad', 8, '0') FROM table t&amp;lt;/code&amp;gt; для DB2, MySQL, Oracle и PostgreSQL сохранит свой вид, а при трансляции в Microsoft SQL Server будет преобразован в &amp;lt;code&amp;gt;SELECT RIGHT(REPLICATE('0', 8) + 'lpad', 8)&amp;lt;/code&amp;gt; FROM table t.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Icon</id>
		<title>Icon</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Icon"/>
				<updated>2015-10-26T05:10:32Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Иконки теперь в BeanExplorer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Иконки}}&lt;br /&gt;
Иконки можно задавать для [[Entity|сущностей]], [[Query|представлений]] и [[Operation|операций]], чтобы они отображались в пользовательском интерфейсе (в меню или на кнопках операций). Иконки задаются в виде ссылки на файл. Поддерживаются форматы png и gif. Есть два варианта:&lt;br /&gt;
&lt;br /&gt;
* Ссылка вида &amp;lt;code&amp;gt;be:имя_файла&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;be:question.gif&amp;lt;/code&amp;gt;): файл ищется в каталоге &amp;lt;code&amp;gt;BeanExplorer/src/html/icons&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ссылка вида &amp;lt;code&amp;gt;project:имя_файла&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;project:myicon.gif&amp;lt;/code&amp;gt;): файл ищется в каталоге проекта, по умолчанию в подкаталоге &amp;lt;code&amp;gt;src/icons&amp;lt;/code&amp;gt; (можно поменять через [[ProjectFileStructure|кастомизацию структуры проекта]]).&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/ColumnDef</id>
		<title>ColumnDef</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/ColumnDef"/>
				<updated>2015-10-22T07:05:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Примеры YAML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.ColumnDef|да|да}}&lt;br /&gt;
&lt;br /&gt;
'''Определение колонки''' (ColumnDef) — это модельный объект, соответствующий колонке в базе данных. Обладает следующими свойствами:&lt;br /&gt;
&lt;br /&gt;
* '''name''' — имя колонки. В некоторых движках регистр имеет значение, в некоторых нет. Две колонки не могут отличаться только регистром.&lt;br /&gt;
* '''type''' — [[Типы_колонок|тип колонки]].&lt;br /&gt;
* '''canBeNull''' — логическое значение, может ли колонка хранить NULL-значения (по умолчанию — нет).&lt;br /&gt;
* '''primaryKey''' — логическое значение, является ли колонка первичным ключом.&lt;br /&gt;
* '''oldNames''' — список старых имён колонки. Если колонка когда-то была переименована, разумно указать здесь старое имя. Тогда при обновлении DDL BeanExplorer сгенерирует запрос на переименование колонки без потери данных. Если старое имя не указать, то старая колонка будет удалена и создана новая, что может привести к потере данных.&lt;br /&gt;
* '''defaultValue''' — значение по умолчанию.&lt;br /&gt;
* '''reference''' — ссылка, если колонка является [[TableRef|ссылкой на ключ в другой таблице]]:&lt;br /&gt;
** Либо просто имя целевой таблицы (ссылка на первичный ключ). Не рекомендуется использовать при ссылках на таблицы, определённые в m4!&lt;br /&gt;
** Либо &amp;lt;code&amp;gt;&amp;lt;имя таблицы&amp;gt;.&amp;lt;имя колонки&amp;gt;&amp;lt;/code&amp;gt;: явное задание целевой колонки&lt;br /&gt;
** Либо список таблиц для generic-ссылки.&lt;br /&gt;
** Либо совокупность двух полей: '''to''' — сама ссылка (с указанием колонки или нет), '''view''' — имя selection view.&lt;br /&gt;
*: Для колонки-ссылки можно не указывать тип, если целевая таблица определена в be4-проекте, либо это generic-ссылка. В таких случаях тип колонки будет определён автоматически.&lt;br /&gt;
&lt;br /&gt;
== Примеры YAML ==&lt;br /&gt;
&lt;br /&gt;
Текстовая колонка длиной до 30 символов, являющаяся первичным ключом:&lt;br /&gt;
&lt;br /&gt;
 - CODE:&lt;br /&gt;
     type: VARCHAR(30)&lt;br /&gt;
     primaryKey: true&lt;br /&gt;
&lt;br /&gt;
Колонка перечислимого типа со значением по умолчанию (обратите внимание, надо брать значение по умолчанию в тройные кавычки):&lt;br /&gt;
&lt;br /&gt;
 - type:&lt;br /&gt;
     type: ENUM('import','export')&lt;br /&gt;
     defaultValue: &amp;lt;nowiki&amp;gt;'''import'''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Колонка с датой и значением по умолчанию — текущая дата:&lt;br /&gt;
&lt;br /&gt;
 - purchaseDate:&lt;br /&gt;
     type: DATE&lt;br /&gt;
     defaultValue: NOW()&lt;br /&gt;
&lt;br /&gt;
Текстовая колонка максимальной длины 255 символов, допускающая значения NULL:&lt;br /&gt;
&lt;br /&gt;
 - comments:&lt;br /&gt;
     type: VARCHAR(255)&lt;br /&gt;
     canBeNull: true&lt;br /&gt;
&lt;br /&gt;
Колонка-ссылка на первичный ключ другой таблицы:&lt;br /&gt;
&lt;br /&gt;
 - companyID:&lt;br /&gt;
     reference: companies&lt;br /&gt;
&lt;br /&gt;
Колонка-ссылка с явным указанием selection view:&lt;br /&gt;
&lt;br /&gt;
 - munCode:&lt;br /&gt;
     reference:&lt;br /&gt;
       to: munExchangeTypes.munCode&lt;br /&gt;
       view: 'MunCode view'&lt;br /&gt;
&lt;br /&gt;
Колонка с generic-ссылкой и документацией:&lt;br /&gt;
&lt;br /&gt;
 - ownerID:&lt;br /&gt;
     doc: владелец счета&lt;br /&gt;
     reference:&lt;br /&gt;
       to:&lt;br /&gt;
       - companies&lt;br /&gt;
       - persons&lt;br /&gt;
       view: &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Entity</id>
		<title>Entity</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Entity"/>
				<updated>2015-10-22T06:31:16Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: +icon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.Entity|да|да}}&lt;br /&gt;
&lt;br /&gt;
'''Сущность''' (Entity) представляет собой SQL-таблицу, либо фиктивную таблицу, предназначенную для создания пунктов меню. Каждая сущность относится к одному из [[Module|модулей]]. Сущность имеет следующие свойства:&lt;br /&gt;
&lt;br /&gt;
* '''name''' — имя. Соответствует имени SQL-таблицы и используется внутри модели для ссылок на данную сущность.&lt;br /&gt;
* '''icon''' — ссылка на [[icon|иконку]] для отображения в меню.&lt;br /&gt;
* '''type''' — тип сущности. Имеется пять типов:&lt;br /&gt;
** table — обычная таблица&lt;br /&gt;
** collection — коллекция&lt;br /&gt;
** genericCollection — обобщённая коллекция&lt;br /&gt;
** dictionary — справочник&lt;br /&gt;
** metadata — таблица с метаданными (используется только для внутренних таблиц BeanExplorer&lt;br /&gt;
* '''displayName''' — отображаемое имя. Имя сущности, которое выводится в пользовательском интерфейсе. Может быть дополнительно изменено через локализации.&lt;br /&gt;
* '''order''' — двузначное число, задающее порядок сущности в меню (чем больше, тем ниже сущность располагается в меню).&lt;br /&gt;
* '''primaryKey''' — первичный ключ таблицы (для фиктивных сущностей обычно используется _dummy_)&lt;br /&gt;
&lt;br /&gt;
В определение сущности входит [[TableDef|схема]], [[Operation|операции]] и [[Query|представления]]. Также есть возможность использовать [[Entity template|шаблон для сущности]].&lt;br /&gt;
&lt;br /&gt;
Пример простой фиктивной сущности в Yaml:&lt;br /&gt;
&lt;br /&gt;
 _myMenuItem_:&lt;br /&gt;
   type: table&lt;br /&gt;
   displayName: Основное меню&lt;br /&gt;
   order: '29'&lt;br /&gt;
   primaryKey: _dummy_&lt;br /&gt;
   queries:&lt;br /&gt;
   - Главная таблица:&lt;br /&gt;
       type: static&lt;br /&gt;
       roles: [Operator,PaymentOperator,ServiceOperator,Reception]&lt;br /&gt;
       value: 'myTable.redir'&lt;br /&gt;
&lt;br /&gt;
Пример сущности-справочника с представлением Selection view и без операций:&lt;br /&gt;
&lt;br /&gt;
 myDictionary:&lt;br /&gt;
   type: table&lt;br /&gt;
   displayName: Мой справочник&lt;br /&gt;
   primaryKey: CODE&lt;br /&gt;
   scheme:&lt;br /&gt;
     columns:&lt;br /&gt;
     - CODE:&lt;br /&gt;
         type: VARCHAR(30)&lt;br /&gt;
         primaryKey: true&lt;br /&gt;
     - name:&lt;br /&gt;
         type: VARCHAR(255)&lt;br /&gt;
   queries:&lt;br /&gt;
   - '*** Selection view ***':&lt;br /&gt;
       code: SELECT CODE AS &amp;quot;Code&amp;quot;, name AS &amp;quot;Name&amp;quot; FROM myDictionary&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Entity_template</id>
		<title>Entity template</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Entity_template"/>
				<updated>2015-10-21T10:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «Шаблон для сущности упрощает создание похожих сущностей, позволяя наследовать не…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Шаблон для [[entity|сущности]] упрощает создание похожих сущностей, позволяя наследовать неизменённые свойства из шаблона. Шаблоны размещаются вот здесь:&lt;br /&gt;
&lt;br /&gt;
  /be4/src/com/beanexplorer/enterprise/metadata/model/templates/&lt;br /&gt;
&lt;br /&gt;
Сохраняются в обычных yaml-файлах, как сущности. Но следует помнить, что имя шаблона не совпадает с именем реальной сущности. Поэтому в тексте запросов надо использовать Freemarker-выражения для обращения к текущей сущности. Например, так:&lt;br /&gt;
&lt;br /&gt;
  SELECT ${entity.primaryKey} AS &amp;quot;Code&amp;quot;, name AS &amp;quot;Name&amp;quot; FROM ${entity.name}&lt;br /&gt;
&lt;br /&gt;
Для создания нового шаблона надо расположить его в том же каталоге и зарегистрировать в списке {{Method|com.beanexplorer.enterprise.metadata.model.Templates.TEMPLATES}}. При создании или изменении шаблона следует прогнать юнит-тест {{Class|com.beanexplorer.enterprise.metadata._test.TemplatesTest}}. Если упал, скорее всего написан некорректный yaml.&lt;br /&gt;
&lt;br /&gt;
Для использования шаблона необходимо при описании сущности указать &amp;lt;code&amp;gt;template: &amp;lt;имя шаблона&amp;gt;&amp;lt;/code&amp;gt;. Затем переопределять то, чего в шаблоне не хватает. Пример есть в модуле financial:&lt;br /&gt;
&lt;br /&gt;
  /beclipse/modules/financial/src/meta/entities/intangibleTypes.yaml&lt;br /&gt;
&lt;br /&gt;
На текущий момент в шаблоне никак не задать группу ролей. Отдельные роли можно, а группы придётся определять в самой сущности. Также пока недоделано сохранение сущности, содержащей ссылку на шаблон (будет сделано).&lt;br /&gt;
&lt;br /&gt;
Использовать шаблон можно только для сущностей, определённых в текущем проекте (в meta/entities). Нельзя задавать шаблон в meta/modules, так как сущности оттуда уже кастомизируют сущность из соответствующего модуля и не могут одновременно наследовать шаблон.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeConnectionProfile</id>
		<title>BeConnectionProfile</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeConnectionProfile"/>
				<updated>2015-08-20T09:15:48Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: +ask&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.BeConnectionProfile|да}}&lt;br /&gt;
&lt;br /&gt;
Профиль соединения (connection profile) — совокупность настроек, описывающих отдельную доступ к базе данных и инсталляцию be4-приложения. Содержит следующую информацию:&lt;br /&gt;
&lt;br /&gt;
* '''connectionUrl''': URL соединения к базе данных (например: jdbc:postgresql://localhost:5432/mydb)&lt;br /&gt;
* '''username''': имя пользователя для доступа к базе данных (например: user)&lt;br /&gt;
* '''password''': пароль для доступа к базе данных&lt;br /&gt;
* '''tomcatPath''': путь к инсталляции Tomcat на локальной системе&lt;br /&gt;
* '''tomcatAppName''': имя приложения в Tomcat (имя war-файла). По умолчанию совпадает с названием [[Project|проекта]].&lt;br /&gt;
* '''tomcatManagerScriptUserName'''/'''tomcatManagerScriptPassword''': имя и пароль для управления удалённой перезагрузкой Tomcat-приложения&lt;br /&gt;
* '''tomcatManagerReloadUrlTemplate''': путь для выполнения удалённой перезагрузки Tomcat-приложения (пример: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://localhost:8080/manager/text/reload?path=/{projectName}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''protected''': если true, то профиль считается защищённым. При попытках работать с ним могут запрашиваться дополнительные подтверждения&lt;br /&gt;
* '''properties''': произвольные текстовые свойства (имя-значение). При работе через ant они доступны в переменных ant. Таким образом можно сконфигурировать дополнительно любые специфичные для данной инсталляции вещи (настройки контекста и т. д.). Также эти свойства доступны во Freemarker-скриптах и при задании [[extras]].&lt;br /&gt;
* '''ask''': список элементов, которые необходимо запросить с командной строки при использовании профайла. Помимо вышеупомянутых (например, &amp;lt;code&amp;gt;tomcatAppName&amp;lt;/code&amp;gt;) можно использовать &amp;lt;code&amp;gt;properties/&amp;lt;имя свойства&amp;gt;&amp;lt;/code&amp;gt; для запроса пользовательского свойства, а также детальные параметры jdbcUrl: &amp;lt;code&amp;gt;jdbcUrl/host&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jdbcUrl/db&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jdbcUrl/properties/SID&amp;lt;/code&amp;gt; и т. д.&lt;br /&gt;
&lt;br /&gt;
Пример задания профиля в [[yaml]]:&lt;br /&gt;
&lt;br /&gt;
  connectionProfiles:&lt;br /&gt;
    profiles:&lt;br /&gt;
      condo:&lt;br /&gt;
        connectionUrl: jdbc:postgresql://localhost:5432/condo&lt;br /&gt;
        username: condo&lt;br /&gt;
        password: condo&lt;br /&gt;
        protected: true&lt;br /&gt;
        tomcatPath: C:/apache-tomcat-7.0.52/webapps&lt;br /&gt;
        tomcatAppName: condo&lt;br /&gt;
        tomcatManagerScriptUserName: tomcat&lt;br /&gt;
        tomcatManagerScriptPassword: tomcat&lt;br /&gt;
        tomcatManagerReloadUrlTemplate: http://localhost:8080/manager/text/reload?path=/condo&lt;br /&gt;
        properties:&lt;br /&gt;
        - INITIAL_SIZE: '30'&lt;br /&gt;
        - MAX_ACTIVE: '2000'&lt;br /&gt;
        - MIN_IDLE: '1'&lt;br /&gt;
        - MAX_IDLE: '20'&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4</id>
		<title>Для разработчиков BE4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%94%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_BE4"/>
				<updated>2014-12-05T05:04:18Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: /* Автосериализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет информация по архитектуре BE4.&lt;br /&gt;
&lt;br /&gt;
На высоком уровне BE4 состоит из нескольких частей:&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро;&lt;br /&gt;
* com.beanexplorer.enterprise.metadata.ant - реализация Ant задач, объявленных в be4/src/be4lib.xml, эти классы не должны использоваться во время исполнения BEclipse;&lt;br /&gt;
* com.beanexplorer.enterprise.be4core - класс Be4QueryExecutor, необходимый для запуска Query относительно простым образом без необходимости хранить Query в таблице (в BE3 запуск Query происходит по имени или идентификатору Query в таблице queries, а мы в BE4 работаем только с модельными объектами представленными в виде Java объектов, а не строк в SQL таблицах); используется для запуска Query в BEeclipse и BE5;&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse - UI BEclipse и необходимые для его модельные элементы и view model;&lt;br /&gt;
* com.beanexplorer.enterprise.api - заготовка фасада для использования простейшего API в тестах: загрузка проекта из папки (projectApi = Facade.load(path)), получение корректного DatabaseConnector (projectApi.getDatabaseConnector()) и запуск Freemarker скриптов (projectApi.runFreemarkerScript(string));&lt;br /&gt;
* com.beanexplorer.enterprise.diagrams - здесь и модельные элементы, и UI для диаграмм; новые виды диаграм легче всего добавлять по аналогии со старыми, смотря на уже готовые классы;&lt;br /&gt;
* com.beanexplorer.enterprise.planning - здесь [http://ru.wikipedia.org/wiki/Model-View-ViewModel и Model, и ViewModel, и View] для для [[BeanExplorer4#Описание по каждому редактору и view|TasksView]].&lt;br /&gt;
&lt;br /&gt;
== Ядро ==&lt;br /&gt;
* '''com.beanexplorer.enterprise.metadata*''' - ядро.&lt;br /&gt;
** exception - все базовые исключения для BE4, мы используем [http://en.wikipedia.org/wiki/Exception_handling#Checked_exceptions checked exceptions].&lt;br /&gt;
** '''model*''' - самое сердце BE4 - модельные объекты, которые представляют собой [[Структура проекта|дерево проекта]], начиная с класса [[Project]].&lt;br /&gt;
** sql - скачивание legacy метаданных (дерева проекта) из BE3 базы данных, синхронизация с базой данных. &lt;br /&gt;
** serialization - сохранённый на жёстком диске BE4 проект представляется как набор YAML файлов; данном пакете реализованы сериализация и десериализация YAML. &lt;br /&gt;
** freemarker - расширение Freemarker, в частности [[Built-ins|Be4BuiltIns]] и [[Встроенные функции|DatabaseFunctions]], [[макросы]] находятся в be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl.&lt;br /&gt;
*** FreemarkerSqlHandler - получает на вход FreemarkerScript и запускает его как SQL, переадресуя сгенерированный текст в SqlExecutor.&lt;br /&gt;
** util - базовые полезности; должны находиться в этом пакете, даже если используются только в UI&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
Поскольку BEclipse - это плагин для Eclipse, UI реализован классическим способом для Eclipse плагинов. А именно:&lt;br /&gt;
* весь основной функционал описан в plugin.xml,&lt;br /&gt;
** это могут быть меню, команды, view, редакторы, wizard, страницы настроек и прочее. Для просмотра всего фунционала открываем plugin.xml на странице &amp;quot;Extensions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Команды ===&lt;br /&gt;
Для создания команды неоходимо зарегистрировать два расширения:&lt;br /&gt;
* org.eclipse.ui.commands&lt;br /&gt;
* org.eclipse.ui.handlers&lt;br /&gt;
Дело в том, что в Eclipse одна и та же команда может быть запущена разными обработчиками, так что команда разделена на две части - собственно command, представляет собой абстрактную команду с именем и описанием, и handler - обработчик, ссылается на класс, реализующий функционал этой команды и указывающий, может ли он в данный момент обработать действие. Например, в Eclipse есть стандартная команда &amp;quot;Debug&amp;quot;. В разных контекстах её обрабатывает разный обработчик - Java код запускается одним способом, а C++ код другим. При этом кнопка на панели инструментов и биндинг постоянно F11 ссылаются на одно и то же действие.&lt;br /&gt;
&lt;br /&gt;
Наши обработчики команд лежат в com.beanexplorer.enterprise.eclipse.handlers и имеют названия, представляющие собой глаголы.&lt;br /&gt;
&lt;br /&gt;
Так что для создания новой команды&lt;br /&gt;
* кликаем на org.eclipse.ui.commands в нашем редакторе plugin.xml на вкладке Extensions, New -&amp;gt; command, даём уникальный идентификатор, читаемое имя и категорию (categoryId) com.beanexplorer.be4.ui.commands,&lt;br /&gt;
* кликаем на org.eclipse.ui.handlers , New -&amp;gt; handler, выбираем только что созданную команду и новый класс из com.beanexplorer.enterprise.eclipse.handlers.&lt;br /&gt;
&lt;br /&gt;
=== Меню ===&lt;br /&gt;
Это расширение org.eclipse.ui.menus (New -&amp;gt; menuContribution). Общий вид ссылки на меню (locationURI):&lt;br /&gt;
* [menu|popup|toolbar]:&amp;lt;menuOrPartName&amp;gt;[?after=additions]&lt;br /&gt;
Здесь &amp;quot;menu&amp;quot;, &amp;quot;popup&amp;quot;, &amp;quot;toolbar&amp;quot; - предопределённые строки. &amp;lt;menuOrPartName&amp;gt; - либо &amp;quot;известное&amp;quot; имя типа org.eclipse.ui.main.menu или org.eclipse.ui.main.toolbar, либо имя редактора или view типа com.beanexplorer.enterprise.eclipse.BeProjectView.&lt;br /&gt;
&lt;br /&gt;
popup:com.beanexplorer.enterprise.eclipse.BeProjectView - это, в частности, контекстное меню нашего дерева проекта. Для добавления в него новой команды кликаем на надпись &amp;quot;popup:com.beanexplorer.enterprise.eclipse.BeProjectView&amp;quot; (слева в дереве), New -&amp;gt; command, выбираем команды, указываем текст и выбираем иконку. Готово!&lt;br /&gt;
&lt;br /&gt;
==== Замечание ====&lt;br /&gt;
Для того, чтобы найти класс с реализацией пункта меню, можно найти соответствующий пункт меню в редакторе plugin.xml, в нём будет указана команда, копируем имя команды в строку поиска в редакторе и находим нужный handler.&lt;br /&gt;
&lt;br /&gt;
=== Редакторы и view ===&lt;br /&gt;
Хранятся в&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.editors и&lt;br /&gt;
* com.beanexplorer.enterprise.eclipse.views соответственно.&lt;br /&gt;
Аналогично командам, создаются через редактор, кликаем на com.beanexplorer.enterprise.eclipse.editors, New -&amp;gt; editor, заполняем необходимые поля. Аналогично со view. Замечу, что клик на метку &amp;quot;class&amp;quot; позволяет создать нужный класс (в случае со view это org.eclipse.ui.part.ViewPart, например).&lt;br /&gt;
&lt;br /&gt;
=== Готовые диалоговые окна ===&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.dialogs.Dialogs - простые реализации диалоговых окошек, которых не хватает в org.eclipse.jface.dialogs.MessageDialog.&lt;br /&gt;
&lt;br /&gt;
=== MVVM и упрощение написания UI ===&lt;br /&gt;
Многие команды представляют собой одностраничные wizard'ы. Вместо того, чтобы писать с нуля, берём класс com.beanexplorer.enterprise.eclipse.handlers.templates.WizardCommandTemplateWizard, копируем в handlers, переименовываем (Alt+Shift+R) и заполняем всё что нужно.&lt;br /&gt;
&lt;br /&gt;
Хорошей практикой являет написание UI с использованием шаблона проектирования MVVM. Пример - CreateDaemonWizard.CreateDaemonWizardPage из CreateDaemon. Это хороший пример с использованием MVVM и моментальной валидацией ввода пользовательских данных, который полагается на класс Ui из com.beanexplorer.enterprise.eclipse.jface. Другие примеры можно найти поискав использования Ui.SimpleBinding&amp;lt;T&amp;gt;.addToWizardPage (Ctrl+Shift+G) или других методов Ui.SimpleBinding&amp;lt;T&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.Ui вообще содержит гибкую основу для реализации MVVM UI (примеры можно найти поискав использования класса Ui или его методов). &lt;br /&gt;
&lt;br /&gt;
Класс com.beanexplorer.enterprise.eclipse.jface.JFace предоставляет методы для частовстречающихся сценариев (как правило создания виджетов внутри Composite с GridLayout из двух столбцов).&lt;br /&gt;
&lt;br /&gt;
=== События ===&lt;br /&gt;
&lt;br /&gt;
==== Автосериализация ====&lt;br /&gt;
Начинать смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируются события разные события &amp;quot;codeChanged(SomeClass)&amp;quot; - в конечном счёте они вызывают Serialization.save(SomeClass).&lt;br /&gt;
&lt;br /&gt;
==== Автодесериализация ====&lt;br /&gt;
Начинасть смотреть с BeanExplorerProjectProvider.setProject - здесь регистрируется &amp;quot;onModify&amp;quot; (статическая функция ON_MODIFY). ON_MODIFY.apply(Path) определяет по пути тип файла и десериализует его. При открытии проекта путь файла регистрируется через project.getAutomaticDeserializationService().registerFile(Path, Type). WatchDir же слушает изменения в файловой системе и отправляет их в onModify.&lt;br /&gt;
&lt;br /&gt;
==== Другие события ====&lt;br /&gt;
См. различные BeanExplorerProjectProvider.registerLocal(ConcreteListener, Composite). Замечу, что structural change - полезное событие для того, чтобы обновить UI, если изменилось дерево модельных объектов. Изменени модельных объектов не вызывает автоматического перерисования UI - у нас нет такого вида событий!&lt;br /&gt;
&lt;br /&gt;
=== Действия и возможности ===&lt;br /&gt;
&lt;br /&gt;
==== Сохранение и открытие проекта ====&lt;br /&gt;
BeanExplorerProjectSource - простейший фасад для сохранения и открытия проекта из YAML.&lt;br /&gt;
&lt;br /&gt;
LegacyBeanExplorerProjectImporter - предоставляет возможность открывать BE3 проект из базы данных.&lt;br /&gt;
&lt;br /&gt;
==== JavaScript отладчик ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.javascript.RunJavaScriptOperationImpl и DebugJavaScriptOperationImpl - основные классы реализации.&lt;br /&gt;
&lt;br /&gt;
==== Запуск Query ====&lt;br /&gt;
Основывается на Be4QueryExecutor из com.beanexplorer.enterprise.be4core. См. класс &amp;quot;RunQuery&amp;quot; в качестве примера.&lt;br /&gt;
&lt;br /&gt;
==== Data Tools Platform: Connection Profiles ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.model.ConnectionProfiles позволяет преобразовывать наши модельные настройки в DTP connection profile и наоборот.&lt;br /&gt;
&lt;br /&gt;
==== Поиск в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.jface.DataElementsFilter&lt;br /&gt;
&lt;br /&gt;
==== Иконки и подсказки в Project View ====&lt;br /&gt;
com.beanexplorer.enterprise.eclipse.views.BeanExplorerProjectViewLabelProvider - вычисляет иконки, рисует простые подсказки и делегирует сложные tooltip'ы (в виде таблиц с ошибками) классу FancyToolTipSupport из того же пакета.&lt;br /&gt;
&lt;br /&gt;
==== Сохранение состояния view ====&lt;br /&gt;
См. в качестве примера BeanExplorerProjectView.saveState (простейшие примеры - сохранение имени открытого проекта и выделенного элемента) и BeanExplorerProjectView.init (загрузка).&lt;br /&gt;
&lt;br /&gt;
==== Настройки ====&lt;br /&gt;
См. BeanExplorerPreferencesPage.createFieldEditors и BeanExplorerPreferences из com.beanexplorer.enterprise.eclipse.preferences.BeanExplorerPreferencesPage.&lt;br /&gt;
&lt;br /&gt;
==== Фоновые процессы ====&lt;br /&gt;
Запуск - new Job(&amp;quot;name&amp;quot;) { implementation }.schedule(). &amp;quot;Подождать&amp;quot; - пример в BeanExplorerProjectProvider.waitForSynchronization, &amp;quot;отменить&amp;quot; - пример в BeanExplorerProjectSource.cancelOpening. Замечу, что любые действия с UI должны делаться в UI потоке, поэтому для запуска кода в UI потоке из Job можно использовать:&lt;br /&gt;
* UiFunction.async(function) - оборачивает функцию;&lt;br /&gt;
* new AbstractUiSyncFunction&amp;lt;A, R&amp;gt;() { implementation }.apply(arg);&lt;br /&gt;
* EclipseUtils.runInUiThread(runnable) или EclipseUtils.runInUiThread(supplier) - асинхронный и синхронный запуск соответственно.&lt;br /&gt;
Подолнительно в EclipseUtils имеются методы для показа окошек с ошибками и предупреждениями из не UI потоков (типа openErrorByNonUiThread).&lt;br /&gt;
&lt;br /&gt;
==== Утилиты Eclipse ====&lt;br /&gt;
EclispeUtils содержит множество полезных методов, относящихся только к Eclipse UI:&lt;br /&gt;
* открытие или создание Java класса;&lt;br /&gt;
* создание проектов;&lt;br /&gt;
* открытие редакторов, view или wizard по идентификатору;&lt;br /&gt;
* копирование в буфер обмена;&lt;br /&gt;
* получение содержимого редакторов;&lt;br /&gt;
* сохранение открытых редакторов.&lt;br /&gt;
=== Статьи по SWT ===&lt;br /&gt;
[http://www.vogella.com/tutorials/SWT/article.html Вот здесь] вводная статья по SWT - объясняются основные концепции, какие виджеты бывают и как используются layout.&lt;br /&gt;
&lt;br /&gt;
А [http://www.vogella.com/tutorials/EclipseJFaceTable/article.html здесь] статья про JFace - библиотеку, упрощающую работу с таблицами и деревьями.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2</id>
		<title>Подключение скриптов</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2"/>
				<updated>2014-10-09T10:32:32Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Для подключения скриптов во [[Freemarker]]'е используется директива #include. В BeanExplorer4 включен собственный загрузчик скриптов, который загружает их из [[структура проекта|дерева проекта]]. Соответственно путь вам надо писать относительно текущего скрипта в дереве. Например, для подключения скрипта в той же папке надо написать просто его имя (без расширения .ftl, так как в дереве проекта расширений нет). Для подключения макросов из модуля можно написать, например, так (учитывая, что текущий скрипт находится в myproject/application/Scripts):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;#include &amp;quot;../../Modules/realty/Macros/somemodulemacros&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметьте, что скрипт common.ftl из каждого доступного модуля подключается автоматически.&lt;br /&gt;
&lt;br /&gt;
Если подключаемый скрипт отсутствует, вы получите ошибку выполнения Freemarker. Иногда требуется игнорировать отсутствие скрипта. Тогда можно подписать к пути скрипта :optional. Например, так можно подключить специфичные для региона словари, если они есть:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;#if REGION??&amp;gt;&lt;br /&gt;
 &amp;lt;#include '${REGION}/dictionaries:optional'&amp;gt;&lt;br /&gt;
 &amp;lt;/#if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Documentation</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Documentation"/>
				<updated>2014-09-19T10:02:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Lan переименовал страницу Documentation в Документация без оставления перенаправления: По-русски&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:DocumentationEditing.png|thumb|Редактирование документации]]&lt;br /&gt;
[[:Категория:Элементы с поддержкой документации|Многие элементы]] в [[Структура проекта|дереве проекта]] поддерживают документацию: вы можете написать произвольный сопроводительный текст. В интерфейсе для этого есть вкладка Documentation: достаточно выделить в дереве проекта элемент, который вы хотите документировать, и написать текст во вкладке.&lt;br /&gt;
&lt;br /&gt;
Помимо просто текста можно автоматически создавать задачи, если написать в документации &amp;lt;code&amp;gt;@todo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;@check&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;@pending&amp;lt;/code&amp;gt;. Текст после этой метки автоматически попадёт в [[Tasks|список задач]] проекта.&lt;br /&gt;
&lt;br /&gt;
Документация сериализуется в [[yaml]]-элемент doc внутри соответствующего родительского элемента.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/TableRef</id>
		<title>TableRef</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/TableRef"/>
				<updated>2014-09-19T09:12:28Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.TableRef|нет|да}}&lt;br /&gt;
&lt;br /&gt;
'''Ссылка на ключ в другой таблице''' (TableRef) позволяет устанавливать вспомогательные связи между таблицами, которые могут использоваться [[Operation|операциями]], например, для заполнения выпадающих списков. Связь имеет следующие свойства:&lt;br /&gt;
&lt;br /&gt;
* tableFrom: исходная сущность. Это та [[Entity|сущность]], в которой связь объявлена.&lt;br /&gt;
* columnFrom: исходная колонка. В данном случае это псевдо-колонка (например, kladr::search::street). Если вы хотите установить связь к существующей колонке, это необходимо сделать непосредственно в [[ColumnDef|определении колонки]].&lt;br /&gt;
* tableTo: целевая сущность.&lt;br /&gt;
* columnTo: целевая колонка. Может быть не указана, тогда автоматически используется первичный ключ целевой сущности.&lt;br /&gt;
* view: имя [[Query|представления]] в целевой сущности, которое используется для выбора элементов. По умолчанию — *** Selection view ***.&lt;br /&gt;
&lt;br /&gt;
Ссылки располагаются в дереве проекта в папке References внутри сущности. Имя ссылки формируется автоматически по имени колонки и целевой сущности.&lt;br /&gt;
&lt;br /&gt;
Ссылки сериализуются в [[yaml]]-файл сущности в секцию references. В качестве ключа указывается columnFrom. Свойства tableTo и columnTo сериализуются в одно поле to через точку. Если кроме поля to ничего нет, можно имя поля опустить.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
 users:&lt;br /&gt;
   references:&lt;br /&gt;
     kladr::search::city:&lt;br /&gt;
       to: addresses.dummy&lt;br /&gt;
       view: City from KLADR&lt;br /&gt;
Здесь создаётся ссылка с tableFrom = users, columnFrom = kladr::search::city, tableTo = addresses, columnTo = dummy, view = City from KLADR (такое представление должно существовать в сущности addresses, иначе будет предупреждение при [[синхронизация|синхронизации]]).&lt;br /&gt;
&lt;br /&gt;
 buildings:&lt;br /&gt;
   references:&lt;br /&gt;
     buildingID: buildings&lt;br /&gt;
Здесь создаётся ссылка с tableFrom = buildings, columnFrom = buildingID, tableTo = buildings, columnTo = ID (первичный ключ у таблицы buildings), view = *** Selection view *** (по умолчанию).&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Yaml</id>
		<title>Yaml</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Yaml"/>
				<updated>2014-09-19T08:44:34Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «{{Stub}} '''Yaml''' — основной формат структурированных данных, который используется в [[BeanExplorer4]…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
'''Yaml''' — основной формат структурированных данных, который используется в [[BeanExplorer4]].&lt;br /&gt;
&lt;br /&gt;
Дополнительная информация по Yaml здесь:&lt;br /&gt;
* http://ru.wikipedia.org/wiki/YAML&lt;br /&gt;
* http://www.yaml.org/&lt;br /&gt;
&lt;br /&gt;
Для работы с Yaml в BeanExplorer4 используется библиотека [https://code.google.com/p/snakeyaml/ SnakeYaml]&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/LanguageLocalizations</id>
		<title>LanguageLocalizations</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/LanguageLocalizations"/>
				<updated>2014-09-19T08:40:33Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: +пример&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
{{ElementType|com.beanexplorer.enterprise.metadata.model.LanguageLocalizations|да}}&lt;br /&gt;
'''Локализации для языка''' — папка, расположенная внутри папки [[Localizations|Localization]], которая содержит локализованные сообщения для конкретного языка. Имя папки — двухбуквенный код [https://ru.wikipedia.org/wiki/ISO_639-1 ISO 639-1], обозначающий язык (например, ru для русского). Дочерние элементы — [[EntityLocalizations|локализации для сущностей]].&lt;br /&gt;
&lt;br /&gt;
Локализация для каждого языка сериализуется в отдельный [[yaml]]-файл по умолчанию в папке src/l10n. На верхнем уровне содержится секция документации (doc) и секция сущностей (entities), в которую сериализуются локализации для сущностей. Пример:&lt;br /&gt;
 ru:&lt;br /&gt;
   doc: |-&lt;br /&gt;
     Локализованные сообщения для русского языка&lt;br /&gt;
     @TODO: навести порядок&lt;br /&gt;
   entities:&lt;br /&gt;
   - algorithmDetails:&lt;br /&gt;
     - topics: All records&lt;br /&gt;
       entries:&lt;br /&gt;
       - Algorithm: Алгоритм&lt;br /&gt;
   - categories:&lt;br /&gt;
     - topics:&lt;br /&gt;
       - '*** Selection view ***'&lt;br /&gt;
       - All records&lt;br /&gt;
       entries:&lt;br /&gt;
       - Type: Тип&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BE%D0%BA</id>
		<title>Типы колонок</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BE%D0%BA"/>
				<updated>2014-09-19T08:28:18Z</updated>
		
		<summary type="html">&lt;p&gt;Fedor: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=&amp;gt; github/be5 +&lt;br /&gt;
&lt;br /&gt;
В BeanExplorer4 определены типы [[ColumnDef|колонок]] таблиц, независимые от движка СУБД. В коде тип колонок хранится в классе {{Class|com.beanexplorer.enterprise.metadata.model.SqlColumnType}}. У типа всегда есть строковое представление. Имеются следующие типы:&lt;br /&gt;
* KEYTYPE — тип, который используется по умолчанию для первичного ключа таблицы (обычно совпадает с BIGINT).&lt;br /&gt;
* Текстовые:&lt;br /&gt;
:* CHAR — строка фиксированной длины. Длина задаётся в скобках. Например: CHAR(10).&lt;br /&gt;
:* VARCHAR — строка произвольной длины вплоть до заданной. Длина задаётся в скобках. Например: VARCHAR(15).&lt;br /&gt;
:* TEXT — большое текстовое поле (не меньше 4000 символов).&lt;br /&gt;
:* BIGTEXT — очень большое текстовое поле {{TODO|уточнить минимальную длину}}.&lt;br /&gt;
* Двоичные:&lt;br /&gt;
:* BLOB — бинарные данные {{TODO|уточнить минимальную длину}}.&lt;br /&gt;
:* MEDIUMBLOB — бинарные данные {{TODO|уточнить минимальную длину}}.&lt;br /&gt;
* Численные:&lt;br /&gt;
:* INT — целое знаковое число (минимум 32-битное).&lt;br /&gt;
:* INT UNSIGNED — целое беззнаковое число (минимум 32-битное). Поддерживается не всеми движками.&lt;br /&gt;
:* BIGINT — целое знаковое число (минимум 64-битное).&lt;br /&gt;
:* BIGINT UNSIGNED — целое беззнаковое число (минимум 64-битное). Поддерживается не всеми движками.&lt;br /&gt;
:* SMALLINT — целое знаковое число (минимум 16-битное).&lt;br /&gt;
:* DECIMAL — дробное число указанной длины с указанной точностью (количество десятичных знаков). Например DECIMAL(10,2).&lt;br /&gt;
:* CURRENCY — валюта. Сейчас совпадает с DECIMAL(18,2).&lt;br /&gt;
* Дата и время:&lt;br /&gt;
:* DATE — дата.&lt;br /&gt;
:* DATETIME — дата и время.&lt;br /&gt;
:* TIMESTAMP — дата и время. Совпадает с DATETIME во всех движках кроме MySQL. Подробнее тут: [http://habrahabr.ru/post/61391/ Datetime или timestamp].&lt;br /&gt;
* Перечислимые:&lt;br /&gt;
:* ENUM — перечисление допустимых значений. Например ENUM(on,off,pending)&lt;br /&gt;
:* BOOL — допустимо два значения — 'no' и 'yes' (совпадает с ENUM(no,yes))&lt;br /&gt;
&lt;br /&gt;
=== Сопоставление типов колонок ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse: collapse; text-align: center;&amp;quot;&lt;br /&gt;
||'''Тип BE4'''&lt;br /&gt;
||'''MySQL'''&lt;br /&gt;
||'''PostGres'''&lt;br /&gt;
||'''DB2'''&lt;br /&gt;
||'''MS SQL 2008'''&lt;br /&gt;
||'''Oracle'''&lt;br /&gt;
|-&lt;br /&gt;
|'''BLOB'''&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|MEDIUMBLOB&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|BYTEA&lt;br /&gt;
|BLOB(4M)&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|IMAGE&lt;br /&gt;
|BLOB&lt;br /&gt;
|-&lt;br /&gt;
|'''MEDIUMBLOB'''&lt;br /&gt;
|BLOB(16M)&lt;br /&gt;
|MEDIUMBLOB&lt;br /&gt;
|-&lt;br /&gt;
|'''TEXT'''&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot;|TEXT&lt;br /&gt;
|CLOB(64K)&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|VARCHAR(MAX)&lt;br /&gt;
|VARCHAR2(4000 CHAR)&lt;br /&gt;
|-&lt;br /&gt;
|'''BIGTEXT'''&lt;br /&gt;
|CLOB(128K)&lt;br /&gt;
|CLOB&lt;br /&gt;
|-&lt;br /&gt;
|'''VARCHAR'''&lt;br /&gt;
|VARCHAR&lt;br /&gt;
(если размер &amp;gt;255, то TEXT)&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|VARCHAR&lt;br /&gt;
|VARCHAR2&lt;br /&gt;
|-&lt;br /&gt;
|'''CHAR'''&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;|CHAR&lt;br /&gt;
|-&lt;br /&gt;
|'''KEYTYPE'''&lt;br /&gt;
|BIGINT UNSIGNED&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot;|BIGINT&lt;br /&gt;
|VARCHAR2(15 CHAR)&lt;br /&gt;
|-&lt;br /&gt;
|'''INT'''&lt;br /&gt;
|INT&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;3&amp;quot;|INT&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|NUMBER(10)&lt;br /&gt;
|-&lt;br /&gt;
|'''INT UNSIGNED'''&lt;br /&gt;
|INT UNSIGNED&lt;br /&gt;
|-&lt;br /&gt;
|'''BIGINT'''&lt;br /&gt;
|BIGINT&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;3&amp;quot;|BIGINT&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|NUMBER(20)&lt;br /&gt;
|-&lt;br /&gt;
|'''BIGINT UNSIGNED'''&lt;br /&gt;
|BIGINT UNSIGNED&lt;br /&gt;
|-&lt;br /&gt;
|'''SMALLINT'''&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;|SMALLINT&lt;br /&gt;
|NUMBER(5)&lt;br /&gt;
|-&lt;br /&gt;
|'''DECIMAL'''&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;|DECIMAL&lt;br /&gt;
|NUMBER&lt;br /&gt;
|-&lt;br /&gt;
|'''CURRENCY'''&lt;br /&gt;
|colspan=&amp;quot;4&amp;quot;|DECIMAL(18,2)&lt;br /&gt;
|NUMBER(18,2)&lt;br /&gt;
|-&lt;br /&gt;
|'''DATE'''&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot;|DATE&lt;br /&gt;
|-&lt;br /&gt;
|'''DATETIME'''&lt;br /&gt;
|DATETIME&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot;|TIMESTAMP&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|DATETIME&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|TIMESTAMP&lt;br /&gt;
|-&lt;br /&gt;
|'''TIMESTAMP'''&lt;br /&gt;
|TIMESTAMP&lt;br /&gt;
|-&lt;br /&gt;
|'''ENUM'''&lt;br /&gt;
|ENUM&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;3&amp;quot;|VARCHAR + CONSTRAINT&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|VARCHAR2 + CONSTRAINT&lt;br /&gt;
|-&lt;br /&gt;
|'''BOOL'''&lt;br /&gt;
|ENUM('no','yes')&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/StaticPage</id>
		<title>StaticPage</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/StaticPage"/>
				<updated>2014-09-17T04:58:39Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «{{ElementType|com.beanexplorer.enterprise.metadata.model.StaticPage|нет}} Статическая страница (static page) — предопределён…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.StaticPage|нет}}&lt;br /&gt;
Статическая страница (static page) — предопределённая HTML-страница с заданным именем. Для каждого языка локализации может быть свой вариант страницы с данным именем. По соглашению принято добавлять к именам статических страниц суффикс .be. По умолчанию статические страницы сериализуются в файл pages.yaml. Если указать статической странице имя файла, то её содержимое будет сериализовано в отдельный файл (по умолчанию в каталоге src/pages). Статических страниц не может быть в проекте-модуле.&lt;br /&gt;
&lt;br /&gt;
Для отображения статической страницы надо создать в дереве статическое [[Query|представление]], указав имя статической страницы в качестве кода.&lt;br /&gt;
&lt;br /&gt;
=== Пример файла pages.yaml ===&lt;br /&gt;
 pages:&lt;br /&gt;
   ru:&lt;br /&gt;
     emailVerified.be:&lt;br /&gt;
       file: emailVerified.html&lt;br /&gt;
     welcome.be: |2&lt;br /&gt;
       &amp;amp;lt;h2&amp;amp;gt;Добро пожаловать в наше приложение!&amp;amp;lt;/h2&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
Страница emailVerified.be подгрузится из внешнего файла src/pages/emailVerified.be, а текст страницы welcome.be размещён непосредственно в pages.yaml.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/IndexDef</id>
		<title>IndexDef</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/IndexDef"/>
				<updated>2014-09-16T09:30:13Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.IndexDef|да|да}}&lt;br /&gt;
'''Индекс''' (IndexDef) — это определение индекса для таблицы в базе данных. Элементы IndexDef расположены внутри [[TableDef|определения таблицы]] в папке Indices. У индекса есть имя, признак уникальности (unique) и набор [[IndexColumnDef|колонок]] (как минимум одна), которые отображаются в дереве [[Project|проекта]] как дочерние элементы.&lt;br /&gt;
&lt;br /&gt;
Длина имени индекса ограничена 30 символами, но обратите внимание, что в DB2 не удастся создать индекс с именем длиннее 18 символов. Также обратите внимание, что не все СУБД поддерживают функциональные индексы (смотрите [[IndexColumnDef|определение колонки индекса]]).&lt;br /&gt;
&lt;br /&gt;
Любые изменения индексов (включая удаление) считаются неопасными, поэтому выполняются без предупреждения при [[Синхронизация|синхронизации]] со структурой. Любое изменение индекса при синхронизации приведёт к его уничтожению и повторному созданию.&lt;br /&gt;
&lt;br /&gt;
Определения индексов записывается в [[yaml]]-файле [[Entity|представления]] в секции indices внутри секции scheme. Примеры:&lt;br /&gt;
&lt;br /&gt;
 buildings:&lt;br /&gt;
  scheme:&lt;br /&gt;
    ...&lt;br /&gt;
    indices:&lt;br /&gt;
    - IDX_BUID_ID_KLADRCODE:&lt;br /&gt;
        unique: true&lt;br /&gt;
        columns:&lt;br /&gt;
        - ID&lt;br /&gt;
        - kladrStreetCode&lt;br /&gt;
        extras: kladr&lt;br /&gt;
    - IDX_BUILD_KLADR:&lt;br /&gt;
        columns: kladrStreetCode&lt;br /&gt;
        extras: kladr&lt;br /&gt;
        doc: значения могут быть не уникальны&lt;br /&gt;
    - IDX_BUILDINGS_NWK:&lt;br /&gt;
        unique: true&lt;br /&gt;
        columns:&lt;br /&gt;
        - buildingNo&lt;br /&gt;
        - lower(wing)&lt;br /&gt;
        - lower(letters)&lt;br /&gt;
        - kladrStreetCode&lt;br /&gt;
        extras: kladr&lt;br /&gt;
        doc: функциональный индекс с уникальными значениями&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/IndexColumnDef</id>
		<title>IndexColumnDef</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/IndexColumnDef"/>
				<updated>2014-09-16T08:20:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Новая страница: «{{ElementType|com.beanexplorer.enterprise.metadata.model.IndexColumnDef|нет}} '''Колонка индекса''' — дочерний элемент IndexDe…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.IndexColumnDef|нет}}&lt;br /&gt;
'''Колонка индекса''' — дочерний элемент [[IndexDef|индекса]]. Имя элемента — имя колонки, по которой выполняется индексирование. Также может содержать описание дополнительного преобразования. Поддерживаются следующие преобразования:&lt;br /&gt;
&lt;br /&gt;
* upper: в индекс будет внесено содержимое колонки в верхнем регистре&lt;br /&gt;
* lower: в индекс будет внесено содержимое колонки в нижнем регистре&lt;br /&gt;
* generic: к содержимому колонки слева будет подписано имя таблицы и точка (для индексирования по ключу таблиц, на которые имеются generic-ссылки)&lt;br /&gt;
&lt;br /&gt;
Если в индексе имеется хотя бы одна колонка с преобразованием, индекс становится функциональным. Не все движки баз данных поддерживают функциональные индексы. Если такой индекс определён, но не поддерживается, он не будет добавлен в базу и вы получите соответствующее предупреждение при синхронизации.&lt;br /&gt;
&lt;br /&gt;
Колонка индекса сериализуется просто. Если преобразования нет, то это имя колонки. Если есть преобразование, пишется его имя, затем в скобках имя колонки. Например:&lt;br /&gt;
    indices:&lt;br /&gt;
    - IDX_OCCUP_ID_CONCAT:&lt;br /&gt;
        unique: true&lt;br /&gt;
        columns: generic(ID)&lt;br /&gt;
&lt;br /&gt;
или&lt;br /&gt;
&lt;br /&gt;
    indices:&lt;br /&gt;
    - IDX_BUILDINGS_NWK:&lt;br /&gt;
        unique: true&lt;br /&gt;
        columns:&lt;br /&gt;
        - buildingNo&lt;br /&gt;
        - lower(wing)&lt;br /&gt;
        - lower(letters)&lt;br /&gt;
        - kladrStreetCode&lt;br /&gt;
        extras: kladr&lt;br /&gt;
&lt;br /&gt;
Разумеется, порядок колонок в индексе имеет значение.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Daemon</id>
		<title>Daemon</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Daemon"/>
				<updated>2014-09-11T07:53:16Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.Daemon|да|да}}&lt;br /&gt;
&lt;br /&gt;
Демон (Daemon) — фоновый процесс BeanExplorer. Вы можете определять своих демонов как в [[Project|проекте]], так и в [[Module|модулях]].&lt;br /&gt;
&lt;br /&gt;
Демон имеет следующие свойства:&lt;br /&gt;
;Имя&lt;br /&gt;
:уникальное имя демона. Если хочется запустить несколько одинаковых демонов, имена всё равно должны быть разными.&lt;br /&gt;
;Класс (className)&lt;br /&gt;
:полное имя класса демона (должен наследовать {{Class|com.beanexplorer.enterprise.process.Daemon}})&lt;br /&gt;
;Секция конфигурации (configSection)&lt;br /&gt;
:Имя секции в таблице [[systemSettings]], которая будет по умолчанию относиться к демону. Чтобы достать настройки из этой секции, используйте метод {{Method|com.beanexplorer.enterprise.process.Daemon.getSetting(String)}}.&lt;br /&gt;
;Тип демона (daemonType)&lt;br /&gt;
:Одно из следующих значений:&lt;br /&gt;
:*periodic&lt;br /&gt;
:*cron&lt;br /&gt;
:*service&lt;br /&gt;
:*manual&lt;br /&gt;
;Описание (description)&lt;br /&gt;
:Описание демона&lt;br /&gt;
;slaveNo&lt;br /&gt;
&lt;br /&gt;
Демоны сохраняются по умолчанию в файл daemons.yaml. В дереве проекта они хранятся в коллекции Daemons внутри [[Module|модуля]].&lt;br /&gt;
&lt;br /&gt;
Пример задания демона в [[yaml]]:&lt;br /&gt;
 daemons:&lt;br /&gt;
   CheckRequestsDaemon:&lt;br /&gt;
     className: com.myproject.daemons.CheckRequestsDaemon&lt;br /&gt;
     configSection: CheckRequestsDaemon&lt;br /&gt;
     daemonType: periodic&lt;br /&gt;
     description: Daemon to check the requests&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/RoleGroup</id>
		<title>RoleGroup</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/RoleGroup"/>
				<updated>2014-09-11T07:31:51Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.RoleGroup|нет}}&lt;br /&gt;
&lt;br /&gt;
Группа ролей (role group) — поименованная совокупность [[role|ролей]], которую можно назначить разом какому-либо элементу (например, [[Operation|операции]] или [[Query|представлению]]). При использовании в списке ролей группы необходимо перед её именем поместить символ '@'. Группы ролей позволяют кастомизировать права доступа для [[Module|модулей]]: вы можете определить в модуле группу и задать ей набор ролей по умолчанию (обычно пустой), а в проекте приложения переопределить эту группу, задав другие роли. Поэтому рекомендуется использовать в модулях только группы ролей.&lt;br /&gt;
&lt;br /&gt;
Одна группа может включать другую группу. Циклическое включение не приведёт к ошибкам и какому-либо эффекту.&lt;br /&gt;
&lt;br /&gt;
Для удобства существуют также предопределённые группы: &amp;lt;code&amp;gt;@AllRoles&amp;lt;/code&amp;gt; (все доступные роли проекта) и &amp;lt;code&amp;gt;@AllRolesExceptGuest&amp;lt;/code&amp;gt; (все роли кроме роли Guest).&lt;br /&gt;
&lt;br /&gt;
Группы ролей по умолчанию сериализуются в файл security.yaml, в секцию groups. В дереве [[Project|проекта]] они хранятся в папке Security/Role groups.&lt;br /&gt;
&lt;br /&gt;
Пример задания группы ролей в [[yaml]]:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   groups:&lt;br /&gt;
     PortalReadOnlyRoles: '@AllRolesExceptGuest'&lt;br /&gt;
     UtilityDispatcherRoles: Dispatcher&lt;br /&gt;
     SocRegReadWriteRoles:&lt;br /&gt;
     - Operator&lt;br /&gt;
     - Reception&lt;br /&gt;
     UtilityAddressManagerRoles: []&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Role</id>
		<title>Role</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Role"/>
				<updated>2014-09-11T05:56:06Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.Role|да|да}}&lt;br /&gt;
&lt;br /&gt;
Роль (role) — это базовый элемент подсистемы безопасности. Роли могут выдаваться конкретным пользователям. [[Operation|Операции]] и [[Query|представления]] могут быть доступны определённым ролям. Роли могут объединяться в [[RoleGroup|группы ролей]], но при внесении в базу группы разворачиваются, поэтому в базе есть только отдельные роли.&lt;br /&gt;
&lt;br /&gt;
Обычно роли называют с большой буквы в CamelCase (например, SecurityOperator, Accountant и т. д.). Имеются стандартные роли, которые могут специально обрабатываться BeanExplorer: Administrator, Guest, DbAdmin, SystemDeveloper.&lt;br /&gt;
&lt;br /&gt;
Роли вместе с группами ролей по умолчанию сохраняются в файл security.yaml в секцию roles. В дереве [[Project|проекта]] они хранятся в папке Security/Roles.&lt;br /&gt;
&lt;br /&gt;
Для ролей поддерживаются [[extras]].&lt;br /&gt;
&lt;br /&gt;
Пример задания ролей в [[yaml]]:&lt;br /&gt;
&lt;br /&gt;
 security:&lt;br /&gt;
   roles:&lt;br /&gt;
     Administrator: {}&lt;br /&gt;
     Cashier:&lt;br /&gt;
       doc: Учет поступления оплаты от населения за услуги ЖКХ&lt;br /&gt;
     NeedyFamilies:&lt;br /&gt;
       doc: Учет малообеспеченных семей, семей &amp;quot;группы риска&amp;quot; и семей в трудной жизненной ситуации&lt;br /&gt;
       extras: module:soccalc&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Extras</id>
		<title>Extras</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Extras"/>
				<updated>2014-09-05T08:04:34Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Extras''' — способ задания условий, по которым данный элемент [[Project|проекта]] будет использоваться. На данный момент поддерживается для следующих типов элементов:&lt;br /&gt;
* [[Entity|Сущность (entity)]]&lt;br /&gt;
* [[Query|Представление (query)]]&lt;br /&gt;
* [[Operation|Операция (operation)]]&lt;br /&gt;
* [[ColumnDef|Определение колонки (columnDef)]]&lt;br /&gt;
* [[IndexDef|Определение индекса (indexDef)]]&lt;br /&gt;
* [[Role|Роль (role)]]&lt;br /&gt;
* [[Daemon|Демон (daemon)]]&lt;br /&gt;
* [[TableRef|Ссылка на другую колонку (tableRef)]]&lt;br /&gt;
&lt;br /&gt;
Extras — набор текстовых строк, представляющих собой условия. Если строк несколько, требуется соблюдение всех условий сразу.&lt;br /&gt;
&lt;br /&gt;
Каждая строка имеет следующий формат:&lt;br /&gt;
 [!]&amp;lt;prefix&amp;gt;:&amp;lt;value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Восклицательный знак означает отрицание (элемент доступен в случае, если условие не выполнено). Определены следующие префиксы:&lt;br /&gt;
* '''db''' — используется ли данный движок СУБД. Возможные значения value: db2, mysql, oracle, sqlserver, postgres&lt;br /&gt;
* '''dbcap''' — обладает ли движок СУБД определённой функциональностью. На данный момент возможны следующие значения:&lt;br /&gt;
** '''fnindex''' — поддерживаются ли функциональные индексы&lt;br /&gt;
** '''customincrement''' — поддерживается ли создание autoincrement-колонки, начинающейся с определённого значения&lt;br /&gt;
** '''gencolumn''' — поддерживаются ли вычислимые колонки. Если да, можно использовать в качестве default value колонки что-то типа generic(ID)&lt;br /&gt;
* '''module''' — присутствует ли в проекте [[Module|модуль]] с данным именем.&lt;br /&gt;
* '''feature''' — подключена ли указанная фича.&lt;br /&gt;
* '''extra''' — доступен ли указанный extras в указанном модуле (формат: &amp;lt;code&amp;gt;extra:moduleName::extraName&amp;lt;/code&amp;gt;). Может потребоваться, если надо проверить extras, объявленный для другого модуля.&lt;br /&gt;
* '''var''' — определена ли указанная переменная или равна ли она заданному значению. К примеру &amp;lt;code&amp;gt;var:REGION=54&amp;lt;/code&amp;gt; выполняется, если определена переменная REGION и её значение — 54.&lt;br /&gt;
&lt;br /&gt;
Также в модулях в качестве extras может встречаться просто строка. Если та же строка определена в проекте приложения в секции данного модуля, то этот extras выполняется.&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/MassChange</id>
		<title>MassChange</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/MassChange"/>
				<updated>2014-09-02T09:19:20Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: опечатка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.MassChange|да}}&lt;br /&gt;
&lt;br /&gt;
'''MassChange''' (массовое изменение) — возможность применить однотипное изменение к различным элементам дерева [[Project|проекта]] по условию. В дереве проекта хранятся в коллекции Mass changes в [[Module|модуле]] приложения. На файловой системе хранятся по умолчанию в src/massChanges.yaml. Пример:&lt;br /&gt;
&lt;br /&gt;
 - select: Entity#messages Query&lt;br /&gt;
   roles: []&lt;br /&gt;
&lt;br /&gt;
Данное массовое изменение выбирает все представления сущности messages и устанавливает им пустой список ролей.&lt;br /&gt;
&lt;br /&gt;
Каждый элемент списка содержит селектор (select) и определение элемента. Для всех элементов, которые соответствуют селектору, производится переопределение указанных свойств точно так же, как в приложении кастомизируется элемент из модуля. В принципе селектор может соответствовать элементам разного типа, в некоторых случаях это сработает. Например:&lt;br /&gt;
 - select: Entity#blahblah Query, Entity#blahblah Operation&lt;br /&gt;
   roles: []&lt;br /&gt;
Удалит все роли у всех представлений и операций сущности blahblah. Но лучше разносить подобное на отдельные селекторы.&lt;br /&gt;
&lt;br /&gt;
Селектор пока может выбирать Query, Operation или Entity. Если селектор выбрал что-то другое, будет ошибка.&lt;br /&gt;
&lt;br /&gt;
== Селекторы ==&lt;br /&gt;
Синтаксис селекторов похож на CSS. Спецсимволы обрабатываются в соответствии со [http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier стандартом CSS]. Поддерживаются следующие возможности:&lt;br /&gt;
&lt;br /&gt;
* Выбор по классу (аналог CSS [http://www.w3.org/TR/selectors4/#type-selector type selector]). Указывается просто название типа элементов. Пока поддерживаются Module, Entity, Query, Operation. Например:&lt;br /&gt;
 Operation&lt;br /&gt;
:Такой селектор просто выберет все представления.&lt;br /&gt;
:&lt;br /&gt;
* Выбор по атрибуту (аналог CSS [http://www.w3.org/TR/selectors4/#attribute-representation attribute value selectors]). Поддерживаются формы &amp;lt;code&amp;gt;[attr=val], [attr^=val], [attr$=val], [attr*=val]&amp;lt;/code&amp;gt; для точного совпадения значения, префикса, суффикса и подстроки. Список доступных атрибутов зависит от типа данных и обычно похож на список полей при сериализации в [[yaml]]. Например:&lt;br /&gt;
 [name=&amp;quot;messages&amp;quot;]&lt;br /&gt;
:Такой селектор выберет все элементы с именем messages.&lt;br /&gt;
:&lt;br /&gt;
* Выбор имени. Для сокращения предыдущий селектор можно написать так:&lt;br /&gt;
 #messages&lt;br /&gt;
:Но при этом значение уже должно удовлетворять свойствам идентификатора, а не строки (например, нужно экранировать пробелы).&lt;br /&gt;
:&lt;br /&gt;
* Выбор типа. У Entity, Query и Operation бывает тип. Его можно выбрать через &amp;lt;code&amp;gt;[type=&amp;quot;...&amp;quot;]&amp;lt;/code&amp;gt;, но короче через точку:&lt;br /&gt;
 .table&lt;br /&gt;
:Выберет все элементы с типом table. Доступные типы:&lt;br /&gt;
:* Для Entity: table, dictionary, collection, genericCollection, metadata&lt;br /&gt;
:* Для Query: 1D, 1D_unknown, 2D, static, custom, container, javascript&lt;br /&gt;
:* Для Operation: java, sql, javafunction, js (=javascript), jsserver (=javascriptserver), dotnet, javadotnet&lt;br /&gt;
&lt;br /&gt;
* Сложный селектор (CSS: [http://www.w3.org/TR/selectors4/#compound compound selector]). Несколько правил, написанных слитно. Выбирается элемент, удовлетворяющий всем правилам. Например:&lt;br /&gt;
 Entity#messages&lt;br /&gt;
:Тут два правила: выбрать элементы по классу Entity (то есть сущности) и выбрать элементы с именем messages. В результате будет выбрана сущность с именем messages.&lt;br /&gt;
:&lt;br /&gt;
* Комбинатор-потомок (CSS: [http://www.w3.org/TR/selectors4/#descendant-combinators descendant combinator]). Если перечислить несколько селекторов через пробел, будут выбраны элементы, удовлетворяющие последнему селектору, у которых есть родитель (не обязательно непосредственный), удовлетворяющий предпоследнему, и т. д. Например:&lt;br /&gt;
 Entity#messages Query&lt;br /&gt;
:Выберет все представления сущности с именем messages. Другие CSS-комбинаторы (&amp;gt;, +, ~) не поддерживаются.&lt;br /&gt;
:&lt;br /&gt;
* Список селекторов (CSS: [http://www.w3.org/TR/selectors4/#grouping selector list]). Можно перечислить через запятую несколько селекторов, тогда элемент будет выбран, если он подходит под любой из селекторов. Например:&lt;br /&gt;
 Query, Operation&lt;br /&gt;
:Выберет все представления и все операции.&lt;br /&gt;
:&lt;br /&gt;
* Псевдокласс :not (CSS: [http://www.w3.org/TR/selectors4/#negation negation]). Выберет элементы, которые не удовлетворяют заданному в скобках селектору. Например:&lt;br /&gt;
 Entity:not(.table)&lt;br /&gt;
:Выберет все сущности, тип которых не table.&lt;br /&gt;
:&lt;br /&gt;
* Псевдокласс :matches (CSS: [http://www.w3.org/TR/selectors4/#matches matches]). Выберет элементы, которые удовлетворяют хотя бы одному из заданных в скобках селекторов. Например:&lt;br /&gt;
 Entity:matches(#users,#persons) Query&lt;br /&gt;
:Выберет все представления из сущностей с именами users и persons.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Примеры старого &amp;lt;code style=&amp;quot;color: blue&amp;quot;&amp;gt;SQL&amp;lt;/code&amp;gt;-кода и соответствующего массового изменения:&lt;br /&gt;
=== Изменение кода операций ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;UPDATE operations SET code = 'com.beanexplorer.enterprise.operations.SilentEditOperation'&lt;br /&gt;
 WHERE code = 'com.beanexplorer.enterprise.operations.EditOperation' AND table_name != 'colorSchemes';&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity:not(#colorSchemes) Operation[code=&amp;quot;com.beanexplorer.enterprise.operations.EditOperation&amp;quot;]&lt;br /&gt;
 code: com.beanexplorer.enterprise.operations.SilentEditOperation&lt;br /&gt;
=== Специальная операция для редактирования словарей ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;UPDATE operations SET code = 'com.beanexplorer.ru.social.operations.DictionaryEdit'&lt;br /&gt;
WHERE table_name IN ( SELECT name FROM entities WHERE type = 'dictionary' )&lt;br /&gt;
AND code = 'com.beanexplorer.enterprise.operations.EditOperation'&lt;br /&gt;
AND name = 'Edit';&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity.dictionary Operation#Edit[code=&amp;quot;com.beanexplorer.enterprise.operations.EditOperation&amp;quot;]&lt;br /&gt;
 code: com.beanexplorer.ru.social.operations.DictionaryEdit&lt;br /&gt;
&lt;br /&gt;
=== Удаление ролей для нескольких таблиц ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;DELETE FROM queries_per_role&lt;br /&gt;
WHERE queryID IN ( SELECT q.ID FROM queries q WHERE q.name IN ( 'All records' ) AND q.table_name IN ( 'gpsDeviceTypes', 'gpsDevices' ) );&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity:matches(#gpsDevices,#gpsDeviceTypes) Query[name=&amp;quot;All records&amp;quot;]&lt;br /&gt;
 roles: []&lt;br /&gt;
Или&lt;br /&gt;
 select: Entity[name^=gpsDevice] Query[name=&amp;quot;All records&amp;quot;]&lt;br /&gt;
 roles: []&lt;br /&gt;
=== Удаление ролей для всех операций по имени ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;DELETE FROM operations_per_role&lt;br /&gt;
WHERE operID IN ( SELECT o.ID FROM operations o WHERE o.name IN ( 'Explain Plan', 'Parent Record' ) );&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Operation[name=&amp;quot;Explain Plan&amp;quot;], Operation[name=&amp;quot;Parent Record&amp;quot;]&lt;br /&gt;
 roles: []&lt;br /&gt;
Или&lt;br /&gt;
 select: Operation:matches([name=&amp;quot;Explain Plan&amp;quot;], [name=&amp;quot;Parent Record&amp;quot;])&lt;br /&gt;
 roles: []&lt;br /&gt;
=== Разрешить фильтровать словари всем ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;INSERT INTO operations_per_role&lt;br /&gt;
  SELECT o.ID, r.role_name&lt;br /&gt;
  FROM operations o, roles r&lt;br /&gt;
  WHERE o.table_name IN (&lt;br /&gt;
SELECT  name FROM entities WHERE type = 'dictionary'&lt;br /&gt;
  ) AND o.name IN ( 'Filter' ) AND r.role_name IN (  r.role_name   ) ;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity.dictionary Operation#Filter&lt;br /&gt;
 roles: '@AllRoles'&lt;br /&gt;
=== Администратору базы данных разрешить менять все словари ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;DELETE FROM operations_per_role&lt;br /&gt;
  WHERE role_name IN ( SELECT r.role_name FROM roles r WHERE r.role_name IN ( 'DbAdmin'  ) ) &lt;br /&gt;
  AND operID IN ( SELECT o.ID FROM operations o WHERE o.table_name IN &lt;br /&gt;
  ( SELECT name FROM entities WHERE type='dictionary' AND origin IN ('ru.mfc') ) AND o.name in (  o.name  ) );&lt;br /&gt;
INSERT INTO operations_per_role&lt;br /&gt;
  SELECT o.ID, r.role_name&lt;br /&gt;
  FROM operations o, roles r&lt;br /&gt;
  WHERE o.table_name IN ( SELECT name FROM entities WHERE type='dictionary' AND origin IN ('ru.mfc') ) &lt;br /&gt;
  AND o.name IN (  o.name  ) AND r.role_name IN ( 'DbAdmin'  ) ;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Module#ru\.mfc Entity.dictionary Operation&lt;br /&gt;
 roles: +DbAdmin&lt;br /&gt;
=== Добавить специальный запрос во все сущности кроме dummy ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;INSERT_INTO(queries) table_name, name, isInvisible, query )&lt;br /&gt;
SELECT name, 'Exchange: Modified Data', 'yes',&lt;br /&gt;
  _DBMS_CONCAT( 'SELECT * FROM ', name, '&amp;lt;if parameter=&amp;quot;dateFrom&amp;quot;&amp;gt; WHERE modificationDate___ &amp;gt;= ''&amp;lt;parameter:dateFrom /&amp;gt; 00:00:00''&amp;lt;/if&amp;gt;' )&lt;br /&gt;
FROM entities WHERE SUBSTRING(name,1,1) != '_';&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity:not([name^=_])&lt;br /&gt;
 queries:&lt;br /&gt;
  - 'Exchange: Modified Data':&lt;br /&gt;
          code: SELECT * FROM ${entity.getName()} &amp;lt;if parameter=&amp;quot;dateFrom&amp;quot;&amp;gt; WHERE modificationDate___ &amp;gt;= '&amp;lt;parameter:dateFrom /&amp;gt; 00:00:00'&amp;lt;/if&amp;gt;&lt;br /&gt;
          invisible: true&lt;br /&gt;
=== Добавить запрос Table definition в сущности, primary key которых не является dummy ===&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;-- add missing table defs in one powerful stroke ;-)&lt;br /&gt;
INSERT INTO queries( table_name, name, query, type )&lt;br /&gt;
SELECT e.name, 'Table definition', ' ', '1D'&lt;br /&gt;
FROM entities e&lt;br /&gt;
WHERE e.primaryKeyColumn != '_dummy_'&lt;br /&gt;
 AND NOT EXISTS( SELECT 1 FROM queries q &lt;br /&gt;
WHERE q.table_name = e.name AND q.name = 'Table definition' );&amp;lt;/pre&amp;gt;&lt;br /&gt;
 select: Entity:not([primaryKey=&amp;quot;_dummy_&amp;quot;])&lt;br /&gt;
 queries:&lt;br /&gt;
  - Table definition: {}&lt;/div&gt;</summary>
		<author><name>Lan</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Built-ins_(BeanExplorer4)</id>
		<title>Built-ins (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Built-ins_(BeanExplorer4)"/>
				<updated>2014-08-22T07:16:42Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://freemarker.org/docs/ref_builtins_alphaidx.html Built-ins] во Freemarker — это встроенные суффиксы к значениям (через вопросительный знак), которые выполняют какие-либо преобразования. К примеру, ${&amp;quot;&amp;lt;test&amp;gt;&amp;quot;?[http://freemarker.org/docs/ref_builtins_string.html#ref_builtin_html html]} вернёт &amp;lt;code&amp;gt;&amp;lt;test&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Мы определили ряд дополнительных built-ins (хотя разработчики Freemarker против этого) для упрощения работы именно в контексте BeanExplorer.&lt;br /&gt;
* '''?str''' — превратит строку в sql-строку, используя особенности текущего sql-диалекта. Если аргумент — специальный объект null, то результатом будет строка NULL. Аналог Utils.safestr(connector, text, true). Примеры (для MySQL, в других СУБД результат может отличаться):&lt;br /&gt;
** &amp;lt;code&amp;gt;${&amp;quot;test&amp;quot;}&amp;lt;/code&amp;gt; -&amp;gt; test&lt;br /&gt;
** &amp;lt;code&amp;gt;${&amp;quot;test&amp;quot;?str}&amp;lt;/code&amp;gt; -&amp;gt; 'test'&lt;br /&gt;
** &amp;lt;code&amp;gt;${null?str}&amp;lt;/code&amp;gt; -&amp;gt; NULL&lt;br /&gt;
** &amp;lt;code&amp;gt;${&amp;quot;test'quotes'&amp;quot;?str}&amp;lt;/code&amp;gt; -&amp;gt; 'test&amp;lt;nowiki&amp;gt;''quotes'''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;${concat('col1', ' - '?str, 'col2')}&amp;lt;/code&amp;gt; -&amp;gt; CONCAT( col1, ' - ', col2 )&lt;br /&gt;
* '''?quote''' — обернёт в кавычки идентификатор, если это необходимо. Пример (для MySQL):&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT ${'___whoModified'?quote} FROM myTable&amp;lt;/code&amp;gt; -&amp;gt; SELECT `___whoModified` FROM myTable&lt;br /&gt;
&lt;br /&gt;
* '''?asVarchar''' — добавит преобразование SQL-числа к строке. Примеры (для MySQL):&lt;br /&gt;
** &amp;lt;code&amp;gt;${&amp;quot;ID&amp;quot;?asVarchar}&amp;lt;/code&amp;gt; -&amp;gt; CAST( ID AS CHAR )&lt;br /&gt;
** &amp;lt;code&amp;gt;${concat('ID = '?str, 'ID'?asVarchar)}&amp;lt;/code&amp;gt; -&amp;gt; CONCAT( 'ID = ', CAST (ID AS CHAR) )&lt;br /&gt;
* '''?asDate''' — добавит преобразование SQL-строки к дате.&lt;br /&gt;
* '''?asInt''' — добавит преобразование SQL-строки к числу.&lt;br /&gt;
* '''?asPK''' — добавит преобразование к типу Primary Key. Пример (для MySQL):&lt;br /&gt;
** &amp;lt;code&amp;gt;${'mycolumn'?asPK}&amp;lt;/code&amp;gt; -&amp;gt; CAST( mycolumn AS BIGINT )&lt;br /&gt;
* '''?upper''' — добавит SQL для преобразования в верхний регистр&lt;br /&gt;
* '''?upperFirst''' — добавит SQL для преобразования первого символа в верхний регистр, а последующих — в нижний.&lt;br /&gt;
* '''?lower''' — добавит SQL для преобразования в нижний регистр&lt;br /&gt;
* '''?idCase''' — добавит SQL для преобразования в регистр идентификаторов базы данных (если требуется)&lt;br /&gt;
* '''?dateFormat''' — добавит SQL для форматирования даты в виде YYYY-MM-DD&lt;br /&gt;
* '''?dateFormatRus''' — добавит SQL для форматирования даты в виде DD.MM.YYYY&lt;br /&gt;
* '''?dateTimeFormat''' — добавит SQL для форматирования даты и времени в виде YYYY-MM-DD HH:MM:SS&lt;br /&gt;
* '''?year''' — создаёт SQL для извлечения года из даты&lt;br /&gt;
* '''?month''' — создаёт SQL для извлечения месяца из даты&lt;br /&gt;
* '''?day''' — создаёт SQL для извлечения дня месяца из даты&lt;br /&gt;
* '''?yearStart''' — создаёт SQL для получения первого дня года&lt;br /&gt;
* '''?monthStart''' — создаёт SQL для получения первого дня месяца&lt;br /&gt;
* '''?orEmpty''' — сокращённый вариант для coalesce(arg, &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;?str). Пример (для MySQL):&lt;br /&gt;
** &amp;lt;code&amp;gt;${concat('nameSpace'?orEmpty, 'name'?orEmpty&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;)}&amp;lt;/code&amp;gt; -&amp;gt; CONCAT( COALESCE(nameSpace,&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;),COALESCE(name,&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;) )&lt;br /&gt;
&lt;br /&gt;
* '''?roles''' — развернёт список ролей и групп ролей в просто список ролей через запятую без повторов. Пусть в проекте определены группы @Managers (Manager, Admin) и @Users (User, Manager). Тогда:&lt;br /&gt;
** &amp;lt;code&amp;gt;${'@Managers,@Users,Guest'?roles}&amp;lt;/code&amp;gt; -&amp;gt; 'Admin,Guest,Manager,User'&lt;br /&gt;
'''Совет''': используйте скобки, если хотите применить суффикс к сложному выражению. Например, для запросов второго уровня:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SELECT ${&amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;'SELECT '+concat('name', ' = '?str, 'value') + ' FROM table1'&amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;)?str&amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;} AS &amp;quot;Data;&amp;lt;sql/&amp;gt;&amp;quot; FROM table2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Альтернатива такому синтаксису: использовать предопределённый макрос &amp;lt;@str&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SELECT '''&amp;lt;@_str&amp;gt;'''SELECT ${concat&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;('name', ' = '?str, 'value')} FROM table1'''&amp;lt;/@&amp;gt;'''&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt; AS &amp;quot;Data;&amp;lt;sql/&amp;gt;&amp;quot; FROM table2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут дело вкуса.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D0%BE%D0%B8%D1%85_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%BE%D0%B2_(BeanExplorer4)</id>
		<title>Создание своих макросов (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D0%BE%D0%B8%D1%85_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D0%BE%D0%B2_(BeanExplorer4)"/>
				<updated>2014-08-22T07:15:01Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Официальная документация по созданию макросов Freemarker [http://freemarker.org/docs/ref_directive_macro.html здесь].&lt;br /&gt;
&lt;br /&gt;
Особенности при переходе с m4:&lt;br /&gt;
* Все параметры макроса обязательны кроме тех, которым дано значение по умолчанию. Если раньше у макроса второй параметр был необязателен и писали так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;define(MY_MACRO, ... ifelse($2,,...))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
теперь можно писать так:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;#macro MY_MACRO requiredParameter optionalParameter=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;gt;...&lt;br /&gt;
   &amp;lt;#if optionalParameter==&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&amp;gt;...&amp;lt;#else&amp;gt;...&amp;lt;/#if&amp;gt;...&lt;br /&gt;
 &amp;lt;/#macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* При вызове макроса можно именовать параметры для наглядности:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;@MY_MACRO requiredParameter='val1' optionalParameter='val2'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Чтобы передать результат выполнения макроса в функцию (например, concat), надо присвоить этот результат в переменную с помощью &amp;lt;[http://freemarker.org/docs/ref_directive_assign.html #assign]&amp;gt;. Раньше писали:&lt;br /&gt;
&amp;lt;code&amp;gt;_DBMS_CONCAT( MYMACRO1(arg1), MYMACRO2(arg2) )&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Теперь так:&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;#assign result1&amp;gt;&amp;lt;@MYMACRO1 arg1/&amp;gt;&amp;lt;/#assign&amp;gt;&lt;br /&gt;
 &amp;lt;#assign result2&amp;gt;&amp;lt;@MYMACRO2 arg2/&amp;gt;&amp;lt;/#assign&amp;gt;&lt;br /&gt;
 ${concat(result1, result2)}&lt;br /&gt;
В некоторых случаях лучше определять не макрос, а функцию с помощью директивы &amp;lt;[http://freemarker.org/docs/ref_directive_function.html #function]&amp;gt;. Тогда функцию можно будет использовать:&lt;br /&gt;
&amp;lt;code&amp;gt;${concat( func1(arg1), func2(arg2) )&amp;lt;/code&amp;gt;&lt;br /&gt;
* Аргументы макроса не могут быть напрямую результатом выполнения другого макроса за исключением &amp;lt;#nested&amp;gt;-аргумента. Если у макроса один из аргументов предположительно может быть большим и нетривиальным или макрос по своей семантике его оборачивает, пользуйтесь &amp;lt;#nested&amp;gt;. Так сделан, например, предопределённый макрос &amp;lt;@bold/&amp;gt;:&lt;br /&gt;
 &amp;lt;#macro bold&amp;gt;&lt;br /&gt;
   &amp;lt;#assign nested&amp;gt;&amp;lt;#nested&amp;gt;&amp;lt;/#assign&amp;gt;&lt;br /&gt;
   ${concat('&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;'?str, nested, '&amp;lt;/b&amp;gt;&amp;lt;/nowiki&amp;gt;'?str)}&lt;br /&gt;
 &amp;lt;/#macro&amp;gt;&lt;br /&gt;
Пользоваться им в результате удобно и естественно:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;@bold&amp;gt;&amp;lt;@italic&amp;gt;${concat('a', 'b')}&amp;lt;/@&amp;gt;&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Если макрос не имеет параметров вообще, возможно, стоит присвоить его значение переменной. Так вместо&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;#macro USER_INFO&amp;gt;&lt;br /&gt;
 User:&lt;br /&gt;
   ${concat('u.emailAddress', ' ('?str, &lt;br /&gt;
     'per.courtesy', ' '?str, &lt;br /&gt;
     'per.firstName', ' '?str, &lt;br /&gt;
     'per.lastName', ', #'?str, &lt;br /&gt;
     'per.ID'?asVarchar, ')'?str)}&lt;br /&gt;
 &amp;lt;/#macro&amp;gt;&lt;br /&gt;
Пишем:&lt;br /&gt;
 &amp;lt;#assign USER_INFO&amp;gt;&lt;br /&gt;
 User: &lt;br /&gt;
   ${concat('u.emailAddress', ' ('?str, &lt;br /&gt;
     'per.courtesy', ' '?str, &lt;br /&gt;
     'per.firstName', ' '?str, &lt;br /&gt;
     'per.lastName', ', #'?str, &lt;br /&gt;
     'per.ID'?asVarchar, ')'?str)}&lt;br /&gt;
 &amp;lt;/#assign&amp;gt;&lt;br /&gt;
Тогда обращаться к USER_INFO можно в любом контексте по имени.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B_(BeanExplorer4)</id>
		<title>Пользовательские макросы (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5_%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B_(BeanExplorer4)"/>
				<updated>2014-08-22T07:13:45Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В дереве проекта в application/Macros можно создавать *.ftl-файлы для подключения в других местах. В этих файлах можно разместить макросы, функции, присвоить переменные и т.д. По умолчанию подключается всегда файл common.ftl (если он есть). Внутри этого файла вы можете подключить другие файлы, используя директиву &amp;lt;code&amp;gt;&amp;lt;#include&amp;gt;&amp;lt;/code&amp;gt;. Обратите внимание, что она работает в виртуальной (модельной) файловой системе проекта, поэтому подключать надо с учётом этого.&lt;br /&gt;
&lt;br /&gt;
Макросы из доступных модулей по умолчанию не подключены, но вы также можете [[Подключение скриптов|подключить их]] с помощью &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt;. Например, в вашем приложении в common.ftl может быть написано&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;#include &amp;quot;../../Modules/realty/Macros/common&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда макросы и функции из модуля realty будут доступны во всех запросах.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B_(BeanExplorer4)</id>
		<title>Объекты (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B_(BeanExplorer4)"/>
				<updated>2014-08-22T07:13:00Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div&amp;gt;Для удобства в контексте выполнения Freemarker всегда содержатся некоторые объекты. Внутри конструкций Freemarker (${}, &amp;lt;#&amp;gt; и &amp;lt;@&amp;gt;) ими можно пользоваться как обычными Java-объектами.&lt;br /&gt;
&lt;br /&gt;
Эти объекты определены везде (в Custom scripts и при задании кода представлений):&lt;br /&gt;
* '''project''': объект com.beanexplorer.enterprise.metadata.model.Project; содержит всю иерархию проекта; можно достать любые данные. Примеры:&lt;br /&gt;
** &amp;lt;code&amp;gt;${project.getConnectionProfileName()} &amp;lt;/code&amp;gt;— профиль соединения к базе данных.&lt;br /&gt;
** &amp;lt;code&amp;gt;${project.getEntity('myTable').getQueries().get('myQuery').getMenuName()} &amp;lt;/code&amp;gt;— название пункта меню для представления myQuery в таблице myTable.&lt;br /&gt;
* '''dbPlatform''': строка, определяющая платформу СУБД. Сокращённый вариант для project.getDatabaseSystem().getName(). Пример использования:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT &amp;lt;#if dbPlatform == 'sqlserver'&amp;gt;TOP 1&amp;lt;/#if&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''currentDate''': SQL-выражение для текущей даты в текущей версии СУБД&lt;br /&gt;
* '''currentDateTime''': SQL-выражение для текущего времени в текущей версии СУБД&lt;br /&gt;
* '''fromFakeTable''': SQL-выражение для выборки из псевдо-таблицы (например &amp;quot;FROM DUAL&amp;quot;) в зависимости от текущей версии СУБД&lt;br /&gt;
* '''null''': специальное значение для работы с NULL в SQL. При использовании &amp;lt;code&amp;gt;null?str&amp;lt;/code&amp;gt; вы получите строку NULL. Объект null можно передавать в макросы и функции, которые применят &amp;lt;code&amp;gt;?str&amp;lt;/code&amp;gt; к нему. Использование объекта null другими способами ведёт к неопределённому поведению.&lt;br /&gt;
&lt;br /&gt;
Эти объекты могут быть определены при задании кода представлений или кастомизаций:&lt;br /&gt;
&lt;br /&gt;
* '''module''': объект com.beanexplorer.enterprise.metadata.model.Module, представляющий текущий модуль&lt;br /&gt;
* '''entity''': объект com.beanexplorer.enterprise.metadata.model.Entity, представляющий текущую entity. Пример:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT * FROM ${entity.getName()} &amp;lt;/code&amp;gt;— выбрать все элементы из текущего entity (можно, к примеру, определить такой макрос и использовать его в разных entity).&lt;br /&gt;
&lt;br /&gt;
* '''query''': объект com.beanexplorer.enterprise.metadata.model.Query, представляющий текущее представление.&lt;br /&gt;
* '''operation''': объект com.beanexplorer.enterprise.metadata.model.Operation, представляющий текущую операцию.&lt;br /&gt;
* '''customization''': объект com.beanexplorer.enterprise.metadata.model.PageCustomization, представляющий текущую кастомизацию.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B_(BeanExplorer4)</id>
		<title>Макросы (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9C%D0%B0%D0%BA%D1%80%D0%BE%D1%81%D1%8B_(BeanExplorer4)"/>
				<updated>2014-08-22T07:11:43Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Макросы для использования в запросах: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Шаблонизатор Freemarker поддерживает [http://freemarker.org/docs/dgui_misc_userdefdir.html макросы] или пользовательские директивы. Вы можете создавать свои макросы как непосредственно в месте использования (custom step или в коде представления), так и в отдельном файле macro.ftl (тогда они будут видны во всём проекте).&lt;br /&gt;
&lt;br /&gt;
Имеется также набор предопределённых макросов, которые позволяют выполнить стандартный функционал, полезный в разных проектах. Все эти макросы определены в файле be4/src/com/beanexplorer/enterprise/metadata/freemarker/macro/common.ftl. Все предопределённые макросы начинаются с подчерка. Просьба не создавать макросы с подчерка в своих проектах.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в запросах: ===&lt;br /&gt;
* '''&amp;lt;@_copyQuery name/&amp;gt;''': скопировать текст другого запроса из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''copySelectionQuery/&amp;gt;''': скопировать текст запроса *** Selection view *** из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''copyAllRecordsQuery/&amp;gt;''': скопировать текст запроса All records из текущего entity.&lt;br /&gt;
* '''&amp;lt;@'''_'''str&amp;gt;text&amp;lt;/@'''_'''str&amp;gt;''': превратить текст в SQL-строку (альтернатива суффиксу ?str), удобно использовать для запросов второго уровня.&lt;br /&gt;
* '''&amp;lt;@'''_'''bold&amp;gt;SQL&amp;lt;/@'''_'''bold&amp;gt;''': добавить SQL-код для выделения текста полужирным( '''НО правильнее это делать через CSS!''' ). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt;name&amp;lt;/@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt; FROM myTable &amp;lt;/code&amp;gt;-&amp;gt; (в MySQL) SELECT CONCAT( '&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;',name,'&amp;lt;/b&amp;gt;&amp;lt;/nowiki&amp;gt;' ) FROM myTable&lt;br /&gt;
* '''&amp;lt;@'''_'''italic&amp;gt;SQL&amp;lt;/@'''_'''italic&amp;gt;''': добавить SQL-код для выделения текста курсивом( '''НО правильнее это делать через CSS!''' ).Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''bold&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''italic&amp;gt;name&amp;lt;/@&amp;gt;&amp;lt;/@&amp;gt; FROM myTable &amp;lt;/code&amp;gt;-&amp;gt; (в MySQL) SELECT CONCAT( '&amp;lt;nowiki&amp;gt;&amp;lt;b&amp;gt;',CONCAT( '&amp;lt;i&amp;gt;',name,'&amp;lt;/i&amp;gt;' ),'&amp;lt;/b&amp;gt;&amp;lt;/nowiki&amp;gt;' ) FROM myTable&lt;br /&gt;
* '''&amp;lt;@_align 'side'&amp;gt;SQL&amp;lt;/@_align&amp;gt;''': добавить SQL-код для выравнивания текста( '''НО правильнее это делать через CSS!''' ). Параметр 'side' принимает значения 'left', 'center', 'right', 'justify'&lt;br /&gt;
* '''&amp;lt;@_localize&amp;gt;SQL&amp;lt;/@_localize&amp;gt;''': добавить SQL-код для локализации текста. Полезно при сочетании с другими макросами, например:&lt;br /&gt;
:* &amp;lt;code&amp;gt;SELECT &amp;lt;@_bold&amp;gt;&amp;lt;@_localize&amp;gt;name&amp;lt;/@&amp;gt;&amp;lt;/@&amp;gt; FROM myTable&amp;lt;/code&amp;gt; (в этом случае внутри _localize должен быть самым внутренним макросом)&lt;br /&gt;
* '''&amp;lt;@_substring from [to]&amp;gt;SQL&amp;lt;/@&amp;gt;''': аналог функции substring. Полезен, если в качестве входной строки подаётся сложное выражение: здесь входная строка задаётся вложенным элементом.&lt;br /&gt;
* '''&amp;lt;@_isInRole 'roles'/&amp;gt;''': добавляет условие для проверки обладает ли текущий пользователь хотя бы одной из указанных ролей. Параметры могут включать конкретные роли и группы ролей через запятую, например '''&amp;lt;@_isInRole '@AllRolesExceptGuest'/&amp;gt;'''&lt;br /&gt;
* '''&amp;lt;@_contains list column/&amp;gt;:''' создаёт IN-предложение для списка элементов list и заданной колонки (column IN ('val1', 'val2', ...)).&lt;br /&gt;
* '''&amp;lt;@_selectRow&amp;gt;SQL&amp;lt;/@&amp;gt;:''' добавляет начало и конец SQL-запроса для выбора только одной строки (либо SELECT TOP 1 ..., либо SELECT ... LIMIT 1). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_selectRow&amp;gt; * FROM myTable&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_staticList 'element1' 'element2' ... /&amp;gt;''': создаёт SQL-предложение, выдающее одну колонку с заданными элементами. Удобно использовать для quick filter. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_staticList 'waiting' 'running' 'complete'/&amp;gt;&amp;lt;/code&amp;gt; -&amp;gt; (в Postgres):&lt;br /&gt;
 SELECT 'waiting'&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT 'running'&lt;br /&gt;
 UNION&lt;br /&gt;
 SELECT 'complete'&lt;br /&gt;
* '''&amp;lt;@_enumList 'columnName'/&amp;gt;''': создаёт SQL-предложение, выдающее одну колонку со списком вариантов типа ENUM для колонки columnName, определённой в текущей таблице. Удобно использовать для quick filter.&lt;br /&gt;
* '''&amp;lt;@_sql&amp;gt;SQL&amp;lt;/@&amp;gt;:''' форматирует данный SELECT-запрос с помощью движка [[BE-SQL]] в соответствии с текущим движком базы данных. В теле макроса должен присутствовать целый SQL-запрос. Пример: можно написать с помощью FTL-конструкций так:&lt;br /&gt;
&lt;br /&gt;
 SELECT c.ID AS &amp;quot;Code&amp;quot;,&lt;br /&gt;
   ${concat('c.alphabeticCode', ' - '?str, 'CASE WHEN '+length('c.name')+' &amp;gt; 30 THEN '+concat(substring('c.name', 1, 30), '...'?str)+' ELSE c.name END')} AS &amp;quot;Name&amp;quot;&lt;br /&gt;
   FROM currencies c&lt;br /&gt;
&lt;br /&gt;
:А можно воспользоваться &amp;lt;@_sql&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;@_sql&amp;gt;SELECT c.ID AS &amp;quot;Code&amp;quot;,&lt;br /&gt;
   c.alphabeticCode || ' - ' || CASE WHEN LENGTH(c.name) &amp;gt; 30 THEN SUBSTRING(c.name, 1, 30) || '...' ELSE c.name END AS &amp;quot;Name&amp;quot;&lt;br /&gt;
   FROM currencies c&amp;lt;/@&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Совет''': если макрос допускает вложенные элементы (например, &amp;lt;@'''_'''bold&amp;gt;), завершать его можно либо &amp;lt;/@'''_'''bold&amp;gt;, либо просто &amp;lt;/@&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в кастомизациях ===&lt;br /&gt;
* '''&amp;lt;@'''_'''onLoad 'functionName'/&amp;gt;''': .js-кастомизация, добавляющая вызов указанной JS-функции при загрузке страницы.&lt;br /&gt;
* '''&amp;lt;@_loadScript 'fileName.js'&amp;gt;code&amp;lt;/@&amp;gt;''': загрузить на клиенте указанный js-файл и выполнить указанный код по завершении.&lt;br /&gt;
&lt;br /&gt;
=== Макросы для использования в ftl-скриптах: ===&lt;br /&gt;
* '''&amp;lt;@'''_'''systemSetting category key value/&amp;gt;''': добавить системную настройку. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''systemSetting 'system' 'FORCED_LOCALE' 'ru' /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;'''_'''systemSetting category='system' key='FORCED_LOCALE' value='ru' /&amp;gt;&amp;lt;/code&amp;gt; — то же самое&lt;br /&gt;
* '''&amp;lt;@_jsHandler code name&amp;gt;JavaScript code&amp;lt;/@&amp;gt;''': добавить в базу JavaScript-handler. Code — код (машинночитаемое имя), name — человекочитаемое имя, JavaScript code — исходник хэндлера&lt;br /&gt;
* '''&amp;lt;@_isInRole 'roles' 'column'/&amp;gt;''': добавляет условие для проверки, &lt;br /&gt;
входит ли значение в указанной колонке в заданный список ролей roles. &lt;br /&gt;
Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;DELETE FROM queries_per_role WHERE &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;&amp;lt;@_isInRole '@DisabledRoles,DbAdmin' 'role_name'/&amp;gt;&amp;lt;/code&amp;gt; -&amp;gt; DELETE FROM queries_per_role WHERE ( role_name IN ( 'DbAdmin', 'Dispatcher', 'Guest' )) (группа DisabledRoles содержала роли Dispatcher и Guest)&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_insertInto table [idCol]&amp;gt;columns&amp;lt;/@&amp;gt;''': добавить начало предложения INSERT INTO для таблицы с автоинкрементной колонкой idCol (по умолчанию 'ID'). Columns — список колонок через запятую. Далее должно следовать &amp;lt;@_insertValues&amp;gt; или &amp;lt;@_insertSelect&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_insertValues&amp;gt;values&amp;lt;/@&amp;gt;''': продолжение INSERT INTO. Values — список значений через запятую (должно быть столько же, сколько колонок в _insertInto. Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertInto myTable&amp;gt;col1, col2&amp;lt;/@&amp;gt; &amp;lt;@_insertValues&amp;gt;'val1', 'val2'&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt; — сгенерирует&lt;br /&gt;
&amp;lt;code&amp;gt;INSERT INTO myTable(col1, col2) VALUES ('val1', 'val2'); (в Oracle будет сложнее)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_insertSelect&amp;gt;statement&amp;lt;/@&amp;gt;''': продолжение INSERT INTO. Statement — SQL-предложение SELECT (без самого слова SELECT). Пример:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertInto 'categories'&amp;gt;entity, name, parentID&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_insertSelect&amp;gt;'utilitySuppliers', 'Жилищные услуги', ID FROM tmp_cat_table&amp;lt;/@&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_noAutoIncrement&amp;gt;insert statements...&amp;lt;/@&amp;gt;''': выполнить вставку записей в таблицу с явным заданием значения auto-increment. В некоторых СУБД может требоваться включить специальный режим для такой вставки, для чего и служит данный макрос.&lt;br /&gt;
&lt;br /&gt;
=== Устаревшие макросы ===&lt;br /&gt;
Эти макросы использовались для массового назначения ролей. После появления [[MassChange]] их использовать нельзя и они могут исчезнуть.&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_operationRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для задания ролей операциям. Каждый параметр необязательный, &lt;br /&gt;
если отсутствует, означает, любое. Использовать только в Pre-meta для &lt;br /&gt;
некастомизированных операций! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_operationRoles entities=['documents','addresses','socialEvents2documents'] names='Filter'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_operationRoles entities='CSPcalls' names=['Insert','Edit'] roles='Passport,ClearingHouse,Reception'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_removeOperationRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для удаления заданных ролей из заданных операций. Каждый параметр необязательный, если отсутствует, означает, любое. Использовать только в Pre-meta для некастомизированных операций! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeOperationRoles names=['Explain Plan', 'Parent Record']/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeOperationRoles roles='Accountant' entities='utilityRates' names=['Insert', 'Edit']/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;@_queryRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для задания ролей представлениям. Каждый параметр необязательный, &lt;br /&gt;
если отсутствует, означает, любое. Использовать только в Pre-meta для &lt;br /&gt;
некастомизированных представлений! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_queryRoles entities=['documents','addresses','socialEvents2documents'] names='All records'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;@_removeQueryRoles 'roles' [entities] [names]/&amp;gt;''': создаёт SQL для удаления заданных ролей из заданных представлений. Каждый параметр необязательный, если отсутствует, означает, любое. Использовать только в Pre-meta для некастомизированных представлений! Примеры:&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities='messages'/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities='_system_' names=['MySQL Variables','MySQL Tables','MySQL Processes'] /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;&amp;lt;@_removeQueryRoles entities=['votes','problems','sharedDocuments'] &amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;roles='Manager,Property Manager' /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_(BeanExplorer4)</id>
		<title>Встроенные функции (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%92%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_(BeanExplorer4)"/>
				<updated>2014-08-22T07:09:37Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: /* Функции для DDL-манипуляций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Основные функции ===&lt;br /&gt;
Для удобства работы предопределены некоторые функции:&lt;br /&gt;
* '''addDays''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество дней. Требуется два параметра: дата и количество дней&lt;br /&gt;
* '''addMillis''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество миллисекунд. Требуется два параметра: дата и количество миллисекунд.&lt;br /&gt;
* '''addMonths''': создаёт SQL-предложение для получения даты, отличающейся от заданной на указанное количество месяцев. Требуется два параметра: дата и количество месяцев.&lt;br /&gt;
* '''chr''': создаёт SQL-предложение для нахождения символа по коду (обычно пригождаться не должно, сейчас используется для идентичных метаданных со старым BE).&lt;br /&gt;
* '''coalesce''': создаёт SQL-предложение COALESCE.&lt;br /&gt;
* '''concat''': создаёт SQL-предложения для конкатенации переданных строк. Пример:&lt;br /&gt;
** &amp;lt;code&amp;gt;SELECT ${concat('name', ' = '?str, 'value')} FROM myDictionary&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;br/&amp;gt; (в MySQL) &amp;lt;code&amp;gt;SELECT CONCAT( name, ' = ', value ) FROM myDictionary&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''genericRef''': создаётся generic-ссылка. Требуется два аргумента: entity и колонка-идентификатор.&lt;br /&gt;
* '''if''': создаёт SQL-предложение IF. Требуется три аргумента: условие, значение, если условие истинно, и значение, если условие ложно. Если третий опущен, предполагается пустая строка.&lt;br /&gt;
* '''indexOf''': создаёт SQL-предложение для поиска подстроки в строке. Требуется два аргумента: строка и подстрока.&lt;br /&gt;
* '''joinGenericRef''': создаёт JOIN-предложение для подключения таблицы через generic reference. Требудется три аргумента: целевая таблица, алиас для неё и колонка-идентификатор.&lt;br /&gt;
* '''length''': создаёт SQL-предложение для подсчёта количества символов в строке. Не путайте со стандартным Freemarker-суффиксом ?length, который вычислит длину поданной строки во время выполнения скрипта.&lt;br /&gt;
* '''limit''': создаёт SQL-предложение для ограничения числа строк в запросе (если это позволяет СУБД)&lt;br /&gt;
* '''lpad''': создаёт SQL-предложение LPAD. Требудется три аргумента: исходная строка, требуемая длина и строка-заполнитель, которая будет использована для удлиннения исходной строки слева в случае необходимости.&lt;br /&gt;
* '''replace''': создаёт SQL-предложение REPLACE. Требуется три аргумента: исходная строка, искомая подстрока, строка замены.&lt;br /&gt;
* '''substring''': создаёт SQL-предложение SUBSTRING. Требуется три аргумента: исходная строка, номер начального символа, количество символов.&lt;br /&gt;
&lt;br /&gt;
=== Функции для DDL-манипуляций ===&lt;br /&gt;
Обычно таблицы задаются в BE4 в декларативном стиле в файлах [[entity|сущностей]], и новые таблицы добавляются автоматически при синхронизации. DDL-манипуляции из FTL-скриптов могут потребоваться для обновления таблиц, определённых в старых m4-модулях. В целом манипулировать схемой таблиц из FTL не рекомендуется.&lt;br /&gt;
&lt;br /&gt;
* '''columnDef(columnName, columnDefinition)''': создаёт фрагмент SQL-предложения CREATE TABLE или ALTER TABLE для определения колонки. Первый параметр — имя колонки, второй — хэш с её свойствами. Свойства в точности такие же, как в structure.yaml. Пример:&lt;br /&gt;
** &amp;lt;code&amp;gt;ALTER TABLE test ADD COLUMN ${columnDef('myCol', {'type': 'BOOL', 'canBeNull': true})}&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;br/&amp;gt; (в Postgres) &amp;lt;code&amp;gt;ALTER TABLE test ADD COLUMN mycol VARCHAR(3) CHECK(mycol IN ('no', 'yes') )&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''tableDef(tableName, columns[, indices])''': создаёт SQL-предложение для создания новой таблицы (если таблица уже существовала, старая удаляется). Первый параметр — имя таблицы, второй — хэш, где ключи — имена колонок, а значения — хэш со свойствами колонок (как в columnDef). Необязательный третий параметр: список индексов (ключи — имена индексов, значения — хэш, описывающий индекс так же, как в structure.yaml). Пример:&lt;br /&gt;
**&lt;br /&gt;
 ${tableDef('uiSocialBlocks', {&lt;br /&gt;
 'CODE': {'type': 'VARCHAR(2)', 'primaryKey': true},&lt;br /&gt;
 'name': {'type': 'VARCHAR(250)'},&lt;br /&gt;
 'parentCode': {'type': 'VARCHAR(2)', 'canBeNull': true}&lt;br /&gt;
 })}&lt;br /&gt;
*** Результат в '''Postgres''':&lt;br /&gt;
 DROP TABLE IF EXISTS uisocialblocks;&lt;br /&gt;
 CREATE TABLE uisocialblocks (&lt;br /&gt;
 code VARCHAR(2) NOT NULL PRIMARY KEY,&lt;br /&gt;
 name VARCHAR(250) NOT NULL,&lt;br /&gt;
 parentcode VARCHAR(2));&lt;br /&gt;
*** Результат в '''Oracle''':&lt;br /&gt;
 call drop_if_exists( 'uiSocialBlocks' );&lt;br /&gt;
 CREATE TABLE UISOCIALBLOCKS (&lt;br /&gt;
 CODE VARCHAR2(2 CHAR) NOT NULL PRIMARY KEY,&lt;br /&gt;
 NAME VARCHAR2(250 CHAR) NOT NULL,&lt;br /&gt;
 PARENTCODE VARCHAR2(2 CHAR));&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Freemarker_(BeanExplorer4)</id>
		<title>Freemarker (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Freemarker_(BeanExplorer4)"/>
				<updated>2014-08-22T07:06:25Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В качестве движка шаблонизатора в BeanExplorer4 используется немного модифицированный [http://freemarker.org/ Freemarker]. Язык Freemarker также называется FTL.&lt;br /&gt;
&lt;br /&gt;
Официальная документация по Freemarker [http://freemarker.org/docs/index.html здесь].&lt;br /&gt;
&lt;br /&gt;
В данный момент Freemarker используется:&lt;br /&gt;
* В тексте запросов к базам данных&lt;br /&gt;
* В тексте кастомизаций страниц (page customizations)&lt;br /&gt;
* В custom scripts — *.ftl-файлы, выполняющие определённый SQL для задания вещей, которые BeanExplorer4 не поддерживает в рамках модели&lt;br /&gt;
* В [[Пользовательские макросы|macros]] — набор FTL-макросов, функций, объявлений, которые доступны в остальных местах в рамках проекта.&lt;br /&gt;
&lt;br /&gt;
Для упрощения работы создан набор функций, макросов и built-ins, которые всегда доступны.&lt;br /&gt;
* [[Встроенные функции|Встроенные функции]] (например &amp;lt;code&amp;gt;${concat('col1', 'col2')&amp;lt;/code&amp;gt;}&lt;br /&gt;
* Предопределённые [[Макросы|макросы]] (например &amp;lt;code&amp;gt;&amp;lt;@_bold&amp;gt;value&amp;lt;/@_bold&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Новые [[Built-ins|built-ins]] (например &amp;lt;code&amp;gt;${'qqq'?str}&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Контекстные [[Объекты|объекты]] (например &amp;lt;code&amp;gt;${project}&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Смотрите также ===&lt;br /&gt;
* [[Создание своих макросов|Создание своих макросов]].&lt;br /&gt;
* [[Подключение скриптов|Подключение скриптов (#include)]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Freemarker]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer4_JavaScript_Debugger</id>
		<title>BeanExplorer4 JavaScript Debugger</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer4_JavaScript_Debugger"/>
				<updated>2014-08-22T07:04:13Z</updated>
		
		<summary type="html">&lt;p&gt;Asko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Launchers ===&lt;br /&gt;
BeanExplorer4 использует возможности Eclipse JavaScript Development Tools (JSDT). JSDT предоставляет два типа launcher'а, относящихся к Rhino: Rhino JavaScript и Remote JavaScript.&lt;br /&gt;
&lt;br /&gt;
* Remote JavaScript - это способ подключения к удалённому запуску JavaScript - предполагается, что на каком-то компьютере запущен JavaScript с отладчиком, который открыл порт для подключения и ждёт, что к нему подключится удалённый отладчик.&lt;br /&gt;
* Rhino JavaScript же представляет одновременно запуск и самого скрипта, и удалённого отладчика к нему. Поскольку этот вид launcher'а запускает скрипт Rhino, но не позволяет при этом выбрать то, откуда брать Java классы, он нам бесполезен.&lt;br /&gt;
&lt;br /&gt;
=== Подключение к удалённому JavaScript ===&lt;br /&gt;
Remote JavaScript launcher создаётся (как обычно) в &amp;quot;Debug Configurations...&amp;quot;. При создании launcher'а необходимо выбрать Connector &amp;quot;Mozilla Rhino - Attaching Connector&amp;quot;, ввести host, на котором запущен проект BeanExplorer, и порт 9000 (отладчик на сервере всегда открывает только 9000 порт). После этого можно будет подключиться к отлаживаемой операции, попытавшись открыть её в браузере и запустив ваш launch configuration для подключения.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы BeanExplorer поднял серверную часть отладчика, необходимо, чтобы в таблице systemsettings были следующие строчки:&lt;br /&gt;
* JAVA_SCRIPT_DEBUG_MODE - включение режима отладки (значение TRUE),&lt;br /&gt;
* JAVA_SCRIPT_OPERATION_TO_DEBUG - имя отлаживаемой операции (например, просто &amp;quot;Test&amp;quot;),&lt;br /&gt;
* JAVA_SCRIPT_SOURCE_NAME - имя файла с отлаживаемой операцией, так, как оно отображается в Eclipse (например, &amp;quot;/condo_be4/src/js/operations/userRegistrations - Test.js&amp;quot;).&lt;br /&gt;
* JAVA_SCRIPT_METHOD_TO_DEBUG - имя метода для отладки (остальные методы не будут отлаживаться), одно из:&lt;br /&gt;
         NOTHING,          // there is no methods to debug&lt;br /&gt;
         GET_PARAMETERS,   // getParameters&lt;br /&gt;
         INVOKE,           // invoke&lt;br /&gt;
         GET_REDIRECT_URL, // getRedirectURL&lt;br /&gt;
         CUSTOM_GENERIC,   // getCustomAction, getCustomEnctype, getCustomMethod&lt;br /&gt;
         CONTEXT,          // the script itself&lt;br /&gt;
&lt;br /&gt;
Установка этих переменных возможна автоматически, посредством нажатия кнопки &amp;quot;Set Current Operation As Remotely Debugged&amp;quot; на основном тулбаре (при открытом редакторе JavaScript). Отключение режима отладки возможен посредством пункта &amp;quot;BeanExplorer&amp;quot;-&amp;gt;&amp;quot;Turn Off Server JavaScript Debugging&amp;quot; основного меню.&lt;br /&gt;
&lt;br /&gt;
==== Known issues ====&lt;br /&gt;
* Может некорректно реагировать на первый breakpoint: в таком случае для того, чтобы увидеть переменные в скрипте, надо поставить хотя бы два breakpoint'а и нажать resume при первой остановке отладчика.&lt;br /&gt;
&lt;br /&gt;
Далее рассматриваются способы запуска JavaScript через BeanExplorer4. Кнопки запуска раположены на основном toolbar'е Eclipse при открытом редакторе JavaScript. Причём операции будут запускаться только при условии, если JavaScript редактор открыть из дерева проекта BE4.&lt;br /&gt;
&lt;br /&gt;
=== Run JavaScript (Local) ===&lt;br /&gt;
Запуск JavaScript операции в Eclipse. По завершению операции открывается браузер с результатом выполнения операции. В качестве входных данных операции возможно передавать presetValues и выбранные строки с entity. Метод для запуска, как и параметры, выбирается во view &amp;quot;Operation Parameters&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Known issues ====&lt;br /&gt;
* Позволяет запускать только getParameters() и invoke(), но не getRedirectURL().&lt;br /&gt;
&lt;br /&gt;
=== Debug JavaScript (Local) ===&lt;br /&gt;
Похоже на Run, но запускает скрипт в режиме отладки и пытается подсоединиться к запущенному скрипту удалённым отладчиком (при этом автоматически создаётся launch configuration с именем &amp;quot;BeanExplorer4&amp;quot;, коннектором &amp;quot;Mozilla Rhino - Attaching Connector&amp;quot;, хостом localhost и портом 9000).&lt;br /&gt;
&lt;br /&gt;
==== Known issues ====&lt;br /&gt;
* Позволяет запускать только getParameters() и invoke(), но не getRedirectURL().&lt;br /&gt;
&lt;br /&gt;
=== Debug JavaScript Query (Local) ===&lt;br /&gt;
Как и JavaScript операции, JavaScript запросы тоже возможно отлаживать. При открытом редакторе JavaScript запроса (это, конечно, будет JavaScript редактор) на основном тулбаре Eclipse будут кнопки &amp;quot;Run JavaScript Query (Local)&amp;quot;, &amp;quot;Debug JavaScript Query (Local)&amp;quot; и &amp;quot;Set Current Query As Remotely Debugged&amp;quot;.&lt;br /&gt;
* Нажатие на первую кнопку просто запускает запрос, результат которого будет отображён во вкладке &amp;quot;Query Executor&amp;quot; (в отличие от обычных, SQL запросов, вкладка &amp;quot;Raw SQL&amp;quot; не будет заполнена, посколько JavaScript запрос не генерирует SQL).&lt;br /&gt;
* Нажатие на вторую кнопку аналогично первой, но оно запускает запрос на отладку.&lt;br /&gt;
* Нажатие на третью кнопку заносит в настройки BeanExplorer4 проекта (в базу данных) информацию о том, что данный запрос должен является отлаживаемым, и при попытке открыть его через браузер, BE4 приложение записнет и будет ждать подключения отладчика. При этом заносятся следующие параметры в таблицу systemsettings:&lt;br /&gt;
** &amp;lt;code&amp;gt;JAVA_SCRIPT_QUERY_DEBUG_MODE&amp;lt;/code&amp;gt; (&amp;quot;true&amp;quot; или &amp;quot;false&amp;quot;)&lt;br /&gt;
** &amp;lt;code&amp;gt;JAVA_SCRIPT_QUERY_TO_DEBUG&amp;lt;/code&amp;gt; (например, &amp;quot;Fast Input Data JS&amp;quot;)&lt;br /&gt;
** &amp;lt;code&amp;gt;JAVA_SCRIPT_QUERY_SOURCE_NAME&amp;lt;/code&amp;gt; (например, &amp;quot;/condo4/src/js/queries/Fast Input Data JS.js&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/Project_(BeanExplorer4)</id>
		<title>Project (BeanExplorer4)</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/Project_(BeanExplorer4)"/>
				<updated>2014-08-22T06:59:52Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: Пример, properties, scripts, includes, bugtrackers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ElementType|com.beanexplorer.enterprise.metadata.model.Project|да}}&lt;br /&gt;
&lt;br /&gt;
Проект — это корневой элемент дерева BeanExplorer4. В основном этот элемент сериализуется в файл project.yaml.&lt;br /&gt;
&lt;br /&gt;
Проект имеет следующие свойства (в скобках — имя соответствующего свойства в project.yaml, если применимо):&lt;br /&gt;
* Имя. Должно совпадать с именем Eclipse-проекта. Используется по умолчанию как имя для сборки war-файла. Если это проект-модуль, то совпадает с именем модуля&lt;br /&gt;
* Проект-модуль (moduleProject): если true, значит проект описывает be4-модуль (должен располагаться в каталоге be4/modules). Для обычных пользовательских приложений false&lt;br /&gt;
* Профиль соединения: используемый в данный момент профиль соединения&lt;br /&gt;
* Баг-трекеры (bugtrackers): список [[ConnectedBugtracker|подключенных баг-трекеров]].&lt;br /&gt;
* Фичи (features): список фич BeanExplorer, доступных в проекте&lt;br /&gt;
* Локализации (l10n): список языков локализации (двухсимвольные коды типа 'ru'), используемых в проекте&lt;br /&gt;
* Структура проекта (projectFileStructure): определяет размещение файлов проекта в поддиректориях.&lt;br /&gt;
* Свойства (properties): список пар ключ-значение, задающих предопределённые переменные проекта. Эти переменные добавляются в ant-свойства, в контекст [[Freemarker]] и доступны в [[extras]].&lt;br /&gt;
&lt;br /&gt;
Дочерние элементы проекта:&lt;br /&gt;
* Connection profiles — коллекция с локальными и удалёнными [[BeConnectionProfile|профилями соединений]]&lt;br /&gt;
* Modules — коллекция, содержащая [[Module|модули]], используемые данным проектом&lt;br /&gt;
* Security — списки [[role|ролей]] и [[RoleGroup|групп ролей]] проекта&lt;br /&gt;
* application (или имя проекта-модуля) — основной модуль проекта (вынесен отдельно)&lt;br /&gt;
&lt;br /&gt;
В файле project.yaml также присутствуют секции:&lt;br /&gt;
* scripts — список всех [[FreemarkerScript|FTL-скриптов]] проекта, которые непосредственно выполняются (может включать путь к скрипту)&lt;br /&gt;
* includes — список всех FTL-скриптов, которые используются для подключения к другим скриптам.&lt;br /&gt;
&lt;br /&gt;
=== Пример файла project.yaml ===&lt;br /&gt;
 myproject&lt;br /&gt;
  features:&lt;br /&gt;
  - columnSettings&lt;br /&gt;
  - events&lt;br /&gt;
  - interfaceComments&lt;br /&gt;
  - logging&lt;br /&gt;
  l10n: ru&lt;br /&gt;
  bugtrackers:&lt;br /&gt;
    bugzilla: MyHome/MyProject&lt;br /&gt;
  projectFileStructure: {}&lt;br /&gt;
  modules:&lt;br /&gt;
  - attributes: {}&lt;br /&gt;
  - beanexplorer:&lt;br /&gt;
      entities:&lt;br /&gt;
      - _system_&lt;br /&gt;
      - users&lt;br /&gt;
  - geo:&lt;br /&gt;
      entities: territories&lt;br /&gt;
      extras:&lt;br /&gt;
      - kladr&lt;br /&gt;
      - okato&lt;br /&gt;
  - workflow: {}&lt;br /&gt;
  - utils: {}&lt;br /&gt;
  application:&lt;br /&gt;
  - _welcome_&lt;br /&gt;
  scripts:&lt;br /&gt;
  - Post-meta&lt;br /&gt;
  - data&lt;br /&gt;
  - dictionaries&lt;br /&gt;
  includes: common&lt;br /&gt;
  properties:&lt;br /&gt;
  - REGION: '54'&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4</id>
		<title>Компиляция и запуск BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%B8_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA_BeanExplorer4"/>
				<updated>2014-08-22T06:46:23Z</updated>
		
		<summary type="html">&lt;p&gt;Yagmik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Простой запуск ===&lt;br /&gt;
Простой запуск:&lt;br /&gt;
# убедиться, что установлена Java 8 (JRE достаточно);&lt;br /&gt;
# поместить исходники be4 в C:\projects\java\be4;&lt;br /&gt;
# взять Eclipse IDE for Java EE Developers, Eclipse Luna SR2 из этой папки: \\logrus.dote.ru\pub2\be4;&lt;br /&gt;
# отсюда же устанавливаем наши плагины, для этого заходим в Help -&amp;gt; Install New Software..., Add... копируем file:////logrus.dote.ru/pub2/be4/com.beanexplorer.be4.site/ в Location, OK, снимаем галочку Group items by category (если список фич пуст), ставим галочку на BeanExplorer4, Next и т.д.&lt;br /&gt;
&lt;br /&gt;
После перезагрузки Eclipse для работы с BE4 нужно будет выбрать перспективу BeanExplorer. При этом (или же при запуске Eclipse) Eclipse спросит, откуда взять исходники be4, если не догадается об их местоположении. В случае, если be4 находится в C:\projects\java\be4, то всё должно происходить само. Эти исходники нужны только для загрузки модулей.&lt;br /&gt;
&lt;br /&gt;
Известный баг: если be4 помещён не в C:\projects\java\be4, то Eclipse каждый раз при запуске будет спрашивать местонахождение be4.&lt;br /&gt;
&lt;br /&gt;
=== Запуск из-под Eclipse ===&lt;br /&gt;
Для компиляции необходимы&lt;br /&gt;
# '''Java 8''' [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html отсюда],&lt;br /&gt;
# '''Eclipse IDE for Java EE Developers''', Eclipse '''Luna SR2''' [http://www.eclipse.org/downloads/packages/release/luna/sr2 отсюда],&lt;br /&gt;
# '''Наша версия Freemarker IDE''' - обычно мы импортируем проекты org.freemarker.core и org.jboss.ide.eclipse.freemarker из публичного репозитория https://github.com/amaembo/jbosstools-freemarker.git (см. ниже),&lt;br /&gt;
# '''IvyDE''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# '''YEdit''' - устанавливается из Eclipse MarketPlace,&lt;br /&gt;
# Наш проект '''common''' - его необходимо импортировать в workspace.&lt;br /&gt;
# Наш проект '''beclipse''' - его необходимо также импортировать в workspace. Живёт в &amp;lt;каталог с проектами&amp;gt;/be4.&lt;br /&gt;
Необходимо создать API baseline. Для этого заходим в Window -&amp;gt; Preferences, Plug-in Development -&amp;gt; API Baselines, там вводим любое Name, нажимаем Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
Необходимо создать конфигурацию запуска. Заходим в &amp;quot;Debug Configurations...&amp;quot; (можно нажать Ctrl+3 и начать печатать &amp;quot;Debug Configurations&amp;quot;), там кликаем два раза на Eclipse Application, открываем вкладку Plug-ins, выбираем &amp;quot;Launch with: all workspace and enabled target plug-ins&amp;quot;, нажимаем Apply, Debug (потом при запуске просто будем нажимать F11 вместо входа сюда). Помимо этого см. настройки запуска ниже.&lt;br /&gt;
&lt;br /&gt;
Для проверки того, что всё установлено и будет корректно работать, нужно зайти на вкладку Plug-ins конфигурации запуска и там нажать &amp;quot;Validate Plug-ins&amp;quot; чтобы убедиться, что все необходимые плагины имеются.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Варианты установки Freemarker IDE ===&lt;br /&gt;
==== Вариант 1 (запуск без исходного кода Freemarker IDE). ====&lt;br /&gt;
Установить содержимое \\files.dote.ru\pub2\_be4\Installation\freemarker.feature.zip&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки.&lt;br /&gt;
&lt;br /&gt;
==== Вариант 2 (для разработчиков Freemarker IDE). ====&lt;br /&gt;
# Необходим репозиторий https://github.com/amaembo/jbosstools-freemarker.git&lt;br /&gt;
# После скачивания репозитория нужно импортировать два проекта:&lt;br /&gt;
#*- org.freemarker.core&lt;br /&gt;
#*- org.jboss.ide.eclipse.freemarker. Остальные проекты можно не импортировать или просто закрыть.&lt;br /&gt;
# Windows -&amp;gt; Preferences; Plug-In Development -&amp;gt; API Baselines; ввести произвольное имя, Reset, Finish, Apply, OK.&lt;br /&gt;
&lt;br /&gt;
=== Настройки запуска: ===&lt;br /&gt;
# Run-&amp;gt;Debug Configurations..., выбрать Eclipse Application, нажать New launch configuration.&lt;br /&gt;
# Выбрать каталог в Workspace data (лучше создать новый пустой, например, c:\projects\be4-workspace).&lt;br /&gt;
# Execution environment -&amp;gt; Java 1.8.&lt;br /&gt;
# Вкладка Arguments Скопировать это значение в поле VM Arguments: '''-Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx768m -ea'''&lt;br /&gt;
# Apply, Debug.&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/BeanExplorer4</id>
		<title>BeanExplorer4</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/BeanExplorer4"/>
				<updated>2014-08-22T06:34:35Z</updated>
		
		<summary type="html">&lt;p&gt;Lan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Как начать работу с BeanExplorer 4 ==&lt;br /&gt;
Для установки: смотрите «[[Установка BeanExplorer4]]».&lt;br /&gt;
&lt;br /&gt;
Есть три способа начать работать с проектом BeanExplorer 4.&lt;br /&gt;
# Взять готовый проект. В таком случае просто откройте перспективу BeanExplorer, сделайте импорт проекта обычным способом, а затем кликните на проект или project.yaml правой кнопкой мыши (во view Project Explorer) и выберите &amp;quot;BeanExplorer -&amp;gt; Open BeanExplorer Project&amp;quot;. Проект появится во view с названием Model.&lt;br /&gt;
# Преобразовать старый BeanExplorer-проект. Для этого выберите File-&amp;gt;New-&amp;gt;Project..., BeanExplorer-&amp;gt;New BeanExplorer Project Using Database Connection (более короткий способ это сделать - это выбрать пункт меню BeanExplorer-&amp;gt;Quick Load Using Database Connection, если уже есть профиль для подключения к базе данных). Если нет ни одного профиля для подключения к СУБД, его надо создать, нажав &amp;quot;Create a new connection profile&amp;quot; и введя всю необходимую информацию для подключения, а также выбрав JDBC драйвер. Пароль обязательно сохранить. Можно это [[BeanExplorer4#Как создать новый профиль подключения к БД|сделать до начала создания проекта, обычными средставми Eclipse DTP]]. После нажатия на кнопку &amp;quot;Finish&amp;quot; загруженный проект должен отобразиться во view &amp;quot;Model&amp;quot;. Преобразование может быть неточным и придётся его доделывать вручную. Кроме того, не сохранятся никакие M4 макросы.&lt;br /&gt;
# Создать новый проект.&lt;br /&gt;
#* File -&amp;gt; New -&amp;gt; Project...&lt;br /&gt;
#* BeanExplorer -&amp;gt; BeanExplorer Project, Next&lt;br /&gt;
#* Ввести имя проекта, изначальный список ролей, допустимых в проекте, и набор поддерживаемых языков (роли и языки всегда можно будет добавить ещё).&lt;br /&gt;
#* Выбрать набор используемых модулей и фитч. Модули аналогичны самим BeanExplorer4 проектам. Модуль 'beanexplorer' всегда добавляется в проект безусловно, поэтому его нельзя выбрать самому.&lt;br /&gt;
#* Заполнить параметры подключения к базе данных. У нас в проектах всегда используются connection profiles и Eclipse DTP, поэтому для начала работы с BeanExplorer4 сначала необходимо создать базу данных и connection profile для её использования. Тестовый пользователь - одновременно и администратор базы данных и пользователь-администратор из создаваемого BeanExplorer4 приложения.&lt;br /&gt;
# Создать новый проект возможно и из консоли. Для этого запускается Ant target с именем 'wizard' (зайти в консоли в папку 'be4/src' и напечатать 'ant wizard', если у вас установлен Ant).&lt;br /&gt;
&lt;br /&gt;
== Описание по каждому редактору и view ==&lt;br /&gt;
* Model (view). Дерево проекта.&lt;br /&gt;
* Properties (view). Свойства выделенного в дереве проекта элемента.&lt;br /&gt;
* Documentation (view). Документация к выделенному в дереве проекта элементу.&lt;br /&gt;
* Tasks (view). Отображает все маркеры @todo и @check, найденные в документации ко всем элементам проекта и при необходимости скачивает задачи с ERP или Bugzilla. Для того, чтобы связать открытый проект с ERP, необходимо в его свойствах (Properties view!) заполнить поле 'ERP project identifier'. Аналогично для связи с Bugzilla имеется поле 'Bugzilla product name'. Помимо этих полей потребуеются логин и пароль, которые возможно ввести на странице BeanExplorer в настройках (Window-&amp;gt;Preferences) (если они не введены, при попытке подключиться к ERP или Bugzilla BeanExplorer4 предложит вам ввести их в диалоговом окошке). Для того, чтобы связать какое-нибудь задание из документации с багом в Bugzilla или ERP, в начале его текста нужно указать номер бага с префиксом 'bug' или 'erp' соответственно: например, в тексте документации будет &amp;quot;@todo bug12345 исправить систему подсчёта X&amp;quot;.&lt;br /&gt;
* Security (view). Таблица с правами ролей для каждого запроса и каждой операции. Реагирует на то, какой редактор открыт или какой элемент в дереве проектов выбран, и в соответствии с последним выбранным элементов фильтрует таблицу. Если в дереве проектов выбран модуль, то будут отображаться только операции и запросы из этого модуля, если entity, то отображаются только те операции и запросы, что относятся к данной entity. Фильтр по ролям позволяет выбрать все операции и запросы, которые может выполнять выбранная роль.&lt;br /&gt;
* Diagram (editor). Редактор диаграмм. Позволяет открывать .dml файлы и редактировать несколько их видов. Диаграммы каждого вида возможно создать пустыми выбором соответствующего пункта в основном меню BeanExplorer (BeanExplorer-&amp;gt;Create *** Diagram/Board). Поддерживаемые виды диаграмм:&lt;br /&gt;
** ER модели. Могут быть открыты посредством клика на модуль и выбора &amp;quot;Create Diagram From This Module&amp;quot;.&lt;br /&gt;
** EPC (Event-Process Chain) диаграммы.&lt;br /&gt;
** CFF (Cross-Functional Flowchart) диаграммы.&lt;br /&gt;
** Planning boards - доски с задачами.&lt;br /&gt;
* Diagram Layout (view). Позволяет перераспределить элементы ER диаграмы. Всегда относится к диаграмме из редактора ER, которым пользовались последним.&lt;br /&gt;
* SQL Editor (editor). Позволяет редактировать SQL запросы - открывается при клике на запросы в дереве проекта. Почти то же самое, что и SQL редактор из Eclipse DTP. Позволяет запускать SQL запросы (правый щелчок мышью-&amp;gt;Execute All). Отличается от оригинального тем, что, во-первых, не сохраняет изменения в файл (при попытке сохранить изменения окажутся в модели BeanExplorer 4), а, во-вторых, позволяет запускать SQL с учётом макропроцессора FreeMarker и [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer/beanexplorerdocrus плейсхолдеров BeanExplorer] (правый щелчок мышью-&amp;gt;Run или &amp;quot;Run BeanExplorer SQL Query&amp;quot; на toolbar'е).&lt;br /&gt;
* Query Executor (view).&lt;br /&gt;
** Позволяет определить контекст выполнения SQL запроса - посредством выбора своих параметров запроса или сессии (при этом запрос пока выполняется только под администратором).&lt;br /&gt;
** Позволяет посмотреть результаты запуска SQL запроса. Автоматически активируется при SQL запросе. Позволяет посмотреть результаты запроса как в виде простой таблицы, так и в виде HTML после обработки в BeanExplorer, а также посмотреть обработанные представления запроса — после макропроцессора FreeMarker и в чистом SQL виде.&lt;br /&gt;
* JavaScript Editor (editor). Позволяет редактировать JavaScript скрипты - открывается при клике на JavaScript/server операции в дереве проекта. Почти то же самое, что и обычный JavaScript редактор из Eclipse JSDT. Отличается тем, что позволяет запускать Rhino JavaScript (&amp;quot;Run JavaScript&amp;quot; на toolbar'е или &amp;quot;Execute&amp;quot; в Operation Parameters view). Результат вызова операции открывается в браузере.&lt;br /&gt;
* Operation Parameters (view). Позволяет определить контекст выполнения JavaScript/server операции посредством задания параметров и выбранных строчек. Также позволяет выбрать метод для запуска: getParameters(), invoke() или getRedirectURL() (последний пока не поддерживается).&lt;br /&gt;
* Localization (view). [[Localizations|Локализация]], относящаяся к выделенному в дереве проектов элементу. Отображается при выборе entity, operation или query.&lt;br /&gt;
&lt;br /&gt;
== Основная информация для понимания BeanExplorer 4 ==&lt;br /&gt;
# Основное представление проекта BeanExplorer 4 - это не база данных, не YAML проект, а дерево проекта в Model view. При открытии BeanExplorer 4 проекта, он оказывается в Model view. И только при сохранении он сериализуется в YAML&lt;br /&gt;
# Основные простейшие действия с проектом - создание/удаление сущностей (entities), операций (operation) и запросов (query) - делаются из контекстного меню (pop-up) в Model view.&lt;br /&gt;
# Если с каким-нибудь узлом дерева проекта может быть связан редактор, то при выделении этого узла открывается редактор. Например, для JavaScript/server операции открывается JavaScript редактор, для 1D запроса - SQL редактор, для custom step - текстовый редактор, для Java операции открывается Java редактор (если .java файл с соответствующим именем находится в рабочем пространстве Eclipse). Некоторые редакторы при сохранении никак не меняют файлы - файлы будут изменены только при сохранении проекта.&lt;br /&gt;
# У большинство элементов из дерева проекта есть свойства, которые возможно редактировать в Properties view.&lt;br /&gt;
# Для любого подключения к базе данных необходим connection profile ([http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.datatools.connectivity.doc.user%2Fdoc%2Fhtml%2Fasc1229700343352.html в документации по Kepler]). При импорте готового проекта connection profile создаётся автоматически, однако вручную всё же необходимо выбрать к нему JDBC Connector (если СУБД для подключения используется впервые). Connection Profile необходим как для SQL запросов из обычного SQL редактора Eclipse DTP, так и для запросов BeanExplorer. Настройки connection profiles находятся в разделе проекта &amp;quot;Connection profiles&amp;quot;, в &amp;quot;папочках&amp;quot; Local и Remote. Эти настройки сохраняются в XML при сохранении BeanExplorer 4 проекта, а при его открытии воссоздаются, и если Eclipse DTP не имеет connection profiles с соответствующими именами, то они будут созданы. Конкретнее - эти настройки хранятся в двух файлах: connectionProfiles.local.xml и connectionProfiles.remote.xml, причём предполагается, что .local вписан в .gitignore, а .remote - нет. Для возможности подключиться к базе данных всегда должен быть выбран в качестве текущего какой-нибудь connection profile. Выбирается он в свойствах проекта (Properties view, &amp;quot;Connection profile name&amp;quot;) - в соответствующем combo box отображаются только те профили, которые есть в Local или Remote. Добавить новый connection profile в проект BeanExplorer 4 возможно через контекстное меню (для этого его сначала необходимо создать в Data Source Explorer view (из Eclipse DTP)).&lt;br /&gt;
&lt;br /&gt;
== Работа с BeanExplorer 4 для аналитиков ==&lt;br /&gt;
Для некоторых типов элементов из дерева проектов возможно приписывать комментарии/документацию. На данный момент это следующие типы элементов:&lt;br /&gt;
* проект,&lt;br /&gt;
* модули (в т.ч. application),&lt;br /&gt;
* сущности (entities - всё, что находится внутри модуля в папках Collections, Dictionaries, Tables, Generic Collections, Metadata),&lt;br /&gt;
* операции,&lt;br /&gt;
* запросы.&lt;br /&gt;
Документация отображается в Documentation view. Если в документации элемента есть маркер @todo или @check, то строка с этим маркером окажется и в другом view: Tasks. При клике на какую-либо строчку из Tasks будет выделен соответствующий ей элемент в Model view.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Возможности назначения ролей ===&lt;br /&gt;
* Все роли перечислены в свойствах проекта. При клике на список ролей (&amp;quot;Project roles&amp;quot; в Properties view при выбранно проекте) появляется панель, позволяющая добавлять роли.&lt;br /&gt;
* Для операций и запросов роли назначаются во view Security.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Analyst2.png]]&lt;br /&gt;
&lt;br /&gt;
== Usecases ==&lt;br /&gt;
Перенесены [[Usecases|сюда]].&lt;br /&gt;
&lt;br /&gt;
== Компиляция и запуск Eclipse с плагином BeanExplorer4 ==&lt;br /&gt;
Здесь: [[Компиляция и запуск BeanExplorer4]] (инструкции для тех, кто запускает Eclipse BeanExplorer4 из под другого экземпляра Eclipse).&lt;br /&gt;
&lt;br /&gt;
== Структура проекта BeanExplorer 4 ==&lt;br /&gt;
[[Структура проекта|Структура]] проекта BeanExplorer 4&lt;br /&gt;
&lt;br /&gt;
== Процесс разработки ==&lt;br /&gt;
=== Использование Ant ===&lt;br /&gt;
[[Использование ant|Использование Ant]]&lt;br /&gt;
&lt;br /&gt;
=== Использование шаблонов Freemarker ===&lt;br /&gt;
Использование шаблонов [[Freemarker|Freemarker]]&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Debugger ===&lt;br /&gt;
Текущее состояние [[JavaScript Debugger|JavaScript Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Поддержка СУБД ===&lt;br /&gt;
Поддержка [[Поддержка СУБД|различных СУБД]]&lt;br /&gt;
&lt;br /&gt;
== Полезная информация, которая может помочь при работе с BeanExplorer 4 ==&lt;br /&gt;
=== Как устанавливать плагины/фитчи из архива ===&lt;br /&gt;
# Заходим в... Help-&amp;gt;Install New Software. Add...-&amp;gt;Archive... выбрать архив, OK.&lt;br /&gt;
# Снять галочку &amp;quot;Group items by category&amp;quot;, если не видно пунктов для установки. Это может занять продолжительное время, т.к. с основного репозитория Eclipse будут скачиваться недостающие плагины.&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор YAML ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://dadacoalition.org/yedit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Site: [https://code.google.com/p/yedit/ https://code.google.com/p/yedit/])&lt;br /&gt;
&lt;br /&gt;
=== Где взять редактор FreeMarker ===&lt;br /&gt;
Update site: &amp;lt;code&amp;gt;http://download.jboss.org/jbosstools/updates/stable/kepler/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или:&lt;br /&gt;
&lt;br /&gt;
Help-&amp;gt;Eclipse Marketplace... ищем &amp;quot;JBoss Tools&amp;quot;, жмём Install у JBoss Tools (Kepler), снимаем галочку со всего и выбираем JBoss Tools (Kepler)-&amp;gt;FreeMarker IDE.&lt;br /&gt;
&lt;br /&gt;
=== Как настроить Tomcat для возможности подгрузить изменения в class-файлах. ===&lt;br /&gt;
1. Add the following lines into /conf/tomcat-users.xml (inside the root element &amp;lt;tomcat-users&amp;gt;):&lt;br /&gt;
 &amp;lt;role rolename=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;user username=&amp;quot;tomcat&amp;quot; password=&amp;quot;tomcat&amp;quot; roles=&amp;quot;manager-script&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Create /conf/Catalina/localhost/manager.xml with the following content:&lt;br /&gt;
 &amp;lt;Context privileged=&amp;quot;true&amp;quot; antiResourceLocking=&amp;quot;false&amp;quot;&lt;br /&gt;
          docBase=&amp;quot;${catalina.home}/webapps/manager&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;Valve className=&amp;quot;org.apache.catalina.valves.RemoteAddrValve&amp;quot;&lt;br /&gt;
         allow=&amp;quot;127\.0\.0\.1&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Context&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подробнее [http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html здесь] и [http://www.mulesoft.com/tcat/tomcat-reload здесь].&lt;br /&gt;
&lt;br /&gt;
3. You can change the username or the password, but you should ensure that your connection profile uses these username and password. Beside this you can change the URL that will be called to refresh Tomcat. Note that this action uses the Tomcat application name from the connection profile. Tomcat path should be set too.&lt;br /&gt;
&lt;br /&gt;
=== Как создать новый профиль подключения к БД ===&lt;br /&gt;
* Переключиться в перспективу Database Development. (В Eclipse почти в правом верхнем углу нажать квадратную кнопку с плюсиком &amp;quot;Open Perspective&amp;quot; и выбрать там &amp;quot;Database Development&amp;quot;).&lt;br /&gt;
* Во view Data Source Explorer кликнуть правой кнопкой мыши на Database Connections, New....&lt;br /&gt;
* Выбрать в диалоговом окне тип используемой БД (напр., PostgreSQL), ввести нормальное имя для подключения (например, &amp;quot;condo&amp;quot;), Next.&lt;br /&gt;
* Ввести параметры подключения, их можно узнать у администратора БД. При первом создании профиля подключения с данным типом СУБД необходимо выбрать драйвер СУБД (для этого нажать круглишок с плюсиком у combo &amp;quot;Driver&amp;quot;, а в появившемся диалоге на второй вкладке обычно необходимо удалить выбранный драйвер и выбрать свой - мы для удобство поместили все драйвера в папку lib из be4).&lt;br /&gt;
* Next, Finish.&lt;br /&gt;
* Новый профиль появится в списке Database Connections во view Data Source Explorer.&lt;br /&gt;
&lt;br /&gt;
= Для разработчиков =&lt;br /&gt;
[[Для разработчиков BE4|Сюда]]&lt;/div&gt;</summary>
		<author><name>Asko</name></author>	</entry>

	<entry>
		<id>http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://wiki.dote.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2014-08-21T06:57:27Z</updated>
		
		<summary type="html">&lt;p&gt;Uuinnk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== BeanExplorer4 ===&lt;br /&gt;
* [[BeanExplorer4]]&lt;br /&gt;
** [[Для разработчиков BE4]]&lt;br /&gt;
* [[Установка BeanExplorer4]] (для пользователей)&lt;br /&gt;
* [[Компиляция и запуск BeanExplorer4]] (для разработчиков)&lt;br /&gt;
* [[Сборка BE4 и BE-SQL]] (для разработчиков)&lt;br /&gt;
* [[Использование ant]]&lt;br /&gt;
* [[Поддержка СУБД]]&lt;br /&gt;
* [[Типы колонок]]&lt;br /&gt;
* [[Структура проекта]]&lt;br /&gt;
* [[Usecases|Usecases с картиночками]]&lt;br /&gt;
* [[JavaScript Debugger]]&lt;br /&gt;
* [[Extras]]&lt;br /&gt;
* [[Entity template|Шаблоны для сущностей]]&lt;br /&gt;
&lt;br /&gt;
=== Freemarker ===&lt;br /&gt;
* [[Freemarker]]&lt;br /&gt;
* [[Встроенные функции]]&lt;br /&gt;
* [[Макросы]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Пользовательские макросы]]&lt;br /&gt;
* [[Создание своих макросов]]&lt;br /&gt;
* [[Built-ins]]&lt;br /&gt;
&lt;br /&gt;
=== BeanExplorer5 ===&lt;br /&gt;
Новая версия переехала на [https://github.com/developmentontheedge https://github.com/developmentontheedge]&lt;br /&gt;
&lt;br /&gt;
* [[BeanExplorer5|BeanExplorer5]]&lt;br /&gt;
* [[BeanExplorer5 API|BeanExplorer5 API]]&lt;br /&gt;
* [[BE-SQL|SQL-диалект BeanExplorer5]]&lt;br /&gt;
* [[Сборка BeanExplorer5 проекта|Сборка BE5 проекта]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Внешние ссылки ===&lt;br /&gt;
* BeanExplorer4 на Edge Wiki [https://sites.google.com/a/developmentontheedge.com/wiki/home/proektnaadokumentacia/beanexplorer4]&lt;br /&gt;
----&lt;br /&gt;
Количество статей в вики: '''[[:Special:Statistics|{{NUMBEROFARTICLES}}]]'''.&lt;/div&gt;</summary>
		<author><name>MediaWiki default</name></author>	</entry>

	</feed>