5.1. Общие положения
 
Общие положения

Smart Bricks представляет собой исполняемый модуль (SmartBricks.exe), отображающий при запуске главное окно приложения. Наличие на главном окне  приложения элементов управления (panel, edit box, combo box, page control, grid, tree view и пр.) определяется сервером для данной конкретной задачи.

При запуске модуля в командной строке присутствует ключевое слово, определяющее основной объект, с которым предстоит работать модулю в данной сессии (имя главной формы). Получив это слово, модуль запускает хранимую процедуру G_ENT_CFG, с параметром @ent_nm, значение которого соответствует ключевому слову. Данная процедура возвращает перечень элементов, которые должны быть отображены модулем на его главном окне. Далее эта же процедура запускается для каждого из полученных родительских элементов и т.д. Этот процесс называется конфигурированием элемента. Для некоторых типов элементов конфигурирование происходит не сразу, а при активизации данного элемента. Например, конфигурирование элемента page происходит при первом выборе страницы пользователем, а элемента form – при первом отображении формы.

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

Если, в результате отработки процедуры, возникает необходимость в выполнении модулем интерфейса каких-либо действий (обновление данных, открытие дополнительных окон, выдача сообщений, запись или экспорт данных во внешние файлы и пр.), то процедура передает ему соответствующую команду – макрос. Таким образом, макрос в SB – это команда интерфейсному модулю произвести какое-либо действие. Макрос отрабатывает после полной отработки процедуры, его вызвавшей. Вызов макроса производится при помощи хранимой процедуры RUN_MACROS, которая имеет один входной параметр @macros строкового типа. Значение этого параметра представляет собой строку макроса. Формат строки макроса: ИмяМакроса [Параметр=Значение] [,...n]

Если Значение содержит пробелы или знаки препинания, тогда оно должно заключаться в одинарные либо двойные кавычки. Можно передавать несколько макросов, разделенных точкой с запятой. Описание макросов и их параметров приведено ниже.

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


5.1.1. Запуск приложения

 

Запуск приложения

Запуск приложения осуществляется через ярлык, командная строка которого выглядит следующим образом:

SmartBricks.exe object=ИмяОбъекта [s=ИмяСервера] [db=ИмяБазыДанных] [u=ИмяПользователя] [p=Пароль] [a] [tim=False] [pic=False] [mac=Макрос] [ci=Интервал] [tray] [logo=False]

Значения параметров командной строки:

s - Сетевое имя сервера, псевдонима либо ip-адрес. Если указан ip-адрес, можно через запятую добавить порт.

db - имя базы данных.

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

p - пароль, не используется при windows-аутентификации.

Если отсутствует хотя бы один из параметров s,db,u либо p(при SQL аутентификации), то при запуске программы выводится стандартное окно подключения к БД, в котором пользователь может выбрать параметры подключения к базе данных.

a - Флаг автообновления интерфейсного модуля. При наличии данного параметра интерфейсный модуль перед запуском проверяет, нет ли в базе данных файла SmartBricks.exe более новой версии. Если такой файл присутствует, осуществляется замена запускаемого файла на файл, хранящийся в базе данных и выполняется перезапуск программы.

mac - макрос, который будет запущен при запуске приложения.

tim - если значения параметра False - будут отключены все таймеры в приложении.

pic - если значения параметра False - пиктограммы загружаться не будут.

ci - (сокр. connection interval) - интервал в секундах, через который будет автоматически выполняться переподключение, если при запуске программы сервер недоступен.

tray - если задан данный параметр, приложение будет запущено в виде значка на панели задач (system tray).

logo - если значения параметра False - будет отключён показ заставки при старте.

 


5.1.2. Соглашение о наименовании объектов
 
Соглашение о наименовании объектов
 
 Имена должны быть в латинской раскладке, начинаться с буквы, не содержать знаков препинания и пробелов. Имена и вообще все ключевые слова в системе INFOPOLIS не чувствительны к регистру.

5.2. Среда разработки Builder
 
    Для разработки интерфейса пользователя к базе данных в распоряжение разработчика предоставлена среда разработки Smart Bricks Builder. Она представляет собой интерфейс к таблицам SB, выполненный в виде дерева, которое отображает всю структуру интерфейса пользователя в иерархическом виде. Структурной единицей в технологии Smart Bricks является элемент интерфейса (далее Элемент либо ЭИ). ЭИ представляет собой некий объект пользовательского интерфейса, например поле редактирования, таблицу, кнопку и т.д. а также он может и не иметь соответствующего элемента управления (не визуальный ЭИ). ЭИ может быть родительским и неродительским, в зависимости от того, может ли он иметь подчиненные ЭИ или нет.
 

Рассмотрим подробнее интерфейс среды разработки Builder.

Основной закладкой (страницой) среды SmartBricks Builder является закладка “Приложения”, На этой закладке расположено дерево элементов интерфейса.

На первом уровне дерева находятся элементы, которые являются отдельными модулями (в стандартной модели программирования – отдельное приложение). Ярлык запуска приложения содержит в качестве ключевого параметра имя этого элемента (см. Запуск приложения ). Далее, на всех последующих уровнях расположены остальные ЭИ, которые в совокупности представляют собой ветку "Элемент".

 


5.2. Среда разработки Builder

Например, если мы хотим, чтобы при чтении и сохранении (процедуры G_ MyGrid15_STF и C_ MyGrid15_STF) элемента MyGrid15 в качестве параметра передавалось значение элемента MyComboBox25, то в поле need необходимо написать:

MyComboBox25=sg

Если написать

MyComboBox25=sg!,

то при изменении пользователем значения элемента MyComboBox25 элемент MyGrid15 будет обновлен процедурой G_ MyGrid15_STF.

Если написать просто

MyComboBox25,

то параметр будет передан во все процедуры, кроме процедуры удаления (D_ MyGrid15_STF).

Если в поле NEED указать MyReport1.Teble1.InnerHtml=s, и в сформированном отчете MyReport1 есть фрагмент <table id=”Table1”><tr><td>Ok</table> то в процедуру сохранения будет передан строковый параметр @Table1, со значением “<tr><td>Ok

Свойства – перечень произвольных свойств ЭИ. Допустимые свойства зависят от типа ЭИ и их перечень описан ниже. При щелчке правой кнопкой мыши на этом поле будет выведен список пиктограмм, зарегистрированных в системе в виде всплывающего меню. При выборе одной из них в данное поле будет вставлена строка вида img=ИмяВыбраннойПиктограммы

Также к этой ветке в правой части дерева прикреплены следующие закладки:

Скриптер – На этой закладке разработчику предоставлена возможность получать скрипт (в формате SQL) созданных элементов интерфейса. Полученный скрипт можно применить к другой базе данных для переноса интерфейса.

Права доступа – на этой закладку системный администратор может назначать права доступа к элементам интерфейса. Первый столбец в таблице прав доступа с заголовком “Доступ” определяет доступ к элементу интерфейса, остальные столбцы предназначены для предоставления прав доступа на процедуры SQL-сервера. Набор процедур для каждого типа элемента интерфейса индивидуальный. Для каждого ЭИ существует четыре уровня прав доступа, которые предоставляются на определенную роль или определенного пользователя:

- Нет (пустая ячейка) – Доступа к элементу отсутствует, однако если доступ предоставлен на другом уровне (в другой роли), пользователь наследует это право.

- Только чтение – пользователь не может изменять данные в элементе управления.

- Есть – Предоставлен доступ к этому элементу управления, однако если на другом уровне (в другой роли) выставлено значение Запрет, доступ к этому элементу будет заблокирован.

- Запрет – Если на элемент выставлен этот уровень, доступ к элементу будет закрыт, даже если в другой роли пользователю предоставлено право Есть или Только чтение.

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

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


5.2. Среда разработки Builder

 

Мастер процедур – на данной закладке разработчик может генерировать заготовки процедур SQL сервера, которые требуются для работы с данным элементом интерфейса. Набор этих процедур зависит от типа ЭИ. Так, например, для типа элемента Grid характерны процедуры выборки данных, сохранения данных, удаления данных. Для ЭИ типа Button – только одна процедура нажатия на кнопку. Подробнее процедуры описаны в разделе Процедуры.


5.3.1. Id

Описание

Данный тип ЭИ представляет собой неотображаемое поле. Как правило, наличие хотя бы одного элемента с данным типом обязательно в ЭИ типа Grid, для идентификации строки. Комбинация значений элементов данного типа должна быть уникальной. Все значения ЭИ данного типа id передаются в процедуру удаления родительского элемента. Кроме того, в процедуре сохранения родительского элемента параметр, соответствующий ЭИ типа id должен быть объявлен как выходной (out). Это требуется для того, чтобы после сохранения строки приложение могло перейти на эту же строку после обновления данных. Подробнее о механизме сохранения данных смотрите в разделе 2.4.13.

Макросы

Макрос set – служит для установки текущего значения элемента. Синтаксис

Set ent=ИмяЭлемента, id=НовоеЗначение


5.3.2. Button, WinBtn

 

Описание

Элементы типов Button, WinBtn представляют собой кнопку, при нажатии на которую вызывается соответствующая процедура. Отличие этих кнопок состоит в том, что для элемента типа Button не создается оконный объект Windows (Handle) и, следовательно, эта кнопка не может получить фокус ввода, и ее нажатие нельзя произвести с помощью клавиатуры (кроме клавишь быстрого доступа, свойство ShortCut, см. ниже).
Кроме того, элемент WinBtn не поддерживает асинхронное выполнение.

Процедуры

BTN_ИмяЭлемента_CLICK

Свойства

Img=ИмяПиктограммы[+ВтораяПиктограмма]
Пиктограмма с данным именем будет присутствовать на кнопке.
Допускается наложение второй пиктограммы через знак "+".
 
Confirm[=ТекстПодтверждения]
При наличии данного свойства при нажатии на кнопку перед вызовом процедуры пользователю будет выведено диалоговое окно, с просьбой подтвердить нажатие. Если ТекстПодтверждения не указан, он будет следующим – “Вы уверены ?”. Если в диалоговом окне пользователь нажмет кнопку “No” (или “Нет”), то процедура BTN_ИмяЭлемента_CLICK не будет запущена.
 
AsyncMode[=True|False]
Только для элемента Button. При значени для данного свойства True процедура BTN_ИмяЭлемента_CLICK будет вызвана асинхронно. Во время выполнения процедуры кнопка будет во вжатом состоянии, пользователь может в это время работать в программе. По окончании отработки процедуры кнопка будет отжата.
 
OnClickMacros=Макрос
Задает макрос, который будет выполнен при нажатии на кнопку. Процедура BTN_ИмяЭлемента_CLICK при этом вызвана не будет.
 
 
 
Ключевые свойства интерфейса

ShortCut – комбинация клавиш для быстрого доступа. Нажатие этих клавиш эквивалентно нажатию кнопки.

 


5.3.3. Frame

Описание

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

Процедуры

Свойства

  • Refresh=ИмяЭлемента

Задает элемент, который будет обновляться при попытке обновления данного элемента. Полезно задавать для фильтров, например, есть отчет (элемент report) и панель фильтра к нему (элемент frame). Пользователь выставляет параметры фильтра и нажимает клавишу F5 или кнопку Обновить на панели инструментов. Для того, чтобы приложение обновило не текущий элемент(frame), а отчет, разработчик указывает имя этого отчета в свойстве Refresh.

Макросы

Ключевые свойства интерфейса

PanelAligned : (apNone,apBottom,apTop,apLeft,apRight) - Определяет расположение панели с кнопками Сохранить, Отмена, Добавить, Удалить. По умолчанию apNone.

5.3.4. ComboBox

Описание

Элементы данного типа представляют собой выпадающий список.
Если родительским элементом является Grid, тогда элемент данного типа представляет собой колонку в таблице с выпадающим списком в качестве элемента редактирования.
Данный элемент может работать в двух режимах относительно родительского элемента:
1. Режим одного значения. В этом режиме элемент в процедуре выдачи данных родительского элемента (G_ИмяРодительскогоЭлемента_STF) ищет поле, наименование которого совпадает с именем данного элемента. Это же поле должно присутствовать в процедуре раскрытия списка (CB_ИмяЭлемента_DROP).
В процедуру сохранения родительского элемента и во все процедуры других элементов, в поле need которых присутствует данный элемент, будет передан один параметр, наименование которого совпадает с наименованием элемента.
 
2. Режим двух значений. Данный режим активируется если в процедуре выдачи данных родительского элемента (G_ИмяРодительскогоЭлемента_STF) присутствует два поля:
ИмяЭлемента_id и ИмяЭлемента_nm. Если же элемент имеет свойство filter, тогда эти поля должны присутствовать в процедуре раскрытия списка (CB_ИмяЭлемента_DROP). Как правило, в поле ИмяЭлемента_id выдается первичный ключ сущности, представленной элементом ComboBox, а в поле ИмяЭлемента_nm - ее наименование в текстовом виде. В данном режиме значением элемента, которое будет передано в другие процедуры будет ИмяЭлемента_id, а в самом элементе будет отображено значение поля ИмяЭлемента_nm.
Тип данных для поля ИмяЭлемента_id произвольный.
Если для данного ЭИ в режиме двух значений требуется получить текст (значение поля ИмяЭлемента_nm) - для этого в свойствах элемента следует указать WithText.
 
Если указано свойство filter, данный элемент не будет требовать в процедуре выдачи данных родительского элемента никаких полей и, соответственно не будет передавать в процедуру сохранения никаких параметров.
 
  • WithText
При наличии данного свойства в процедуры будет передан текст, в настоящий момент отображаемый в ЭИ.
 
  • DropDownFilter[=(Auto|Число)]
При наличии данного свойства стиль элемента автоматически становится таким, что в нем можно редактировать отображаемый текст. В процедуру CB_ИмяЭлемента_DROP будет передан дополнительный параметр FILTER, значением которого и будет текст, набранный в поле редактирования данного элемента. Это свойство применяется для фильтрации данных на сервере, выпадаемых при раскрытии списка.
Если указано значение Auto или число - выпадающий список автоматически будет подставлять значения при наборе текста по первым буквам. Для Auto процедура выпадающего списка будет запущена после набора первого символа, если указано число - после набора заданного количества символов.
 
 
  • NeedRefresh[=[WithValue][EmptyNull]]
При наличии данного свойства элемент будет обновлен (процедурой CB_ИмяЭлемента_DROP) при обновлении родительского элемента.
Если указано WithValue, тогда в процедуру будет передан параметр VALUE, значением которого будет значение поля ИмяЭлемента_id, полученное из процедуры обновления данных родительского элемента либо значение фильтра, запомненное с прошлого раза (при наличии свойства filter).
Если указано EmptyNull тогда процедура CB_ИмяЭлемента_DROP запущена не будет в случае, если значением элемента является NULL. Вместо этого текстовое поле станет пустым.
Значения данного свойства WithValue и EmptyNull служат для ускорения обновления элемента.

  • Change[=Команда]

При наличии данного свойства при изменении пользователем значения элемента запускается процедура либо макрос (можно указывать и то и другое). При отсутствии значения Команда будет запущена процедура A_ИмяЭлемента_CHNG.

C помощью макроса Set можно принудительно установить значение данного элемента. Для этого нужно использовать свойство Id, например:
Set ent=MyCombobox,id=12
После отработки данного макроса будет запущена процедура CB_ИмяЭлемента_DROP и в выпадающем списке будет выбран пункт, соответствующий значению идентификатора 12.
 
Ключевые свойства интерфейса
 
Style - Внешний вид элемента.
DropDownCount - количество строк, отображаемых в раскрытом списке. Если процедура выдает большее количество - появляется полоса прокрутки.
DropDownOnSelect={True|False} - только если элемент - это колонка в таблице (Grid) - задает, будет ли выпадающий список автоматически раскрываться при выборе ячейки.

5.3.5. PageControl
Данный элемент представляет собой набор страниц (элементов типа Page). Если данный элемент указан в поле need другого элемента, то в параметре, имя которого соответствует имени PageControl-а, будет передано имя закладки, активной в данный момент. Дочерними элементами PageControl-а могут быть только элементы типа Page.
5.3.6. Page
Родительским элементом данного элемента может быть либо PageControl либо Node. В обоих случаях данный элемент представляет собой закладку, на которой располагаются другие элементы. Элемент типа Page конфигурируется при первом переходе на нее. Для того, чтобы переконфигурировать данный элемент достаточно сделать двойной клик на заголовке страницы, удерживая при этом клавишу Alt.

Свойства

  • Img=ИмяПиктограммы[+ВтораяПиктограмма]
Пиктограмма с данным именем будет присутствовать на закладке перед заголовком.
Допускается наложение второй пиктограммы через знак "+".
  • eo
При наличии данного свойства кнопки Добавить и Удалить будут неактивными, т.е. элемент можно будет использовать только для редактирования текущей записи (edit only).

Ключевые свойства интерфейса

PanelAligned : (apNone,apBottom,apTop,apLeft,apRight) - Определяет расположение панели с кнопками Сохранить, Отмена, Добавить, Удалить. По умолчанию apNone.

5.3.7. Form
Данный элемент представляет собой отдельное окно, на котором располагаются другие элементы.
Создать элемент типа Form (как собственно и любой другой) можно либо
в Builder-е либо с помощью макроса Create.
Для облегчения создания форм в базе данных существует процедура RUN_MACROS_FORM.
 

Свойства

  • OnShow[=Макрос]
или
  • OnBeforeShow[=Макрос]
