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