Введение в программирование

Profile picture for user Бурлак А. Н.
Автор: Бурлак А. Н.
07.06.2012 10:33

Введение в программирование на платформе Инфо‑Бухгалтер 10.

1. Наполнение платформы программами на внутреннем языке.

Зачем нужены программы на внутреннем языке? Прикладные решения создается путем наполнения платформы программами на внутреннем языке. Программы на внутреннем языке могут различными способами взаимодействовать с платформой. В простейшем случае платформа осуществляет запуск программы и более не взаимодействует с ней. Платформа может передавать значения входных параметров программам на внутреннем языке и получать значения выходных параметров.

1.1. Простой запуск программ.

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

Самая простая программа может быть записана следующим образом:

ВЫЧИСЛИТЬ

СООБЩЕНИЕ("Самая простая программа")

КОНЕЦ

Простая программа с получением строкового параметра будет выглядеть не намного сложнее:

ВЫЧИСЛИТЬ(СТРОКА: парам)

СООБЩЕНИЕ("Принят параметр: " + парам)

КОНЕЦ

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

С помощью функции ВЫПОЛНИТЬ можно осуществить запуск одной программы из другой:

ВЫПОЛНИТЬ(["ПростаяПрограмма.ibx"])

На платформе Инфо-Бухгалтер 8 простой запуск программ известен как запуск ibx-программ из меню и с помощью функции СТАРТ_ПРОГ. Специальные случаи вызова бланка или типовой операции из меню в Инфо-Бухгалтер 10 отсутствуют, есть просто запуск программ. Если программа показывает бланк — это бланк, если таблицу отчета — то отчет и т.д.

1.2. Обработчики на сервере и клиентском месте.

Платформа Инфо-Бухгалтер 10 содержит широкие возможности настройки своего поведения, основанные на программировании обработчиков различных действий. Такие действия можно разделить на две группы: клиентские и серверные. Инфо-Бухгалтер 10 использует трехзвенную архитектуру. Сервер — это отдельная программа, которая может в процессе своей работы исполнять программы на внутреннем языке.

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

В клиентской программе многие обработчики работают по аналогии с диалоговыми окнами. На вход им подается информация об элементе списка (элементе справочника, операции из журнала и т.п.), выбранного пользователем. Программный код обработчика может изменить редактируемую информацию и передать ее обратно платформе с признаком сохранения или отмены. Это в большой степени напоминает редактирование информации в диалоговом окне с кнопками «ОК» и «Отмена». Обычно такие программы-обработчики как раз показывают диалоговые окна, внешний вид и возможности которых ориентированы на конкретную прикладную задачу. Уровень специализации таких диалоговых окон не оставляет платформе ни единого шанса, заменить их стандартным диалогом без использования обработчиков на внутреннем языке. Подробнее об клиентских обработчиках журналов и справочников см. раздел 6.

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

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

В Инфо-Бухгалтер 8 есть обработчики на вход/выход и для замены стандартных диалогов операции и счета — это аналогия некоторых клиентских обработчиков. Отображение информации в стандартных окнах в Инфо-Бухгалтер 8 никак не программируется, а при изменении данных ничего не вызывается.

2. Программа на внутреннем языке.

В этом разделе вкратце рассматриваются ступени создания программы на внутреннем языке. Также дается обзор инструментария для быстрого создания и организации проектов.

2.1. Проект.

Проект — это набор данных, описывающий, как и из чего создается исполняемый код программы на внутреннем языке. Проект включает список исходных файлов, параметры компилятора, инструкции размещения исполнимого кода и др. Физически проект хранится в файле с расширением *.ibp. Создание проекта осуществляется на основе шаблона см. подраздел 2.4.

В Инфо-Бухгалтер 8 нет файлов проектов. Неявно роль проектов исполняют бланки. В файле бланка хранится информация о режиме интерпретатор/компилятор и опции компиляции. Для исходных файлов (*.src) и типовых операций индивидуальное хранение опций компиляции не предусмотрено.

2.2. Основной файл и библиотеки.

Один из исходных текстов проекта является основным — с него начинается компиляция. Такой файл имеет расширение *.ipp. Основной файл должен содержать точку входа в программу, обозначаемую ключевым словом ВЫЧИСЛИТЬ:

// основной файл /////////////////////

...

ВЫЧИСЛИТЬ

...

КОНЕЦ

//////////////////////////////////////

После ключевого слова ВЫЧИСЛИТЬ и до ключевого слова КОНЕЦ располагаются операторы тела программы. Эти операторы могут обращаться к переменным и функциям, объявленным вне тела, например до слова ВЫЧИСЛИТЬ. Если таких функций и других объявлений много или они используются в различных проектах, то их выносят в отдельные файлы, называемые библиотеками. Библиотеки являются файлами исходного текста с расширением *.ibl. Подключение библиотек осуществляется с помощью ключевого слова ИСПОЛЬЗОВАТЬ.

Простой пример показывает принцип взаимодействия основного файла и библиотеки:

// библиотека: Арифметика.ibl /////////

ФУНКЦИЯ ЧИСЛО: Квадрат(ЧИСЛО: арг)

РЕЗУЛЬТАТ = арг * арг

КОНЕЦ_ФУНКЦИИ

///////////////////////////////////////

// основной файл: Пример.ipp //////////

ИСПОЛЬЗОВАТЬ("Арифметика.ibl")

ВЫЧИСЛИТЬ

СООБЩЕНИЕ(СТР(Квадрат(2))) // 4

КОНЕЦ

///////////////////////////////////////

В Инфо-Бухгалтер 8 используется сходный способ организации исходного кода в виде библиотек. Тело программы между ключевыми словами ВЫЧИСЛИТЬ и КОНЕЦ сохранилось лишь в типовых операциях. Для бланков телом программы является формульный раздел, а для файлов *.src – все содержимое файла. В отличие от Инфо-Бухгалтер 8, в Инфо-Бухгалтер 10 применять ключевое слово ИСПОЛЬЗОВАТЬ можно только вне тела программы или функции.

2.3. Компиляция исполнимого файла.

Компилятор обрабатывает основной файл и все подключенные библиотеки, при этом генерируется исполнимый байт-код. Исполнимый код записывается в файл с расширением *.ibx. Выполнением программы на внутреннем языке является обработка инструкций байт-кода специальным проигрывателем — виртуальной машиной.

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

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

Компиляция может осуществляться несколькими способами:

  • для открытого в среде разработки проекта

  • для проекта в составе открытого пакетного проекта

  • при вызове функции ЛКФ_КОМПИЛЯЦИЯ для обычного или пакетного проекта.

В Инфо-Бухгалтер 8 общий принцип создания и исполнения байт-кода такой же. Для бланков и типовых операций компиляция выполняется автоматически при устаревании или отсутствии исполнимого файла. В текущей версии Инфо-Бухгалтер 10 такой режим отсутствует. Задача массовой компиляции проектов в Инфо-Бухгалтер 10 решается созданием пакетных проектов.

