Руководство разработчика

Библиотечные функции и методы

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

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

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

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

Описание функции начинается ключевым словом ФУНКЦИЯ и заканчивается словом КОНЕЦ_ФУНКЦИИ. Вложенные функции (функция внутри функции) не поддерживаются. Вложенный вызов функций поддерживается, в том числе и рекурсия. Внутри функции видны все функции из этой же библиотеки.

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

ФУНКЦИЯ ТИП_ДАТА: Завтра
    Завтра = ДАТА_ТЕК + 1
КОНЕЦ_ФУНКЦИИ

вернет значение переменной Завтра, т.е. завтрашнюю дату.

Определение собственных методов

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

ФУНКЦИЯ <тип_объекта> [<тип_результата>:] <имя_метода>
    [(<описание_параметров>)]

Внутри метода видны, т.е. доступны без указания имени объекта, все поля и методы объекта, чей метод был вызван.

Замечания:

Примеры использования

ФУНКЦИЯ Скобки ( ПЕРЕМ ТИП_СТРОКА : Строка )
    Строка = "("+Строка+")"    // изменение переменной Строка
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ ТИП_ЧИСЛО : Факториал ( ТИП_ЧИСЛО : N )
    ЕСЛИ N = 0 ТО
        Факториал = 1   // 0!=1
    ИНАЧЕ
        Факториал = N*Факториал (N-1)   // рекурсивный вызов
    КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ ТИП_ПРОВОДКА ТИП_ЧИСЛО: ЦенаПров
//      |            |          |        |
//      |            |          |        параметров нет
//      |            |          имя метода
//      |            тип возвращаемого результата
//      тип объекта, которому принадлежит метод
СчД = СЧЕТ_СЧИТАТЬ ( дебет )     // создаем объект счет дебета
СчК = СЧЕТ_СЧИТАТЬ ( кредит )    // создаем объект счет кредита
ЕСЛИ НЕ ( СчД.кол  ИЛИ  СчК.кол ) ТО
    ЦенаПров = 0                 // если оба счета не количественно-
    ВЫХОД                        // суммовые, то цена равна нулю
КОНЕЦ_ЕСЛИ
ЕСЛИ СчД.исп_фц  И  СчК.исп_фц  ТО
    ЦенаПров = -1                // ошибочная ситуация - по обоим счетам
    ВЫХОД                        // используется фиксированная цена
КОНЕЦ_ЕСЛИ
ЕСЛИ  СчД.исп_фц  ТО
    ЦенаПров = СчД.фикс_цена     // фикс. цена из счета дебета
ИНАЧЕ
    ЕСЛИ  СчК.исп_фц  ТО
        ЦенаПров = СчК.фикс_цена // фикс. цена из счета кредита
    ИНАЧЕ
        ЕСЛИ ( количество = 0 ) ТО
            ЦенаПров = 0         // расчет цены по количеству и сумме
        ИНАЧЕ
            ЦенаПров = сумма / количество
        КОНЕЦ_ЕСЛИ
    КОНЕЦ_ЕСЛИ
КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ

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

Скрытые функции

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

Для скрытых функций подавляется размещение имени функции и имен локальных переменных в исполняемом коде (*.ibx) даже при установленной опции компилятора Записывать в код отладочную информацию (на закладке Документы пункта Установка/Настройки Главного меню).

Отображение имени скрытой функции заменяется ********** при выводе сообщений об ошибке и прогресса компиляции.

Имя скрытой функции должно начинаться с префикса _h_

Пример:

ФУНКЦИЯ ТИП_ЛОГИКА: _h_ПопробуйУгадать_387672976743(ТИП_СТРОКА: запрос)

См. также