При наличии данного свойства перед выводом формы на экран будет запущен макрос Макрос либо, если он не задан - процедура A_ИмяЭлемента_SHOW
 
  • OnAfterShow[=Макрос]
    При наличии данного свойства после вывода формы на экран и после обновления всех подчиненных элементов будет запущен макрос Макрос либо, если он не задан - процедура A_ИмяЭлемента_ASHOW
     
     
    • OnClose[=Макрос]
    При наличии данного свойства при закрытии формы будет запущен макрос Макрос либо, если он не задан - процедура A_ИмяЭлемента_CLOSE
     

    Ключевые свойства интерфейса

    Visible : Boolean - Видимость - определяет, отображается ли форма на экране.
     
    PanelAligned : (apNone,apBottom,apTop,apLeft,apRight) - Определяет расположение панели с кнопками Сохранить, Отмена, Добавить, Удалить. По умолчанию apNone.
     
    FormStyle : (esModal,esOnTop,esNormal) - стиль формы - может быть модальная, поверх всех окон или обычная.
    Замечание! - Если форма имеет значение свойства FormStyle=esModal, все макросы, вызываемые после макроса Create будут обработаны после закрытия формы.

    5.3.8. ToolBar
    Данный элемент представляет собой панель инструментов, и располагается, как правило, на элементе типа Form. Допускается несколько панелей инструментов для элемента типа Form.

    5.3.9. Grid
    Данный элемент представляет собой таблицу с набором колонок. Каждый дочерний элемент типа Edit, Calc, Date, CheckBox, Combobox, CheckListBox соответствует своей колонке.
     
    Свойства
     
    eo - при наличии данного свойства элемент не разрешает удаление и добавление новых строк, т.е. таблица находится в режиме только для редактирования (EditOnly).
     
    IgnoreModified - при наличии данного свойства разрешается переход с данного элемента при наличии модифицированных записей. По умолчанию такой переход запрещен, и при попытке сменить текущую строку в родительском элементе либо текущую закладку панель сохранения элемента мигнет три раза красным цветом.
     
    AutoWidth - при наличии данного свойства ширина всех колонок будет устанавливаться автоматически в зависимости от отображаемых данных после каждого обновления таблицы. Для установки автоматического подбора ширины отдельных колонок задайте это же свойство для каждого элемента, представляющего столбец таблицы, отдельно.
     
    Paged[=СтрокНаСтранице] - позволяет таблице отображать данные в режиме постраничного просмотра. При включении данного свойства на панели справа появляется элемент управления постраничным просмотром.
    Количество строк на странице по умолчанию равно 100, его можно переопределить в свойствах интерфейса - свойство PageRowCount. Если нужно кол-во строк задать жестко, можно использовать значение СтрокНаСтранице.
    Сам постраничный вывод данных должен быть реализован в процедуре обновления данных (G_xxx_STF). В эту процедуру будут переданы следующие параметры:
    @PAGE_FIRST_ROW int -- номер начальной строки для отображения данных
    @PAGE_LAST_ROW int -- номер конечной строки
    @PAGE_ALL_ROWS int out -- выходной параметр, всего строк.
    Разработчик должен позаботиться, что-бы процедура фильтровала выходные данные по первым двум параметрам.
    Последний выходной параметр не обязателен, но крайне желателен, поскольку интерфейсный модуль в этом случае отобразит, сколько всего страниц может быть доступно.
     

    ElementBasedXml[=True|False] - При формировании xml будет использован Element-based метод построения - значения подчинённых элементов будут в виде элементов. В противном случае - attribute-based - в виде аттрибутов (в аттрибутах не поддерживается символ перевода строки).

    SingleRowEdit[=True|False] - Если True - пользователь не имеет возможности сменить текущую строку, пока не закончит её редактировать.

     
     

    Форматирование таблицы
    Кроме форматирования колонок, выполняемых в Object Inspector, в элементе Grid существует возможность форматирования отдельных ячеек таблицы в зависимости от ее содержимого. Для этого в рекордсете, возвращаемом процедурой G_ИмяЭлемента_STF должны присутствовать поля #ИмяЭлемента или #ИмяДочернегоЭлемента. Поле #ИмяЭлемента отвечает за форматирование строки целиком, а поле #ИмяДочернегоЭлемента - за форматирования отдельной ячейки. Тип поля строковый. Формат строки в поле:
    ИмяСвойства=ЗначениеСвойства[,...n]
     
    Ключевые свойства для колонок

    Alignment : (caLeft,caCenter,caRight) - выравнивание текста в колонке. Для полей типа Calc, которые представляют денежное выражение, это свойство по умолчанию устанавливается в caRight наряду с DecimalShow=2.
    ReadOnly : Boolean - Элемент только для чтения. Используется при форматировании.
    Color : Задает цвет ячейки либо колонки целиком, может использоваться при форматировании.
     
    Ключевые свойства для таблицы

    CanInsert, CanDelete : Boolean - Допускается ли удаление либо добавление данных в таблицу. Например при СanInsert=False кнопка "Добавить" будет не активна. По умолчанию оба свойства установлены в True.
     
    ReadOnly : Boolean - Используется только при форматировании. Указывает, может ли редактироваться текущая строка в таблице.
     
    Color : Задает цвет всей строки при форматировании.
     
    MaketName : String - имя макета, активного в данный момент
    MaketNo : Integer - порядковый номер макета, активного в данный момент. Нумерация начинается с 0.
    PanelAligned : (apNone,apBottom,apTop,apLeft,apRight) - Определяет расположение панели с кнопками Сохранить, Отмена, Добавить, Удалить. По умолчанию apBottom.
    RefreshButtonVisible : Boolean - Если установлено в True, в левой ячейке заголовка таблицы будет отображаться кнопка Обновить. Значение по умолчанию - True.
    MarkCurrentRowKind : (mcrNone,mcrColor,mcrLines) - устанавливает способ подсветки текущей строки. При выборе mcrColor текущая строка будет подсвечена цветом, заданным в свойстве MarkCurrentRowColor. При выборе mcrLines текущая строка будет выделена двумя линиями (сверху и снизу). Цвет линий задается в свойстве MarkCurrentRowColor. Значение по умолчанию - mcrLines.
    MarkCurrentRowColor : TColor - цвет для выделения текущей строки, при свойстве MarkCurrentRowKind отличном от mcrNone.

    5.3.10. Edit
    Поле редактирования для однострочного текста
     

    Ключевые свойства интерфейса

    DefLayout : (klNone,klEngl,klUkr,klRus) - управляет раскладкой клавиатуры по умолчанию для данного элемента. Если установлено значение, отличное от klNone, при получении элементом фокуса ввода раскладка клавиатуры переключается в соответствующее положение. При потере фокуса ввода раскладка возвращается в прежнее положение.
     
    MaxLendth : Integer - Максимальное количество символов. По умолчанию - 255. Если установлен 0 - максимальная длина не ограничена.
     
    CharCase : (ekNormal,ekUpperCase,ekLowerCase) - регистр текста.
    PasswordChar : Char - если установлен не нулевой символ - введенный текст будет заменен на текст, состоящий из заданных символов. Может использоваться для полей ввода паролей.

    5.3.11. CheckBox
    Поле редактирования для логических значений.
    Тип данных - логический (bit в MS SQL Server) 

    Ключевые свойства интерфейса

    AllowGrayed : Boolean - если установлено в True элемент может иметь три состояния - выбрано (True), не выбрано (False) и серый (NULL).

    5.3.12. Calc
    Поле для редактирования чисел. Тип данных - любой числовой.
     

    Свойства

  • DblInc[=Значение]
    При наличии данного свойства при двойном клике мышкой на элементе его значение будет увеличиваться на указанное значение. Значение по умолчанию равно единице.
     

    Ключевые свойства интерфейса

    DecimalShow : Boolean - Указывает, сколько знаков после запятой будет отображаться в данной колонке. Отсутствующие знаки будут дополнены нулями.
    Только для элементов, родительским которого является Grid.
    Рекомендуется для всех колонок, в которых выводятся суммы в денежном выражении устанавливать данное свойство в 2.

  • 5.3.13. Date
    Поле для редактирования даты (а также времени).
     
    Тип данных: Дата-время (Datetime в MS SQL Server)
     

    Свойства

    SetPeriod={ИмяСвязанногоЭлемента|Near}
    Данное свойство устанавливается для элемента, который в паре с другим элементом Date устанавливает период, причем устанавливается для второго элемента пары. При наличии данного свойства в выпадающем календаре пользователь сможет выбрать не только конечную дату периода, но также и начальную.
     
    При значении данного свойства Near, в качестве связанного элемента будет выступать ближайший, расположенный на одном родителе с данным. Значение Near не допускается, если родительским элементом для данного выступает элемент Grid либо Node (т.е. когда элемент представляет собой столбец в таблице).
     
    Ключевые свойства интерфейса
     
    Kind : (dkDate,dkDatetime) - Управляет возможностью отображения/редактирования времени. По умолчанию dkDate - только дата, без времени.
    5.3.16. Memo
    Поле редактирования для многострочного текста.
    Тип данных - строковый, text, ntext
     
     
    Если родительским элементом является Grid, то данный элемент не модифицируется в столбец, в отличие от прочих полей редактирования.
     

    Свойства

  • IsEntityPropsProxy - служебное свойство, применяется только для отображения и редактирования свойств интерфейса в среде разработки Builder.
     
  •  

    Ключевые свойства интерфейса

    SyntaxMode : (mmNormal,mmSyntaxSQL) - Устанавливает режим подсветки синтаксиса. Если установлено mmSyntaxSQL элемент будет подсвечивать текст аналогично утилите Query Analyzer.
     
    DefLayout : (klNone,klEngl,klUkr,klRus) - управляет раскладкой клавиатуры по умолчанию для данного элемента. Если установлено значение, отличное от klNone, при получении элементом фокуса ввода раскладка клавиатуры переключается в соответствующее положение. При потере фокуса ввода раскладка возвращается в прежнее положение.

    5.3.17. RadioBox
    Представляет собой элемент выбора одного значения из нескольких, представленных в виде кнопок.
    Работа с данным элементом аналогична работе с элементом Combobox

    5.3.18. Tree
     
     
    Данный элемент (далее Дерево) вместе с элементами Node и NodeChild служит для представления иерархических данных и очень часто применяется в системе Инфополис.
    Дочерними элементами могут являться только элементы типа Node (либо невизуальные элементы).
    Визуально Дерево состоит из двух частей, разделенных вертикальной линией. В левой части представлена собственно иерархическая структура, а в правой отображается информация, соответствующая выбранной в данный момент ветке.
    Для функционирования дерева в нем должна быть по крайней мере одна ветка, представленная элементом Node (хотя их, как правило, гораздо больше).
     

    Ключевые свойства интерфейса

    ShowNodeCaption : Boolean - Определяет, будет ли в верхней части левой половины дерева отображаться заголовок выбранной в данный момент ветки. Имеет смысл устанавливать данное свойство если в дереве есть многоколоночные ветки, т.е. элементы Node, у которых есть дочерние элементы NodeChild.
     
    ShowLines : Boolean - Определяет, отображать ли линии, соединяющие ветки дерева.
     
    SplitterWidth : Integer - Ширина разделителя правой и левой частей.
     
    TabStyle : (tsButtons,tsFlatButtons,tsTabs) - Определяет внешний вид страниц (закладок) в правой части. По умолчанию - tsTabs.

    5.3.19. Node
     
    Данный элемент представляет собой ветку дерева. Родительским элементом для него может являться только элемент Tree.
    При создании данного элемента автоматически создается соответствующая закладка в правой части дерева. Заголовок этой закладки является заголовком данного элемента. Все дочерние визуальные элементы будут отображаться в правой части дерева, на этой закладке (за исключением элемента NodeChild). Одна ветка (Node), аналогично элементу Grid, может состоять из нескольких колонок - элементов NodeChild. Kаждый элемент Node должен иметь как минимум один подчиненный элемент NodeChild. Как правило, этот подчиненный элемент создается автоматически в памяти при создании элемента Node. Это значит, что в Builder-е данный элемент не отображается. Хотя его можно создать и вручную - задав то же имя, что и у элемента Node. Этим мы добьемся возможности сохранять свойства колонки в базе данных, что имеет смысл делать для многоколоночных веток. Элемент NodeChild, созданный автоматически либо вручную, имеющий то же имя, что и родительский элемент Node, называется Основным листом. Основной лист всегда работает в режиме двух значений, т.е. процедура выдачи данных G_ИмяЭлемента_STF должна вернуть для этого элемента два поля: ИмяЭлемента_ID и ИмяЭлемента_NM. Если элемент Read-Only, в процедуру сохранения будет передан только параметр ИмяЭлемента_ID.
     
    Для построения иерархических структур в элемент Node следует добавить другой элемент Node. Таким образом подчиненная ветка будет отображаться внутри главной. При этом в процедуры выдачи и сохранения данных дочерней ветки будет передан параметр ИмяРодительскогоЭлемента_PRNT, который идентифицирует родительскую ветку. Для того, чтобы превратить элемент Node в иерархический (его данные могут входить сами в себя), нужно создать подчиненный элемент Node с тем же именем.
     
    Быстрое создание веток.
    Очень часто при проектировании интерфейса возникает необходимость структурировать иерархические данные. Для упрощения создания таких иерархических структур в элемент Node добавлена возможность получать данные не из процедур SQL-сервера, а задавать их прямо в Builder-е в поле Свойства. Данные свойства следует задавать после основных свойств ветки.
    Синтаксис:
     {Item=Идентификатор,capt=Заголовок[,img=ИмяПиктограммы[+ВтораяПиктограмма]]} [ ,...n ]
     
    Каждый набор свойств, начинающийся с Item представляет собой отдельную ветку.
    Item - значение, обычно число от 1, идентифицирующее ветку. Данное значение будет передаваться во все процедуры в виде параметра ИмяЭлемента_ID.
    capt - Заголовок ветки, отображаемый в дереве.
    img - Имя пиктограммы для ветки, отображаемой слева от заголовка. Допускается наложение второй пиктограммы через знак "+".
     
    Пример:
    item=1,capt="Товары",img=tov, item=2,capt="Услуги",img=usl
    В результате будет создано две ветки с заголовками Товары и Услуги.
    Элемент, созданный таким способом всегда Read-Only, не допускает ни удаление своих данных, ни добавление.
     
    Форматирование ветки
    Кроме форматирования колонок, выполняемых в Object Inspector, в элементе Node, аналогично элементу Grid, существует возможность форматирования отдельных строк и ячеек в зависимости от ее содержимого. Для этого в рекордсете, возвращаемом процедурой G_ИмяЭлемента_STF должны присутствовать поля #ИмяЭлемента или #ИмяЭлементаNodeChild. Поле #ИмяЭлемента отвечает за форматирование ветки целиком, а поле #ИмяЭлементаNodeChild - за форматирования отдельной ячейки в колонке. Тип поля строковый. Формат строки в поле:
    ИмяСвойства=ЗначениеСвойства[,...n]
     

    Свойства

    • Img=ИмяПиктограммы[+ВтораяПиктограмма]
    Имя пиктограммы по умолчанию для ветки. Данное свойство может быть переопределено с помощью форматирования для каждой строки отдельно. Допускается наложение второй пиктограммы через знак "+".
     
    Ключевые свойства интерфейса
     
    Font - Шрифт для элементов, находящихся на основной закладке, при условии, что эти элементы имеют значение свойства ParentFont=True.
     
    TextFont - шрифт для текста, отображаемого в ветке дерева. Используется, если у элемента нет дочерних элементов типа NodeChild.

    5.3.20. NodeChild
    Данный элемент представляет собой отдельную колонку в дереве. Родительским элементом для него всегда является элемент Node.

    5.3.21.1. Общие сведения
    Элемент данного типа применяется для создания в системе печатных форм (документов, отчетов и пр.). Внешне он представляет собой рабочую область и панель инструментов с кнопками, которая, как правило, находится в верхней части элемента.
     

    Процедуры

    REP_ИмяЭлемента_STF

    Свойства

    • AsyncMode[=True|False]
    При значени для данного свойства True процедура REP_ИмяЭлемента_STF будет вызвана асинхронно. Во время выполнения процедуры кнопка "Обновить" будет во вжатом состоянии, пользователь может в это время работать в программе. По окончании отработки процедуры кнопка будет отжата. Значение по-умолчанию - True.
     
    • ExportExcelScript=Скрипт
    Данное свойство задаёт скрипт (имя функции), который будет вызван после нажатия кнопки "Экспорт в эксель".
    Сам скрипт должен присутствовать в уже сформированном документе в виде функции. Этот скрипт может дополнительно форматировать Excel-документ.
    Пример скрипта для преобразования картинок, чтобы Excel сохранял их вместе с файлом:

    <script language="JavaScript">
    function ExportExcelProcessing()
    {
      var MsExcel;
      var xlShapes;
      var xlShape;
      MsExcel = GetObject("","Excel.Application")
      xlShapes = MsExcel.ActiveWorkbook.ActiveSheet.Shapes;
      for (var i=xlShapes.Count; i>=1; i--) {
        xlShape = xlShapes.item(i);
        xlShapes.AddPicture(xlShape.AlternativeText, true, true, xlShape.Left, xlShape.Top, xlShape.Width,   xlShape.Height);
        xlShape.Delete();
      }
    }
    </script>

    Для этого примера в свойствах элемента нужно указать: ExportExcelScript=ExportExcelProcessing()
      

    Ключевые свойства интерфейса

    Mht – возвращает текущее содержимое отчета в формате mht.

     
    Описание кнопок:
    Печать - Отправляет документ на печать без вызова диалогового окна.
    Печать... - Вызывает диалоговое окно печати, в котором можно задать ориентацию страницы, количество копий и т.д.
    Параметры страницы... - Вызывает диалоговое окно настройки печати, в котором можно задать поля, колонтитулы и т.д.
    Предварительный просмотр - Позволяет посмотреть, как документ будет выглядеть на бумаге. Данная кнопка активна только если версия браузера больше, чем 6.0.
    Сохранить в файле - Позволяет сохранить документ в файле.
     
    Экспорт в Excel, Экспорт в Word - Экспорт текущего документа в Microsoft Excel или в Microsoft Word.
    Замечание: при экспорте программа заменяет все ссылки-макросы (с протоколом infopolis:// )на простой текст. Также при экспорте убираются все элементы, у которых заданы атрибуты:
    class="PrintOnly" или class="NoExport" или id="PrintOnly" или id="NoExport".
     
    Отправить по почте... - позволяет отправить документ по почте, путем вызова почтовой программы, установленной в системе по умолчанию.
    Открыть в браузере - открывает документ во внешнем браузере, используемом по умолчанию.
    Режим редактирования - переключает документ в режим редактирования. В этом режиме пользователь может править документ. Горячие клавиши, доступные в этом режиме:
    Ctrl+B - выделить жирным
    Ctrl+I - выделить курсивом
    Ctrl+U - подчеркнуть текст
    Enter - перевод строки
    Назад, Вперед - Навигация по открытым документам. Всего элемент запоминает до десяти документов.
    Отмена - позволяет прервать формирование документа.
    Обновить - позволяет обновить документ.
     
    Данный элемент подготавливает файл печатной формы в формате HTML либо XML и открывает его во встроенном браузере. Работает он следующим образом.
    При активизации данного элемента запускается процедура REP_ИмяЭлемента_STF, в которую передаются все необходимые параметры (поле NEED). Эта процедура возвращает данные в виде
    - выходных (OUTPUT) параметров;
    - в виде наборов данных (SELECT), которых может быть произвольное количество.
     
    Обязательные выходные параметры процедуры:
    @PATH varchar(255) out - В обязательном выходном параметре @PATH процедура возвращает интерфейсному модулю имя файла шаблона печатной формы. В системе INFOPOLIS шаблоны хранятся в базе данных. Интерфейсный модуль затем получает этот шаблон либо из базы данных либо из подсистемы кеширования.
    @PATH_CRC int out - контрольная сумма файла шаблонов. Требуется для оптимизации процесса загрузки шаблона. Для оптимизации времени загрузки шаблонов в интерфейсном модуле реализована система кеширования файлов, получаемых из базы данных. Для того, чтобы определить, изменился шаблон или нет с момента кэширования, интерфейсном модуль использует контрольную сумму. Поэтому настоятельно рекомендуется в процедурах отчетов использовать параметр @PATC_CRC.
    Для инкапсуляции кода при написании процедур REP_xxx_STF в комплексе INFOPOLIS предусмотрена процедура BL_PATH. Ее вызов должен стоять в начале процедуры, сразу за декларацией переменных. Пример:

    create
    procedure REP_MyReport_STF
     @PATH
    varchar(255) out
    ,@PATH_CRC int = NULL out
    -- in
    ,@SGFirm_ID pk -- ID Фирмы
    -- out
    ,@BEGSALDO money out
    ,@ENDSALDO money out
    AS
    declare

     @MY_VARIABLE pk

    exec BL_PATH @path=@PATH out, @path_crc=@PATH_CRC out, @set='MyReport.htm'
    .....
    GO

    Также в процедуре может быть объявлен выходной параметр @PROPS varchar(max) out, в котором задаются локальные свойства. Формат параметра @PROPS:
      ИмяСвойства[=Значение]{[,ИмяСвойства[=Значение]] [...n]}
     
    В качестве локальных свойств можно использовать следующие:
     DirectShablon - при наличии данного свойства элемент открывает шаблон без обработки.
     XmlParams={True|False} - указывается, если отчет формируется в виде XML. Определяет, должны ли в результирующий XML попадать входные параметры хранимой процедуры. Значение по-умолчанию - True.
     MailTo=ПочтовыйАдрес - указывает, какой адрес электронной почты подставлять в почтовый клиент при отправке отчета по электронной почте.
     MailSubject=ТемаПисьма - тема электронного письма. Если не указана - в теме указывается заголовок из отчета (title).
     
     
    Механизм формирования отчета состоит из двух частей:
    1. Формирование отчета в виде HTML.
    2. Формирование отчета в виде XML.
     

    5.3.21.2. Формирование отчета в виде HTML

    Формирование отчета в виде HTML.

     
    Шаблон представляет собой файл в формате HTML (расширение .html, .htm), в котором, в местах, куда процедура должна вставить данные, расположены соответствующие метки.
     
    Замечание: При составлении отчетов рекомендуется использовать тег <TITLE>, в котором нужно указывать заголовок отчета.

    Обозначается метка тильдами (~) с обеих сторон. Например, метка в которую мы хотим вывести название предприятия, может называться ~FIRM_NAME~.
    Интерфейсный модуль, получив результаты работы процедуры, просматривает возвращенные параметры и находит в тексте HTML-шаблона соответствующие метки. Так, для вывода в метку ~FIRM_NAME~ названия фирмы мы должны описать в процедуре отчета параметр @FIRM_NAME varchar(255)=null out и присвоить ему нужное значение, которое и будет помещено в метку.
    Для заполнения таблиц в отчетной форме, процедура должна вывести набор данных с названиями колонок, соответствующих названию меток, помещенных в соответствующие поля таблицы печатной формы.
    Легче это объяснить на следующем примере: необходимо вывести в документ типа накладной или счета номенклатуру товаров с количеством и ценами. Создадим в шаблоне документа таблицу:
    <table width="50%" border="1" bordercolor="Black" cellpadding="0" cellspacing="0">
    <tr>
    	<td>Наименование</td>
    	<td width="1%" nowrap>Количество</td>
    	<td width="1%" nowrap>Цена</td>
    </tr>
    <tr>
    	<td>~TOV_NM~</td>
    	<td>~QTY~</td>
    	<td>~PRICE~</td>
    </tr>
    </table>
    Выглядеть это будет так:
    НаименованиеКоличествоЦена
    ~TOV_NM~~QTY~~PRICE~

    Теперь, если процедура выведет набор данных следующим образом:
    tov_nm qty price 
    -------- ----------- ----------- 
    Чайник 1 20
    Кофейник 2 25
    
    т.е. названия полей набора будут соответствовать названиям меток в таблице шаблона, то интерфейсный модуль добавит в таблицу столько строк, сколько их содержится в возвращенном наборе и заполнит их соответствующими данными.
    НаименованиеКоличествоЦена
    Чайник120.00
    Кофейник225.00

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

    Такой шаблон:
    НаименованиеКоличествоЦенаСумма
    ~TOV_NM~~QTY~~PRICE~~SUMMA~

    Такой же, как в предыдущем примере набор данных и вот такой результат:
    НаименованиеКоличествоЦенаСумма
    Чайник120.00~SUMMA~
    Кофейник225.00~SUMMA~

    Есть метод, позволяющий не добавлять выходной параметр для каждой метки. Если процедура возвращает набор данных с полями называемыми fieldnm и fieldvalue, то интерфейсный модуль заполнит метки с названиями выведенными в поле fieldnm значениями выведенными в поле fieldvalue.
    Например, в документе есть метки ~FIRM_NAME~, ~FIRM_ADRESS~, ~FIRM_TEL~. Быстро заполнить их можно, вернув из процедуры набор следующего вида
    fieldnm fieldvalue
    FIRM_NAME ООО 'Рога и копыта'
    FIRM_ADRESS г.Киев, ул.Тупик Коммунизма, 6
    FIRM_TEL 356-66-66
    Важное замечание. Если в шаблоне печатной формы имеется несколько повторяющихся одинаковых меток, интерфейсный модуль заполняет их все. Т.е., если нужно вывести в нескольких местах отчета одну и ту же информацию, необязательно создавать несколько меток и несколько, соответствующих им выходных параметров процедуры, а достаточно одного параметра и нескольких одинаковых меток в документе.

    Следующий рисунок иллюстрирует пример шаблона и процедуры, заполняющей его, с использованием трех методов заполнения меток:
    1. Вывод значения меток через возвращаемые параметры процедуры.
    2. Вывод таблицы набором данных с именами колонок, соответствующими названиям меток шаблона
    3. Вывод нескольких меток одновременно с использованием набора данных с именами колонок fieldnm и fieldvalue.
     
    Группировка данных
    Для группировки данных в отчете необходимо:
    Для каждого уровня группировки создать свою строку - тэг <TR> в котором в любом месте должна быть метка Header. Синтаксис метки:
      ~Header(ПолеГруппировки)~
    Количество уровней группировки не ограничено. Для нижнего уровня данных метка Header не требуется.
    Для вывода данных группировки после вложенных данных используется метка Footer. Ее синтаксис:
      ~Footer(ПолеГруппировки)~
     
    Замечание: Для корректной группировки данных возвращаемый набор должен быть отсортирован по полям группировки.
     
    Для получения итоговых данных по каждой группе можно использовать следующие встроенные функции: Sum, Min, Max, Avg, Count.
    Их синтаксис:
    ~Sum(Аргумент[,ПолеГруппировки])~
    Для получения порядкового номера служит функция Counter. Ее синтаксис:
    ~Counter([Аргумент1[,Аргумент2]])~ 
    где Аргумент1,Аргумент2 - имена полей в наборе данных.
    Если функция задана без аргументов - результатом будет порядковый номер строки в наборе данных. Если задан только Аргумент1 - результатом будет номер группы. Если заданы Аргумент1 и Аргумент2 - результатом будет относительный номер строки с полем Аргумент2 в группе, соответствующей полю Аргумент1.
     
    Вывод рекордсета с произвольными полями
     
    Иногда процедура выдачи данных может возвращать заранее неизвестное количество полей. Для вывода таких данных используется две метки-функции: WideCapt и Wide. Метка WideCapt задает место, где будут выведены заголовки таблицы. Каждому полю будет соответствовать свой столбец. Заголовок столбца будет представлен в виде названия поля.
    Метка Wide задает место вывода собственно данных. Как правило обе эти метки располагаются попарно в одной таблице в разных строках. Допускается использование таких пар меток несколько раз в одном отчете. При этом процедура вывода данных должна возвращать несколько рекордсетов, по одному на каждую пару меток WideCapt и Wide.
     
    Синтаксис метки WideCapt:
     
    ~WideCapt([BegTag='НачальныйТэг'][,EndTag='КонечныйТэг'][,RecordsetNum=НомерРекордсета])~
    ,где
    BegTag - текст HTML, который будет выведен перед данными.
    EndTag - текст HTML, который будет выведен после данных.
    RecordsetNum - Задает номер рекордсета, при условии, что процедура возвращает более одного рекордсета.
     
     
    Синтаксис метки Wide:
     
    ~Wide([BegTag='НачальныйТэг'][,EndTag='КонечныйТэг'])~
    ,где
    BegTag - текст HTML, который будет выведен перед данными.
    EndTag - текст HTML, который будет выведен после данных.
     
    Пример использования меток WideCapt и Wide:
     
    <TABLE border="1">
    <TR>
     <TH align="center" bgcolor="#C0C0C0">№п/п;
      ~WideCapt(begtag='<TH bgcolor="#C0C0C0">')~
    </TR>
    <TR bgcolor="#~ROWCOLOR~">
     <TD align="center">&nbsp;~Counter()~&nbsp;
      ~Wide(begtag='<TD>')~
    </TR>
    </TABLE>
     
     
    Прочие функции
     
    Для подстановки в метки текущего значения какого-либо элемента в элементе Report существуют две метки-функции: EntityValue и EntityValueName.
    Их синтаксис:
     
    ~EntityValue(ИмяЭлемента)~ - вместо этого в отчёт будет подставлено значение элемента (его id).
    ~EntityValueName(ИмяЭлемента)~ вместо этого в отчёт будет подставлено отображаемое значение элемента.
    Если элемент с таким именем не существует - результатом функции будет пустая строка.
     

     

    5.3.21.3. Формирование отчета в виде XML
    Для формирования отчета в формате XML и вывода его на экран с помощью XSL-преобразования разработчик в качестве шаблона (выходной параметр @PATH в процедуре REP_ИмяЭлемента_STF) указывает файл в формате XSL.
     
    В этом случае допускается возвращать из процедуры все рекордсеты либо в формате XML (с использованием инструкции FOR XML) либо в обычном формате. В случае, когда используется FOR XML, разработчик в свойствах элемента должен обязательно указать ключевое слово xml.
     
    В этом случае интерфейсный модуль все рекордсеты и выходные параметры сохраняет в файл XML следующего формата:
    Для обычных рекордсетов:
    <?xml version="1.0" encoding="windows-1251" ?>
    <?xml:stylesheet type="text/xsl" href="Шаблон.xsl" ?>
    <root>
    <params ИмяПараметра="ЗначениеПараметра" [ ,...n ]/>
    <rowset index="1">
      <row ИмяПоля="ЗначениеПоля" [ ,...n ]/>
      <row ИмяПоля="ЗначениеПоля" [ ,...n ]/>
      ...
    </rowset>
    <rowset index="2">
      <row ИмяПоля="ЗначениеПоля" [ ,...n ]/>
      <row ИмяПоля="ЗначениеПоля" [ ,...n ]/>
      ...
    </rowset>
    </root> 
     
    Для рекордсетов FOR XML:
    <?xml version="1.0" encoding="windows-1251" ?>
    <?xml:stylesheet type="text/xsl" href="Шаблон.xsl" ?>
    <root>
    <params ИмяПараметра="ЗначениеПараметра" [ ,...n ]/>
    XML из рекордсетов FOR XML
    </root> 
     
     
    Замечание: При написании XSLT файлов следует учитывать, что формат XML чувствителен к регистру.
    Если в качестве шаблона в параметре @PATH указать .xsl то в элемент Report отобразит исходный xml, без преобразования его в HTML.

    5.3.21.3.1. Отображение картинок при формировании отчета в виде XML
     
    Для отображения картинок, хранящихся в базе данных в возвращаемом XML нужно возвратить атрибут src в произвольном элементе вида:

    src="infopolis://FileSource FileName=Идентификатор,Table=Таблица"

    где Идентификатор - id файла, Таблица - имя таблицы, в которой хранится картинка.

    В шаблоне xsl для вывода картинки нужно прописать:

    <img src="Идентификатор"/>

    где Идентификатор - id файла.

     

     

    Пример возвращаемого XML-файла:

    <tov name=" soft Dalia ALIZE K-06 - 80E" price="25.9400">
     
    <picture id="25000000011" src="infopolis://FileSource FileName=25000000011,Table=tov_pict" />
    </
    tov>

    Шаблон для конвертации в HTML будет выглядеть так:

    <?xml version="1.0" encoding="windows-1251"?>
    <
    xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
    <
    html>
    <
    body>
    <xsl:apply-templates/>
    </body>
    </
    html>
    </
    xsl:template>

    <xsl:template match="picture">
    <
    img src="{@id}"/><br/>
    </
    xsl:template>

    </xsl:stylesheet>


    5.3.21.4. Особенности работы
    Особенности работы
    В элементе Report используется браузер Internet Explorer, версия которого соответствует версии, установленной в системе Windows.
    Для корректной работы с кодировками каждый шаблон должен содержать в заголовке документа строку:
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
    Также в системе "Инфополис" введен единый стандарт отчетов, который прописан в файле style.css.
    Необходимые стили из этого файла следует копировать во все создаваемые шаблоны.
     
    Функциональность отчетов, создаваемых элементом Report можно повысить применяя Java Script, элементы ActiveX и другие возможности Microsoft Internet Explorer.
     
    Кроме стандартных отчетов в формате HTML элемент Report может содержать в себе многомерные отчеты. Подробнее об этом описано в элементе PivotTable.
     
    При печати всех отчетов (за исключением некоторых бланков строгой отчетности либо жестко регламентированных) в правом верхнем углу первой страницы элемент выводит мелким шрифтом название фирмы разработчика и его координаты.

    5.3.21.5. Макросы
    Элемент Report может выполнять макросы при обработке ссылок. Ссылка считается макросом, если в ней используется протокол infopolis://.
     
    Также макросом будут являться обычные ссылки, без указания протокола, при условии, что они начинаются c двух значков доллара $$ (этот режим используется для обеспечения совместимости с ранними версиями и не рекомендуется к использованию).
     
     Пример: в сформированном отчете в тексте html встречается такая строка:
      <a href="infopolis://RunProc JUMP_MOVE, move_id=105">Перейти</a>
    Это значит, что при клике на этой ссылке будет выполнен макрос "RunProc JUMP_MOVE, move_id=105". Подробнее о макросе RunProc. Подробнее о макросе JUMP.
     
    Также разрешен вызов макроса из процедуры обновления отчета, при условии, что вызов процедуры RUN_MACROS идёт в конце процедуры обновления отчета REP_xxx_STF.

    5.3.21.6. Пример
    Пример отчета в формате HTML:
    Нам нужно получить отчет по товарам на складе следующего вида:
    Группа Подгруппа Товар Количество
    Группа1 250
    Подгруппа1 150
    Товар1 100
    Товар2 50
    Подгруппа2 50
    Товар3 20
    Товар4 30
    Итого: 250
    Для этого нам нужно создать шаблон следующего вида:
    <HTML>
    <HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
    <LINK REL=STYLESHEET TYPE="text/css" HREF="style.css">
    </HEAD>
    <BODY>
    <TABLE>
    <TR>
    <TH>Группа
    <TH>Подгруппа
    <TH>Товар
    <TH>Количество
    <TR>
    <TD colSpan=3>~Header(TOV_GROUP_NM)~ ~TOV_GROUP_NM~
    <TD>~SUM(QTY,TOV_GROUP_NM)~
    <TR>
    <TD>
    <TD colSpan=2>~Header(TOV_SUBGROUP_NM)~ ~TOV_SUBGROUP_NM~
    <TD>~SUM(QTY,TOV_SUBGROUP_NM)~
    <TR>
    <TD colSpan=2>
    <TD>~TOV_NM~
    <TD>~QTY~
    <TR bgColor=silver>
    <TD colSpan=3>Итого:
    <TD>~Sum(QTY)~
    </TABLE>
    </BODY>
    </HTML>
    Процедура REP_ИмяЭлемента_STF должна возвратить набор следующего вида:
     
    TOV_GROUP_NM TOV_SUBGROUP_NM TOV_NM QTY 
    Группа1 Подгруппа1 Товар1 100
    Группа1 Подгруппа1 Товар2 50
    Группа1 Подгруппа2 Товар3 20
    Группа1 Подгруппа2 Товар4 30

    5.3.22. Timer
     
    Данный элемент предназначен для периодического запуска процедуры на сервере.
     

    Процедуры

    A_ИмяЭлемента_TIMER

    Свойства

    Period=Число
     
    Задает период запуска процедуры в секундах.
     
    AsyncMode={True|False}
     
    Задает режим выполнения процедуры. При значении данного свойства True процедура будет запускаться асинхронно, при False - синхронно. Значение по умолчанию - True. 
     
    OnTimerMacros=Макрос
    Задает макрос, который будет выполнен при срабатывании таймера. Процедура A_ИмяЭлемента_TIMER при этом не вызывается.
     
    OnBeforeTimerMacros=Макрос
    Задает макрос, который будет выполнен при срабатывании таймера перед вызывом процедуры A_ИмяЭлемента_TIMER.

    5.3.23. Multi
     
    Данный элемент используется в том случае, когда на этапе разработки неизвестно количество и тип элементов внутри какого-либо родительского элемента. Например, в таблице (элемент Grid) нужно вывести количество товаров на складах. Каждый склад нужно представить в виде отдельной колонки. Но, поскольку классификатор складов редактируется пользователем, на этапе разработки мы не можем сказать, сколько колонок будет в нашей таблице. Для представления таких "многоколоночных наборов" и применяется тип элементов Multi. В нашем примере элемент Multi будет объединять колонки, представляющие собой количество товара на отдельном складе. Кроме того, в нашей таблице будет присутствовать обычный элемент Id для уникальной идентификации товара и элемент Edit для вывода наименования товара. В процессе конфигурирования родительского элемента Grid в нем создаются подчиненные элементы-столбцы, в нашем случае это невидимый столбец типа Id и столбец типа Edit.
    В процессе обновления данных (процедурой G_ИмяЭлемента_STF) элемент Multi обрабатывает полученный рекордсет и создает дополнительные колонки. Этот процесс называется конфигурированием элемента.
    Конфигурирование элемента Multi может осуществляться двумя способами:
    1. Процедура выдачи данных родительского элемента выдает один рекордсет, состоящий из полей конфигурирования и полей данных. Ниже перечислены эти поля:
     
    ИмяЭлемента_mid - идентификатор элемента, в нашем случае это идентификатор склада.
    ИмяЭлемента_capt - заголовок элемента, в нашем случае это название склада.
    ИмяЭлемента_type - тип элемента. Наличие данного поля необязательно, если в свойствах элемента Multi задан общий тип элементов.
    ИмяЭлемента_props - свойства элемента, зависящие от его типа. Наличие данного поля необязательно.
    ИмяЭлемента_need - аналогично полю Need в среде разработки Builder. Наличие данного поля необязательно.
    ИмяЭлемента - значение, выводимое в ячейку таблицы, выводится для всех типов элементов, кроме Combobox.
    ИмяЭлемента_ID - только если тип элемента Combobox, значение ключа
    ИмяЭлемента_NM - только если тип элемента Combobox, текстовое значение
    , здесь ИмяЭлемента - имя элемента Multi.
     
    2. Процедура выдачи данных родительского элемента выдает два рекордсета - один для конфигурирования колонок, другой для заполнения колонок данными. В первом рекордсете должны присутствовать только следующие поля:
     
    ИмяЭлемента_mid - идентификатор элемента, в нашем случае это идентификатор склада.
    ИмяЭлемента_capt - заголовок элемента, в нашем случае это название склада.
    ИмяЭлемента_type - тип элемента. Наличие данного поля необязательно, если в свойствах элемента Multi задан общий тип элементов.
    ИмяЭлемента_props - свойства элемента, зависящие от его типа. Наличие данного поля необязательно.
    ИмяЭлемента_need - аналогично полю Need в среде разработки Builder. Наличие данного поля необязательно.
     
    Во втором рекордсете: 
    ИмяЭлемента_mid - идентификатор элемента.
    ИмяЭлемента - значение, выводимое в ячейку таблицы, выводится для всех типов элементов, кроме Combobox.
    ИмяЭлемента_ID - только если тип элемента Combobox, значение ключа
    ИмяЭлемента_NM - только если тип элемента Combobox, текстовое значение
    , здесь ИмяЭлемента - имя элемента Multi.
     
      Способ конфигурирования элемента выбирается исполняемым модулем автоматически, исходя из наличия полей других элементов в первом рекордсете.
     
     
    Для каждого родительского элемента допускается использование только одного элемента Multi.
     
    При сохранении одной строки родительского элемента процедура сохранения C_ИмяЭлемента_STF запускается столько раз, сколько было модифицировано значений в колонках, порожденных элементом Multi.

    Свойства

    type=ТипЭлемента
    Данное свойство указывается в том случае, если все элементы, порожденные данным элементом имеют один тип (например, Calc либо Edit). В противном случае тип элементов указывается в рекордсете в поле ИмяЭлемента_type.
     
    AlwaysView={True|False}
    Если свойство AlwaysView=True колонки, созданные данным элементом не сохраняются в макетах и всегда отображаются. Даже если пользователь скроет какие либо колонки, при следующем заходе в программу эти колонки будут отображены. Данное свойство целесообразно устанавливать в тех случаях, когда колонки не привязаны к сущностям базы данных (а привязаны, например к датам).
     
    AlwaysMaket={True|False}
    При значении True элемент Multi сохраняет в макетах колонки, которые не были возвращены из базы данных при очередном обновлении родительского элемента. По умолчанию значение данного свойства равно False и если процедура обновления родительского элемента не возвращает какие-либо из уже созданных колонок, эти колонки удаляются из макетов.
    Данное свойство целесообразно устанавливать в том случае, когда один и тот же элемент Multi возвращает разные наборы колонок, в зависимости от различных условий.

    5.3.25. FastReport

    5.3.26. CheckListBox
     
    Выпадающий список с возможностью множественного выбора.
    Процедура для его раскрытия во многом схожа с процедурой для элемента ComboBox.
     
    Значение данного элемента, которое передается на сервер в качестве параметра, представляет собой строку с перечислением идентификаторов выбранных строк списка, разделенных запятыми.
     
    Для преобразования этого значения на сервере в список идентификаторов можно использовать функцию StrAsTable.
     

    5.3.27. PivotTable
     
    Данный элемент предназначен для многомерного анализа данных (OLAP).
    Он может работать в двух режимах: "Клиентский OLAP" и "Серверный OLAP".
     
    Клиентский OLAP
    В этом режиме при обновлении элемента вызывается процедура REP_ИмяЭлемента_STF, которая должна возвратить рекордсет для анализа.
    Данный режим работает по умолчанию.
     
    Серверный OLAP
     
    Для задания этого режима в свойствах элемента нужно прописать:
    OlapCube=ИмяКуба
     
     
     

    5.3.28. PivotChild

    5.3.29. Ole
    Элемент Ole предназначен для того, чтобы предоставить разработчику возможность работы с внешними объестами, поддерживающими технологию Ole Automation.
     
    Создать элемент типа Ole (как собственно и любой другой) можно либо
    в Builder-е либо с помощью макроса Create.
    Синтаксис макроса Create:
    create Name=TestOle, type=Ole [,props='OleClassName="Имя класса Ole"']
     
    Активируется элемент при вызове макроса Refresh, синтаксис которого:
    Refresh ent=testole [,ИмяПараметра1=ЗначениеПараметра1[...]]
     
    Созданный элемент при вызове макроса Refresh запускает процедуру вида
    G_ИмяЭлемента_STF, которая должна вернуть следующие данные:
    - выходной параметр @OleClassName varchar(255), в котором указано имя
    OLE-класса, например 'Word.Application'. (Этот параметр не обязателен, если он
    указан в свойствах сущности в поле props, например
    OleClassName='Word.Application')
    - один или несколько рекордсетов со следующими полями:
    1.  MethodName - имя вызываемого метода, свойства или функции
    2.  MethodKind - что вызывается. Значения поля: Procedure - указывается, когда не
    требуется получить возвращаемое значение; Function - метод возвращает значение,
    при этом SQL-процедура запускается еще раз, и ей передается параметр с именем,
    которое соответствует имени метода и значением, полученным в результате
    выполнения метода(функции); PropertyGet - вызываемый метод представляет собой
    свойство и нужно получить значение этого свойства, работает аналогично значению
    Function, за исключением того, что при получении значения свойства не
    допускается указание параметров(см.ниже); PropertyPut - вызываемый метод
    представляет собой свойство и нужно задать его значение. При этом допускается
    указывать только один параметр - требуемое значение свойства (см.ниже). Если в
    рекордсете данное поле не присутствует, то по умолчанию метод имеет тип
    Procedure.
    3. ResultName - если данное поле присутствует в рекордсете, это значит,
    что возвращаемое значение вызываемого метода будет сохранено
    в памяти интерфейсного модуля под именем, заданным в значении этого поля,
    и может быть использовано при вызове других методов в качестве параметра.
    4. ObjectToken - указывает объект, метод которого будет вызван.
    Объект должен быть создан перед этим с помощью вызова другого метода
    и сохранен под именем, указанным в поле ResultName.
    Если данное поле отсутствует в рекордсете, будет вызван метод основного объекта, указанного в параметре или в свойстве OleClassName.
     
    5. Param[Stored]1,Param[Stored]2,Param[Stored]3 и т.д. (макс.кол-во 64) - параметры, которые передаются в
    вызываемый метод. Для значения MethodKind - Procedure и Function допускается
    указание до 64 параметров, для PropertyPut - только один, для PropertyGet
    параметры не допускаются. При задании суффикса Stored в качестве значения параметра будет взято не значение поля, а сохраненный результат вызова другого метода, указанный ранее в поле ResultName.
     

    Ниже представлен пример процедуры, первая создает текстовый файл на компьютере
    клиента и записыват в него имена всех хранимых процедур:
     
    create proc G_TestOle_STF
     @OleClassName varchar(255) out
    as
    set @OleClassName='Scripting.FileSystemObject'
     
    select 'CreateTextFile' as MethodName
     ,'C:\Temp\testole.txt' as Param1
     ,'MyFile1' as ResultName
     
    select 'MyFile1' as ObjectToken
     ,'WriteLine' as MethodName
     ,name as Param1
    from sysobjects
    where type='P'
    order by Param1
    GO
     
    Пример процедуры для работы с кассовым аппаратом,
    которая открывает чек, печатает две строки и закрывает чек:
     
    create procedure G_KassaOle_STF
    @OleClassName varchar(255)=null out
    AS
     
    -- Имя OLE класса
    set @OleClassName='CashRegisterLib.CashRegister'
     
    -- Открываем чек
    select 'OpenCheck' as MethodName, 2 as Param1, 4800 as Param2
    -- Добавляем в чек товары
    select 'AddCheckPosition' as MethodName
    ,'1;Молоко;2.50;1.000;1;1;1;0;0;' as Param1
    union all
    select 'AddCheckPosition','2;Кефир;3.25;2.000;1;1;1;0;0;'
     
    -- Закрываем чек
    select 'CloseCheck' as MethodName
    GO

    5.4. Процедуры
    В данной главе описаны процедуры, вызываемые элементами интерфейса в ответ на различные события
    5.4.1. BTN_Имя элемента_CLICK

    Вызывается при нажатии на кнопку.

    Процедура применяется для типов элементов Button,WinBtn


    5.4.2. G_Имя элемента_STF

    Процедура отображения данных. Данная процедура вызывается при необходимости обновить данные родительского элемента: при первом отображении элемента, при открытии формы или переходе на закладку, на которой находится родительский элемент, при нажатии на кнопку обновить, при вызове макроса Refresh или RefreshCurrentRow, при изменении текущего индекса родительского элемента (связка главный/подчиненный). Данные требуется обновить только при условии, что данный родительский элемент имеет дочерние элементы без свойства filter.

    Данная процедура должна вернуть рекордсет, состоящий из полей, каждое из которых соответствует определенному дочернему элементу данного элемента. Каждому дочернему элементу может соответствовать одно или несколько полей в рекордсете. Имя поля должно соответствовать имени дочернего элемента, за исключением типов элементов ComboBox, RadioBox. Поля, необходимые для данных элементов описаны в разделах, посвященных этим типам элементов. Кроме полей данных, данная процедура может вернуть также и поля форматирования. Имена этих полей имеют формат #ИмяЭлемента и должны иметь строковый тип данных. ИмяЭлемента может представлять собой как имя дочернего элемента, так и имя текущего родительского элемента, для которого вызывается данная процедура. В первом случае форматирование будет относиться только к дочернему элементу (например, цвет отдельной ячейки), во втором случае – к строке родительского элемента целиком (например, цвет строки в таблице). Формат данных поля форматирования дочернего элемента имеет следующий вид:

    {ИмяСвойства=ЗначениеСвойства}[,…]

    Родительского элемента

    [ИмяСвойства=ЗначениеСвойства][,…], {[ent=ИмяДочернегоЭлемента, {ИмяСвойства=ЗначениеСвойства}[,…]]}[,…]

    В качестве ИмяСвойства могут выступать свойства элемента, отображаемые в ObjectInspector-е в режиме дизайна, а также некоторые заранее определенные свойства. Для элементов типа Grid и Node определены следующие свойства: Color – цвет ячейки, TextColor – цвет шрифта отдельной ячейки. Для элемента типа Node: img – имя пиктограммы, которая будет отображаться слева или справа от текста в ячейке.

    Особенности применения: Для элемента типа Node  ко входным параметрам этой процедуры, помимо стандартных добавляется параметр @ИмяРодительскойВетки_PRNT, где ИмяРодительскойВетки  - имя элемента, связанного с веткой, внутри которой происходит обновление информации. Если обновление информации происходит на первом уровне (корень дерева), то данный параметр не передается. Рекомендуется этот параметр в процедуре объявлять со значением по умолчанию NULL.

    Процедура применяется для типов элементов  Frame, Page, Form, Grid, Node


    5.4.3. C_ИмяЭлемента_STF

    Процедура сохранения данных. Вызывается для сохранения измененных данных для каждой строки (за исключением тех случаев, когда в свойствах элемента указано SaveAsXml, о чем будет рассказано ниже). В эту процедуру передаются параметры, соответствующие дочерним элементам, при условии, что на дочерний элемент не ReadOnly, и не имеет свойства filter. Примечание: Если у дочернего элемента присутствует свойство SaveRo, то в процедуру сохранения данных параметр, соответствующий этому элементу будет передан вне зависимости от того, ReadOnly этот элемент или нет..

    Параметры, соответствующие дочерним элементам типа Id должны быть объявлены как выходные (out) – это необходимо для того, чтобы интерфейсный модуль при создании новой строки мог перейти на нее после сохранения.

    Как было уже сказано выше, данная процедура вызывается для каждой измененной строки определенного родительского элемента при нажатии пользователем кнопки “Сохранить” (либо клавиши Enter). После отработки пакета процедур сохранения интерфейсный модуль SmartBricks запускает процедуру отображения данных, для того, чтобы отобразить реально сохраненные в базе данных значения. Для того чтобы предотвратить запуск процедуры обновления, процедура сохранения данных должна вернуть рекордсет, состоящий из одной строки и с набором полей, аналогичным полям процедуры отображения данных. Это, как правило, достигается тем, что в процедуру сохранения данных добавляется вызов процедуры отображения данных с параметром, соответствующим первичному ключу редактируемой записи.

    Особенности применения: Для элемента типа Node  к входным параметрам этой процедуры, помимо стандартных, добавляется параметр @ИмяРодительскойВетки_PRNT, где ИмяРодительскойВетки  - имя элемента, связанного с веткой, внутри которой происходит обновление информации. Если обновление информации происходит на первом уровне (корень дерева), то данный параметр не передается. Рекомендуется этот параметр в процедуре объявлять со значением по умолчанию NULL.

    Если в свойствах элемента указано SaveAsXml тогда данная процедура будет вызвана один раз для всех измененных строк, и в нее вместо параметров, соответствующих дочерним элементам, будет передан один параметр с именем, соответствующим имени элемента (или переопределенным с помощью свойства Param). Этот параметр должен иметь тип xml. Значению этого параметра будет соответствовать текст в формате XML следующей структуры:

    <?xml version="1.0" encoding="windows-1251" ?>

    < ИмяЭлемента >

      <row {ИмяДочернегоЭлемннта=”Значение дочернего элемента” [,...n]} [ИмяДочернегоЭлемннта_mid=IdMulti]>

      <row {ИмяДочернегоЭлемннта=”Значение дочернего элемента” [,...n]} [ИмяДочернегоЭлемннта_mid=IdMulti]>

    </ИмяЭлемента>

     

    Где ИмяЭлемента/ИмяДочернегоЭлемннта  – имя данного/дочернего элемента в нижнем регистре либо если в свойстве данного элемента указано значение Param=ПереопределенноеИмя то переопределенное имя без изменения регистра.

    Для Multi - элементов также добавляется параметр ИмяДочернегоЭлемннта_mid.

    Процедура применяется для типов элементов  Frame, Page, Form, Grid, Node


    5.4.4. D_ИмяЭлемента_STF
    Процедура удаления данных. Вызывается для удаления текущей строки при нажатии пользователем кнопки “Удалить” либо при нажатии сочетаний клавиш Ctrl+Delete. В эту процедуру передаются параметры, соответствующие дочерним элементам типа Id. После вызова данной процедуры интерфейсный модуль запускает процедуру отображения данных.
     
    Процедура применяется для типов элементов  Frame, Page, Form, Grid, Node

    5.4.5. N_ИмяЭлемента_STF

    Процедура выдачи данных по умолчанию. Вызывается при добавлении новой строки при нажатии пользователем кнопки “Вставить” либо при нажатии сочетания клавиш Ctrl+Insert. Если процедура возвращает одну строку с полями, соответствующими дочерним элементам, значения полей будут отображены в дочерних элементах как значения по умолчанию. Рекордсет, возвращаемый этой процедурой аналогичен рекордсету, возвращаемому процедурой отображения данных (G_ИмяЭлемента_STF), за исключением того, что в нем могут присутствовать не все поля для дочерних элементов. Если при запуске процедуры произошла ошибка или такая процедура не существует, то при добавлении новой записи будет вставлена пустая строка, и в дальнейшем при добавлении новой записи в элемент эта процедура запускаться не будет. То есть, если процедура N_ была создана после того, как пользователь пытался добавить новую запись в элемент, данная процедура будет запускаться на выполнение только после перезагрузки приложения.

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

    Процедура применяется для типов элементов  Frame, Page, Form, Grid, Node.

    Для типов элементов Frame, Page, Form данная процедура не должна возвращать рекордсет, и должна вызывать какой либо макрос.


    5.4.6. A_ИмяЭлемента_EVAL
    Процедура пересчета. Вызывается после сохранения или удаления данных. Может потребоваться для выполнения каких-либо пересчетов после модификации данных. Для того, чтобы эта процедура вызывалась, в свойствах элемента нужно прописать свойство
    eval.
    5.4.7. CHK_ИмяЭлемента_CHNG
    Процедура проверки модификации данных. Вызывается перед сохранением или удалением данных. Кроме стандартных параметров (указанных в поле need Builder-а) в данной процедуре должны быть объявлены два дополнительных параметра: ACTION, входной, строкового типа, и YES, выходной (out) логического типа (bit в MS SQL Server). В параметр ACTION будет передана строка ‘SAVE’ при сохранении данных и ‘DELETE’ при удалении записи. Если параметр YES вернет значение False (0 для типа данных bit в MS SQL Server) модификация данных выполнена не будет. Для того, чтобы эта процедура вызывалась, в свойствах элемента нужно прописать свойство check.
    5.4.8. A_ИмяЭлемента_CHNG
    Данная процедура вызывается при изменении значения в элементе редактирования - вводе с клавиатуры символа в поле Edit, выборе строки в выпадающем списке и т.п.
    5.4.9. CB_ИмяЭлемента_DROP
    Процедура выдачи данных для списка.
    Должна возвратить рекордсет из двух полей ИмяЭлемента_id, ИмяЭлемента_nm либо из одного поля ИмяЭлемента. В первом случае поле ИмяЭлемента_id не отображается и служит ключем, который может передаваться в другие процедуры.
     
    Процедура применяется для типов элементов   Combobox ,RadioBox ,CheckListBox.
     
    Для элемента Combobox допускается наличие следующих полей:
    ИмяЭлемента_img - имя пиктограммы.
    ИмяЭлемента_indent - величина отступа в пикселях, для отображения иерархических списков.
     
    Для элемента Radiobox допускается наличие следующих полей:
    ИмяЭлемента_enabled - bit - позволяет сделать некоторые пункты недоступными для выбора пользователем.
     

    5.4.10. A_ИмяЭлемента_TIMER
     
    Процедура, запускаемая периодически через определенный интервал времени с помощью элемента Timer.
    Данная процедура не должна возвращать рекордсет.
    Из данной процедуры можно вызывать макросы.
     
    Процедура применяется для элемента   Timer

    5.5. Макросы
     
    Макросом в системе Smart Bricks называется команда, переданная интерфейсному модулю для выполнения каких-либо действий. Для вызова макроса из хранимых процедур служит процедура RUN_MACROS c единственным строковым параметром @MACROS. Однако для облегчения вызова наиболее часто используемых макросов существуют процедуры-оболочки. Примером таких процедур служит процедура MESSAGE для макроса message и процедура RUN_MACROS_FORM для макроса create.
     
    Общий синтаксис макросов:
     
    ИмяМакроса {Параметр=Значение, [ ,...n ]}
     
    ИмяМакроса и Параметр регистронезависимые и должны следовать соглашению о наименованиях.
    Значение - Строка - значение параметра макроса. Если строка содержит пробелы либо знаки препинания, она должна заключаться в двойные либо одинарные кавычки.
    Если в самом значении содержатся кавычки, обрамляющие значение, они должны быть задвоены.
    В одной строке можно передавать несколько макросов, разделенных точкой с запятой.
     
    Принцип реализации:
    В процессе работы интерфейсный модуль Smart Bricks запускает множество хранимых процедур как реакцию на какие-либо события. Если в теле хранимой процедуры произошел вызов процедуры RUN_MACROS, интерфейсный модуль выполняет определенное действие, зависящее от типа макроса. Ниже перечислены макросы, поддерживаемые средой Smart Bricks. 
     
    Если возможностей стандартных макросов не хватает, можно воспользоваться функционалом, предоставляемым модулем выполнения скриптов.
     

    5.5.1. Input
    Input
    Данный макрос предназначен для запроса информации у клиента.
    Результатом его работы является появление диалогового окна с полями ввода информации.
    После нажатия кнопки Ok, расположенной на этом окне, исполняемый модуль запускает процедуру, вызвавшую макрос, еще раз с теми же параметрами и с дополнительными, соответствующими полям ввода.
     
    Параметры макроса можно разделить на две группы - параметры собственно макроса и параметры, соответствующие полям ввода.
     
    Параметры макроса задаются в начале макроса. Затем идут параметры полей ввода.
     
    Параметры полей ввода условно объединены в группы. Каждая группа начинается с параметра name и описывает одно из полей ввода.
     
    Синтаксис:
     
    input
    [title=ЗаголовокОкна,]
    [HelpCode=КонтекстнаяСправка,]
    [Sound=ИмяЗвука,]
    [CancelAction=ИмяПараметра,]
    name=ИмяЭлемента,type=ТипЭлемента,caption=ЗаголовокЭлемента[,default=ЗначениеПоУмолчанию[,deftext=ТекстПоУмолчанию]][,sql=SqlЗапрос]
    [,DropDownFilter]
    [,StoreDefault[=True|False]]
    [,path=ПутьКФайлу[,mask=Маска]]
    [,SetPeriod=ИмяЭлементаDate|Near]
    [,Focused=True|False]
    [,СвойствоЭлемента=ЗначениеСвойства]
    {,name=ИмяЭлемента ... [ ,...n ]}
     
    Параметры макроса:
    title - заголовок окна. Если не задан - заголовок наследуется от элемента, из которого вызван макрос.
    HelpCode - Код топика контекстной справки. Если данный параметр задан, на форме будет отображена кнопка Справка, при нажатии на которую пользователю будет предоставлена глава справки, соответствующая этому коду. Подробнее см. создание контекстной справки.
    Sound - позволяет проигрывать стандартный звук Windows либо нестандартный, хранящийся в базе данных. Аналогичен параметру sound макроса PlaySound.
    CancelAction - Данный параметр задается только в том случае, если требуется повторно запустить процедуру при нажатии кнопки Отмена (Cancel). В значении данного параметра указывается имя параметра-флага хранимой процедуры, который будет установлен. Тип параметра хранимой процедуры должен быть bit. Данный параметр применяется, когда необходимо вызвать два макроса Input последовательно, причем отмена первого не должна прерывать выполнение процедуры.
     
    Параметры полей ввода:
    name - Имя, присваиваемое дополнительному параметру. Должно соответствовать соглашению о наименовании. Параметр с этим именем будет передан в процедуру.
    type - Определяет тип элемента. Может принимать одно из следующих значений: Edit, Combobox, Calc, CheckBox, СheckListBox, Date, File, Shedule. Назначение этих элементов аналогично одноименным стандартным элементам, за исключением элементов типа File и Shedule, работа с которыми описана ниже.
    caption - Заголовок элемента, отображается слева от поля ввода. Может быть многострочным. Для элементов типа File заголовок может быть не задан, при этом нужно обязательно задать параметр path либо mask.
    default - Значение по умолчанию. Отображается в поле ввода для всех визуальных элементов, кроме Combobox,СheckListBox и Shedule. Для этих элементов в данном параметре нужно передавать идентификатор значения по умолчанию.
    deftext - применяется только для элементов типа Combobox, СheckListBox и Shedule совместно с параметром default. В параметре default указывается идентификатор, а в параметре deftext - текст, отображаемый в элементе.
    StoreDefault - позволяет запоминать предыдущее значение свойств default и deftext. Значения запоминаются в реестре для текущего пользователя Windows.
    setperiod - Применяется только для элемента типа Date. Задает имя элемента, который в паре с текущим элементом образует пару элементов для задания периода. Данное свойство устанавливается для второго элемента в паре, а значение этого свойства - имя первого элемента. Если вместо имени элемента задано ключевое слово Near либо имя не задано вовсе, первым элементом пары будет первый элемент типа Date, стоящий перед текущим.
    Focused - позволяет установить фокус ввода на данный элемент. Если ни на один из элементов данное свойство не задано - фокус будет установлен на первый элемент, у которого не задано свойство ReadOnly=True.
     
    sql - Применяется только для элементов типа Combobox и СheckListBox. Содержит текст sql-запроса для заполнения списка при его открытии. Данный запрос должен возвратить рекордсет, состоящий как минимум из двух полей. Первое поле воспринимается как идентификатор, второе как текст, отображающийся в списке. Внимание! Данный запрос выполняется с правами текущего пользователя, поэтому не рекомендуется использовать в данном запросе прямой доступ к таблицам базы данных. Оптимальным является вызов той же процедуры, из которой вызывается данный макрос с дополнительным параметром. Например:
      exec BTN_mybutton_CLICK @get='MY_COMBOBOX1'.
    В данном случае по параметру @GET внутри процедуры мы можем определить, вызвана ли она для возвращения записей, заполняющих какой-либо список.
    Допускается в значении данного параметра использовать метки. Метка обрамляется символом ~ с двух сторон. Перед выполнением скрипта метка заменяется на значение одноименного элемента, объявленного в данном макросе. Например:
      exec BTN_mybutton_CLICK @get='TOV',@vt_id=~VT~
    DropDownFilter - применяется только для элемента типа Combobox. Позволяет фильтровать записи в выпадающим списке при его раскрытии. Если свойство sql содержит метку ~FILTER~, эта метка будет заменена на строку, введенную пользователем перед раскрытием списка. В этом случае фильтрация возлагается на сервер, т.е. запрос, заданный в свойстве sql должен корректно обработать данную метку. Если же метка ~FILTER~ в свойстве sql отсутствует, фильтрация по подстроке осуществляется на стороне клиента.
    Пример строки для макроса с элементом Combobox с фильтрацией на стороне сервера:
    input name=FIRM_INPUT,type=Combobox,caption=Контрагент,sql="BTN_SgRoznSellingNew_CLICK @get=''FIRM_INPUT'', @filter=''~FILTER~''",default=100001,deftext="Контрагент1",DropDownFilter
     
     
     

    5.5.1. Input
     
    Работа с элементом типа File.
    Тип File служит для передачи в процедуру одного или нескольких файлов. Если для данного элемента параметр Caption не задан, данный элемент отображаться в форме не будет. Если параметр Caption задан, на форме будет отображен специальный элемент для выбора файлов.
    Индивидуальные параметры для элемента File:
    path - Используется только если в процедуру нужно передать один файл, имя которого известно заранее. Содержит полный путь к файлу, который нужно передать в процедуру. Путь задается относительно клиента. Не может использоваться одновременно с параметром mask.
    mask - Используется когда в процедуру нужно передать несколько файлов. Содержит полный путь к файлу, который нужно передать в процедуру, включая маску для имени файла, например, C:\Temp\*.txt. Путь задается относительно клиента. Не может использоваться одновременно с параметром path и параметром caption. При заданном данном параметре процедура запускается для каждого найденного по маске файла. При каждом запуске в процедуру будет передаваться, кроме самого файла в параметре ИмяЭлемента, параметр ИмяЭлемента_ID, содержащий имя файла без пути.
    filter - Используется только тогда, когда не задан ни параметр path ни параметр mask. Применяется для фильтрации файлов в диалоге выбора файлов.
    Формат значения параметра:
      {Заголовок|Маска [ ,...n ]}
    ,где
    Заголовок - строка, которая отображается в выпадающем списке в диалоге выбора файлов.
    Маска - список масок, разделенных точкой с запятой, где * - любое количество символов, ? - произвольный символ.
     
    Пример фильтра:
      Text files (*.txt)|*.TXT|Pascal files|*.PAS;*.DPK;*.DPR
     
    FileNameOnly - Параметр типа Boolean, если True - то в процедуру будет передан только параметр ИмяЭлемента_NM, содержащий имя выбранного файла, сам же файл передаваться не будет. Параметр полезен для запроса имени файла, с последующим его сохранением на клиенте с помощью макроса copy_file.
    DirNameOnly - Параметр типа Boolean, если True - вместо диалога выбора файла будет показан диалог выбора директории.

    5.5.1. Input
     
    Работа с элементом типа Shedule.
    Элемент Shedule служит для упрощения работы с расписанием. Он представляет собой диалоговую форму, в которой пользователь может выбрать параметры расписания (например, каждый месяц, 10-го числа, каждые 30 минут).
    Для хранения расписания в системе служит таблица shed, структура которой схожа с системной таблице sysjobshedules для MSSQL2000 или sysshedules для MSSQL2005 (за исключением полей для хранения длительности, которые начинаются с duration_, их формат будет описан ниже).
    Выбранные параметры передаются в процедуру из которой был вызван макрос в виде пераметра ИмяЭлемента - ИмяЭлемента - содержит текст в формате XML, описывающий расписание. Формат XML:
    <root
      description="Заголовок"
      freq_type="int"
      freq_interval="int"
      freq_subday_type=int"
      freq_subday_interval="int"  
      freq_relative_interval="int"
      freq_recurrence_factor="int"
      active_start_time="int"
      active_end_time="int"
      duration_type="int"
      duration_interval="int"
    </root>
    ,где
      int - число в формате Integer.
      Формат и значения атрибутов описаны в таблице:
      Заголовок - строка, описывающая расписание (например: "Каждый понедельник каждого 3-го месяца в 15:00").
     
     
    Также в процедуру передается необязательный параметр
    ИмяЭлемента_NM, в котором дублируется содержимое атрибута description (Заголовок).
     
     

    5.5.1. Input
    Для преобразования расписания в формате XML в запись в таблице shed и обратно служат хранимые процедуры IP_SHED_TO_XML и IP_XML_TO_SHED.
     
    Индивидуальные параметры для элемента Shedule:
    TimeEnable : Boolean - Если значение данного параметра False - в диалоге расписания отсутствует возможность выбора времени, и, соответственно, в результате будут отсутствовать атрибуты freq_subday_type, freq_subday_interval, active_start_time, active_end_time. Значение по умолчанию - True.
    DurationEnable : Boolean - Разрешает задавать продолжительность. Может применяться для задавания расписания для процессов, имеющих длительность. Если DurationEnable=False, в результате будут отсутствовать атрибуты duration_type, duration_interval. Значение по умолчанию - False.

    5.5.2. Message
     
    Message
     
    Данный макрос служит для вывода пользователю какого-либа сообщения.
    Для вызова данного макроса служит хранимая процедура MESSAGE.
    Параметры этой процедуры:
    @MSG varchar - собственно текст, который будет выведен пользователю.
    @PICT_NM varchar - Имя пиктограммы, которая будет выведена в окне сообщения. Стандартные пиктограммы: 'Info','Question','Warning','Error'. Значение по-умолчанию - Warning.

    @PROC_ID int - идентификатор процедуры, из которой вызывается макрос. Данному параметру всегда нужно присваивать значение @@PROCID. При этом к сообщению, если пользователь является членом роли db_owner, будет добавлено имя процедуры, которая вызвала это сообщение. Данный параметр служит для облегчения поиска ошибок при отладке.
    @SAVE_ERROR bit - Если данный параметр установить в единицу и процедура, вызвавшая макрос является процедурой сохранения данных (C_ИмяЭлемента_STF), данное сообщение будет воспринято как ошибка сохранения и элемент не будет обновлен. Благодаря этому у пользователя появляется возможность исправить введенные данные и попытаться их сохранить повторно.
    @BEEP bit - указывать, проигрывать ли стандартный звук Windows при выводе сообщения. Стандартный звук зависит от параметра @PICT_NM.
    @SOUND varchar - позволяет проигрывать стандартный звук Windows либо нестандартный, хранящийся в базе данных. Аналогичен параметру sound макроса PlaySound.
    @HELP_CODE - Код топика контекстной справки. Если данный параметр задан, на форме сообщения будет отображена кнопка Справка, при нажатии на которую пользователю будет предоставлена глава справки, соответствующая коду. Подробнее см. создание контекстной справки.
     
    @MOVE_ID,@TOV_ID и т. д. - параметры прикладной системы, в данном случае INFOPOLIS, служащие для облегчения написания сообщений.
     
    Пример:
     
    declare @TOV_ID pk
    select @TOV_ID=tov_id from tov where tov_nm='Кофеварка'
    exec MESSAGE @msg='Товара нет на складе.', @tov_id=@TOV_ID, @proc_id=@@PROCID
     
    В результате отработки макроса пользователю будет выведено окно с сообщением следующего содержания: 
    Товара нет на складе.
    Товар - Кофеварка
    (Процедура " BTN_testbt_CLICK ")
     

    5.5.3. Refresh
     
    Refresh
     
    Служит для принудительного обновления элемента.
     
    Синтаксис:
     
    Refresh ent=Элемент [{,ДопПараметр=Значение [ ,...n ]}] [,ForceInvisible[=False|True]] [,proc_nm=ИмяПроцедуры]
     
    Где ent=Элемент - параметр, определяющий элемент, который нужно обновить. См. Параметр ent
     
    ДопПараметр=Значение - произвольные параметры, которые будут переданы в процедуру обновления.
     
    ForceInvisible - если параметр присутствует или равен True - элемент будет обновлён даже если он в данный момент не отображается на экране. В противном случае обновления не происходит.
     
    ИмяПроцедуры - используется только для элемента типа Report. Переопределяет имя хранимой процедуры для обновления данных.
     
     
    Примеры вызова макроса:
     
    Refresh ent=MyGrid
    Refresh ent=CurrentNode,tree=MyTree
     

    5.5.4. Set
     
    Set
     
    Данный макрос устанавливает свойства заданного элемента.
     
    Синтаксис:
     
    Set ent=Элемент {,Свойство=Значение [ ,...n ]} [,ApplyJustNow={True|False}] [,OnChange=False]
     
    Где ent=Элемент - параметр, определяющий элемент, свойство которого нужно установить. См. Параметр ent
    Свойство - Имя свойства, которое устанавливаем. Свойствами обычно являются свойства интерфейса, такие как Visible, Width, Height, Enabled.
    Значение - Значение свойства.
     
    ApplyJustNow - флаг, который указывает приложению немедленно применить указанные свойства. Используется при вызове нескольких макросов подряд. Значение по умолчанию - False. Данный параметр не следует указывать без необходимости.
     
    OnChange=False - при наличии данного флага при установке свойств типа Text,Id не будет отрабатываться стандартная реакция на изменение, указанная в Builder-е в свойстве Change.
     
    В одном макросе set можно устанавливать несколько свойств одного элемента.
     
    Для элементов типа Combobox и CheckListBox можно устанавливать свойство id. При установке этого свойства запускается процедура раскрытия списка CB_ИмяЭлемента_DROP для получения текста. При этом в процедуру будет передан необязательный параметр @VALUE, значение которого будет соответствовать значению id, устанавливаемому этим макросом. Процедура, ориентируясь на этот параметр, должна возвратить только одну строку. Данное свойство целесообразно применять для оптимизации, когда значений в выпадающем списке очень много.
     

    5.5.5. Confirm
     
    Выводит окно запроса с заданными кнопками.
    После нажатия на одну из кнопок закрывает окно и вызывает ту же процедуру, из которой был вызван данный макрос (аналогично макросу input).
     
    Синтаксис:
     
    Confirm text=Текст [,img=ИмяПиктограммы] [,title=Заголовок] {[,ИмяКнопки=ЗаголовокКнопки] [ ,...n ]} [,SaveError=True]
     
    text - текст запроса.
    img - имя пиктограммы, которая будет отображена на окне диалога. Возможные значения: Confirm, Info, Error.
    title - заголовок формы диалога.
    ИмяКнопки=ЗаголовокКнопки - список кнопок, которые будут на форме. ИмяКнопки - данное имя будет передано в процедуру в параметре @BUTTON. Если кнопки не указаны - по-умолчанию будут отображены две кнопки - YES и NO.
    SaveError - Если значение данного параметра равно True, то нажатие кнопки NO либо CANCEL будет воспринято как ошибка сохранения. Данный параметр имеет смысл использовать только в макросе, который вызывается из процедуры сохранения данных C_ИмяЭлемента_STF

    5.5.6. SystemCmd
     
    Служит для выполнения команды операционной системы на клиенте - запуска исполняемых либо командных файлов, открытия документов и т.д.
    Синтаксис:
     
    SystemCmd cmd=Команда[, action=Действие][, params=Параметры]
     
    cmd=Команда - команда, передаваемая операционной системе. Может содержать имя исполняемого файла либо имя документа.
    action=Действие - Если cmd содержит имя документа - действие над документом. Может быть Open либо Edit. По умолчанию - Open
    params=Параметры - Параметры командной строки

    5.5.11. SendMail
    Открывает почтовый клиент, установленный в системе по-умолчанию, и открывает диалог для создания нового письма.
    Синтаксис:
     
    SendMail To=Получатель [,Subj=Тема] [,Body=ТелоПисьма]

    5.5.12. Save
    Служит для принудительного сохранения родительского элемента.
    При выполнении данного макроса элемент запускает процедуру сохранения и затем обновляет себя, т.е. поведение аналогично нажатию кнопки "Сохранить".
     
    Синтаксис:
     
    Save ent=Элемент
     
    Где ent=Элемент - параметр, определяющий элемент, который нужно обновить. См. Параметр ent
     
    Примеры вызова макроса:
     
    Save ent=MyGrid
     

    5.5.13. RefreshCurrentRow
    Служит для принудительного обновления текущей строки элемента.
     
    Синтаксис:
     
    RefreshCurrentRow ent=Элемент [{,ДопПараметр=Значение [ ,...n ]}]
     
    Где ent=Элемент - параметр, определяющий элемент, который нужно обновить. См. Параметр ent
    ДопПараметр=Значение - произвольные параметры, которые будут переданы в процедуру обновления.
     
    При отработке данного макроса запускается процедура обновления элемента G_ИмяЭлемента_STF, в которую, кроме стандартных параметров будут переданы еще параметры, соответствующие дочерним элементам типа Id. При этом разработчик должен позаботиться о том, что-бы процедура вернула одну строку.
     
    Примеры вызова макроса:
     
    RefreshCurrentRow ent=CurrentNode,tree=MyTree
     

    5.5.14. PlaySound
    Этот макрос может воспроизводить звуки событий Windows, а также звуки из файлов, хранящихся в базе данных.
     
    Синтаксис:
     
    PlaySound sound=ИмяЗвука 
     
    где ИмяЗвука задает имя одного из стандартных звуков Windows либо имя файла, содержащего звук, из базы данных.
     
    Ниже описаны строковые константы для стандартных звуков Windows:
     
    standart - проигрывает стандартный звук с помощью спикера
    asterisk -  проигрывает звук "Звездочка" (SystemAsterisk)
    warning - проигрывает звук "Восклицание" (SystemExclamation)
    error -  проигрывает звук "Критическая ошибка" (SystemHand)
    question - проигрывает звук "Вопрос" (SystemQuestion)
    info- проигрывает звук "Стандартный звук" (SystemDefault)
     
    Замечание!
    Если требуется проигрывать звук одновременно с выводом сообщения пользователю, можно использовать параметр sound макроса MESSAGE.
    Если требуется проигрывать звук одновременно с выводом формы запроса макроса Input, можно использовать параметр sound этого макроса.

    5.5.15. Action
    Служит для запуска определенного действия указанным элементом.
     
    Синтаксис:
     
    Action ent=Элемент,action=Действие [{,ДопПараметр=Значение [ ,...n ]}]
     
    Где ent=Элемент - параметр, определяющий элемент, который запускает действие. См. Параметр ent
     
    action=Действие - код действия. См. ниже.
    ДопПараметр=Значение - дополнительные параметры, зависят от действия и типа элемента.
     
     
    Значения параметра action:
     
    CLICK - для элементов типа Button и WinButton. Эмулирует нажатие кнопки. При этом разрешается указывать дополнительные параметры.
     
    PRINT - для элемента Report. Отправляет отчет на печать, используя принтер по-умолчанию.
     
    SENDMAIL - для элемента Report. Позволяет отправить отчет по почте. При указании данного действия разрешается использование дополнительных параметров:
      format - формат тела письма, допустимые значения: mht,html. По-умолчанию - html.
      to - адресат
      subject - тема письма
      (примечание : на панели инструментов элемента report уже есть соответствующая кнопка, позволяющая отправлять отчет по почте, данный макрос можно использовать для расширения функциональности).
     
    EXECSCRIPT - выполняет произвольный скрипт для элемента Report. Скрипт будет выполнен при условии, что в элемент уже загружен отчет. Дополнительные параметры:
      script - скрипт для выполнения;
      language - язык скрипта, не обязателен, по умолчанию JavaScript;
     
     
    SAVETOFILE - для элемента Memo. Дополнительные параметры:
      FileName - задает имя файла с путем. Если файл существует - он будет перезаписан. Если параметр не задан - пользователю будет представлено диалоговое окно для выбора пути и имени файла.
      Text - текст, который нужно записать. Если не задан - будет записан текущий текст, отображаемый в элементе. Также можно использовать метку ~TEXT~, которая будет заменена на текст из элемента.
     
     
    DOTIMER - для элемента Timer. Эмулирует срабатывание таймера. При этом разрешается указывать дополнительные параметры.
     
    CANCEL - для родительских элементов, эквивалентно нажатию кнопки "Отмена".

    5.5.50. Параметр ent
     
    С помощью данного параметра задается элемент, к которому применяется макрос.
     
    Применяется в макросах Set, Refresh, RefreshCurrentRow, RefreshChilds, ApplyView, Save, Action.
     
     
    Синтаксис:
     
    ent={ИмяЭлемента|Current|{CurrentNode[,tree=ИмяДерева]} }
     
    ИмяЭлемента - имя явно заданного родительского элемента, который нужно обновить.
    Current - Текущий активный родительский элемент - элемент на котором установлен фокус ввода. Если фокус ввода установлен на неродительском элементе, тогда берется его родитель.
    CurrentNode - Текущий элемент типа Node. Определяется как элемент типа Node, соответствующий выделенной ветке в указанном либо текущем дереве.
    Tree=ИмяДерева - Применяется только если параметр ent имеет значение CurrentNode. Определяет дерево, на котором нужно определить текущую ветку. Если параметр не задан, берется текущее дерево.
    Sender - элемент, который запускает макрос. Если макрос запускается не элементом, возвращается текущий элемент (на котором установлен фокус ввода).

    5.6. Модуль выполнения скриптов

     

    Данный модуль предназначен для выполнения скрипта на клиенте. Язык скрипта может быть JavaScript, VBScript либо любой другой, поддерживаемый процессором InternetExplorer.

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

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

    Для запуска скрипта служит процедура RUN_SCRIPT_CLIENT. Рассмотрим её параметры:
     

    @SCRIPT nvarchar(max) = NULL -- -- текст скрипта, который нужно выполнить на клиенте. Нельзя задавать вместе с параметром @SCRIPT_FILE_NAME

    @LANGUAGE nvarchar(255) = NULL -- язык скрипта. По умолчанию JavaScript. Нельзя задавать вместе с параметром @SCRIPT_FILE_NAME

    @SCRIPT_FILE_NAME nvarchar(255) = NULL -- файл шаблона в формате html, в котором находится скрипт. Нельзя задавать вместе с параметрами @SCRIPT и @@LANGUAGE

    @PROC_NM nvarchar(255) = NULL -- процедура для выдачи данных, может использоваться для подстановки меток в файл шаблона скрипта. За образец можно брать процедуру REP_SgClientScriptRep_STF.

    ,@ADDITION_PARAMS nvarchar(max) = NULL -- дополнительные параметры и значения, через запятую, которые должны быть переданы в процедуру, указанную в @PROC_NM.

    ,@DEBUG_MODE bit = NULL  -- режим отладки, если передать 1 - будет выведена форма с элементом Report, в заданный скрипт будет открыт в виде HTML-файла.
    Также режим отладки включается, если во время выполнения макроса удерживать клавиши Shift и Alt. Если задан параметр @PROC_NM, реализация этой возможности должна быть в этой процедуре. За образец можно брать процедуру REP_SgClientScriptRep_STF.
     

     

    Как видно из параметров, скрипт можно передать напрямую в процедуру (параметр @SCRIPT) либо передать только имя файла-шаблона, в котором находится скрипт.

    Если при вызове заданы параметры @SCRIPT_FILE_NAME и @PROC_NM - файл шаблона будет предварительно обработан, в нем будут заменены метки, таким же образом, как и при выводе отчётов элементом Report.

     

    Имейте в виду, что элемент Report умеет выполнять такие же самые скрипты.


    5.9. Расширенная система формирования отчетов
     Расширенная система описания меток
    С целью минимизации работы программиста при создании отчетов (главным образом, бухгалтерских), в программе реализована система описания меток, позволяющая без программирования указать в какую из меток отчета выводить какую информацию и как ее извлечь из базы данных. Работа программиста сводится к регистрации отчета в Конфигураторе, написанию HTML-шаблона и созданию процедур подготовки наборов данных и процедур, возвращающих эти данные. Далее необходимо только описать метки и их свойства соответствующим образом.
    Механизм работы такой системы устроен следующим образом. В системе (в Конфигураторе) регистрируются отчеты и метки. Метка может входить в несколько отчетов. Для вывода всех таких отчетов используется одна и та же процедура (R_STANDART). В качестве параметров она получет идентификатор отчета и временной период, за который необходимо вывести отчет, а также балансовую единицу. По идентификатору отчета процедура определяет список всех меток, относящихся к данному отчету. В начале, процедура создает временную таблицу, в которой будут храниться значения всех меток отчета. Для каждой метки в конфигураторе описывается процедура, возвращающая значение данной метки и процедура подготовки данных. Перед проходом всех меток процедура получает имена всех процедур подготовки данных и поочередно запускает их. Процедуры подготовки данных обращаются к базе, выбирают данные и сохраняют их во временных таблицах. Далее, основная процедура запускает поочередно процедуры возвращающие значения меток. Эти процедуры могут обращаться к временным таблицам, содержащим подготовленные данные или напрямую к базе. Получив значение метки, эти процедуры записывают его во временную таблицу, созданную основной процедурой. Таким образом, к концу работы цикла по меткам отчета основной процедуры во временной таблице содержаться все значения меток отчета. Процедуре остается только вернуть их интерфейсу известным нам методом (схема работы элемента report).
    На примере схематически покажем работу алгоритма:
    Для некоего отчета необходимо вывести четыре метки, описанных в конфигураторе следующим образом:
    Имя метки Процедура подготовки данных Процедура вывода значения метки
    Метка1 Проц_подг_1 Проц_вывода_1
    Метка2 Проц_подг_1 Проц_вывода_2
    Метка3 Проц_подг_2 Проц_вывода_3
    Метка4 Проц_подг_2 Проц_вывода_3

    На схеме показан алгоритм получения данных о значениях меток:

    Напрашивается вопрос: зачем нужны процедуры подготовки данных, если процедуры вывода значений меток сами могут обратиться к базе и выбрать нужную информацию? Дело в том, что, зачастую, информация для различных меток выводится из базы одной функцией, причем весьма ресурсоемкой, и нет смысла запускать ее несколько раз подряд для каждой метки. Запустим ее один раз в процедуре подготовки данных и будем брать готовые значения из временной таблицы, не расходуя лишний раз ресурсы сервера для выборки данных.
    Важное замечание. Процедуры вывода значений меток могут просто возвращать наборы данных, и интерфейс стандартным методом будет заполнять в шаблоне отчета таблицы с метками, совпадающими с названиями полей набора данных. Т.е. метка может возвращать не одно значение, а целую таблицу значений.
    Важное замечание.В общем случае, имя метки, заданное в Конфигураторе, не обязательно должно совпадать с меткой в шаблоне печатной формы. Ведь интерфейс заполнит значением метки метку шаблона, совпадающую со значением поля fieldnm в результирующем наборе данных. Кстати, процедура вывода значения метки может вывести в таблицу значений меток и не одну метку, а несколько... В вышеописанном примере есть такая ситуация: для подготовки данных и вывода меток 3 и 4 используются одинаковые процедуры. Но первая запишет в поле fieldnm результирующей таблицы имя метки "Метка3", а вторая - "Метка4".

     Соглашение о наименовании процедур
    Процедуры отчетов имеют следующий формат R_xxx (для всех отчетов можно использовать стандартную процедуру R_STANDART). Процедуры подготовки данных - LBP_xxx, процедуры меток - LB_xxx.


    5.9. Расширенная система формирования отчетов
    Формирование параметризованных отчетов
    При построении отчета в процедуры меток передаются три стандартных параметра: начальная дата, конечная дата и балансовая единица. Этого достаточно для большинства форм бухгалтерской отчетности. В случае же, когда требуется запросить у пользователя дополнительную информацию (например при формировании справки мы запрашиваем фамилию, на кого она выписывается) в системе применяется следующий механизм: На отчет задается специальная процедура, с параметрами, аналогичными R_STANDART. Из этой процедуры с помощью макроса input у пользователя запрашиваются дополнительные параметры. После этого, в коде процедуры должен быть следующий вызов:
    exec R_STANDART_INPUT @param1='Имя параметра1', @val1='Значение параметра 1', @label_nm1='ИмяМетки1'
    	,@param2='Имя параметра2', @val2='Значение параметра 1', @label_nm2='ИмяМетки2'
    	...
    Параметр @label_nm[1..10] нужно указывать только в том случае, если мы хотим задать разные значения параметра для разных меток. Всего предусмотрено максимум 10 параметров. Все эти параметры сохраняются в глобальной временной таблице ##sg_rep_param. Процедуры меток могут использовать эти параметры применяя следующий синтаксис:
     select @PARAM1=case when param_nm='Имя параметра1' then cast(value as bigint) else @PARAM1 end 
    		,@PARAM2=case when param_nm='Имя параметра2' then cast(value as datetime) else @PARAM2 end 
    		...
    	from ##sg_rep_param
    	where spid=@@SPID and (label_id is NULL or label_id=@LABEL_ID)
    	order by case when label_id is NULL then 0 else 1 end
    Для меток, использующих стандартную процедуру LB_BUH_SCH предусмотрено задание пользователем параметра variable_val, который при подсчете значения метки перекрывает одноименное свойство метки, заданное в конфигураторе. Например, нам нужно создать метку, которая возвратит оборот по счету в разрезе одного контрагента. Сам контрагент выбирается при формировании отчета. Для этого в конфигураторе мы для метки с именем SAMPLE_FIRM в свойстве variable_id выбираем "Контрагент" а процедура отчета может выглядеть следующим образом:
    create procedure R_SAMPLE_FIRM
     @REP_ID pk
    ,@PATH varchar(255)=null out
    ,@SDT datetime =null
    ,@EDT datetime =null
    ,@MAST_ID pk =null
    
    -- input
    ,@FIRM_ID pk = NULL
    AS
    
    if @FIRM_ID is NULL begin
    	-- Запрашиваем у пользователя контрагента
    	exec RUN_MACROS 'input name=FIRM_ID, type=ComboBox, caption="Выберите контрагента", sql="select firm_id,firm_nm from firm"'
    	return
    end
    
    -- Сохраняем доп. параметры
    exec R_STANDART_INPUT @param1='variable_val', @val1=@FIRM_ID, @label_nm1='SAMPLE_FIRM'
    
    -- Вызываем стандартную процедуру формирования отчета
    exec R_STANDART @rep_id=@REP_ID, @PATH=@PATH out, @SDT=@SDT, @EDT=@EDT, @MAST_ID=@MAST_ID
    GO
    
    Обеспечение переходов
    Для облегчения процесса разработки и отладки отчетов в шаблонах следует предусматривать возможность 
    перехода к меткам в конфигураторе. Делается это следующим образом: вместо метки вида ~Метка~ указывается ссылка вида
    <a href="$$runproc JUMP_CONFIG_LBL,label_nm=ИмяМетки,rep_id=~REP_ID~">~Метка~</a>
    где ИмяМетки - имя метки в конфигураторе, к которой будет осуществлен переход.
    В этом случае метки представляются в виде ссылок, и для печати их черным цветом при объявлении тега <BODY> в него следует добавить атрибут link:
    <body link="black">

    Подсказки для меток
     
    Наряду со значением метки процедура R_STANDART выводит и примечания к меткам. 
    Примечания заполняются из Конфигуратора. 
    Для вывода в отчет примечания следует в шаблон отчета добавить метку ~ИмяМетки_CMNT~ 

    Описание стандартных меток и процедур подготовки данных

    5.9.1. lb_buh_sch
    Для большинства форм бухгалтерской отчетности требуется вывод данных об остатках или оборотах по определенным счетам. Для ускоренного создания отчетов, использующих такие данные, в системе имеются специализированные процедуры подготовки данных и вывода значений меток. Процедура подготовки данных называется LBP_BUH_SCH и подготавливает данные во временной таблице в виде похожем на бухгалтерский оборотный баланс, в котором входящее сальдо, обороты, исходящее сальдо по каждому счету даны с детализацией по каждому месяцу указанного периода. В метку нужно вывести что-то определенное (например входящее дебетовое сальдо некоего счета или его оборот по кредиту за период и пр.). Что следует вывести в метку, описывается в дополнительных свойствах метки. Для всех меток этого типа используется одна процедура вывода значений LB_BUH_SCH, которая, руководствуясь дополнительными свойствами метки, выбирает из временной таблицы нужные данные.
    Имя метки Процедура метки Процедура подготовки данных Описание
    LB_BUH_SCH LBP_BUH_SCH Остатки и обороты по бух. счетам. Метки создаются пользователем в зависимости от выбранных свойств
    Свойства
    sch_id счет, по которому выводятся данные
    sch_id_cr корреспондирующий счет, если не задан - все счета
    period
    Период, заданный в виде строки смещения. Синтаксис: 
      X{a|b|y}:X{a|b|y} 
    где
     X - величина смещения в месяцах, число либо D (длина периода)
     а - смещение от первой даты
     b - смещение от второй даты
     y - смещение от начала года (из второй даты)
    Окончание периода - это всегда конец месяца, вне зависимости от выбранной даты.
    Примеры:
       0a:11y - от начальной даты до конца года
      -2b:0b - последние три месяца
      -Da:-Db - предыдущий период
      -12a:-12b - аналогичный период прошлого года
    Допускается также упрощенная запись в виде целого положительного либо отрицательного числа. При такой форме записи периода число обозначает смещение на длину периода. Например:
      -1 - предыдущий период
      0 - текущий период
      1 - следующий период
    ostatok Тип бухгалтерского остатка, который будет выведен, например начальное дебетовое сальдо, оборот по кредиту и т.д.
    variable_id Аналитика, в разрезе которой выводится остаток по счету. Если параметр variable_val не задан - выводится развернутое сальдо в разрезе этой аналитики.
    variable_val Значение аналитики, в разрезе которой выводится остаток по счету. Работает совместно с параметром variable_id.
    variable_group Аналитики, в разрезе которой выводится набор данных в виде двух полей - [имя метки]_AN_NM и [имя метки]_AN_SUM.
    scale Масштаб метки. Значение метки делится на значение этого свойства. Например, если значение нужно вывести в тысячах, значение данного свойства нужно установить в 1000
    prec 
    Количество значащих цифр после запятой
    Значения
    ИмяМетки Сумма, соответствующая параметру ostatok
    ИмяМетки_AN_NM Вместе с значением [имя метки]_AN_SUM образует набор данных, разворачивающий данную сумму в разрезе аналитики, указанной в параметре variable_group. Выдает наименование аналитики.
    ИмяМетки_AN_SUM Выдает значение метки в разрезе аналитики. См. описание значения [имя метки]_AN_NM. Если на метку задана формула, то она применяется к данному значению. При этом не допускается в формуле использовать переменные из других меток.

    5.9.2. lb_mast_rec
    Имя метки Процедура метки Процедура подготовки данных Описание
    MAST_REC LB_MAST_REC Реквизиты балансовой единицы
    Значения
    MAST_NM Полное название балансовой единицы
    MAST_F_ADR Физический адрес
    MAST_U_ADR Юридический адрес
    MAST_OKPO Окпо юридического лица
    MAST_NDS_N Налоговый номер плательщика НДС
    MAST_NDS_S Номер свидетельства плательщика НДС
    MAST_IPN Идент. номер физического лица
    MAST_OKPO Окпо юридического лица
    MAST_BANK Название банка
    MAST_RS Расчетный счет
    MAST_BANK_MFO МФО банка
    MAST_TEL Телефон
    [Имя доп. поля] Также процедура выдает все дополнительные поля на организацию либо контрагента
    [Имя доп. поля]_KOD Наряду со значениями также выдаются коды аналитик для аналитических дополнительных полей

    5.9.3. lb_kadr_rec
    Имя метки Процедура метки Процедура подготовки данных Описание
    KADR_REC LB_KADR_REC Процедура выводит кадровый состав предприятия
    Значения
    KADR_COUNT_1 Кол-во работающих на начало периода
    KADR_COUNT_2 Кол-во работающих на конец периода
    KADR_COUNT_3 Кол-во работающих за период (кол-во на начало периода+кол-во принятых на работу за период)
    KADR_COUNT_SOVM_[1,2,3] Кол-во работающих по совместительству (1-на начало периода, 2-на конец, 3-за период)
    KADR_COUNT_NSOVM_[1,2,3] Кол-во работающих в штате (не по совместительству) (1-на начало периода, 2-на конец, 3-за период)
    KADR_COUNT_MALE_[1,2,3] Кол-во работающих мужчин (1-на начало периода, 2-на конец, 3-за период)
    KADR_COUNT_FEMALE_[1,2,3] Кол-во работающих женщин (1-на начало периода, 2-на конец, 3-за период)
    KADR_COUNT_STAVKA_3 Кол-во работающих в эквиваленте полной занятости за период
    KADR_COUNT_STAVKA_MALE_3 Кол-во работающих мужчин в эквиваленте полной занятости за период
    KADR_COUNT_STAVKA_FEMALE_3 Кол-во работающих женщин в эквиваленте полной занятости за период
    [Код должности] Также процедура выдает фамилию и инициалы персон, занимающих должности. Имя метки соответствует коду должности, значение - фамилия и инициалы
    [Код должности]+_IPN Индивидуальные налоговые номера должностных лиц. Имя метки - [код должности]+_IPN, значение - ИПН

    5.9.4. lb_buh_pays
    Имя метки Процедура метки Процедура подготовки данных Описание
    LB_BUH_PAYS    Выводит платежи, по которым есть проводки
    Свойства
    sch_id счет, по которому выводятся данные
    sch_id_cr корреспондирующий счет, если не задан - все счета
    period период, по которому выводятся данные. см. аналогичное свойство для метки lb_buh_sch
    ostatok Тип оборотов. Допустимые значения: ОБОРОТ_ДЕБ,ОБОРОТ_КРЕ
    Значения
    ИмяМетки  Общая сумма платежей (с учетом знака)
    ИмяМетки_NUM Вместе с значениями [имя метки]_SUM и [имя метки]_DT образует набор данных, разворачивающий данную сумму по платежам. Возвращает номер платежного поручения.
    ИмяМетки_SUM Сумма платежа.
    ИмяМетки_DT Дата платежа в формате DD.MM.YYYY

    5.9.5. lb_period
    Имя метки Процедура метки Процедура подготовки данных Описание
    PERIOD LB_PERIOD Период, за который составляется отчет
    Свойства
    lang Язык - 1-русский, 2-украинский. По умолчанию - украинский
    period период, если не задан - берется период отчета. см. аналогичное свойство для метки lb_buh_sch
    Значения
    ИмяМетки_DT период в виде "с Дата1 по Дата2". Например "с «2» октября 2002 г. по «31» декабря 2002 г."
    ИмяМетки_AUTO Если выбранный диапазон дат соответствует календарному периоду (месяц, квартал, полугодие, год), метка будет вида: для месяца - "январь 2002 г.", для квартала - "1-й квартал 2002 г.", для полугодия - "1-е полугодие 2002 г.", для года - "2002 г.". Если диапазон не соответствует календарному периоду то выводится "с «2» октября 2002 г. по «31» декабря 2002 г."
    ИмяМетки_YEAR_NUM{1|2} Номер года для выбранной даты (1-начальной, 2-конечной). Если отчет формируется за один год, рекомендуется пользоваться меткой [имя метки]_YEAR_NUM2
    ИмяМетки_QUART_NUM{1|2} Номер квартала с начала года для выбранной даты периода (1 - начальной, 2 - конечной)
    ИмяМетки_MONTH_NUM{1|2} Номер месяца с начала года для выбранной даты периода (1 - начальной, 2 - конечной)
    ИмяМетки_BEG Дата начала периода (в формате datetime, для использования в формулах)
    ИмяМетки_END Дата окончания периода (в формате datetime, для использования в формулах)

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

    5.10. Методические указания по программированию
     
    Методические указания по программированию в среде MS SQL Server применительно к программному комплексу INFOPOLIS.

    5.10.1. Коллективная разработка
     
     Коллективная разработка 
     
    Владельцем всех объектов в базе данных является dbo. При написании скриптов создания объектов следует обязательно указывать префикс владельца - dbo. Например:
    create proc dbo.MyProcedure
    as
    ...
     
      Каждому разработчику дается свой логин на сервер, и дается роль db_owner для всех доступных баз данных. Свойства интерфейса, хранящиеся в таблицах store, store_big, являются общими для всех разработчиков.
    Ограничения MS SQL:
    1. При ведении коллективной разработки под разными логинами становится невозможным использование утилиты SQL-Profiler, поскольку она требует наличия серверной роли System Administrators. Все права доступа в системе INFOPOLIS опираются на пользователей в базе данных, а не на логины на сервере. Поскольку в MS-SQL все логины - члены серверной роли System Administrators - отображаются в пользователя dbo, включение всех логинов разработчиков в данную роль приведет к тому, что все они будут работать от имени одного пользователя - dbo. 
     2. Если логин не входит в серверную роль System Administrators, ему будет недоступна команда setuser, и как следствие, кнопка "Прикинуться другим пользователем" работать не будет.
     
     

    5.10.2. Соглашения о наименовании и форматирование кода
    Все наименования объектов базы данных в среде INFOPOLIS выполняются в английской кодировке.
    Таблицы:
    Таблицы в среде INFOPOLIS именуются в единственном числе, а не в множественном, как принято в большинстве баз данных.
    Описание префиксов и окончаний к таблицам:
    log_имя - таблица логов для основной таблицы
    имя_incl - вспомогательная таблица для хранения иерархии к основной таблице
    имя_buffer - таблица-буффер - служит для временного хранения данных, в таких таблицах, как правило, присутствует поле autor_id
    Представления (View):
    имена представлений - срезов к основной таблице - начинаются на u.
    Такие виды, как правило, содержат строки из основной таблицы, доступные текущему пользователю.
    Процедуры:
    Процедуры именуются в верхнем регистре, составные части процедуры разделяются знаком "_", например IP_SYNCHRO_TOV_OST.
    Процедуры выполняющие какое-либо действие должны начинаться на A_
    Процедуры выполняющие какое-либо действие, обходящее бизнес-логику должны начинаться на BL_
    Процедуры действий, вызываемые интерфейсом: ACT_
    (примечание: хорошим стилем считается процедура ACT_ в которой реализовано только взаимодействие с пользователем, а дальше идет вызов процедуры А_.
    Таким образом процедуру A_ можно вызывать из различных мест интерфейса)
    Процедуры, выполняющие административные функции, либо общие процедуры, не относящиеся к предметной области - IP_
    Функции:
    В названиях функций символ "_" не используется, составные части имени начинаются с заглавной буквы, например GetMastPrnt.
    Скалярные функции, возвращающие какое-либо значение : Get
    Скалярные функции, возвращающие логическое значение: Is
    Функции, возвращающие административную информацию, либо общие процедуры, не относящиеся к предметной области ip_
    Пользовательские данные:
    Часто разработчику приходится определять пользовательские данные (заголовки элементов интерфейса, наименования сущностей в базе данных, сообщения, выдаваемые пользователю).
    При этом не следует излишне увлекаться юмористической стороной.
    Названия и сообщения должны быть с использованием общеупотребительной ОФИЦИАЛЬНОЙ(при наличии таковой) терминологии.
    Недопускаются сообщения типа "Это делать не следует", "Можете сходить покурить пока выполняется такая-то операция" и т.п.
    Сообщения пользователю должны быть максимально информативны.
    Например, при нехватке товара недостаточно сообщить пользователю о данной ошибке, но и нужно выдать, какого товара не хватает, на каком складе, в каком количестве и т.д.
    При введении нового термина в систему нужно согласовать его с непосредственным руководителем. Причем согласовать ДО введения его в эксплуатацию. А еще лучше - до начала разработки.
     
     
    Правила форматирования кода
       Отступы в коде оформляются с помощью символа табуляции. Размер символа табуляции в текстовом редакторе (SQL Server Management Studio) нужно выставить в четыре символа!.
       Процедуры пишутся без внешних операторных скобок begin/end, т. е. код процедуры начинается сразу после ключевого слова as и заканчивается вместе с окончанием пакета. 
      При перечислении переменных в секции declare каждая переменная объявляется в отдельной строке, причем запятая ставится ПЕРЕД именем переменной. То же касается и перечисления полей в запросе. Пример объявления переменных:
    declare
     @VAR1 int
    ,@VAR2 varchar(255)
     
    Точно так-же перечисляются условия фильтрации в секции where - каждое условие в отдельной строке, начинается с "and".
    Наименования таблиц, полей пишутся в нижнем регистре, параметры и переменные - в верхнем.
     
    Пример правильно отформатированного запроса:
    select f.firm_id
      ,f.firm_nm
      ,f.okpo
    from
    ufirm f
     
    left join bank_rec r on
    f.firm_id=r.firm_id
     
    left join firm_cat fct on f.firm_id=fct.firm_id and @FC_ID is not NULL
    where (fct.fc_id=@FC_ID or @FC_ID is NULL)
      and (f.city_id=@CITY_ID or @CITY_ID is NULL)
      and (f.firm_nm like @FIRM_NM or @FIRM_NM is NULL)
      and (f.firm_cmnt like @FCMNT or @FCMNT is NULL)
      and (f.okpo like @OKPO or @OKPO is NULL)


    5.10.3. Правила программирования
    В начале процедур/функций, которые вызываются не напрямую из интерфейса либо их назначение не очевидно следует добавлять описание, что эта процедура/функция делает.
    Описание добавляется в начале текста после ключевого слова as в виде примечания, плюс к этому добавляются еще фигурные скобки.
    Пример:
    --- начало скрипта
    create proc IP_SEND_MAIL
    @FROM varchar(255)
    ,@TO varchar(255)
    ,@BODY varchar(255)
    as
    /*{ Отправка текста по электронной почте }*/
    --- конец скрипта
     
    Обработка ошибок:
    Инструкции, модифицирующие данные (непосредственно либо через вызов процедур), должны быть объявлены в одной транзакции.
    Наиболее употребляемая конструкция обработки ошибок:
    --- начало скрипта
    begin tran
    exec @rs=U_TABLE1
    if @RS<>0 goto rlbk
    update table1 set field1=10
    if @@error<>0 goto rlbk
    commit tran
    return
    rlbk:
    if @@TRANCOUNT>0 rollback tran
    return 1
    --- конец скрипта
    в данном примере переменная @rs (return status) объявляется в начале процедуры, и имеет тип int.
    Передавать параметры в хранимые процедуры нужно ТОЛЬКО по имени.
    При написании сложных процедур обработки данных (более 100 строк) рекомендуется разбивать их на отдельные процедуры.
    Причем разработку правильнее вести с написания более мелких процедур.
    Не рекомендуется писать сразу большие/сложные куски кода.
    Нужно, написав логически законченую, небольшую часть кода, тестировать ее.
     
    При объявлении текстовой переменной ее размер объявляется с запасом.
    Проверка на неравенство делается с помощью оператора "<>" (а не "!=") .

    При написании функций следует резервировать параметры, поскольку MSSQL требует указания всех параметров при вызове функции.
    Пример:
    create function GetData (@DataType varchar(50)
    ,@RESERVED1 int = NULL
    ,@RESERVED2 int = NULL
    ,@RESERVED3 int = NULL
    )
     
    Во временных таблицах и переменных типа таблицы для символьных полей обязательно следует указывать collate database_default. То же касается и объявления результирующей таблицы в табличных функциях.
    Пример:
     
    declare @T table
    (tov_id bigint primary key
    ,tov_nm varchar(255) collate database_default NULL
    )
     
     
     
    - Динамические запросы
    Динамические запросы (оператор exec() и системную процедуру sp_executesql) применять не рекомендуется.
    Исключение - Динамические запросы, работающие исключительно с временными таблицами.
    - Курсоры
    Правило - Курсоры должны использоваться в тех случаях, когда необходимо вызывать процедуру для каждой записи обрабатываемого набора данных.
    Исключения из правила - В особо сложных расчетах иногда курсоры использовать целесообразнее.
    В среде INFOPOLIS используются только локальные курсоры.
    Ключевое слово fast_forward использовать не рекомендуется (из-за ошибок в MS-SQL 2005).
     
    Типичное объявление и работа с курсором:

    declare c cursor local for
     
    select ...
     
    from ...
    open с
    fetch c into @MY_VAR1, @MY_VAR2
    while @@FETCH_STATUS=0 begin
        -- действия с переменными
        fetch c into @MY_VAR1, @MY_VAR2
    end

     
    - Представления
    Представления, начинающиеся на u следует использовать ТОЛЬКО там, где необходимо ограничить данные в соответствии с правами доступа.
    НЕ следует использовать данные представления в процедурах бизнес-логики, за редким исключением.
     
    - Запросы
    В запросах (а также в операторе insert) нельзя использовать * вместо перечисления полей, за исключением запросов внутри оператора exists.
    Для каждой таблицы в запросе необходимо объявлять псевдоним.
     
    Перед каждым именем поля в запросе необходимо указывать псевдоним таблицы.
    Псевдоним, как правило, представляет собой первую букву в имени таблицы.
    Принятые псевдонимы для наиболее распространенных таблиц:
    mstf - m
    move - mm
    tov - t
    sklad - s
     
    В каждом запросе, возвращающем данные в интерфейс ДОЛЖНА присутствовать инструкция ORDER BY
    (исключение - запросы для элементов PivotTable, Diagram)

    В запросах не рекомендуется использовать операторы in, not in. Вместо них следует применять операторы exists, not exists.
     
    Синтаксис объединения таблиц (в нижнем регистре):
    Внутреннее объединение - join - без указания слова inner
    Левое внешнее объединение - left join - без указания слова outer
    Правое внешнее объединение - right join - без указания слова outer
    Полное внешнее объединение - full join - без указания слова outer
     
    right join следует применять в том случае, когда без него трудно обойтись. В основном следует использовать left join.
     
    cross join используется очень редко.
     
    Не следует злоупотреблять оператором distinct - он употребляется, в основном только если в списке возвращаемых полей одно или два поля.
    Если возвращается больше полей и использован оператор distinct - это говорит, чаще всего, о неправильном построении запроса.
     
    Оператор UNION используется ОЧЕНЬ РЕДКО. Вместо него следует использовать UNION ALL.
     
     
    - Операторы и типы данных
    При работе с типом данных datetime нужно учитывать то, что он может содержать кроме даты еще и время.
     
    Тип numeric не используется. Вместо него следует использовать тип decimal.
     
    В конструкции
      update @var=field=Значение
    в случае, когда переменная @var имеет тип decimal, разрядность и точность переменной должны совпадать с разрядностью и точностью в типе данных для поля field.
     
    - Рекомендации по разработке базового варианта
     
    Скрипты, необходимые по мнению разработчика, в базовом варианте, следует оформлять в виде хранимых процедур, документируя их, и включать в базовый вариант. Писать и отлаживать такие скрипты нужно сразу в виде хранимой процедуры.
     

    5.10.4. Мультиязычная поддержка
     
    Все тестовые сообщения, выдаваемые пользователю из sql-кода, должны быть объявлены таким образом, чтобы была возможность их перевода на другие языки.
     
    Для этих целей служит таблица dbo.sgmsg и её аналог lang.sgmsg для переводов.
    Разработчик не работает напрямую с этими таблицами, а использует хранимую процедуру GET_STRING_CONST или функцию dbo.StringConst.
     
    Для автоматизации процесса перевода хранимых процедур и функций рекомендуется применять форму "Скрипт объектов базы данных". В этой форме нужно выбрать птичку "Перевод". В результате скриптинга с этой птичкой система проанализирует код, все строковые константы будут заменены на переменные и добавлены в таблицу sgmsg. Перевод на другие языки затем может быть выполнен стандартным модулем переводов в конфигураторе.

    5.10.5. Вспомогательные инструменты при разработке и отладке
     
    Полезные функции и процедуры:
     
    - для работы в среде MS SQL Server Management Studio
     
    IP_SQLEDITOR_SELECT - вызов данной процедуры рекомендуется поставить на сочетание клавиш Ctrl+3. Тогда в редакторе кода SQL Server Management Studio достаточно выделить имя таблицы или представления и нажать Ctrl+F3. Это будет эквивалентно выполнению запроса
       select * from <таблица>
    Если выделить текст с именем таблицы и, через запятую, значение первичного ключа, будет выведена одна строка, соответствующая этому значению. Также можно указывать третий параметр, задающий имя поля, по которому будет проведена фильтрация сравнением со вторым параметром.
    Например, если выделить текст:  mstf,105,tov_id и нажать Ctrl+3 - это будет эквивалентно запросу:
       select * from mstf where tov_id=105
     
    - для работы с интерфейсом
    IP_MSG - Служит для быстрой отладки кода из интерфейса. В необходимом месте кода нужно вызвать  эту процедуру, передав ей необходимое кол-во параметров (до 8-ми). В момент выполнения этого кода в интерфейс будут выведены эти параметры (Только для членов роли db_owner). 
     
    - для работы с датой и временем
    DatetimeToDate - Отсекает время от параметра datetime, возвращая дату
    DatetimeToTime - Отсекает от datetime дату, возвращает время
    DateTimeEndDay - возвращает конец дня
    DateTimeCompare - сравнивает две даты
    DatetimeAddPeriod - Прибавляет к переданной дате заданное кол-во периодов
    GetDateAsString - Возвращает дату в виде «25» января 2002 г.
    GetPeriodDate - Возвращает дату начала или конца периода.
     
    - для работы с числами
    DecimalToStr - Возвращает тип decimal в виде строки, убирая в конце нули
     
    - для работы со строками
    FormatString - аналог функции Format, служит для вывода сообщений пользователю. Используется вместо конкатенации строки сообщения.
     
    - общие
    IP_FIND - поиск в тексте процедур и функций по маске.
    IP_FIND_DATA - поиск во всех полях всех таблиц.
    IP_FILE_CREATE,ip_FileWriteLn,IP_FILE_WRITELN,IP_FILE_DESTROY
    - Процедуры и функции для работы с файлами.
    IP_EXEC_SQL - запускает SQL-скрипт на всех базах данных через linked server-s (для распределенной системы)
    IP_SEND_MAIL - отсылает письмо по электронной почте через CDO.
    IP_WHO - показывает, кто в данный момент работает с базой данных, его CPU, использование памяти, блокировки и текст запроса/процедуры.
    IP_C_TASK - позволяет создать задачу для администратора с текстом, в котором будут результаты запроса. Имеет смысл использовать в сервисных процедурах для нахождения различных расхождений в данных.
    IP_ERROR_HANDLE - обработка ошибок (перевод на русский язык), также позволяет создать задачу системному администратору с текстом ошибки.
    IP_EXECUTESQL - выполнение динамического скрипта с правами dbo. C применением этой процедуры следует быть осторожным, не допуская sql-injection.
     

    5.10.5.1. Обновление библиотек .NET Framework
    Чаще всего возникает ошибка с загрузкой файла/изображения.
    Для решения данной ошибки необходимо прописать ниже указанный скрипт.
     
    alter ASSEMBLY [System.Drawing] FROM  'C:\WINDOWS\MICROSOFT.NET\Framework\v2.0.50727\system.drawing.dll'

    5.11. Методические указания по внедрению
    Данные методические указания предназначены для отдела внедрения фирмы-разработчика, для дилеров, субподрядчиков и непосредственно разработчиков и администраторов баз данных заказчика. Все вышеперечисленные лица в дальнейшем в этой главе будут именоваться Разработчиком.
     
    В данной главе описаны технические требования к разработчику, выполнение которых призвано обеспечить безконфликтную установку пакетов обновлений, выпускаемых фирмой-разработчиком.
     
    Разработчик должен придерживаться рекомендаций, описанных в главе "Методические указания по программированию"
     
    Установка системы проводится согласно Инструкции по установке.
    Перед началом внедрения заказчик получает диапазон значений identity, и все данные, добавляемые в таблицы, где есть колонка identity, должны лежать в этом диапазоне. Важно помнить, что при вставке данных с использованием set identity_insert on счетчик identity сбивается, поэтому, после таких изменений требуется восстановить нарушенный диапазон (делается это с помощью процедуры IP_SET_IDENTITY_SEED).
     
    Объекты базы данных, созданные разработчиком, должны именоваться с использованием Префикса заказчика. Префикс заказчика заранее согласовывается с фирмой-разработчиком. Также префикс заказчика следует использовать при задании имен переменных и других данных, которые имеют кодовое название. 
     
    Не допускается изменение существующих процедур, функций, представлений, триггеров.
    Для обеспечения специфической бизнес-логики разработчик должен использовать триггеры и свои процедуры, следуя соглашению о наименованиях и используя собственный префикс.
     
    Пример объявления дополнительного триггера на таблицу move:
     
    create trigger inf_a_move on move for INSERT,DELETE,UPDATE
    NOT FOR REPLICATION
    as
    ---
     
    где inf_a_move - имя триггера : inf - префикс заказчика, a - модификатор триггера (i - insert, u - update, d- delete, a - insert,update,delete)
     
     
    Для внесения изменений в интерфейс следует скопировать существующий элемент интерфейса, обладающий собственной функциональностью, и убрать доступ к существующему элементу. Далее работать с скопированным элементом.
    Копирование осуществляется с помощью закладки Скриптер в приложении Builder следующим образом: Выбираются птички "Иерархически", "Данные", "CREATE". В полученном скрипте заменяется подстрока, содержащая имя элемента на новую подстроку, меняется значения параметра @PRNT в первом вызове процедуры C_ENT на значение id елемента,который будет служить родительским вновь созданному. Если родительский элемент не меняется, просто убирается символы @E. Например, строка
    exec @RSLT=C_ENT @ent_id=@E5597 out,@ENTTP_ID=8,@ENT_NM='SgMtpHelp',@PRNT=@E297,@CAPTION='Помощь'...
    будет выглядеть так:
    exec @RSLT=C_ENT @ent_id=@E5597 out,@ENTTP_ID=8,@ENT_NM='SgMtpHelp',@PRNT=297,@CAPTION='Помощь'...
    Создание пользователей базы данных
    1.Логин пользователя должен состоять из имени и первой буквы фамилии пользователя. Если такой логин уже существует, то из двух букв фамилии и.т.д.
    2.Все пользователи должны быть заведены в кадровом классификаторе и сопоставлены логинам.
    3.Для облегчения процесса набора операций требуется указать для логина Балансовую единицу по-умолчанию.
     
    Перед первым запуском
     
    1. Запустить ярлык INFOPOLIS, созданный программой SgInstaller и на закладке Конфигуратор (путь :  Системные установки -> Сервера и базы данных) добавить сервер, базу данных. Добавленный сервер и база данных должны подсветиться синим цветом. Если устанавливается главная база данных, нужно выбрать соответствующую птичку. На закладке Репликация установить соответствующие опции для базы данных. Если репликация не используется, нужно отметить птички "Реплицировать все балансовые единицы" и "Реплицировать все склады"
     
    2. Задать диапазон Identity, предварительно согласованный с разработчиком. Нажатием кнопки "Установить значения identity" зафиксировать эти изменения в системных таблицах.
     
     
    После настройки
     
    После выполнения у заказчика всех настроек (создания необходимого количества балансовых единиц, отключения неиспользуемых модулей) требуется сгенерировать лицензию. Лицензия представляет собой sql-скрипт, который следит за выполнением лицензионного соглашения, и в случае его нарушения запрещает пользователям подключение к базе данных.

    5.11.1. Порядок действий по внедрению комплекса
    Для эффективного внедрения программного комплекса INFOPOLIS необходимо выполнить такую последовательность действий:
    1. Получить от заказчика список сотрудников, которые будут иметь доступ к программе, с указанием: 
     
    Ф.И.О Должность непосредственный начальник Отдел(Подразделение)
             
     
    2.Обсудить и определить  с системным администратором серверный компьютер установить на него сервер см. Инструкция по установке.Установить базу данных последней версии в спецификации, оплаченной заказчиком  и  зарегистрировать на сервере и в базе данных всех пользователей предоставленных им.
    3.Приступить к настройке базы данных: 
    А.Настроить основные классификаторы (Балансовые единицы, склады, расчетные счета)
    Б.Определить (с ответственным лицом со стороны заказчика) права доступа пользователей к базе данных и настроить их.
    В.Тренинг пользователей по работе с программой(Работа с товарным классификатором, работа с контрагентами, работа с операциями)
    4.Введение остатков:
    А.Товаров по складам
    Б.Кредиторской и дебиторской задолженности
    В.Остатки денег по расчетным счетам и кассам       
     
            
     

    5.13. Разработка документов
    Разработка новых документов для программного комплекса INFOPOLIS.
    Для создания документов в INFOPOLIS нужно владеть языком разметки страниц HTML, для создания шаблона и T-SQL для написания хранимых процедур. До 25 версии INFOPOLIS, каждому документу указывалась хранимая процедура, которая возвращала набор значений, соответствующий меткам в документе. Согласно действующим методическим указаниям по программированию, если в процессе эксплуатации или внедрении комплекса у заказчика, в некоторый документ потребовался вывод дополнительной информации, то необходимо было создавать новую процедуру с префиксом заказчика и сопоставить её документу. При этом за основу берется процедура из базового варианта и дописывается/переписывается под логику работы заказчика. Этот метод оказался не всегда удобным, такая отделенная процедура уже не подлежит обновлению через механизм версий, при разработке типичных документов, с незначительными отличиями приходится создавать процедуры с дублированием значительной части кода и прочее. Естественным желанием стало разделить документ на типовые части и написать процедуры для заполнения каждой такой части. Иметь возможность составлять свои документы, используя готовые, проверенные части документов, дописывая лишь недостающий функционал.
    Начиная с 25 версии INFOPOLIS, появилась возможность компоновки документов с использованием не одной, а нескольких процедур.
    Рассмотрим детально процесс создания нового документа:
    1.Новый документ создаем в конфигураторе, в ветке системные - документы.
     
    2.При создании документа заполняем: Название doctp.doctp_nm - название документа; Псевдоним doctp.alias - полное название документа, возможно на языке оригинала печатной формы; Привязка doctp.tbl - определяется к чему будет подвешен документ, что он характеризует. Возможные значения: Операция - документ будет создаваться под операцией(в поле docum.key_n будет храниться move.move_id); Платеж - документ создается под платежом (docum.key_n <--> pay.pay_id); Товарные позиции - документ создается в интерфейсе под операцию, но пользователь будет обязан указать товарную позицию.(docum.key_n=mstf.mstf_id); Серийный номер - создается в интерфейсе также под операцию, но пользователю нужно будет указать привязку к серийному номеру. (docum.key_n <--> sn.sn_id); Свойства кадров - документ создается под операции кадрового учета. (docum.key_n <--(staffing.staffing_id). Процедура - для получения возможности формирования документа при помощи нескольких процедур - в этом поле указывается процедура DOC_STANDART. Шаблон - шаблон в одном из форматов *.html, *.htm, *.xsl. Рядом расположены кнопки работы с шаблоном. Свойства - в символах "/" указываются свойства документа. Статус документа - указывается статус, который будет автоматически присвоен созданному документу (если ведение статусов для документа не требуется, данное поле не заполняется). Нумеровать как - указывается документ, нумерацию которого следует учитывать при нумерации создаваемого документа. Также указывается период нумерации и в разрезе чего нумеровать документ. Затем сохранить.
    Интерфейс для создания документа

    Если для создания документа использовали DOC_STANDART, то требуется указать процедуры для формирования документа. Для этого используется "механизм меток". За каждой меткой закрепляется одна процедура. Каждая такая процедура может возвращать несколько одиночных меток и/или один или несколько рекордсетов. Базовый вариант содержит ряд стандартных меток и процедур для них. Метки, которые используются в документах принято называть используя префикс DOC_, а процедуры для этих меток - LB_<имя метки>. При разработке документов не для базового варианта, дополнительно в имени метки нужно использовать префикс заказчика. То есть имя такой метки будет иметь вид <Префикс заказчика>_DOC_......
    Для создания новой метки используем всплывающее меню на документе, выбираем "Вставить метка", в появившемся интерфейсе указываем имя метки и процедуру.
    Метки, которые используются документами базового варианта 

    DOC_INFO - информация о документе
    DOC_DT Дата документа
    DOC_N Номер документа
    SERIA Серия документа
    DAY День месяца из даты документа
    MONTH Месяц из даты документа
    YEAR Год из даты документа
    DOC_DT_WORD Дата словами
    DOCTP_NM Название документа. Псевдоним, и если он не указан - то название документа.
    DOCTP_NM_UPPER Название документа, в верхнем регистре.upper(DOCTP_NM)
    DOC_KADR_NM ФИО сотрудника, указанного в поле "Сотрудник".
    DOC_RECV - реквизиты
    MAST_NM Название организации
    FIRM_NM Название контрагента
    FIRM_SNM Краткое название контрагента
    REKVI_FIRM Реквизиты контрагента одной строкой
    DIRECTOR_FIRM ФИО персоны контрагента, где указано свойство /Директор/
    DIRECTOR_KIND Должность, указанная в персонах контрагента, где указано /Директор/
    FIRM1_NM Имя куратора
    MAST_OKPO ОКПО Организации
    BMAST_NM Название балансовой единицы
    BMAST_ADRESS Адрес балансовой единицы
    MAST_ADDR Адрес организации
    MAST_UADDR Юридический адрес организации
    MAST_NDS_S Номер налогового свидетельства плательщика НДС
    MAST_NDS_N Номер НДС
    FIRM_OKPO ОКПО Контрагента
    FIRM_ADDR Адрес контрагента
    FIRM_UADDR Юридический адрес контрагента
    FIRM_NDS_S Номер налогового свидетельства плательщика НДС контрагента
    FIRM_NDS_N Номер плательщика НДС
    MAST_RS Перечень р/с организации, которые указаны в типе операций, как допустимые в реквизитах
    MAST_TEL_FOR_DOC Перечень телефонов организации для документов
    FIRM_TEL_FOR_DOC Перечень телефонов контрагента для документов
    FIRM_TELL_ALL Перечень всех телефонов контрагента
    MAST_TAXMODE Вид налогообложения организации, с указанием названия организации
    MAST_TAXMODE_SIMPLE Вид налогообложения организации, без названия организации. Предполагается, что оно есть в реквизитах.
    PER_DT4  
    PER_DT1 Предварительная дата отгрузки из операции
    PERS_KONTR Персона контрагента из поля "Персона" на документе
    PERS_KONTR_POST Должность персоны контрагента из поля "Персона" на документе

    5.14. Методические указания по обслуживанию
     

    5.14.1. Обновление версий
      Обновление версий программного комплекса, внедренного у заказчика.
    1.При обновлении использовать скрипты, находящиеся в задачах, в типе задач INFOPOLIS-SP. Где каждая задача - это релиз определенной версии, во вложении задачи содержится скрипт обновления предыдущей версии до релиза.
    2.Перед началом обновления сделать резервную копию базы данных заказчика.
    3.Развернуть резервную копию базы данных в тестовую базу и проверить применяемость пакета обновления. В случае возникновения системных ошибок провести следующие действия:
      а)Если квалификация позволяет, то выявить и устранить причину возникших ошибок. Лицо, устраняющие ошибки несет персональную(административную, а в некоторых случаях и материальную) ответственность за правильность устранения таких причин.
      б)Если причина возникновения ошибок не понятна, создать задачу(если таковая не поставлена раньше) в разделе "Обслуживание/внедрение" и указать возникшие ошибки(скопировать текст из Managment Studio, а не сочинять) и ответственным указать начальника отдела внедрения. Если задача по обновлению версии, была создана ранее, и ответственный не может её выполнить, в поле результат ставится "невыполнено", а в текстовом поле "результат" - указываются ошибки и причины невыполнения задачи. При наличии невыясненных проблем пакет обновления на рабочую версию заказчика устанавливать запрещено.
    4.Полученный скрипт, который применяется без ошибок на тестовой версии рабочей базы заказчика (п.3) используется для обновления рабочей базы. Порядок применения скрипта для баз с существующими публикациями и без них отличается. В случае, если у заказчика реализована распределенная структура серверов баз данных, скрипт применяется на главной базе.
      а)База данных не содержит публикации.
     Перед началом применения скрипта, база переводится в режим RESTRICTED_USER. Затем последовательно применяются пакеты обновлений до требуемой заказчику версии. Скрипт должен отработать без ошибок. Перед проведением обновления, следует ознакомится с дополнениями и исправлениями в обновляемых скриптах, и сообщить заказчику те из них, которые касаются модулей, используемых в работе предприятия заказчика. Новые разработки, не приобретенные заказчиком требуется скрыть, чтобы избежать конфликта параметров лицензионной политики.
      б)База данных содержит публикацию(и)
    Перед применением обновления нужно понять, не добавляется ли новых таблиц, которые исходя из логики работы заказчика, должны попадать в одну или несколько публикаций. Если таковые имеются - предупредить администратора заказчика или если такового нет, то самому обсудить с руководством заказчика наиболее удачный период времени для установки обновления и учесть время, требуемое для настройки всех затрагиваемых публикаций и их подписчиков. Если возникла необходимость переделки репликации, то перед началом обновления нужно прокачать данные со всех подписчиков и предупредит их о бесполезности внесения данных(смотреть отчеты на своих серверах в период обновления версии и подготовки издателя - они могут, не надо им это запрещать.) Сделать резервную копию базы. Затем применить пакет обновлений аналогично пункту 4.а. Создать требуемые публикации, перед обновлением подписок - сообщить о невозможности работы с серверами-подписчиками, на период настройки репликации. Настройку начать с проброски разницы скриптов на подписчиков. Прокачав данные убедиться в работоспособности подписчика, правильной настройке диапазонов. Сообщить о возможности полноценной работы с подписчиком.
    5.Проверить работоспособность Job'ов сервера.
    6.При необходимости, на примере, провести консультации пользователей заказчика по вопросам возможных изменений в их работе с комплексом.
    7.Поставить результат на задаче, или создать задачу про обновление заказчика до новой версии. Указать в конфигураторе, в списке серверов и баз данных, версию базы заказчика.