2.4. Шаблоны проектов.

Шаблоны проектов — это специальные текстовые файлы, на основе которых среда разработки генерирует файл проекта и исходные файлы с заготовками кода. Например, шаблон «Диалог» создает проект с диалоговым окном, содержащим кнопки «ОК» и «Отмена». Простейший шаблон называется «_По умолчанию» и создает исходный файл с пустым телом программы ВЫЧИСЛИТЬ/КОНЕЦ.

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

В Инфо-Бухгалтер 8 нет аналогов шаблонов проектов. Шаблоны документов хорошо известны по офисным программам.

2.5. Пакетные проекты.

Для логической группировки обычных проектов используется специальный тип проектов — пакетный. Физически пакетный проект представлен файлом с расширением *.ibw. Он содержит список проектов: обычных или пакетных. Таким образом, можно организовать логическую иерархию проектов путем вкладывания пакетных проектов нижнего уровня в пакетные проекты верхнего уровня.

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

В Инфо-Бухгалтер 8 есть пакетная компиляция всех бланков/типовых операций/исходных текстов и бланков с избирательностью по разделу. Пакетная компиляция запускается только вручную. Компиляция «по требованию» снимает остроту проблемы, но переносит момент компиляции с этапа начального конфигурирования/обновления на момент работы конечного пользователя.

3. Создание диалоговых окон.

Диалоговые окна — основное средство взаимодействия программы с пользователем. Платформа предоставляет библиотеку элементов пользовательского интерфейса (GUI), на основе которой можно строить диалоговые окна от простейших до весьма сложных. Работу с диалоговыми окнами обеспечивает модуль FC. Об использовании элементов пользовательского интерфейса в печатных формах см. раздел 4.

Кроме возможности создания произвольных диалоговых окон, платформа позволяет вызывать некоторые стандартные диалоговые окна Windows: диалоги сообщений и вопросов (message boxes), диалоги выбора файла, папки, шрифта, цвета.

Также платформа предоставляет специальные диалоги для отображения массивов данных. О вызове специальных диалогов платформы см. раздел 6.

3.1. Представление форм в исходном тексте.

Для диалоговых форм (а также бланков и, отчасти, табличных форм, см. раздел 4) внешний вид сохраняется в исходном тексте. Поэтому создать внешний вид любого диалога или бланка можно вручную в текстовом редакторе. Однако наглядность и удобство такого способа оставляет желать лучшего. Наглядное редактирование и возможность сохранения изменений в исходный текст предоставляет редактор форм (см. подраздел 3.2). Тем не менее важно понимание того, как формы представляются во внутреннем языке и как сделать руками то, что делает автоматически редактор форм.

Задание внешнего вида форм и элементов управления построено на наследовании и задании значений полей. Значение любого типа в языке имеет состояние по умолчанию. Например, строковое значение по умолчанию равно "", а значение типа дата — 01.01.2001. Для объектных типов данных также имеется понятие значения по умолчанию, которое складывается из значений всех его полей. Причем значение строкового поля в составе описания объектного типа может отличаться от "". Поясним сказанное на примере простого типа Шрифт (выдуманного и упрощенного):

ТИП Шрифт

[

СТРОКА: имя = "Arial";

ЧИСЛО: размер = 8;

ЛОГИКА: жирный;

]

Значения типа Шрифт будут создаваться с заданными значениями полей. Это начальные значения полей или, иначе говоря, значения по умолчанию. Их совокупность составляет значение по умолчанию для объектного типа. Для поля «жирный» не задано явно значение и будет использоваться значение по умолчанию для логического типа, т.е. НЕТ.

В производном объектном типе можно заменить некоторые или все значения полей:

ТИП ЖирныйШрифт(Шрифт)

[

ЛОГИКА: жирный = ДА;

]

Здесь объявляется новый объектный тип ЖирныйШрифт, который наследует поля типа Шрифт. Для поля «жирный» заменяется значение по умолчанию с НЕТ на ДА. В результате при создании значения типа ЖирныйШрифт поля будут иметь следующие значения:

имя

"Arial"

размер

8

жирный

ДА

Позднее можно изменить эти значения в коде программы:

ВЫЧИСЛИТЬ

ПЕРЕМ ЖирныйШрифт: шрифт // создали переменную типа ЖирныйШрифт

шрифт.размер = 11 // изменили размер 8 на 11

...

КОНЕЦ

Определение значений по умолчанию для полей формы, позволяет задать ее собственные параметры (такие как заголовок окна, основной шрифт и др.) и параметры содержащихся на форме элементов управления. Для того чтобы элемент управления был создан на форме, должно быть объявлено поле соответствующего типа. Типы форм и элементов управления определяются в модуле FC. Произвольные диалоговые формы создаются путем наследования от объектного типа ДИАЛОГ. Рассмотрим описание простейшего диалога, содержащего одну кнопку с текстом «Кнопка 1»:

ТИП ПростейшийДиалог(ДИАЛОГ)

[

СТРОКА: заголовок = "Пример";

ЧИСЛО: ширина = 200;

ЧИСЛО: высота = 200;

КНОПКА: кнопка1 = [ левый = 10,

верхний = 10,

ширина = 70,

высота = 30,

текст = "Кнопка 1" ];

]

Здесь «заголовок», «ширина» и «высота» - поля типа ДИАЛОГ, значения которых переопределяются для придания производному диалогу требуемых характеристик. Для поля «кнопка1» задаются значения полей объектного типа КНОПКА. Эти значения определяют размер кнопки и ее расположение на форме, а также текст надписи. В диалоговых окнах все размеры и координаты задаются в экранных точках (пикселях). Более подробно вопрос добавления элементов управления рассматривается в подразделе 3.3.

В результате получено описание внешнего вида диалогового окна. Пока здесь нет функции-обработчика нажатия на «Кнопка 1», а также обработки событий самой диалоговой формы. О задании обработчиков событий см. подраздел 3.4.

Создание диалогового окна с использованием подготовленного ранее типа ПростейшийДиалог осуществляется методами ПОКАЗАТЬ, ПОКАЗАТЬ_МОДАЛЬНЫЙ и др. Модальные диалоговые окна блокируют работу пользователя с главным окном платформы на время своего показа. В следующей простой программе выполняется показ диалогового окна в модальном режиме:

ТИП ПростейшийДиалог(ДИАЛОГ)

[

… // описание внешнего вида опущено для краткости

]

ВЫЧИСЛИТЬ

ПЕРЕМ ПростейшийДиалог: диалог // переменная диалога

диалог.ПОКАЗАТЬ_МОДАЛЬНЫЙ

КОНЕЦ

Методы показа форм (не только диалоговых) останавливают выполнение программы до тех пор, пока окно формы не будет закрыто. В примере выше программа будет завершена не ранее, чем управление вернется из метода ПОКАЗАТЬ_МОДАЛЬНЫЙ.

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

3.2. Редактор форм.

Редактор форм позволяет визуально представить внешний вид формы так, как она будет выглядеть во время показа, а также изменять значения полей, положений и размеров элементов управления — в первую очередь. Так будет выглядеть в редакторе форм диалог из подраздела 3.1:

С помощью рамки выделения (вокруг кнопки) можно изменять поля «левый», «верхний», «ширина» и «высота», которые имеются у всех элементов управления. Другие параметры формы и элементов управления могут быть заданы в полях ввода окна «Инспектор объектов»:

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

Редактор форм позволяет добавлять и удалять элементы управления, а также создавать функции-обработчики для событий элементов управления и формы. О добавлении элементов управления на форму см. подраздел 3.3. Об обработке событий см. подраздел 3.4.

В Инфо-Бухгалтер 8 для визуального редактирования доступны формы бланков. Диалоговые окна ограниченных возможностей можно создавать путем нестандартного применения типовых операций.

3.3. Добавление элементов управления.

Для добавления элемента управления достаточно поместить поле соответствующего типа в описание типа формы. Такой элемент управления будет создан и добавлен на форму в момент ее показа. Во время показа формы имеется возможность добавить элемент управления динамически, для этого служит метод ДОБАВИТЬ.

Для добавления элемента управления в редакторе форм можно воспользоваться специальной панелью инструментов:

Для создания нажимаем кнопку желаемого элемента управления и на форме левой кнопкой мыши растягиваем прямоугольник для размещения элемента. После отпускания кнопки мыши элемент добавляется, а его поля отображаются в инспекторе объектов.

Элементы управления можно разделить на несколько групп по их назначению:

  • статические (текст, рамки, линии, изображения)

  • поля ввода (ввод текста, чисел, дат и т.п.)

  • прочие интерактивные (кнопки, опции, списки и т.п.)

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

    Предоставляемого модулем FC набора элементов управления достаточно для решения большого круга задач. Настраивать внешний вид и поведение многократно используемых элементов управления можно путем создания производных типов. Редактор форм позволяет добавлять на форму элементы управления таких пользовательских типов.

3.4. Обработка событий.

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

Приведем пример обработки нажатия на кнопку из подраздела 3.1:

ТИП ПростейшийДиалог(ДИАЛОГ)

[

КНОПКА: кнопка1 = [ левый = 10,

верхний = 10,

ширина = 70,

высота = 30,

текст = "Кнопка 1",

нажатие = НажатаКнопка

];

ФУНКЦИЯ НажатаКнопка(ПЕРЕМ КНОПКА: кнопка)

СООБЩЕНИЕ("Нажата кнопка: " + кнопка.текст)

КОНЕЦ_ФУНКЦИИ

]

Для события «нажатие» типа КНОПКА задается вызов метода формы НажатаКнопка. Объявление события «нажатие» требует, чтобы функция-обработчик принимала в качестве параметра кнопку-инициатора события. Это позволяет использовать одну функцию-обработчик для приема событий от нескольких элементов управления.

В редакторе форм создание заготовки функции-обработчика автоматизировано. Для задания обработчика кнопки надо выбрать в инспекторе объектов закладку «События». В поле нужного события надо написать имя функции-обработчика (или выбрать из списка, если такая функция уже есть).

После нажатия клавиши Enter редактор форм закрывается с сохранением изменений и в исходный файл добавляется заготовка функции-обработчика с заданным именем. Остается написать тело функции-обработчика. В примере выше тело функции-обработчика показывает сообщение «Нажата кнопка: Кнопка 1».

При изменении пользователем текста в полях ввода, выделенного элемента в списках и т.п. происходит внутренняя обработка этих событий, в результате чего соответствующие поля элементов управления принимают новые значения. Например, при снятии «галочки» в элементе ОПЦИЯ поле логического типа «выбор» меняет значение с ДА на НЕТ. Это изменение происходит до вызова обработчика «изменение» так, что функция-обработчик получает обновленное значение.

Для обратного обмена с элементами управления служит метод ОБНОВИТЬ. Для изменения любых параметров элемента достаточно установить необходимые значения полей и вызывать метод ОБНОВИТЬ для этого элемента. Для обновления всех элементов можно вызвать метод ОБНОВИТЬ для формы.

Диалоговая форма позволяет обрабатывать некоторые собственные события, такие как открытие и закрытие. Обработчик «открытие» особенно важен, т.к. вызывается, когда окно формы уже создано, но еще не видимо на экране. В этом обработчике можно произвести дополнительную настройку формы, добавить динамические элементы управления и т.п. Следующий пример демонстрирует установку обработчика «открытие»:

ТИП ПростейшийДиалог(ДИАЛОГ)

[

ОБРАБОТЧИК открытие = ОткрытиеФормы;

ФУНКЦИЯ ОткрытиеФормы

КОНЕЦ_ФУНКЦИИ

]

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

В Инфо-Бухгалтер 8 единственным обрабатываемым программно событием является нажатие на кнопку у графы с вызовом функции.

4. Создание печатных форм.

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

4.1. Табличные формы.

Табличные формы — наиболее мощный инструмент создания печатных форм. Табличная форма содержит последовательность разделов, которые могут быть:

  • регулярными таблицами с одинаковой структурой столбцов во всех строках

  • нерегулярными наборами строк без общей структуры столбцов.

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

    Ниже приведен пример табличной формы, открытой в редакторе форм:

Столбцы и строки табличной формы образуют ячейки. Ячейкам назначается тип (строка, число и т.п.) и могут быть установлены соответствующие типу данные. Границам ячеек могут быть назначены толщина и цвет линии. Вся совокупность разделов, строк, ячеек и других данных сохраняется в файл табличной формы с расширением *.ibf.

Для работы с табличными формами во внутреннем языке модуль FC объявляет тип ТАБ_ФОРМА. Этот тип содержит большое количество методов для получения и изменения данных формы. Для удобного программного доступа ячейкам могут быть назначены строковые идентификаторы. В общем случае программный доступ к любой ячейке может быть осуществлен по имени раздела, номеру строки и номеру столбца.

Программно заполненная табличная форма может быть сохранена в ibf-файл, что позволяет создавать архивы сформированных форм. Заполненную и сохраненную форму можно открыть позже для правки, печати или извлечения данных. Таким образом, ibf-файл выступает в двух ролях: как шаблон незаполненной формы и как средство для долговременного хранения заполненных форм.

Для создания нового проекта табличной формы в мастере создания проекта выберите шаблон «Табличная форма». В открывшемся окне проекта вызовете редактор форм и введите имя ibf-файла. После сохранения изменений получим следующий исходный текст:

ТИП ТабФорма1(ТАБ_ФОРМА)

[

СТРОКА: файл = "ТабФорма1.ibf";

]

ВЫЧИСЛИТЬ

ПЕРЕМ ТабФорма1: тф

// тф <- данные

тф.ПОКАЗАТЬ

КОНЕЦ

Переменная «тф» связывается с файлом «ТабФорма1.ibf», что позволяет произвести обработку и заполнение формы перед показом. В процессе показа форма может интерактивно взаимодействовать с пользователем, о чем подробнее рассказывается в подразделе 4.4.

В Инфо-Бухгалтер 8 отдаленные аналогии с табличными формами можно проводить для бланков. Хранение значений граф ввода в архивах бланков, выбор архивной записи по полям-идентификаторам — это ограниченный случай неполного сохранения состояния формы. Для табличных форм сохраняется состояние полностью, со всем оформлением, входными и выходными полями. Метки табличных форм — это ключевые значения, хранящиеся в заголовке ibf-файла — близкие родственники идентификаторов архивов в Инфо-Бухгалтер 8.

4.2. Бланки.

Объявляемый модулем FC тип БЛАНК очень похож на тип ДИАЛОГ (см. раздел 3) с той разницей, что координаты и размеры элементов управления задаются в сантиметрах, а не в пикселях. В отличие от табличной формы, элементы бланка могут располагаться произвольно, не подчиняясь табличной структуре. Взаимное расположение элементов бланка строго фиксируется в координатном пространстве и может быть изменено только принудительно.

В отличие от табличной формы, где данные содержатся и редактируются в ячейках, в бланке данные заносятся в поля ввода (например, РЕДАКТОР, ВВОД_ЧИСЛА), а выводятся в статические элементы (например, ТЕКСТ). Рисунок рамок и линий создается такими статическими элементами как ЛИНИЯ, РАМКА.

Обмен данными с элементами бланка аналогичен обмену в диалоге (см. подраздел 3.4). Для бланков нет встроенной возможности сохранения внешнего вида в заполненном состоянии и значений входных полей. Вкратце, бланк — это диалог, который можно напечатать.

Бланки Инфо-Бухгалтер 10 наиболее близки по принципу построения к бланкам Инфо-Бухгалтер 8. Там также внешний вид бланка создается из граф и рамок, расположенных произвольно друг относительно друга.

4.3. Отчеты.

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

Наполнение отчета данными осуществляется путем вызова методов типа ОТЧЕТ. Для многоуровневых отчетов заполнение подуровней данными может выполняться постепенно, при вызове обработчика «вход». Отчет не предоставляет средств для редактирования данных. Для отображаемых данных доступна настройка порядка и видимости столбцов, сортировка по заданным критериям на уровне средств, предоставляемых конечному пользователю.

В отличие от типов ДИАЛОГ и БЛАНК, для работы с типом ОТЧЕТ не обязательно использовать наследование. Простейший сценарий формирования и показа отчета выглядит так:

ВЫЧИСЛИТЬ

ПЕРЕМ ОТЧЕТ: отчет

// отчет <- данные

отчет.ПОКАЗАТЬ

КОНЕЦ

В Инфо-Бухгалтер 8 имеется развитая, но не расширяемая система встроенных отчетов. В Инфо-Бухгалтер 10 с помощью форм типа ОТЧЕТ имеется возможность создавать произвольное количество разнообразных отчетов. Многоуровневые отчеты позволяют делать таблицы с подуровнями, подобные оборотной ведомости в Инфо-Бухгалтер 8.

4.4. Реализация интерактивного поведения.

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

Тип формы Элементы управления Панель инструментов

Табличная форма

да

да

Бланк

да

нет

Отчет

нет

да

Установка обработчиков событий в типе формы происходит подобно тому, как было показано для типа ДИАЛОГ в подразделе 3.4.

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

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

5. Использование внутреннего языка на стороне сервера.

Есть несколько причин для использования внутреннего языка на стороне сервера. Запуск программ при изменении базы данных позволяет осуществлять сложные взаимосвязи между данными. Выполнение сложных расчетов на стороне сервера позволяет использовать его вычислительные ресурсы и избежать передачи обрабатываемых данных по сети.

5.1. Алгоритмы модификации.

Специальные программы на внутреннем языке, запускаемые платформой при изменении базы данных, называются алгоритмами модификации. Вызовы этих программ, как скобки до- и после-, обрамляют изменение данных. Алгоритмы модификации запускаются в контексте транзакции внесения изменений, поэтому действует принцип «все или ничего». Или будут внесены все изменения данных плюс изменения, сделанные алгоритмами модификации, или транзакция будет отменена и база данных останется в согласованном состоянии, как до попытки внесения изменений.

Алгоритмы модификации вызываются применительно к объектам аналитики и операциям в журналах. Схематически последовательность действий, выполняемых платформой при добавлении/изменении/удалении объекта аналитики или операции, выглядит следующим образом:

  • начало транзакции

  • вызов алгоритма «до-»

  • внесение изменений в базу

  • вызов алгоритма «после-»

  • завершение транзакции

Объекты аналитики образуют иерархическую структуру данных, с помощью которой платформа представляет различную справочную и служебную информацию. Так ветки плана аналитики в контексте прикладного решения могут ассоциироваться, например, с бухгалтерским планом счетов, справочником контрагентов и т.п. Прикладные решения могут хранить на служебных ветках плана аналитики свои конфигурационные данные. Объекты аналитики могут зависеть друг от друга различными способами. Например, в контексте прикладной задачи значения какого-то свойства двух объектов должны быть согласованы между собой. Также объекты могут быть ассоциированы с другими объектами с отношением «многие ко многим». Поддержание таких зависимостей реализуется в коде алгоритмов модификации.

Рассмотрим работу алгоритмов модификации на примере алгоритма «до добавления» объекта аналитики:

ВЫЧИСЛИТЬ(ПЕРЕМ АНАЛИТИКА: об;

ПЕРЕМ АЛГ_ПАРАМ: парам;

ПЕРЕМ ПРАВА_ДОСТУПА: доступ;

ПЕРЕМ ЛОГИКА: рез)

//...

рез = ДА

КОНЕЦ

Значения всех свойств, код, название и другие данные объекта аналитики передаются алгоритму в параметре «об». Отдельно передаются права доступа в параметре «доступ». Дополнительные параметры, задаваемые прикладным решением, передаются в структуре данных «парам». Все эти три параметра являются входными и выходными, т.е. алгоритм может изменить любые из них (хоть код объекта аналитики) и изменения будут учтены при сохранении. Выходной логический параметр «рез» позволяет запретить запись изменений, если ему будет установлено значение НЕТ. Дальнейшая обработка при этом производиться не будет, транзакция будет отменена, а функция добавления вернет ошибку «добавление отменено алгоритмом модификации».

Исполнимый код алгоритмов модификации хранится в базе данных в свойстве объекта аналитики. Такое свойство имеет специальный тип «алгоритм», а конкретный алгоритм находится по определенному имени. Так для алгоритма «до добавления» ищется свойство с именем ДО_ДОБАВЛЕНИЯ. Алгоритм применяется не к самому объекту, содержащему это свойство, а к его дочерним объектам.

Создать проект алгоритма модификации очень просто. Выберите в мастере создания проекта шаблон с именем «До добавления объекта». Укажите, для какого объекта добавить алгоритм. Имя свойства «ДО_ДОБАВЛЕНИЯ» будет подставлено автоматически. После завершения работы мастера будет сгенерирован исходный текст наподобие приведенного выше.

Для операций алгоритмы модификации привязываются к типу операции. Код алгоритмов сохраняется в плане аналитики на служебных ветках в свойствах типа «алгоритм». Имена таких свойств могут быть любыми, кроме имен зарезервированных для алгоритмов объектов аналитики: ДО_ДОБАВЛЕНИЯ и т.д.

Для примера добавим алгоритм «после добавления» для типа операции «Отпуск» в журнале «ЖурналОтпусков». Для создания проекта в мастере проектов выберем шаблон «После добавления операции». Введем код объекта аналитики и имя свойства, которые будут хранить код. Например, код объекта служебной ветки плана аналитики «ЗАРПЛАТА/АЛГОРИТМЫ/Отпуска» и имя свойства «ПослеДобавления». Мастер создаст следующую заготовку тела программы:

ВЫЧИСЛИТЬ(СТРОКА: журнал;

ПЕРЕМ ОПЕРАЦИЯ: оп;

ПЕРЕМ АЛГ_ПАРАМ: парам;

ПЕРЕМ ПРАВА_ДОСТУПА: доступ;

ПЕРЕМ ЛОГИКА: рез)

//...

рез = ДА

КОНЕЦ

После написания тела программы и компиляции исполнимый код записывается в базу данных в указанное свойство. Остается связать тип операции и сохраненный в плане аналитики алгоритм. Для этого открывается редактор типов операций для журнала «ЖурналОтпусков», выбирается тип «Отпуск», для алгоритма «после добавления» задается ссылка на свойство «ПослеДобавления» объекта аналитики «ЗАРПЛАТА/АЛГОРИТМЫ/Отпуска». Теперь после добавления любой операции типа «Отпуск» будет вызван этот алгоритм, а в поле параметра «оп» уже будет содержаться уникальный номер вновь добавленной операции (на момент вызова алгоритма «до добавления» он еще не назначен).

Специальной разновидностью алгоритмов модификации, применяемой только к операциям, являются алгоритмы расчета итогов. Алгоритмы итогов позволяют производить распределенное по времени вычисление сумм, остатков и т.п. Расчет итогов построен на вычислении численного вклада операции в один или несколько итоговых показателей. Такими показателями могут быть, например, сумма документа или количество товара. Алгоритму не сообщается, в какой ситуации он вызван, что происходит с операцией. Это обеспечивает согласованное поведение при любых изменениях операции. Например, при добавлении операции и последующем ее удалении, вклады в итоговые показатели со знаком «+» и со знаком «-» компенсируют друг друга. Следующие схемы показывают моменты вызова алгоритмов итогов и знак применения вклада операции:

Добавление:

  • вызов алгоритма «до добавления»

  • вызов алгоритмов итогов со знаком «+»

  • добавление операции в базу

  • вызов алгоритма «после добавления»

    Изменение:

  • вызов алгоритма «до изменения»

  • вызов алгоритмов итогов со знаком «-» (для старого значения операции)

  • изменение операции в базе

  • вызов алгоритмов итогов со знаком «+» (для нового значения операции)

  • вызов алгоритма «после изменения»

    Удаление:

  • вызов алгоритма «до удаления»

  • вызов алгоритмов итогов со знаком «-»

  • удаление операции в базе

  • вызов алгоритма «после удаления»

В Инфо-Бухгалтер 10 алгоритмы модификации обеспечивают взаимозависимость прикладных данных. Описание взаимосвязей осуществляется на внутреннем языке с использованием типов АНАЛИТИКА, ОПЕРАЦИЯ и др., хорошо известных прикладным программистам по реализации клиентских программ. В СУБД такие задачи решаются созданием сохраненных процедур, написанных с помощью расширений языка SQL, наложением ограничений на данные и другими средствами, специфическими для конкретной СУБД.

5.2. Программируемые фильтры и каталогизаторы.

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

Приведем пример программируемого фильтра для операций:

ВЫЧИСЛИТЬ(ПЕРЕМ ОПЕРАЦИЯ: оп;

ПЕРЕМ АЛГ_ПАРАМ: парам;

ПЕРЕМ ЛОГИКА: рез)

рез = ДЕНЬ_НЕДЕЛИ(оп.дата_время.дата) = 5 // пятница

КОНЕЦ

Эта программа принимает на вход операцию «оп», дополнительные параметры «парам» и должна вынести вердикт: попадает ли данная операция в выборку или нет. В примере для принятия решения используется дата операции и в выборку попадают только операции, дата которых соответствует пятнице. Этот пример иллюстрирует возможности, открываемые использованием функций внутреннего языка (в примере — ДЕНЬ_НЕДЕЛИ) для написания сложных критериев отбора, которые невозможно выразить обычным фильтром.

Для использования программируемого фильтра исполнимый код сохраняется в свойство типа «алгоритм» какого-либо служебного объекта аналитики. В переменной типа ФИЛЬТР указывается ссылка на этот алгоритм и, при необходимости, дополнительные параметры в значении типа АЛГ_ПАРАМ.

Программируемые каталогизаторы применяются для задания сложного критерия группировки объектов аналитики. Если алгоритм программируемого фильтра должен ответить на вопрос ДА или НЕТ, входит или не входит объект или операция в выборку, то алгоритм программируемого каталогизатора должен назвать группу, в которую будет отнесен объект.

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

5.3. Сложные расчеты на сервере.

Трехзвенная архитектура позволяет возложить на серверное приложение ответственность за проведение сложной обработки данных локально по отношению к базе данных. Примером таких сложных вычислений может служить формирование различных отчетов или расчет зарплаты.

Платформа предоставляет два способа хранения исполнимого кода программ на сервере. Во первых, исполнимый код может сохраняться в базе данных, в свойствах типа «алгоритм» служебного объекта аналитики. Во вторых, на сервере могут располагаться файлы исполнимого кода *.ibx, которые могут быть запущены по запросу клиента.

Для запуска программы на сервере с клиента используется функция ВЫПОЛНИТЬ_СЕРВ:

// запуск из файла

ВЫПОЛНИТЬ_СЕРВ({"СерверныйРасчет.ibx"})

// запуск из базы данных

ВЫПОЛНИТЬ_СЕРВ(["СЛУЖ/АЛГ/РАСЧЕТЫ", "ОтчетПоОплатам"])

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

Еще один способ выполнения кода из файлов на стороне сервера предоставляет механизм прикладных событий (см. подраздел 7.1).

6. Настройка внешнего вида и поведения журналов и справочников на клиентском месте.

В клиентском приложении платформа предоставляет два развитых компонента: окно показа журналов и окно показа плана аналитики/каталогизатора. В контексте прикладной задачи возможна разнообразная настройка внешнего вида и поведения этих окон. Показ окон возможен в немодальном режиме (дочернее MDI окно) и в режиме выбора, когда окно является модальным диалогом с кнопками «ОК» и «Отмена». Для программного задания режима показа, начального выбора и т.д. в модуле SPECDLG объявлены типы ДИАЛОГ_ЖУРН и ДИАЛОГ_АНАЛИТ.

6.1. Режимы отображения журналов и плана аналитики.

В одном окне возможно отображение нескольких журналов или справочников, переключение между которыми осуществляется с помощью выпадающего списка. Каждый такой вариант наполнения окна называется состоянием. Для задания списка отображаемых состояний используются типы ЖУРН_СОСТ и АНАЛИТ_СОСТ. Рассмотрим логику настройки состояния на примере журнала:

ПЕРЕМ ЖУРН_СОСТ: сост

сост.журнал = "ЖурДТМЦ"

сост.режим = "Приходные накладные"

ПЕРЕМ ЖУРН_СОСТ_ПАРАМ: сост_парам

сост_парам.доб = НЕТ // запрещаем добавление новых операций

ПЕРЕМ ДИАЛОГ_ЖУРН: диалог

диалог.состояния[1] = сост

диалог.сост_парам[1] = сост_парам

диалог.ПОКАЗАТЬ

В переменной «сост» указывается имя журнала «ЖурДТМЦ» и имя режима показа «Приходные накладные». Имя режима используется для взятия настроек отображения и поведения, предварительно сконфигурированных в окне «Настройка отображения» (или программно: вызовом функций модуля LOCCFG).

В качестве состояний может быть указан один и то же журнал или ветка плана аналитики с разными значениями режима. Например, журнал «ЖурДТМЦ» может быть показан в режимах «Приходные накладные», «Расходные накладные» и по умолчанию. Режим по умолчанию существует всегда, а остальные режимы могут быть добавлены и настроены в соответствии с требованиями прикладной задачи.

6.2. Замена стандартных диалогов редактирования.

Стандартные диалоги вызываются для операций или объектов аналитики, когда для соответствующего режима показа не заданы обработчики действий «Добавление», «Изменение» и «Удаление». Рассмотрим замену стандартного диалога редактирования операции при изменении:

ВЫЧИСЛИТЬ (ПЕРЕМ ОПЕР_КОНТЕКСТ: контекст;

ПЕРЕМ ОПЕРАЦИЯ: оп;

ПЕРЕМ МОДИФ_ПАРАМ: мп;

ПЕРЕМ ПУБЛ_ПАРАМ: публ;

ПЕРЕМ СТРОКА: рез)

ПЕРЕМ МойДиалог: диалог

// диалог <- данные

ЕСЛИ диалог.ПОКАЗАТЬ_МОДАЛЬНЫЙ <> "" ТО

// диалог -> данные

рез = "OK";

ИНАЧЕ

рез = "CANCEL"

КОНЕЦ_ЕСЛИ

КОНЕЦ

Значение операции поступает на вход программы в параметре «оп». Параметр «контекст» содержит информацию об имени журнала и режиме. Программа может заполнить выходные параметры «мп» и «публ», которые подаются на вход другим алгоритмам, вызываемым платформой после подтверждения изменения. Выходной параметр «рез» определяет статус изменения: "OK" – принятие изменения, "CANCEL" – отмена, "CONTINUE" – вызов стандартного диалога с подстановкой в него измененных данных.

Исполнимый код программ-обработчиков изменения и других действий сохраняются в файлах на клиентском месте. Соответствия между ibx-файлами и действиями назначаются в окне «Настройка отображения»:

В Инфо-Бухгалтер 8 возможна обработка добавления и изменения счетов и операций, но замена обработчиков может производиться только глобально, а не в зависимости от режима. Метод РЕДАКТИРОВАТЬ позволяет показывать стандартные диалоги с дополнительной обработкой данных.

6.3. Расчетные столбцы и таблицы.

Отображение операций и объектов аналитики может настраиваться с помощью программ на внутреннем языке. Без программирования в таблицах могут отображаться поля объектов и операций. Если необходимо отображать комбинации полей или какие-то связанные данные, то можно воспользоваться расчетными столбцами.

Следующий пример демонстрирует программу для вывода даты и времени операции в различных форматах:

ВЫЧИСЛИТЬ(ПЕРЕМ ОПЕР_КОНТЕКСТ: контекст;

ПЕРЕМ ОПЕРАЦИЯ: оп;

СТРОКА: столбец;

ПЕРЕМ СТРОКА: рез)

ВЫБОР (столбец)

#"Месяц" : рез = МЕСП(МЕС(оп.дата_время.дата))

#"ДатаПроп": рез = ДАТАП(оп.дата_время.дата)

КОНЕЦ_ВЫБОРА

КОНЕЦ

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

В окне журнала возможно отображение расчетной подчиненной таблицы. Расчетная таблица представляется типом РАСЧ_ТАБЛИЦА и содержит схему столбцов, атрибуты и данные для строк. Может быть определено несколько вариантов расчетных таблиц, между которыми пользователь сможет переключаться. Имя варианта передается в программу расчетной таблицы:

ВЫЧИСЛИТЬ(ПЕРЕМ ОПЕР_КОНТЕКСТ: контекст;

СТРОКА: вариант;

ПЕРЕМ ОПЕРАЦИЯ: оп;

ПЕРЕМ РАСЧ_ТАБЛИЦА: рез)

//...

КОНЕЦ

Для расчетной таблицы поддерживается обработка стандартных действий «добавление», «изменение» и «удаление». Настройка вариантов подчиненной таблицы и всех обслуживающих ее программ производится в окне «Настройка отображения» или функциями конфигурирования из модуля LOCCFG.

Аналогом расчетного столбца в Инфо-Бухгалтер 8 является сумма первой проводки или сумма всей операции, отображаемые в таблице операций. В Инфо-Бухгалтер 10 можно отображать произвольные дополнительные столбцы в таблице операций, текст для которых формируется программой на внутреннем языке. Расчетная таблица напоминает таблицу проводок в Инфо-Бухгалтер 8 с той разницей, что расчетная таблица может иметь произвольную структуру столбцов, отображать не только проводки, иметь специальное оформление, контекстное меню, обработку действий редактирования.

7. Взаимодействие прикладных программ.

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

В Инфо-Бухгалтер 8 имеется два способа взаимодействия программ на внутреннем языке: через внешние файлы и через модификацию определений и реквизитов. Также поддерживается запуск одной программой другой, но без передачи и возврата параметров.

7.1. Механизм прикладных событий.

Наиболее гибким способом взаимодействия частей прикладного решения является обмен прикладными событиями. Платформа обеспечивает регистрацию программ-обработчиков событий и вызов соответствующих обработчиков при возбуждении события в коде программы на внутреннем языке.

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

ПЕРЕМ СОБЫТИЕ: соб

соб.блок = "Зарплата"

соб.семейство = "УведомленияЗП"

соб.имя = "ИзмененПериодЗП"

соб.парам["начало"] = дата1

соб.парам["конец"] = дата2

СОБЫТИЕ_ДЛЯ_ВСЕХ(соб)

Здесь «Зарплата» - имя блока, «ИзмененПериодЗП» - имя конкретного события. В индексное поле «парам» добавляется дополнительная информация для данного события (какие-то значения «дата1» и «дата2»). Функция СОБЫТИЕ_ДЛЯ_ВСЕХ производит рассылку события для всех блоков, у которых есть зарегистрированные обработчики для семейства «УведомленияЗП» или конкретного события «ИзмененПериодЗП».

Регистрация обработчиков событий производится с помощью специальных текстовых файлов *.evd. Например, так может выглядеть evd-файл с регистрацией обработчика для семейства событий «УведомленияЗП»:

[Штат]

@УведомленияЗП = Штат\ОбработкаУведомлений.ibx

Здесь указывается соответствие семейств событий (со знаком @) или отдельных событий и файлов исполнимого кода, используемых для обработки. «Штат» - имя прикладного блока, который принимает перечисленные события. Для адресной отправки событий одному или нескольким блокам используется функция СОБЫТИЕ_ДЛЯ_БЛОКА.

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

Имеется возможность перенаправить обработку события с клиентского места на сервер. Для этого в evd-файле на клиентском месте имя ibx-файла заменяется символом @:

[Штат]

@УведомленияЗП = @

При возбуждении события будут проверены обработчики на сервере (на сервере лежат свои evd-файлы). При наличии обработчиков событие будет передано по сети на сервер. Это еще один способ запуска программ на сервере, в дополнение к обсуждавшимся в подразделе 5.3.

Механизм прикладных событий позволяет устанавливать слабые связи между прикладными блоками. Это позволяет поставлять блоки конечному пользователю по отдельности. Также взаимодействие блоков через механизм событий способствует принятию четкого и документированного протокола общения.

7.2. Хранение данных в профилях.

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

  • локальный профиль

  • профиль сеанса

  • профиль пользователя.

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

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

В Инфо-Бухгалтер 8 определения и реквизиты разделяются программами и их изменения сохраняются в файлы или в базу данных.

7.3. Запуск программ из кода.

Запуск программ из кода уже обсуждался в подразделах 1.1 и 5.3. В свете взаимодействия программ представляет интерес обмен параметрами между вызывающей и вызываемой программами. Имеется возможность задавать как входные, так и выходные параметры. Проиллюстрируем обмен параметрами на простом примере:

// в программе СуммаПропиью

ВЫЧИСЛИТЬ(ЧИСЛО: сумма; СТРОКА: язык; ПЕРЕМ СТРОКА: текст)

ВЫБОР (язык)

#"rus": текст = СУММАП(сумма)

#"eng": текст = СУММАП_АНГЛ(сумма)

ИНАЧЕ

текст = "???"

КОНЕЦ_ВЫБОРА

КОНЕЦ

Эта программа принимает два входных параметра «сумма» и «язык». Результат своей работы программа передает в выходном параметре «текст». То, что параметр «текст» является выходным, задается ключевым словом ПЕРЕМ.

Пусть при компиляции данной программы получился локальный файл «СуммаПрописью.ibx». Теперь сделает другую программу, которая будет вызывать программу «СуммаПрописью» и обмениваться с ней параметрами:

ВЫЧИСЛИТЬ

ПЕРЕМ СТРОКА: сумма_проп

ВЫПОЛНИТЬ(["СуммаПрописью.ibx"](12345, "rus", ПЕРЕМ сумма_проп))

СООБЩЕНИЕ(сумма_проп)

КОНЕЦ

Указание имени ibx-файла в квадратных скобках означает, что файл расположен локально. Далее следует список фактических параметров вызова. Для выходного параметра, передаваемого по ссылке, явно указывается ключевое слово ПЕРЕМ.

Обмен значениями параметров между программами возможен, если типы этих значений известны и одинаковы в обеих программах. Это условие соблюдается для стандартных типов (строка, число и т.п.), а также для типов, объявленных в подключаемых модулях.

В Инфо-Бухгалтер 8 возможен запуск программ без обмена параметрами с помощью функции СТАРТ_ПРОГ.

8. Отладка программ на внутреннем языке.

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

8.1. Отладчик в среде разработки.

Встроенный отладчик программ на внутреннем языке позволяет производить пошаговую отладку, размещение точек останова, просмотр значений переменных и стека вызова. Если алгоритм предназначен для простого запуска (см. подраздел 1.1), то нет никаких препятствий для его запуска с отладчиком из среды разработки. Для программ, принимающих сложные параметры, может потребоваться задание отладочных значений входных параметров. Это можно сделать на вкладке «Параметры» диалога настроек проекта или прямо в коде программы.

8.2. Вывод отладочных сообщений на стороне клиента и сервера.

Контролировать выполнение программы на внутреннем языке удобно путем вывода отладочных сообщений функцией ОТЛАДКА. Вызов этой функции не приостанавливает выполнение программы в отличие, например, от функции СООБЩЕНИЕ. К тому же реальный вывод функция ОТЛАДКА делает только в отладочной версии исполнимого кода. Поэтому вызов функции ОТЛАДКА можно безбоязненно оставлять в конечном коде прикладного решения. В откомпилированных без отладочной информации программах у конечного пользователя вывод сообщений производиться не будет.

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

Для программ, работающих на стороне сервера, отладочные сообщения регистрируются в log-файлах. Установите опцию [Trace] VMDebug=on в файле athopt.ini для включения вывода отладочных сообщений алгоритмов модификации, программируемых фильтров и каталогизаторов. Для серверных обработчиков прикладных событий, и просто файлов, запускаемых функцией ВЫПОЛНИТЬ_СЕРВ, включение отладочного вывода осуществляется в файле asrvlg.ini параметром [Debug] CustomLog=on.

В Инфо-Бухгалтер 8 имеется возможность вывода отладочных сообщений функцией ОТЛАДКА в специальное окно и в log-файл.

8.3. Навигация по исходным текстам.

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

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

В Инфо-Бухгалтер 8 можно вызвать оглавление функций для одной библиотеки. Также поддерживается оглавление для файлов типовых операций.

9. Краткий обзор подключаемых модулей.

Подключаемые модули добавляют во внутренний язык типы и функции для решения разнообразных задач. Эти средства позволяют программе на внутреннем языке взаимодействовать с операционной системой и другими компонентами, развернутыми на компьютере.

9.1. Основные модули.

Особую роль играют модули ATHENA и LOCCFG. Эти модули предоставляют доступ к базе данных и конфигурации клиентского места.

Модуль ATHENA содержит объявления типов и функций для работы с базой данных. Например, в нем содержатся объявления типов ОПЕРАЦИЯ и АНАЛИТИКА, использующихся повсеместно в серверных и клиентских алгоритмах (см. разделы 5 и 6). Также модуль содержит тип КОНФИГУРАТОР, который позволяет в режиме монопольного доступа произвольным образом изменять базу данных. Например, конфигурирование базы данных может включать в себя создание новых журналов и типов операций, изменение структуры плана аналитики и т.п.

Модуль LOCCFG позволяет программно производить настройку клиентского места. С помощью его функций и типов задаются все настройки, которые можно видеть в окне «Настройка отображения». Также модуль предоставляет функцию ЛКФ_КОМПИЛЯЦИЯ, которая незаменима для программной компиляции программ прикладного решения.

Модуль FC предоставляет средства для создания диалоговых окон (см. раздел 3) и печатных форм (см. раздел 4).

9.2. Работа с файлами.

Модуль FILES включает средства для поиска, копирования и удаления файлов и директорий на диске компьютера. Поддерживается семейство функций для манипуляций с путями именами файлов.

Объектный тип ФАЙЛ позволяет осуществлять чтение и запись произвольных текстовых файлов. Для удобного чтения и записи конфигурационных файлов в формате ini существует специальный тип КОНФИГ_ФАЙЛ. Тип АРХИВ_ФАЙЛ позволяет записывать и считывать произвольные значения в специальный двоичный файл, что может использоваться для переноса данных в рамках прикладного решения.

Также модуль содержит средства расширения платформы. Вызов внешних приложений возможен с помощью функций СОЗДАТЬ_ПРОЦЕСС и КОМАНДА_ОБОЛОЧКИ. С помощью них можно запускать *.exe файлы, открывать страницы в Интернет-браузере и т.п. Тип ДИНАМИЧЕСКАЯ_БИБЛИОТЕКА позволяет осуществлять загрузку динамических библиотек *.dll и вызов функций из ниx.

Модуль XML предназначен для разбора и формирования xml-файлов. С помощью типов этого модуля программа на внутреннем языке получает доступ к возможностям библиотеки MS XML.

В Инфо-Бухгалтер 8 есть тип для чтения и записи текстовых файлов и некоторые функции для работы с файлами. Для вызова exe-файлов есть функции ВЫПОЛНИТЬ и СОЗДАТЬ_ПРОЦЕСС. Взаимодействие с dll возможно с помощью функции ВЫЗОВ, но функции в dll должны иметь строго заданный вид.

9.3. Работа с локальными базами данных.

Модуль LOCALDB предоставляет возможность работы с таблицами баз данных в форматах *.dbf (DBASE) и *.db (Paradox). Тип БАЗА_ДАННЫХ позволяет выполнять SQL-запросы, осуществлять перебор результатов и выполнять позиционное редактирование записей.

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

В Инфо-Бухгалтер 8 программный доступ к таблицам баз данных широко используется. В основном это вызвано необходимостью хранения и обработки аналитической информации, не предусмотренной в структуре собстветнной базы данных бухгалтерской программы. В Инфо-Бухгалтер 10 локальным базам данных отводится второстепенная роль.

9.4. Работа с COM.

Модуль MODCOM предоставляет еще одно важное средство расширения возможностей платформы: доступ к технологии COM. С помощью COM-интерфейсов можно взаимодействовать с различными программными компонентами, установленными на компьютере: от офисных приложений, до программ обслуживания оборудования (сканеров, кассовых аппаратов и т.п.).

Например, следующий код откроет документ «DemoBook.xls» в Excel:

ПЕРЕМ СТРОКА: имя_файла = "DemoBook.xls"

ПЕРЕМ ДИН_COM_ОБЪЕКТ: приложение;

приложение.СОЗДАТЬ_ЭКЗЕМПЛЯР("", "", "Excel.Application")

приложение.ЗАПИСАТЬ("Visible", ДА)

ПЕРЕМ ДИН_COM_ОБЪЕКТ: книги

приложение.СЧИТАТЬ("Workbooks", книги)

ПЕРЕМ ДИН_COM_ОБЪЕКТ: книга

книги.ВЫЗВАТЬ("Open"(имя_файла), книга)

Здесь создается COM-объект по ProgId = «Excel.Application». Запись и чтение свойств (properties) осуществляется методами ЗАПИСАТЬ и СЧИТАТЬ. Метод ВЫЗВАТЬ осуществляет вызов метода книги (workbook) Excel «Open» с параметром — именем файла. Обработка ошибок опущена для краткости.

В Инфо-Бухгалтер 8 также есть средства для работы с COM, но ограничения внутреннего языка не позволяют использовать их столь же полно, как в Инфо-Бухгалтер 10.

9.5. Работа с Интернет.

Модуль GNET предоставляет средства для получения файлов из сети Интернет по протоколам http и ftp (функция ПОЛУЧИТЬ_ФАЙЛ), а также для отправки писем электронной почты (тип ПИСЬМО). Для отправляемых писем имеется возможность прикрепления файлов:

ПЕРЕМ ПИСЬМО: письмо

письмо.адреса[1] = "someperson@someserver.ru"

письмо.тема = "Ваш заказ принят"

письмо.сообщение = "Здравствуйте! ..."

письмо.файлы[1] = "C:\upload\somefile.zip"

письмо.ОТПРАВИТЬ

В Инфо-Бухгалтер 8 есть аналогичная ПОЛУЧИТЬ_ФАЙЛ.

10. Справочная информация по внутреннему языку.

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

Все файлы справочной системы можно найти в папке «help» в директории установки платформы. Различные статьи по использованию внутреннего языка содержатся в основном файле справки ath_main.chm. В частности, информация по программированию содержится в разделах:

  • Создание алгоритмов на внутреннем языке.

  • Параметры алгоритмов плана аналитики и журналов.

  • Обработчики событий платформы.

  • Механизм межблочного взаимодействия.

10.1. Описание базовых конструкций языка.

Базовые конструкции языка описаны в файле справки language.chm. Там приводится синтаксис и примеры объявления переменных, констант, функций, типов, описаны управляющие конструкции и ключевые слова.

Базовый язык определяет немногим более 40 ключевых слов, включая имена встроенных типов (ЧИСЛО, СТРОКА и т.п.). Текстовый редактор среды разработки выделяет ключевые слова синтаксической подсветкой. В этом документе и в справке по подключаемым модулям ключевые слова языка выделяются жирным шрифтом.

10.2. Справка по подключаемым модулям.

Справка по подключаемым модулям организована в виде *.hlp файлов, имя которых совпадает с именем модуля. Например, файл справки по модулю FC называется fc.hlp. Справка по подключаемым модулям является основной документацией для прикладных разработчиков и поддерживается в строго актуальном состоянии.

10.3. Контекстный вызов справки.

При работе в среде разработки можно вызвать контекстную справку по внутреннему языку. Для этого надо поставить курсор на интересующее имя и нажать Ctrl + F1. Это же действие можно выполнить в окнах дерева типа и глобальных единиц. Поиск имени происходит по справке всех установленных модулей и базовой части языка.

Поделитесь с коллегами: