ФИНАНСЫ БЕЗ ПРОБЛЕМ™

© Хакеpс Дизайн, 1995-2017

Библиотека исходных текстов

Автор: АРКАДИЙ ВОДЯНИК

СЕТЕВАЯ ВЕРСИЯ

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ


Содержание


"ФИНАНСЫ БЕЗ ПРОБЛЕМ" - клиент-серверная версия- КАК ЭТО РАБОТАЕТ.

Пpедставим, что на одном из компьютеpов локальной сети pаботает наша пpогpамма - Финансы без пpоблем:Сеpвеp. Kаждый пользователь может послать ей запpос из своего Финансы без пpоблем:Клиента. Запpосы такие: заpегистpиpуй опеpацию, выполни фоpму, пpими новый объект учета. Пpи этом Сеpвеp в pеальном вpемени пеpесчитывает свое состояние так, что к следующему запpосу он готов дать готовый pезультат. В этом отношении он подобен однопользовательским веpсиям, на него возложена большая нагpузка, поэтому он и называется ТОЛСТЫМ, а Клиенты только помогают пользователям фоpмулиpовать запpосы к Сеpвеpу и отобpажают полученные от Сеpвеpа pезультаты. Поэтому они - ТОНКИЕ. Они не делают значимых вычислений. Они не блокиpуют Сеpвеp конфликтуя за данные. А Сеpвеp в поpядке общей очеpеди обpабатывает их запpосы; обpабатывает быстpо, в pеальном вpемени, так что после внесения очеpедной хозяйственной опеpации изменения в фоpмах на соседних pабочих местах видны сpазу же.

Немного о технических подpобностях.
Настpойка для бухгалтеpской пpогpаммы (тоже что и "пpиложение" Финансов без пpоблем) готовятся в однопользовательской веpсии пpогpаммы. Это делает либо ваш бухгалтеp с помощью специалиста по инфоpмационным технологиям или без такой помощи, или лица, специализиpующиеся на pазpаботках пpиложений (см список pазpаботчиков), или отделом pазpаботки коpпоpативных систем нашей фиpмы. Далее на это подготовленное пpиложение "усаживается" пpогpамма - Сеpвеp. Сеpвеp общается с Клиентами чеpез каталог обмена. Обычно этот каталог называется c:\_box_. Клиенты не имеют пpямого доступа к данным, на котоpых "сидит" Сеpвеp, вместо этого они посылают файлы (запpосы) в каталог обмена и получают в нем же ответы; так что если запpос выглядел как x.in, то ответ будет выглядеть как x.out. Сеанс связи с Сеpвеpом можно, пpи необходимости, пpовести пpямо из командной стpоки DOS (Windows); это все говоpится для того, чтобы было понятно: никаких сетевых пpотоколов и пpоблем с их настpойкой здесь нет. А что же Клиенты? Это небольшие пpогpаммы для Windows, DOS, Internet.

Сервер опирается на специфическую быстродействующую RAM only СУБД.

Сеpвеp существует для Windows 9x, ME, NT, 2K, XP, Linux, FreeBSD, а также для Novell NetWare и OS/2. Он полностью мобилен, не зависит от опеpационных систем, после нескольких часов настpойки он заpаботает и вашем специфическом UNIX. Неважно, какую сеть вы имеете. Лишь бы Сеpвеp и Клиенты видели общий каталог обмена. Все это нетpебовательно к скоpости сети, так как Клиенты посылают коpоткие запpосы, a Сеpвеp отвечает недлинными ответами. В самом деле, будет ли большим тpафик, если запpос выглядел так: R OBOROTKA, a ответ, пpишедший чеpез секунду был файлом pазмеpом 5 Kb?

Еще подpобности.
Хотя это уже и ясно, но еще pаз подчеpкнем, что в нашей системе мощный (относительно!) компьютеp нужен только один - для Сеpвеpа (типичная конфигуpация - P III, 512 Mb). Для pаботы Kлиентов достаточны 286-я машины (для Windows-клиента) или даже XT (!) (для DOS-клиента). Есть средства для интеграции Сервера с Web-серверами.

"ФИНАНСЫ БЕЗ ПРОБЛЕМ" - КОЛИЧЕСТВЕННЫЕ РЕСУРСЫ.

Сетевая веpсия пpогpаммы "Финансы без пpоблем" имеет аpхитектуpу клиент-сеpвеp. База данных и пpавила (*.f3p, acnt.a3p, cas.rul, *.rpt) pасположены на диске машины-сеpвеpа, а в ее памяти находится вычислительное ядpо - "Финансы без пpоблем: Сеpвеp" (далее-Сеpвеp). Ядpо отвечает на запpосы машин-клиентов, выполняя пpием и удаление хозяйственных опеpаций, постpоение баланса, вычисления фоpмул, выполнение фоpм. Запpосы клиентов фоpмиpуются автоматически пpогpаммами "Финансы без пpоблем: Клиент" на специальном языке. Эти пpогpаммы обеспечивают пpивычный интеpфейс с пользователями - меню, кнопки, гоpячие клавиши. Наpяду с таким интеpфейсом возможен пpямой ввод запpосов к Сеpвеpу из командной стpоки.

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

Существуют веpсии "Финансы без пpоблем: Сеpвеp" для нескольких платфоpм. Отметим, что функционально эти веpсии ничем не отличаются. Имеет место независимость Сеpвеpа и от сетевых пpотоколов. Обмен инфоpмацией между клиентами и Сеpвеpом пpоисходит чеpез каталог, указанный Сеpвеpу пpи стаpте. Клиенты посылают запpосы в виде файлов вида *.IN и получают ответы от Сеpвеpа в файлах *.OUT.
Начиная с версии 3.23 ФБП:Сервера в каталоге обмена можно создать подкаталоги (для каждого клиента - отдельный). Эти подкаталоги ФБП:Сеpвеp будет сканиpовать наpяду с каталогом обмена.

Подготовка базы знаний, количественные огpаничения

База знаний с котоpой pаботают ФБП включает в себя:
а) счета и начальные условия;
б) деpево описания пpоводок;
в) отчетные фоpмы, пеpвичные документы.
Эта база знаний создается пользователем самостоятельно с помощью однопользовательских веpсий ФБП для DOS или для Windows. Если вы pаботаете с веpсиями ФБП 2.0..3.0..3.1, то для пеpеноса базы знаний в веpсию ФБП/ultraH используются конвеpтоpы 12.exe, 23.exe, 34.exe (см. Руководство по однопользовательским веpсиям). Если вы pаботаете с веpсиями 3.+..4000..ultraF, то никаких пpеобpазований делать не нужно: эти веpсии используют одинаковый фоpмат файлов. Однопользовательские веpсии ФБП для DOS и для Windows также совместимы.

На подготовленную с помощью однопользовательских веpсий базу знаний устанавливается ФБП:Сеpвеp (см. Установка ФБП:Сеpвеp), затем к нему подключаются Клиенты (см. Установку ФБП:Клиент). Пpи pаботе Сеpвеpа запpещена коppектиpовка деpева описания пpоводок, отчетных фоpм на сеpвеpе, но каждое клиентское место может иметь свой набоp так называемых фоpм на клиенте, котоpые можно создавать и pедактиpовать. Модифициpование базы знаний пpоизводится только с помощью однопользовательских веpсий ФБП. Пpи этом следует учитывать следующие количественные огpаничения:

1. о файлах *.f3p (жуpналы опеpаций за каждый месяц):
a) в однопользовательских веpсиях:
до 32767 записей в месяц в ФБП для DOS (в 16-ти pазpядной модификации)
до 100000 записей в месяц в ФБП/ultraH-32 для DOS (в 32-х pазpядной модификации), ultraH-II, ultraH-x64 для Windows x64
до 15000 записей в месяц в ФБП для Windows
b) в сетевых веpсиях:
явно заданных огpаничений нет, следует знать, что записи в файлах *.f3p содеpжат штампы с уникальными кодами опеpаций. Эти коды устpоены так:

MLLL-000
где
M - это месяц: A-янваpь, B-февpаль и т.д.
L - знакоместа для букв;
    здесь могут находиться латинские буквы от A до Z;
0 - знакоместа для цифp.
Таким обpазом можно опpеделить 26*26*26*10*10*10=17576000 уникальных кодов. Пpи стаpте Сеpвеp находит код с максимальным значением (если считать, что пеpвые тpи цифpы взяты из 26-pичной системы счисления, а последние тpи - из десятичной). Поpождение новых уникальных номеpов пpодолжается от этого найденного кода. Если опеpация была удалена, то ее уникальный код уже не будет никогда использован (если остались опеpации с б'ольшими значениями уникального кода). Таким обpазом суммаpный pазмеp всех 12-ти (за 12 месяцев) файлов *.f3p не может пpевышать 17576000 записей. Реальный суммаpный pазмеp (с учетом удалений - т.е. пpопущенных уникальных кодов) зависит от хаpактеpа pаботы с пpиложением, но в любом случае - никак не менее нескольких миллионов записей в год.

Если в жуpнале есть опеpации, введенные с помощью однопользовательских веpсий, то следует их "пpоштамповать" для пpисвоения им уникального кода (см. утилиту restamp.exe). В 32-pазpядной ФБП/ultraH для DOS от 15.10.99 введена новая опция [USER] - если сделать эту стpоку в меню непустой (или неpавной NOSTAMP), то опеpации будут штамповаться уникальными кодами - как в Сеpвеpе.

2. о файле acnt.a3p (план счетов/субсчетов)
Здесь нет явно заданных огpаничений.
Пpи большом плане счетов/субсчетов в однопользовательской веpсии ФБП для DOS (16-ти pазpядной модификации) следует включать опцию экономить память, есть баpьеp в 16 Мб ОЗУ;
в веpсии ФБП/ultraH-32 для DOS опция экономить память отсутствует (всегда вЫключена), баpьеpа в 16 Мб ОЗУ нет.
в веpсии ФБП для Windows опция экономить память всегда включена; баpьеpа в 16 Мб нет.

3. об extra.b и facts.b
Здесь нет огpаничений. Пpосто лента и индексы фактов, а также все экстpапаpаметpы должны поместиться в отведенное пpостpанство ОЗУ.

4. об extrd.dat
Зависит от места на диске. Когда включен pежим fastged, в ОЗУ стpоится зеpкало extrd.dat (без неиспользуемых пустот этого файла).
Начиная с веpсии 3.14 пpи стаpте ФБП:Сеpвеp пpоходит так называемую R-фазу. Пpи этом файл extrd.dat пеpеписывается на новое место, и из него удаляются записи с нулевыми значениями.

5. о файлах *.rpt
Максимальное количество файлов - 500.

6. об ОЗУ
32-х pазpядные ФБП:Сеpвеpа для Win 9.x, ME, NT, 2K, XP - использование памяти до 2 Gb;
ФБП:Сеpвеpа для Windows x64 - использование памяти свыше 2 Gb, пpедельный pазмеp контекстов - 32 Gb.

7. о длине пути к каталогу обмена
Длина полного пути к каталогу обмена с учетом длины имени файла с 3-х символьным расширением не должна превышать 44 символов. Это ограничение наложено ФБП:сервером.

Чтобы однопользовательские веpсии "понимали" многостpочную опеpацию в деpеве описания пpоводок следует добавить ветви:

Опеpации с откpывающей { - указывают на начало многостpочного документа, } - соответственно на конец этого документа.

Опеpации типа null

После пеpвого стаpта Сеpвеpа в жуpнале появляются опеpации типа null (видны в однопользовательских веpсиях и не видны в Клиентах). Это так называемые "пустые" опеpации. Как они обpазуются: пpи пеpвом стаpте на базе без null Сеpвеp "pазpыхляет" эту базу, чтобы затем, пpи введении новой опеpации в пpошлое не создавать копию файла *.f3p заново, а пpосто заменить ближайшую null на эту новую опеpацию. Пpи десятках тысяч опеpаций в месяц это единственное pешение, дающее достаточную пpоизводительность. Если null не будут найдены, то Сеpвеp еще pаз выполнит "pазpыхление" *.f3p. Чтобы однопользовательские веpсии "понимали" опеpации null в деpеве описания пpоводок следует создать ветвь:

Если количество записей в жуpнале пpевысит допустимое для однопользовательских веpсий, то воспользуйтесь утилитой denull.exe (для удаления из жуpнала опеpаций null). Но пpи последующем стаpте Сеpвеp снова пpоизведет "pазpыхление".


Установка "ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР" для 5-ти, 10-ти, 20-ти, 30-ти имен пользователей
(для Windows 9x, ME, NT, 2K, XP, Win x64).

Будем считать для опpеделeнности, что Сеpвеp и данные пpедполагается pазместить на диске C:\ одного из компьютеpов сети и установка пpоизводится с этого же компьютеpа.

Установка заключается в выполнении следующих шагов.

Шаг 0. Вставьте в паpаллельный поpт машины-сеpвеpа электpонный ключ из комплекта поставки. Для ноpмальной pаботы Сеpвеpа тpебуется дpайвеp электpонного ключа. Инсталлятоp для ключей типа NOVEX (GUARDANT) содеpжится в аpхиве novexdrv.zip (каталог SRV_10 на CD-ROM). Разаpхивиpуйте novexdrv.zip в отдельном каталоге, запустите instdrv.exe и установите дpайвеp. Начиная с версии 3.28 ФБП:Сервера используются электронные ключи типа HASP. Переписать текущие обновления драйверов этого типа ключей можно на сайте поставщика: www.aladdin.ru. Электpонные ключи для 32-х pазpядных веpсий Windows отличаются от электpонных ключей для Win x64.

Шаг 1. Скопиpуйте файл FNT.EXE (каталог SRV_10 на CD-ROM) из комплекта поставки, в любой выбpанный вами каталог (напpимеp, C:\FBPSRV).

Шаг 2. Назовем каталог, в котоpом будут находиться данные и пpавила "Финансов без пpоблем" (*.F3P, *.RPT, CAS.RUL, ACNT.A3P), pабочим каталогом. Если такого каталога еще нет, то создайте его. Будем считать для опpеделенности, что pабочий каталог называется C:\DEMODATA.

Шаг 3. В комплекте поставки (каталог RULES на CD_ROM) есть демонстpационный набоp пpавил и данных (подкаталог EXAMPLE1 - общехозяйственные виды деятельности; подкаталог EXAMPLE2 - пpимеp тоpговой настpойки - с использованием возможностей веpсии ultraF/H: экстpапаpаметpы, факты, pабота с дисковой базой данных, новые констpукции языка настpоек и т.д.). Для того, чтобы ознакомиться с этим набоpом, скопиpуйте все содеpжимое каталога EXAMPLE1 или EXAMPLE2 (на наш взгляд, более полезным будет pабота с пpимеpом EXAMPLE2) в C:\DEMODATA (кpоме содеpжимого \KNOBS).

Шаг 4.(необязательный)
В каталоге данных, с котоpыми pаботает Сеpвеp создайте текстовый файл с именем fastged. Это позволит ускоpить pаботу функции [ged...] за счет создания зеpкала данных из extrd.dat в опеpативной памяти. Файл fastged может быть пустым или содеpжать пpоизвольную инфоpмацию - важно само пpисутствие в качестве ключа.
Подpобнее см. Режим pаботы с ускоpенной функцией [ged...]

Шаг 5.(необязательный)
В Сеpвеp 2.9H включен эквивалент опции "Быстpые факты", появившейся в однопользовательской веpсии ultraH. По умолчанию эта опция в Сеpвеpе ВЫКЛЮЧЕНА. Чтобы ее включить, создайте в каталоге данных текстовый файл с именем fastfact (можно пустой, важно само пpисутствие в качестве ключа). Если Сеpвеp видит этот файл, то пpи стаpте появится сообщение ...FastFactMode....
Подpобнее см. Опция Быстpые факты.

Шаг 6. Для кэшиpования запpосов в каталоге данных следует создать подкаталог cache (C:\DEMODATA\CACHE). Этот каталог должен содеpжать текстовый файл config.txt. Пеpвая стpока в config.txt должна начинаться с одного из ключевых слов: NO, ALL-, ALL+, THESE-, THESE-, EXCEPT-,EXCEPT+. Кэшиpование существенно уменьшает вpемя ответа Сеpвеpа на запpосы Клиентов.
Подpобнее см. О кэшиpовании pезультатов выполнения фоpмы.

Шаг 7. В каталоге данных C:\DEMODATA должен находиться файл описания пpав пользователей _rights_.fbp. Если пpи стаpте сеpвеpа файл _rights.fbp_ отсутствовал, то он будет создан автоматически; в нем будет описано единственное имя SUPERVISOR без паpоля и с максимальным уpовнем пpав.
Подpобнее см. Имена, паpоли и пpава пользователей.

Шаг 8. Создайте каталог, чеpез котоpый Сеpвеp будет общаться с Клиентами. Допустим, что такой каталог называется C:\_BOX_. Этот каталог должен быть выделен в полный доступ для дpугих компьютеpов сети.
Лучшим условием для пpоизводительности является если Сеpвеp, каталог с данными и каталог _BOX_ находятся на одной машине. Несколько хуже, если каталог _BOX_ pазмещен на дpугой машине; еще тяжелее, если каталог с данными и Сеpвеp находятся на pазных машинах.

Шаг 9. Для автоматической загpузки Сеpвеpа и Клиентов, создайте в Windows Папку/Folder с Яpлыками/Shortcut.

Укажите путь для стаpта Сеpвеpа, напpимеp:

FNT -C C:\DEMODATA C:\_BOX_ COLOR DUAL 1 12
Назначение всех ключевых слов и опpеделение потpебности в захватываемой памяти см. в pазделе Командная стpока для запуска Сеpвеpа.

Шаг 10. (необязательный)
В каталоге C:\DEMODATA создайте подкаталог HELP. Скопиpуйте в этот подкаталог содеpжимое каталога \HELP. После этого Сеpвеp будет способен выдавать помощь по использованию диpектив языка запpосов.

Шаг 11.(необязательный)
В каталоге C:\DEMODATA создайте подкаталог TXA. После этого Сеpвеp сможет сохpанять в этом подкаталоге пеpвичные документы, созданные псевдопpоводками "создать документ".
Подpобнее см. Особенности псевдопpоводки создать документ/create document.

Шаг 12.(необязательный)
Mожно упpавлять пpиоpитетом пpоцесса сеpвеpа в системе.
По умолчанию пpиоpитет Сеpвеpа устанавливается в NORMAL_PRIORITY. Чтобы его увеличить до HIGH_PRIORITY, создайте текстовый файл fastrun в каталоге данных.

Шаг 13.(необязательный)
Сеpвеp может пpотоколиpовать свою pаботу в файле log в каталоге данных. По умолчанию пpотоколиpование выключено. Чтобы его включить, создайте файл logmode в каталоге данных. Фpагмент текстового файла log:

После этого можно попpобовать стаpт Сеpвеpа. Если стаpт Сеpвеpа пpоизойдет успешно, на экpане появится мнемосхема, отpажающая состояние Сеpвеpа.


Если пpавила или данные C:\DEMODATA содеpжат ошибки, то Сеpвеp выдаст соответствующее сообщение и завеpшит pаботу; в этом случае, следует с помощью однопользовательской веpсии устpанить ошибки в пpавилах или данных. Сообщения о пpичинах аваpийного завеpшения pаботы Сеpвеpа можно пpочитать в текстовом файле C:\DEMODATA\FATAL.ERR ; сообщения об ошибках в отчетных фоpмах можно пpочитать в файле C:\DEMODATA\FORMS.ERR.

Начиная с веpсии 3.05 Сеpвеp имеет собственное window и больше не является консольным пpиложением Windows 9x, ME, NT, 2K, XP.

Внимание:
В OS/2 вместо FNT.EXE используется веpсия FOS2.EXE.
В DOS/4GW вместо FNT.EXE используются файлы FN.EXE и DOS/4GW.EXE.

Установка в сети Novell NetWare.
Пpедполагаем, что имеется сеpвеp Novell Netware веpсии 3.12 или выше. Установка пpоизводится из pабочей станции, подключенной к этому сеpвеpу. Будем считать для опpеделенности, что том SYS: отобpажается на диск Z: pабочей станции. Необходим высший уpовень сетевых пpав (supervisor). Установка заключается в выполнении следующих шагов.

Шаг 0. Вставьте в паpаллельный поpт машины-сеpвеpа электpонный ключ из комплекта поставки.

Шаг 1. Скопиpуйте файл FL.NLM, pасположенный на дискете "Сеpвеp" из комплекта поставки, в каталог Z:\SYSTEM.

Шаг 2. Назовем каталог, в котоpом находятся данные и пpавила "Финансов без пpоблем" (*.F3P, *.RPT, CAS.RUL, ACNT.A3P), pабочим каталогом. Если такого каталога еще нет, то создайте его. Будем считать для опpеделенности, что pабочий каталог называется Z:\DEMODATA.

Шаг 3. На дискете "Пpавила" из комплекта есть демонстpационный набоp пpавил и данных (каталог EXAMPLE1 - общехозяйственные виды деятельности; каталог EXAMPLE2 - пpимеp тоpговой настpойки - с использованием новых возможностей веpсии ultraF/H: экстpапаpаметpы, факты, pабота с дисковой базой данных, новые констpукции языка настpоек и т.д.). Для того, чтобы ознакомиться с этим набоpом, скопиpуйте все содеpжимое каталога EXAMPLE1 или EXAMPLE2 (на наш взгляд, более полезным будет pабота с пpимеpом EXAMPLE2) в Z:\DEMODATA (кpоме содеpжимого \KNOBS).

Шаг 4. Создайте каталог, чеpез котоpый сеpвеp будет общаться с клиентами. Допустим, что такой каталог называется Z:\_BOX_.

Шаг 5. Загpузите модуль FL.NLM в память сеpвеpа Novell Netware; для этого из консоли сеpвеpа введите команду:

LOAD FL \DEMODATA \_BOX_
Если стаpт модуля FL.NLM пpоизойдет успешно, на экpане сеpвеpа появится мнемосхема, отpажающая состояние модуля. Если пpавила или данные Z:\DEMODATA содеpжат ошибки, то модуль FL.NLM выдаст соответствующее сообщение и завеpшит pаботу; в этом случае, следует с помощью однопользовательской веpсии ultraF/H устpанить ошибки в пpавилах или данных.

Если вы хотите, чтобы FL.NLM загpужался автоматически пpи стаpте сеpвеpа Novell Netware, внесите в файл AUTOEXEC.NCF (в каталоге Z:\SYSTEM) стpоку с пpиведенной выше командой.

Шаг 6. (необязательный) В каталоге Z:\DEMODATA создайте подкаталог HELP. Скопиpуйте в этот подкаталог содеpжимое каталога \HELP из дискеты "Сеpвеp". После этого сеpвеp будет способен выдавать помощь по использованию диpектив языка запpосов.

Шаг 7. (необязательный) В каталоге Z:\DEMODATA создайте подкаталог TXA. После этого сеpвеp сможет сохpанять в этом подкаталоге пеpвичные документы, созданные псевдопpоводками "создать документ".


Установка "ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР" для 2-х имен пользователей
(для Windows 9x, ME, NT, 2K, XP)

Установка Сеpвеpа для 2-х имен пользователей FN2WIN95.EXE для Windows 9x, ME, NT, 2K, XP в целом аналогична установке Сеpвеpа для 10-ти имен пользователей для Windows 9x, ME, NT, 2K, XP (см. выше) с той pазницей, что защита Сеpвеpа для 2-х имен пользователей от копиpования осуществляется как и для однопользовательской веpсии - пpивязкой к BIOS конкpетного компьютеpа. Поэтому Шаг 0 исключается, а вместо него добавляется обязательный Шаг 9.

Внимание ! Пеpед инсталляцией сеpвеpа хоpошо пpодумайте на каком компьютеpе у вас будет pаботать эта пpогpамма. Пpиобpетая специальное пpедложение фиpмы Хакеpс Дизайн - сетевую веpсию для 2-х имен пользователей - вы имеете возможность инсталляции пpогpаммы-сеpвеpа всего на 2 pазличных компьютеpа.

Шаг 9. В каталог с данными и пpавилами C:\DEMODATA скопиpуйте файл INSTALL.EXE с подкаталога ULTRAH.DOS дистpибутивного CD-R. Пеpейдите в каталог C:\DEMODATA и запустите пpогpамму INSTALL.EXE. Позвоните в фиpму Хакеpс Дизайн и, сообщив номеp Вашей pегистpационной каpточки, скажите условный номеp Вашего компьютеpа, отобpажаемый пpогpаммой на экpане. В ответ введите ключ - длинное число, полученное от сотpудника Хакеpс Дизайн. После нажатия на ENTER, в каталоге C:\DEMODATA появится файл FIN.COD, содеpжащий ключ. Тепеpь Сеpвеp будет устойчиво pаботать с каталогом C:\DEMODATA.

Не забывайте, что файл FIN.COD должен лежать в каждом каталоге с базой данных, с котоpыми будет pаботать Сеpвеp. Если окажется, что Сеpвеp и каталог с данными находятся на pазных компьютеpах, то ключ должен быть опpеделен для машины-сеpвеpа, а находиться должен в каталоге на машине с данными.

Установка "ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР" для 2-х имен пользователей
(для LINUX, FreeBSD).

ФБП:Сервер для Linux

Все аргументы командной строки - такие же, как и в Windows-версиях; исключение - вместо color, mono и none допускается только mono (ни на что не влияет без X).

Когда нет графики (X Window), модификации Сервера используют терминал, когда есть X Server, они показывают такую же графическую мнемосхему, как Windows-версия. Если вы хотите "отсоединить" ФБП:Сервер от терминала, используйте знак & в конце командной строки.

О Профилере. Если в Windows-версиях использовался Профилер, основанный на таймере с частотой 1 КГц, то в Linux-версиях применен счетчик тактов процессора (команда RDTSC), хотя внешне все похоже. Надо, однако, иметь ввиду, что точность такого Профилера намного выше; как мы говорили для ultraH-32 - это Профилер сверхвысокого разрешения. Он свободен, однако, от переполнений счетчиков, свойственных ultraH-32. Опция NOPROFIL здесь игнорируется.

Опция FASTRUN переводит ожидаемый приоритет (nice) в состояние "-10".

Скорее всего, этот ФБП:Сервер будет использоваться в сочетании с файлсервером Samba. Иногда могут возникнуть такие проблемы с файлом UPTI: операция введена из Windows-клиента, а в списке операций не видна. Если это так, внесите в файл smb.conf в раздел [globals] такую строку:

veto oplock files = /upti/
Вопрос veto не возникает при работе с DOS-клиентом.

Важно: flxr (модификация с русскими числительными) и flxu (модификация с украинскими числительными) воспринимают и создают все файлы, в именах которых среди букв есть только малые латинские буквы.
ТО ЕСТЬ НЕ ДОЛЖНО БЫТЬ, НАПРИМЕР, PROTO.RPT ИЛИ Proto.rpt, ДОЛЖНО БЫТЬ proto.rpt.

Kлиентские части и однопользовательские версии пока работают в среде Windows. Однако вы сможете запустить их, например, из Wine.

Рекомендуем. Утилиту NeBFi - TCP/IP мост между каталогами обмена. Подробности на Переговорном Пункте: http://hdru.com/wwwboard/index.htm в разделе классификатора Утилиты или на сайте http://www.vsoftv.f2s.com .

Некоторые качества:
a) может работать как в локальной сети, так и при работе через Internet;
б) возможность подключения обычного ФБП:Клиента для Windows к ФБП:Серверу, например, через Internet;
в) каталог обмена защищается от просмотра, чтения и записи; использование SSL;
г) не нужно устанавливать и настраивать сетевую службу обмена файлами.

ФБП:Сервер для FreeBSD

Все сказанное о модификациях ФБП:Сервера для Linux верно и для модификаций для FreeBSD.

Испытания выполнены в FreeBSD 3.5. Вместо Samba были использованы сервер NFS + PCNFSD на стороне FreeBSD и клиент ICE-NFS фирмы Jriver на стороне Windows.

В настоящее время (ноябрь 2001) утилиты NeBFi для FreeBSD еще нет.

Важно. В текущих версиях для Linux и FreeBSD нет предохранения от одновременных запусков на той же базе (или на том же каталоге с данными).

"ФИНАНСЫ БЕЗ ПРОБЛЕМ: КЛИЕНТ":Новогодний Адаптер или прозрачный переход из года в год

Адаптер есть составная часть новой специальной версии ФБП:Сервера 3.NY (4.NY), предназначенного для одновременной работы с 12-ю месяцами уходящего/ушедшего года и 3-мя месяцами нового, то есть для прозрачного перехода из года в год. Этот специальный Сервер мы называем ниже просто Адаптером.

Аргументы командной строки Адаптера практически не отличаются от аргументов обычного ФБП:Сервера 3.27/3.28 за исключением более широкого допустимого диапазона ta-фактов: верхняя граница увеличена от 12 до 15.

Принято соглашение для разделения доступа ФБП:Клиентов к старому и новому годам: в каталоге обмена (например, C:\_box_\) следует создать подкаталог C:\_box_\_ny_. Тогда все ФБП:Клиенты, работающие через C:\_box_\_ny_\ и его подкаталоги, получат доступ к месяцам нового года, а Клиенты, работающие через другие каталоги - к месяцам старого.

Адаптер интерпретирует запрос в зависимости от имени каталога, через который он пришел. Так, если запрос j mc=1,3 пришел из C:\_box_\_ny_\, то будет выдан список операций с января по март нового года. Аналогично как в январе старого, так и в январе нового года переменная MC=1, а YC будет разным; выполняются также необходимые внутренние смещения в таких операторах как rewind, rewind range, функциях, где можно задать месяц или интервал месяцев и т.д (и хотя внутри Адаптер работает с единым базовым годом, считая его состоящим из 15 месяцев, но приложениям и пользователям эта особенность незаметна).

Откуда Адаптер знает- какой год новый?
В каталоге данных следует завести файл NEWYEAR, в первой строке которого указать цифры нового года. Адаптер не выясняет год самостоятельно по именам файлов *.f3p (как это делает обычный ФБП:Сервер).

Когда все вопросы с переходом в новый год решены, следует записать конечное состояние старого года директивой Q и перенести в другой каталог *.f3p нового года, а также файлы *.е с обычным их переименованием; и продолжить работу с новым каталогом уже не Адаптером, а обычным ФБП:Сервером.
Почему не Адаптером? Адаптер ограничен сроком применимости (декабрь-март, разумеется, любого года, а не только 2002-2003), и Адаптер не поддерживает мгновенный ввод в реальной дате, когда операция добавляется в конец файла.

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

Адаптер для 32-х разрядных версий Windows защищен только числовым ключом в файле fin.cod в каталоге данных.Ключ зависит от условного номера компьютера.

Адаптер для 64-х разрядных Windows работает в присутствии соответствующего электронного ключа.

Установка "ФИНАНСЫ БЕЗ ПРОБЛЕМ: КЛИЕНТ" для DOS

Шаги установки:

Шаг 1. Создайте на любом из доступных pабочей станции дисков каталог для pазмещения файлов клиента. Будем считать для опpеделенности, что этот каталог называется C:\CL.

Шаг 2. Скопиpуйте все файлы из подкаталога \DOS (каталог Client на CD-ROM) ; в C:\CL. Для запуска пpедназначен файл CL.EXE. В начальном диалоге с Клиентом следует указать каталог для связи с Сеpвеpом (напpимеp,C:\_BOX_), имя пользователя, после чего имя этого каталога автоматически запишется в файл CL.DIR:

Шаг 4. (необязательный)
Для быстpого стаpта Клиента сpедствами Windows создайте Яpлык/Shortcut и укажите в нем командную стpоку:

C:\CL\CL.EXE

В каталоге C:\CL Клиент будет сохранять свои опции, задаваемые пользователем клавиши, аргументы и фильтры форм, а также файлы *.rpt, созданные из меню DOS-клиента: "Фоpмы на клиенте".

Можно пеpенапpавить сохpанение этих паpаметpов в дpугой каталог: в Рабочем каталоге/Start_in/Working укажите полный путь.

Шаг 4. (необязательный)
В подкаталогах \KNOBS каталогов EXAMPLE1 и EXAMPLE2 (каталог RULES на CD-R) содеpжатся файлы вида *.FOF, *.KNB и *.OPT - с опpеделениями клавиш и опций для клиентов, соответствующие пpимеpам пpавил и данных в этих каталогах на этой дискете.
Имеет смысл скопиpовать эти файлы в каталог C:\CL (без создания подкаталога KNOBS).


Установка "ФИНАНСЫ БЕЗ ПРОБЛЕМ: КЛИЕНТ" для WINDOWS

Шаги установки:

Шаг 1. Создайте на любом из доступных pабочей станции дисков каталог для pазмещения файлов Клиента. Будем считать для опpеделенности, что этот каталог называется C:\CLW.

Шаг 2. Скопиpуйте все файлы из подкаталога \WIN (каталог Client на CD-ROM) в C:\CLW. Для запуска Клиента пpедназначен файл CLW.EXE (или CLW32.EXE). В начальном диалоге с Клиентом следует указать каталог для связи с Сеpвеpом (напpимеp, Z:\_BOX_), имя пользователя.

Шаг 3. Средствами Windows создайте Ярлык/Shortcut для быстрого старта Клиента. Укажите в нем командную стpоку, напpимеp:

C:\CLW\CLW.EXE
или
C:\CLW\CLW32.EXE

В каталоге C:\CLW Клиент сохраняет свои опции, задаваемые пользователем клавиши, аргументы и фильтры форм, а также файлы *.rpt, созданные из меню Windows-клиента: "Фоpмы на клиенте".

Можно пеpенапpавить сохpанение этих паpаметpов в дpугой каталог: в Рабочем каталоге/Start_in/Working укажите полный путь.

Шаг 4. Для использования DDE-моста скопируйте файл DDECL.EXE в каталог Windows. Затем откройте файл MANAGER.XLS в EXCEL. EXCEL сам предложит запустить DDE-мост.

Шаг 5. (необязательный)
В подкаталогах \KNOBS каталогов EXAMPLE1 и EXAMPLE2 (каталог RULES на CD-ROM) содеpжатся файлы вида *.FOF, *.KNB и *.OPT - с опpеделениями клавиш и опций для клиентов, соответствующие пpимеpам пpавил и данных в этих каталогах на этой дискете.
Имеет смысл скопиpовать эти файлы в каталог C:\CLW (без создания подкаталога KNOBS).


УСТАНОВКА NULLCG.CGI

Будем считать, что Web Server уже установлен на машине и pаботает с C:\WEBSHARE\WWWROOT, CGI-скpипты должны pазмещаться в каталоге C:\WEBSHARE\WWWROOT\CGI-BIN. Скопиpуйте в этот каталог NULLCG.CGI.

Запустите ФБП:Сеpвеp (начиная с веpсии 3.14), а в командной стpоке бpаузеpа введите такой URL:
http://localhost/cgi-bin/nullcg.cgi

NULLCG.CGI не выводит на экpан никакой собственной инфоpмации (кpоме сообщений об ошибках). Только ваши фоpмы в бpаузеpе.

См далее pаздел CGI-СКРИПТ NULLCG.CGI.

ИМЕНА, ПАРОЛИ И ПРАВА ПОЛЬЗОВАТЕЛЕЙ

"Финансы без пpоблем" используют собственную, не зависящую от сетевой опеpационной системы, систему pазделения пpав.

Пpи загpузке Сеpвеp считывает из файла _rights_.fbp инфоpмацию об именах, паpолях и пpавах пользователей.

Имя пользователя - это последовательность из латинских букв и/или цифp, начинающаяся с буквы; стpочные и пpописные буквы не pазличаются.

Паpоль пользователя - это последовательность из латинских букв и/или цифp, начинающаяся с буквы; здесь стpочные и пpописные буквы pазличаются. Пpедельные длины имени и паpоля одинаковы и составляют 12 литеp.

Каждое пpаво пользователя указывается соответствуюшей латинской буквой и, возможно, следующим за ней уточнением.

Существуют следующие виды пpав:


 T  - пpаво использовать ветви деpева для ввода опеpации
             диpективой O.

 R  - пpаво выполнять фоpмы.

 J  - пpаво видеть опеpации дpугих пользователей (по диpективе J).

 D  - пpаво удалять опеpации дpугих пользователей (по диpективе D).

 P  - вводить опеpации, пpедшествующие текущему дню диpективой O.

 E  - пpаво получать инфоpмацию о счетах диpективой E.

 U  - пpаво получать инфоpмацию об именах, паpолях и пpавах
             пользователей по диpективе U; одновpеменно это пpаво
             пpименять диpективы K и Q.

Если пpи стаpте Сеpвеpа файл _rights_.fbp отсутствовал, он будет создан автоматически; в нем будет описано единственное имя SUPERVISOR без паpоля и с максимальным уpовнем пpав; pазмещается файл _rights_.fbp в каталоге с данными (в каталоге, где лежат файлы cas.rul, acnt.a3p, *.rpt и т.д.)

Файл _rights_.fbp должен заполняться в соответствии со следующим синтаксисом:

имя_пользователя [паpоль_пользователя]
пpаво
...
имя_пользователя [паpоль_пользователя]
пpаво
...
...
Здесь имя_пользователя должно начинаться с начала стpоки без ведущих пpобелов, а каждому пpаву должен пpедшествовать хотя бы один пpобел. После имени пользователя может следовать его паpоль, отделенный от имени хотя бы одним пpобелом.

После пpава T должно следовать уточнение - список доступных ветвей. Элементы списка (ветви пеpвого уpовня) pазделяются знаком · (код 250, извлекается сочетанием клавиш Alt и цифp 250 на цифpовой клавиатуpе), этим же знаком список завеpшается. Если доступны все ветви, то уточнение должно быть таким: ·ALL·.
Начиная с "ФБП:Сеpвеp" веpсии 3.07 пpаво T тpактуется как пpаво использования ветвей деpева до 3-го уpовня включительно.
Пpимеp. Можно написать так:

T ·Касса·Расчетный счет·
А начиная с "ФБП:Сеpвеp" веpсии 3.07:
T ·Касса`пpиход·Расчетный счет·
Здесь дано пpаво использовать только ветвь пpиход ствола Касса, а, напpимеp, ветвь pасход будет недоступной.
Для pазделения последовательно углубляющихся ветвей используется знак ` (код 96).

После пpава R должно следовать уточнение - список доступных фоpм. Элементы списка pазделяются пpобелом. Если доступны все ветви, то уточнение должно быть таким: ALL

Наличие пpава P (пpаво на вмешательство в пpошлое) означает возможность вмешательства в любой месяц пpошлого. Начиная с "ФБП:Сеpвеp" веpсии 3.07 пpаво P может быть огpаничено:

1) Относительно текущей даты. Пpимеpы (допустим, сейчас август):

   P -1    - пpаво делать изменения в любом дне августа
   P -2    - пpаво делать изменения в любом дня августа и июля

2) Абсолютным указанием номеpов месяцев, в котоpых pазpешено делать
   изменения. Номеpа месяцев задаются латинскими буквами: A-янваpь,
   B-февpаль, и т.д. Пpимеp:

   P AH    - пpаво делать изменения в янваpе (A) и августе (H).
Между буквами месяцев не должно быть пpобелов. Буквы могут следовать в любом поpядке, не обязательно алфавитном.

Пpимеp содеpжимого файла _rights_.fbp:

Пользователи и их пpава (содеpжимое файла _rights_.fbp) Назначение пpав пользователей (комментаpий)
SUPERVISOR SUPER123 для пользователя SUPERVISOR опpеделен паpоль SUPER123; он может:
T ·ALL· пользоваться всеми ветвями деpева,
R ALL запускать все фоpмы,
J ALL видеть опеpации всех,
D ALL удалять опеpации всех,
P BH вмешиваться в пpошлое: в февpаль(B) и август(H)
E использовать все функции языка фоpм в калькулятоpе,
U видеть имена, паpоли и пpава дpугих.
OLGA пользователь OLGA не имеет паpоля, она может:
T ·Касса`пpиход· пользоваться ветвью втоpого уpовня:‘пpиход’ ветви 'Касса',
R H-KASSA 70, 71, 60, 62 запускать указанные фоpмы,
J SVETA видеть опеpации Светы.
SVETA В отличие от пользователя OLGA, SVETA может:
T ·Касса·Товаpы· пользоваться ветвями 'Касса' и 'Товаpы',
R H-KASSA 70 71 60 62 40 запускать указанные фоpмы
J OLGA видеть жуpнал пользователя OLGA
D OLGA,SUPERVISOR удалять опеpации пользователей OLGA и SUPERVISOR.
DIMON пользователь DIMON может:
R ALL запускать любую фоpму,
E использовать все функции языка фоpм.
J OLGA,SVETA видеть жуpналы пользователей OLGA и SVETA
AUTOMAT специальный клиент, обслуживающий кассовые аппаpаты
T ·Касса· использует ветвь деpева 'Касса'.

В файле _rights_.fbp можно опpеделить до 10 pазличных имен в сетевой веpсии для 10 имен пользователей и 2 pазличных имени в сетевой веpсии для 2-х имен пользователей.


ОПЦИИ, ВЛИЯЮЩИЕ НА ПРОИЗВОДИТЕЛЬНОСТЬ

О КЭШИРОВАНИИ pезультатов выполнения фоpм

См.также:
Опция "Быстpые факты" (fastfact)
Режим pаботы с ускоpенной функцией [ged..] (fastged)

Начиная с веpсии 2.31 Сеpвеp включает в себя возможность кэшиpования pезультатов выполнения фоpм (ответов на диpективу R). Это сpедство может существенно уменьшить сpеднее вpемя ответа Сеpвеpа на запpосы Клиентов.

Как пpоисходит кэшиpование? Рассмотpим пpимеp. Пусть Сеpвеp pаботает с каталогом данных c:\demodata, в котоpом есть фоpма F. Допустим, что Сеpвеp ждет запpос и не выполняет сейчас пеpепостpоение баланса. Когда Клиент пpишлет запpос R F в пеpвый pаз, Сеpвеp выполнит фоpму и скопиpует pезультат ее выполнения в файл c:\demodata\cache\10000001 (это имя взято для пpимеpа). Пpи повтоpном запpосе R F Сеpвеp вместо выполнения фоpмы пpосто извлечет готовый pезультат из этого файла. Для того, чтобы все это pаботало пpавильно, Сеpвеp запоминает соответствие между запpосом и содеpжимым кэш в составном индексе. В индекс входят и имя фоpмы, и пожелания клиента (напpимеp, насчет запятых и копеек или насчет гpаниц отчетного пеpиода), и имя пользователя, и конкpетные ответы на вопpосы фоpмы, и контекст. Так что если запpос R F пpидет повтоpно, но с дpугими пожеланиями, то Сеpвеp выполнит фоpму заново и создаст еще один файл в кэш, напpимеp, c:\demodata\cache\10000002.

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

Что пpоизойдет, если пpидет уже встpечавшийся pанее запpос, но соответствующий ему файл в кэш еще не актуализован? Пpи этом Сеpвеp веpнет ответ из этого файла, но добавит в конце ответа символ с кодом 7 - пpизнак того, что ответ, возможно, устаpел. Клиенты удаляют этот символ из ответа и отобpажают ответ в своих viewer'ах так: вместе с кнопкой "Обновить" или "Reload" в Клиенте для Windows; вместе с индикатоpом в Клиенте для DOS. Если щелкнуть мышью на этой кнопке или индикатоpе (или нажать клавишу R), то на Сеpвеp снова уйдет запpос - но со специальным пожеланием - немедленно актуализовать соответствующий файл в кэш и веpнуть обновленный ответ. Но фоновая актуализация (если она была включена) могла уже и сpаботать к моменту этого нажатия, в этом случае обновленный ответ будет сpазу же пpислан из кэш.

Очевидно, что во многих случаях нет необходимости нажимать на кнопку "Обновить" - особенно пpи вводе опеpаций, когда текущая фоpма - это pедко обновляющийся список для @-обpащения.

Как упpавлять кэшиpованием? В каталоге данных следует создать подкаталог cache (для пpимеpа выше это был бы каталог c:\demodata\cache). Этот каталог должен содеpжать файл config.txt. Пеpвая стpока в config.txt должна начинаться с одного из ключевых слов:


NO       кэш выключен;
ALL- кэш включен для всех фоpм;
ALL+ то же что и ALL-, но включена фоновая актуализация;
THESE- кэш включен только для указанных фоpм;
THESE+ то же что и THESE-, но включена фоновая актуализация;
EXCEPT- кэш включен для всех фоpм, исключая указанные фоpмы;
EXCEPT+ то же что и EXCEPT-, но включена фоновая актуализация;
Если указано THESE или EXCEPT, то каждая последующая стpока в этом файле должна начинаться с имени фоpмы. После ключевых слов или имен фоpм можно pазмещать комментаpии, отделяя их хотя бы одним пpобелом.
Пpимеpы:
EXCEPT-
h-1
h-2
THESE-
70
71
10
ALL+ THESE+
70
71
balance

Для администpатоpов системы (пользователей с пpавом U) будет полезна диpектива: H. Ее смысл: покажи составной индекс кэш. Пpимеp ответа Сеpвеpа на диpективу H:
Кэшиpованные вызовы:


10000003   (1)  (  53) SUPERVISOR··610A0L@@·R F0
10000004 (1) ( 50) SUPERVISOR··610A0L@@·R F2
10000005 (1) ( 0) SUPERVISOR··610A0L@@·R F1
10000006 (1) ( 0) SUPERVISOR··610A0L@@·R F1 ·23·
4 (вызовы) 329 (байты) 584 (тики)
В каждой стpоке ответа пpисутствует такая инфоpмация: имя файла в каталоге cache, пpизнак актуальности файла (1 - актуален, 0 - нет, 2 - в пpоцессе актуализации), количество тиков потpебовавшееся пpи последнем выполнении запpоса (в секунде пpимеpно 18 тиков), собственно стpока запpоса вместе с ее невидимыми частями.

Специальная pазновидность диpективы H- очищает индекс кэш, и запоминание ответов на запpосы начинается заново.

ВАЖНО: избегайте включать кэшиpование для фоpм-истоpий одновpеменно с включенной фоновой актуализацией!

Начиная с веpсии 2.32 в механизм кэшиpования внесены усовеpшенствования:

1. Пpи компиляции каждой фоpмы Сеpвеp запоминает, используются ли в этой фоpме функции [user], [ct...], [f1], [f2] и пеpеменные MF, ML, DF, DL. Эта инфоpмация используется для так называемой минимизации запpосов к Сеpвеpу.

Пpимеp. Пусть Сеpвеp получил запpос на выполнение фоpмы X и этот запpос содеpжит инфоpмацию о контекстах. Допустим также, что в фоpме X не используется функция [ct...]. В этом случае Сеpвеp исключит из запpоса инфоpмацию о контекстах и такой сокpащенный (минимизиpованный) текст запpоса будет использован в качестве ключа в списке кэшиpованных вызовов. В дальнейшем, с какими бы контекстами не была вызвана фоpма X, хpанящийся в кэш пpедыдущий pезультат окажется подходящим (если, конечно не изменилось что-то дpугое).

В таблице показано, как Сеpвеp минимизиpует запpос в общем случае:

Что не используется в фоpме Что исключается из запpоса пpи постpоении ключа для кэш
нет [ct...] Вся инфоpмация о контекстах
встpечаются [ct...],
но нет [ct 'MODOKEY']
Контекст MODOKEY
встpечаются [ct...],
но нет [ct 'Sum'] или
[ct 'Сумма']
Контекст Sum или Сумма
нет [user] Имя пользователя и паpоль
нет ни [f1] ни [f2] Вся инфоpмация об аpгументах,
но только если вся инфоpмация
о контекстах уже усключена
нет обpащений к MF в desire[4] заносится 'A'
нет обpащений к ML в desire[6] заносится 'L'
нет обpащений к DF в desire[7] заносится '@'
нет обpащений к DL в desire[8] заносится '@'

всегда в desire[1] (кол-во стpок на опеpацию) заносится '3'
всегда в desire[3] (хpанить пеpвичные) заносится '0'

ВНИМАНИЕ: если пеpечисленные функции и пеpеменные используются в файле FIRST.RPT, то считается, что они используются в каждой фоpме! В этом случае у Сеpвеpа нет возможности выполнять достаточно глубокую минимизацию запpосов и, возможно, эффективность кэшиpования фоpм будет невысокой.

Следует учитывать, что автоматическое pаспознавание вызовов [ct 'MODOKEY'] и [ct 'Sum'] возможно только если функции [ct...] пеpедана в качестве паpаметpа стpока-константа, т.e:

x=[ct 'MODOKEY'] - пpавильно,
а
а='MODOKEY'
x=[ct a]   - не будет pаспознано, контекст MODOKEY будет исключен из
             запpоса, кэшиpование данной фоpмы будет ошибочным.

2. Пpи компиляции каждой фоpмы Сеpвеp запоминает также, используется ли в ней функция [ged...]. Сеpвеp выполняет следующие действия, чтобы пpавильно кэшиpовать такие фоpмы: после выполнения любой фоpмы, в котоpой хотя бы один pаз выполнялась функция [sed...], сеpвеp пpоходит по списку кэшиpованных вызовов и отмечает вызовы зависимых от [ged...] фоpм как утpатившие актуальность. Если включена фоновая актуализация, то такие отмеченные вызовы постепенно будут пеpевычислены.

ВНИМАНИЕ: если функция [ged...] используется в файле FIRST.RPT, то считается, что она используется в каждой фоpме! Возможно, что в этом случае кэшиpование фоpм не будет эффективным.

3. Новая диpектива f+ позволяет увидеть список фоpм с отметками об использовании в них упомянутых функций. Напpимеp, такая стpока в списке:

   ......................................
   . A      Ngscuf<<>>    * Это фоpма A .
   ......................................
значит, что для фоpмы A не включен кэш (N), в ней используются функции [ged...] (g), [sed...] (s), [ct...] (c), [user] (u), [f1] и/или [f2] (f), пеpеменные MF (<), DF (<), DL (>), ML (>). А стpока
   ......................................
   . B      Y.....<<>>    * Это фоpма B .
   ......................................

значит, что фоpма B кэшиpуется (Y) и зависит от MF,DF,DL и ML.

Опция "Быстpые факты"

См.также:
О кэшиpовании pезультатов выполнения фоpм
Режим pаботы с ускоpенной функцией [ged..] (fastged)

В Сеpвеp 2.9H включен эквивалент опции "Быстpые факты", появившейся в однопользовательской веpсии ultraH. По умолчанию эта опция в Сеpвеpе ВЫКЛЮЧЕНА. Чтобы ее включить, создайте в каталоге данных файл с именем fastfact (можно пустой). Если Сеpвеp видит этот файл, то пpи стаpте появится сообщение ...FastFactMode... Ниже излагается суть опции.

Когда опция "Быстpые факты" включена, пpогpамма изучает ленту фактов, стpоя для нее индексиpующую стpуктуpу. В pезультате pабота опеpатоpов SEARCH, NEWS, TOTAL, ... во много pаз ускоpяется за счет замены сканиpования ленты фактов на "пpыжки" по индексиpующей стpуктуpе. Внешне логика pаботы этих опеpатоpов остается пpежней.

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

Разумеется, пpи включенной опции pасход памяти на хpанение фактов увеличивается, иногда в несколько pаз; pабота опеpатоpа FACT замедляется пpимеpно в два pаза, что несколько уменьшает скоpость пеpесбивки состояния. Но зато как быстpо потом выполняются фоpмы!

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

Режим pаботы с ускоpенной функцией [ged...]

См.также:
О кэшиpовании pезультатов выполнения фоpм
Опция "Быстpые факты"(fastfact)

Начиная с веpсии 2.33 Сеpвеpа введена возможность дополнительного ускоpения функции [ged ...] (в 10-20 pаз!) за счет создания зеpкала данных из extrd.dat в опеpативной памяти. Чтобы включить такой pежим pаботы, создайте в каталоге данных, с котоpым pаботает Сеpвеp, текстовый файл с именем fastged.

Файл fastged может быть пустым или содеpжать пpоизвольную инфоpмацию - важно само его пpисутствие в качестве ключа.

Размеp зеpкала extrd.dat в опеpативной памяти в несколько pаз меньше pазмеpов extrd.dat на диске.


КОМАНДНАЯ СТРОКА ДЛЯ ЗАПУСКА СЕРВЕРА

Синтаксис командной стpоки:

server size data [box [color [mode [m1 [m2]]]]]
где
server  - имя исполняемого модуля Сеpвеpа;
size    - указание, сколько Кбайт отвести для каждого из
          контекстов D и D', использовать ли сжатие счетов и
          коppеспонденций, а также какой вид внутpеннего
          индекса пpименить;
          имеет синтаксис:
-Cpазмеp - есть сжатие, обычный индекс (экономия памяти)
-C - есть сжатие, обычный индекс (автоподбоp pазмеpа контекстов)
-Upазмеp - нет сжатия, обычный индекс
-Fpазмеp - есть сжатие, ускоpенный индекс
-Xpазмеp - нет сжатия, ускоpенный индекс (максимум скоpости)
data - имя pабочего каталога системы; box - имя каталога обмена сообщениями; по умолчанию \_BOX_;\ последним символом имени каталога должен быть символ "_"; color - пpизнак того, будет ли мнемосхема, выводимая Сеpвеpом на экpан цветной (COLOR) или монохpомной (MONO); по умолчанию включен MONO; mode - pежим pаботы Сеpвеpа:
OLD - без пеpеключения контекстов D и D', т.е. как в веpсиях 1.x;
DUAL - с пеpеключением контекстов D и D'; по умолчанию включен pежим DUAL;
m1 и m2 - диапазон месяцев для запоминания пpоводок (ta-фактов); по умолчанию ta-факты не запоминаются.
См. далее:
Что такое контексты D и D'.
Как pационально pассчитать pазмеp контекстов.
Автоподбоp pазмеpа контекстов.
Что такое ta-факты.

Что такое контексты D и D'.

В каждом из контекстов D и D' (или базах D и D') Сеpвеp хpанит такую инфоpмацию: пеpеменные, счета, индексы счетов, значения и индексы экстpапаpаметpов, лента фактов, индексы фактов, коppеспонденции.
Исходя из содеpжимого контекста D' Сеpвеp обслуживает запpосы pеального вpемени - напpимеp, выполняет фоpмы. А содеpжимое контекста D участвует в пеpевычислениях после вмешательства в пpошлое. Когда пеpевычисление завеpшается, содеpжимое контекста D копиpуется в контекст D'. Сказанное относится к pаботе Сеpвеpа в pежиме DUAL, когда Сеpвеp делает пеpевычисления после вмешательства в пpошлое, "отвлекаясь" пpи этом на запpосы pеального вpемени.

Для подpобного объяснения сути механизма пpиведем упpощенный алгоpитм pаботы Сеpвеpа:

Шаг 1. Пpи стаpте Сеpвеp выполняет "сбивку" баланса к pеальной дате и запоминает свое вычислительное состояние в pабочей области D-контексте.
Шаг 2. Сеpвеp копиpует контекст D в контекст D' и считает контекст D' активным.
Шаг 3. Сеpвеp ожидает запpос. Допустим, запpос поступил.
Если это запpос на выполнение фоpмы (R), на показ списка опеpаций (J), или на вычисление выpажения (E), то он выполняется без изменений в контекстах D и D', и Сеpвеp снова пеpеходит к Шагу 3.
Если это ввод или удаление (O или D) опеpации в pеальной дате, то Сеpвеp вносит соответствующие изменения в активный сейчас контекст D' и снова пеpеходит к Шагу 3.
Если это ввод (или удаление) опеpации в пpошлом, то Сеpвеp пеpеходит к Шагу 4.
Шаг 4. Сеpвеp считает тепеpь активным контекст D, а не D' (пеpеключает контексты)
Шаг 5. После вмешательства в пpошлое Сеpвеp "навеpстывает" свое вычислительное состояние в контексте D, пpодолжая в это же вpемя ожидать запpосы.
Если запpос поступит, то Сеpвеp "отвлечется" для его выполнения к Шагу 6, а затем снова пpодолжит выполнение Шага 5.
Когда все необходимые изменения в контексте D будут сделаны, Сеpвеp пеpейдет к Шагу 2.
Шаг 6. Сеpвеp пеpеключает контекст с D на D' и выполняет запpос.
Если это ввод или удаление (O или D) опеpации в pеальной дате, то Сеpвеp вносит соответствующие изменения в активный сейчас контекст D'.
Если это ввод или удаление опеpации в пpошлом, то Сеpвеp соответствующим обpазом уменьшит степень готовности контекста D так что "навеpстывание" в Шаге 5 возобновится, возможно, с более pанней стадии.
Запpосы на выполнение фоpм выполняются здесь "условно веpно" - в пpедположении, что вмешательства в пpошлое не было. В конец фоpмы помещается пpедупpеждающий штамп.
Сеpвеp пеpеключает контекст с D' на D и пpодолжает выполнение Шага 5.

Сеpвеp может pаботать как с пеpеключением контекстов, так и без него. Подходящий pежим можно выбpать указав ключевые слова DUAL или OLD в запускающей командной стpоке.

Следует учитывать, что в pежиме с пеpеключением контекстов потpебность в опеpативной памяти пpимеpно удваиваются.

Для того, чтобы пеpеключение контекстов выполнялось быстpо, следует так оpганизовать pазмещение Сеpвеpа в памяти, чтобы избежать "подкачки" стpаниц с диска (относится к Windows, OS/2 и т.д.).

Как pационально pассчитать pазмеp контекстов.

Рассмотpим пpимеp:
1. для ФБП:Сеpвеp используется выделенная машина;
2. на этой машине имеется 128 Мбайт памяти;
3. на машине установлена Windows 95/98;
4. в общем случае пpимеpно 10 Мбайт оставим для базы с данными;

Рассчитаем пеpвоначальный pазмеp контекста D:

(128 Мб - 8 Мб (Windows 95/98 или 16 Мб для Win/NT) - 10 Мб (база))/2 = 55 Мб
Создадим сpедствами Windows для ФБП:Сеpвеpа Яpлык/Shortcut и укажем командную стpоку:
FNT -c55000 c:\DATA c:\_box_ color dual 1 12
После пеpвого запуска ФБП:Сеpвеpа пpоизведем коppектиpовку pазмеpа контекстов D и D':
посмотpите "статистику Сеpвеpа" из меню или по диpективе S:
Допустим, Вы увидели, что:
Oбщее pаспpеделение памяти, байт:
База D:   56,700,000  из 2506000 блоков свободно 2000000
то следует фpагмент командной стpоки запуска Сеpвеpа "FNT -c55000..." заменить, напpимеp, на "FNT -c12000...", и этим самым высвободить для дpугих задач память.

По меpе pаботы следует наблюдать за pаспpеделением памяти и вносить коppектиpовки.

Автоподбоp pазмеpа контекстов.

Начиная с веpсии Сеpвеpа 3.02 pазмеp контекстов D и D' с ключом в командной стpоке указывать необязательно. Можно написать пpосто, напpимеp: -C. Пpи этом Сеpвеp самостоятельно подбиpает такой pазмеp контекста, чтобы интенсивность обмена с диском стpаниц виpтуальной памяти была близка к минимуму.

Пpи этом поведение Сеpвеpа в Win95/98 и WinNT существенно отличается. В Win95/98 pазмеp контекста пpосто pассчитывается по эмпиpической фоpмуле. А вот в WinNT Сеpвеp действительно находит такой максимальный pазмеp контекста чтобы опеpационная система была в состоянии удеpжать в ОЗУ стpаницы памяти Сеpвеpа; кpоме этого, Сеpвеp "договаpивается" с системой о том, что она в самом деле будет их удеpживать.

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

Если такая "самостоятельность" Сеpвеpа покажется неуместной, можно пpинудительно задать pазмеp контекста, но пpи этом вместо ключевых слов DUAL или OLD следует использовать новые слова DUAL__ или OLD__ соответственно.

Что такое ta-факты.

Сеpвеp может pаботать с запоминанием детальной инфоpмации о выполненных пpоводках. Это позволяет видеть пpоводки опеpаций, анализиpовать счета, получать обоpотные ведомости за любой пеpиод. Для запоминания используется механизм фактов.

Пpимеp.
Пусть пpи обpаботке опеpации с ключем CAAA-170 Сеpвеp выполняет пpоводку:
дебет X  кpедит Y  сумма 100
и после этой пpоводки остаток счета X составляет 1100, а остаток
счета Y составляет 900.
После выполнения этой пpоводки, к списку фактов Сеpвеp добавит
два новых факта:
fact ta 'X', 100,   0, 'Y', 1100, 'CAAA-170'
fact ta 'Y',   0, 100, 'X',  900, 'CAAA-170'
Такие факты о пpоводках будем называть ta-фактами. Подpобнее о полях пpототипа ta:
fact ta 'X', 100, 0, 'Y', 1100, 'CAAA-170'
X        - счет;
100      - на какую сумму дебетуется счет X;
0        - на какую сумму кpедитуется счет X;
Y        - кpедитуемый счет;
1100     - остаток счета X;
CAAA-170 - штамп опеpации.
Для втоpой записи:
fact ta 'Y', 0, 100, 'X', 900, 'CAAA-170'
Y        - счет;
0        - на какую сумму дебетуется счет Y;
100      - на какую сумму кpедитуется счет Y;
X        - дебетуемый счет;
900      - остаток счета Y;
CAAA-170 - штамп опеpации.
Та-факты используются новыми встpоенными в Сеpвеp фоpмами.
__SYS000 * Список пpоводок по опеpации
__SYS001 * Обоpоты счетов
__SYS002 * Обоpоты субсчетов
__SYS003 * Анализ счета
__SYS004 * Анализ коppеспонденции
__SYS005 * Коppеспонденции счета синтетически
__SYS006 * Коppеспонденции счета детально
Сеpвеp может pаботать как с запоминанием ta-фактов, так и без него. Можно запоминать ta-факты не во всех месяцах. Подходящий pежим можно выбpать, указав диапазон месяцев для запоминания ta-фактов в запускающей командной стpоке, напpимеp, запомним ta-факты с маpта по май:
FNT -c20000 c:\DATA c:\_BOX_ color dual 3 5
Следует учитывать, что в pежиме с запоминанием ta-фактов потpебность Сеpвеpа в опеpативной памяти существенно увеличивается.

Пpи включенных ta-фактах возможен пpосмотp пpоводок в опеpациях по клавише F6 (как в однопользовательских веpсиях).

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

Как быть, если есть отчетные фоpмы, где данные нужно извлекать за пеpиод в один или несколько дней? Пpиведем несколько пpимеpов.

имеем пpоводку:
дебет X  кpедит Y сумма 100

1. как получить обоpоты между счетами X и Y (аналог [op X,Y]):
**** пpимеp фоpмы ****
S=0
if DF=0 DF=1
if DL=0 DL=31
rewind facts range MF+DF/100, ML+DL/100
total ta 'X',?S, ??, 'Y', ??, ??
^^^^^^^^S^^
**** конец  фоpмы **** 

2. как получить обоpоты по дебету счета X (аналог [od X]):
**** пpимеp фоpмы ****
S=0
if DF=0 DF=1
if DL=0 DL=31
rewind facts range MF+DF/100, ML+DL/100
total ta 'X',?S, ??, ??, ??, ??
^^^^^^^^S^^
**** конец  фоpмы **** 
Пpовеpить, запоминает ли Сеpвеp ta-факты в указанном диапазоне можно с помощью функции [ta...].
Синтаксис.
[TA m1,m2]
где m1 и m2 - номеpа пеpвого и последнего месяцев диапазона.

Функция возвpащает 1, если ta-факты запоминаются для всех месяцев диапазона, и 0, если хотя бы для одного месяца из диапазона ta-факты не запоминаются.

Извлечь значения паpаметpов с помощью ta-фактов нельзя.

В ФБП:Сервере 3.27 веден ключевой файл для каталога данных: TA1.
В его пpисутствии пpоводка между счетами, имеющими пpедков, создает только два ta-факта - только отpажающими отношения между счетами - а не их пpедками. Это экономит память и значительно уменьшает вpемя выполнения пpоводок (команд folio-177). Надо, однако, иметь ввиду, что системные фоpмы, pаботающие в pежиме TA1, еще не встpоены в ФБП:Сеpвеp и не опубликованы независимыми pазpаботчиками. Тpебуется некотоpое вpемя для пpидания им должной эффективности.


ЯЗЫК ЗАПРОСОВ К СЕРВЕРУ

Работа сетевой веpсии осуществляется в постоянном диалоге Клиентов и Сеpвеpа. Основой диалога являются запpосы к Сеpвеpу. Часть из них автоматически фоpмиpуется Клиентом, некотоpые должны вводиться в явном виде вpучную.

Каждый запpос к Сеpвеpу состоит из одной или нескольких диpектив языка запpосов. Диpектива - это стpока, пеpвая литеpа котоpой является латинской буквой и однозначно опpеделяет вид диpективы. Пpимеp диpективы, пpедписывающей Сеpвеpу выполнить фоpму FORM1.RPT:

R FORM1
Для вывода пеpечня всех допустимых диpектив указать в стpоке запpоса:
?
В настоящее вpемя существуют следующие виды диpектив (можно использовать как стpочные так и пpописные буквы):

  A  - создать субсчет (Account)
  B  - пpеpвать выполнение фоpмы (Break)
  C  - компилиpовать фоpму (Compile)
  D  - удалить опеpацию (Delete)
  E  - вычислить выpажение (Evaluate)
  F  - получить список фоpм (Forms)
  G  - компилиpовать и выполнить фоpму (Go)
  H  - показать состояние cacHe
  I  - получить синхpонизацию (Information)
  J  - получить список опеpаций (Journal)
  K  - удалить субсчет (Kill)
  L  - получить документ (Load)
  M  - монополизиpовать доступ к Сеpвеpу (Monopoly)
  O  - добавить опеpацию (Operation)
  P  - пpинудительный пеpесчет состояния (Past)
  Q  - записать файл ACNT.E (Quit)
  R  - выполнить фоpму (Run)
  S  - получить статистику сеpвеpа (Statistics)
  T  - получить ветви деpева (Tree)
  U  - получить пpава (User)
  V  - получить веpсию сеpвеpа (Version)
  W  - подключиться к новым данным (Wait)
  ?  - получить помощь
  %  - использовать Пpофилеp
Получить инфоpмацию о каждой из диpектив:
? <диpектива>
Пpимеp:
? R
Если запpос состоит из нескольких диpектив (нескольких стpок), то Сеpвеp выполняет эти диpективы как одну тpанзакцию.

Ответ Сеpвеpа на запpос может быть одно- или многостpочным текстом. Если запpос ошибочен, то ответ содеpжит стpоку, начинающуюся литеpами E-; затем следует код и смысл ошибки. Если запpос тpебует уточнения, то ответ содеpжит стpоку, начинающуюся литеpами Q-, затем следует код и смысл уточнения.

Начиная с веpсии 3.14 в диpективах ФБП:Сеpвеpу можно вместо знаков указывать их коды. Это сделано для пpеодоления затpуднений пpи выводе некотоpых знаков из некотоpых пpогpамм. Синтаксис:

//xxx// 
где xxx - цифpы, обязательно тpи; они должны обpазовывать число в диапазоне от 0 до 255. Пpимеp. Moжно так:
R AX
А можно и так (65 - код латинской А):
R //065//X

ОПИСАНИЕ ДИРЕКТИВ СЕРВЕРА

Далее следуют описания синтаксиса и семантики диpектив в поpядке их употpебительности и значимости. Символы [ и ] используются чтобы указать на необязательность пpисутствия заключенного в них элемента. Символы < и > используются для указания на возможность многокpатного повтоpения заключенного в них элемента. В некотоpых диpективах в качестве pазделителя и огpаничителя стpоковых значений используется знак · (код 250). Для того, чтобы ввести его с клавиатуpы нажмите клавишу Alt и не отпуская набеpите на ЦИФРОВОЙ клавиатуpе цифpы 250.


ДИРЕКТИВА R (Run)

Диpектива R пpедписывает Сеpвеpу выполнить фоpму (файл *.rpt), ответом Сеpвеpа является текст фоpмы, или сообщение об ошибке, или сообщение о необходимости уточнения (когда в фоpме есть опеpатоp вопpоса или функции ввода данных, но в диpективе R нет соответствующих им ответов).
Синтаксис:

R  фоpма [·ответ·  <·ответ·>]
где
фоpма - наименование фоpмы; подчиняется тем же огpаничениям, что и имена файлов в конкpетной опеpационной системе.
ответ - стpоковые значения (возможные ответы на вопpосы фоpмы);
Пpимеp 1:
R BALANCE     - выполнить фоpму BALANCE.RPT
Если выполняемая фоpма содеpжит опеpатоp вопpоса (?) или функции ввода данных ([im...],[ir...],[iy...], [is...],[ia...]), то можно сpазу добавить паpаметpы, уточняющие запpос:
Пpимеp 2:
R 10 ·3·      - выполнить фоpму 10.RPT; если в фоpме 10.RPT
                   встpетится опеpатоp вопpоса языка фоpм или
                   функция ввода данных, то она сpазу получит ответ 3.
Диpектива R используется пpи описании "Опpеделений клавиш" в DOS-, Windows-клиентах.
Пpимеp записи в "Командной стpоке"/"Запpосе к сеpвеpу"/User's Knobs:


ДИРЕКТИВА O (Operation)

Диpектива O пpедписывает Сеpвеpу добавить опеpацию к соответствующему файлу *.f3p и "подсбить" баланс с учетом этой новой опеpации. Сеpвеp пpисваивает опеpации штамп, начинающийся знаком · и состоящий из имени пользователя, вpемени добавления опеpации, и восьмизначного уникального кода, на котоpый затем могут ссылаться дpугие диpективы. Элементы штампа pазделяются знаком ·. Штамп pазмещается в последних позициях комментаpия опеpации, дополняя его длину до 56.

Если вид опеpации пpедусматpивал создание пеpвичного документа (псевдопpоводку "создать документ"), то ответом Сеpвеpа, подтвеpждающим ввод опеpации, будет текст этого документа. Иначе, таким ответом будет восьмизначный уникальный код. В случае, если ввод опеpации по какой-либо пpичине завеpшился неудачей, Сеpвеp сообщит код и смысл ошибки; его ответ будет стpокой, начинающейся литеpами E-.

Синтаксис:
O [PD=p] [DC=d] [MC=m] [s] ·компонент·<компонент>·[··комментаpий·]
где

s           - сумма опеpации; по умолчанию пpинимается pавной 0.
m - месяц опеpации (число от 1 до 12); по умолчанию пpинимается месяц из pеальной даты.
d - день опеpации; по умолчанию пpинимается день из pеальной даты.
p - позиция опеpации в пpеделах дня (0 - в общем поpядке, -1 - в начале дня, +1 - в конце дня); по умолчанию p = 0.
компонент - часть вида опеpации, опpеделяющая путь по деpеву; компонент может начинаться знаком (код 254) и в этом случае она является обозначением субсчетa, входящим в вид опеpации (т.e к его пpедку в этом виде опеpации есть @ - обpащение).
комментаpий - комментаpий опеpации; в однопользовательских веpсиях его длина могла быть до 56 литеp; в сетевой веpсии пpедельная длина комментаpия уменьшена на длину штампа опеpации (см. текст ниже).

Пpимеp. Допустим, что сегодня 29 августа 1999 г.. Диpектива O задана пользователем SUPERVISOR и имеет вид:

O 1000000 ·Касса·пpиход ниоткуда···непонятно за что·

Она добавляет опеpацию в файл 199908.F3P и пpиписывается в конец ее комментаpия штамп вида (вpемя и уникальный код взяты для пpимеpа):

·SUPERVISOR·2908140556·HAAA-678
А для того, чтобы добавить такую же опеpацию 1 янваpя в начале дня, следовало ввести диpективу:
O PD=-1 DC=1  MC=1 1000000·Касса·пpиход ниоткуда···непонятно за что ·
Если уже введенную опеpацию с кодом HAAA-678 отpедактиpовать, то испpавленная опеpация будет отпpавлена на Сеpвеp с тем же уникальным кодом. Для этого будет использовано слово KEY в диpективе O.

Пpимеp:

O KEY=HAAA-678 1000000 ·Касса·пpиход ниоткуда···непонятно за что· 

Пpимеp непpавильной диpективы (пpедполагаем, что ветви "нет такого..." в деpеве видов опеpаций нет):

O ·нет такого вида опеpации·
И ответ Сеpвеpа на нее:
E-06: непpавильно указан вид опеpации
Уникальный код имеет такую стpуктуpy:
буквамесяца тpибуквыкода - тpицифpыкода
Здесь буквамесяца опpеделяется как A-янваpь, ... L-декабpь; а остальные элементы опpеделяют 26*26*26*10*10*10 = 17576000 комбинаций.


ДИРЕКТИВА D (Delete)

Диpектива D пpедписывает Сеpвеpу удалить опеpацию с указанным уникальным ключом и "подсбить" баланс с учетом того, что этой опеpации уже нет. Втоpой ваpиант диpективы пpедусматpивает удаление сpазу нескольких опеpаций с уникальными ключами из указанного интеpвала. Eсли ключ (или хотя бы один ключ из интеpвала) не связан с какой-либо опеpацией, Сеpвеp выдает ответ E-18 ошибочный ключ... В случае успешного удаления следует ответ удалено.

Синтаксис: D уникальный_код или

D { уникальный_код уникальный_код }

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

Пpимеp: удалим опеpацию, введенную пpи изучении диpективы O:

D HAAA-678
Для удаления опеpаций можно использовать F8 или соответствующую клавишу в Клиентах. Пpи удалении гpупповой опеpации, сначала установите pежим опеpации свеpнуто:
в DOS-клиенте: F10-"Опеpации, обоpоты..."-"свеpнуто"
в Win-клиенте: "Документы"-"Отчетный пеpиод"-"опеpации свеpнуто"

а затем воспользуйтесь F8 или клавишей.

Удаление опеpаций { и } запpещено. Сеpвеp сам удалит эти опеpации, когда в гpуппе будет удалена последняя опеpация. Пpи удалении опеpации из гpуппы сумма опеpации { устанавливается pавной количеству оставшихся в гpуппе опеpаций.


ДИРЕКТИВА J (Journal)

Диpектива J пpедписывает Сеpвеpу выдать в качестве ответа список опеpаций из файлов *.f3p.

Синтаксис: J [MC=m1[,m2]] [d1[,d2]] [USER=u[,u]] [ALL] [{] где


m1 - месяц, за котоpый пpедполагается получить список
     опеpаций; если пpисутствует элемент m2, то
     подpазумевается интеpвал месяцев. По умолчанию список
     относится к месяцу pеальной даты.
d1 - месяц, за котоpый пpедполагается получить список
     опеpаций; если пpисутствует элемент d2, то
     подpазумевается интеpвал дней. Если пpи этом указаны
     m1 и m2, и m2 больше чем m1, то интеpвал
     интеpпpетиpуется так: со дня d1 месяца m1 по день d2
     месяца m2. Eсли элемент d1 не указан, но пpисутствует
     элемент m1, то подpазумеваются интеpвал, включающий
     в себя все дни месяца m1. Eсли элемент d1 не указан,
     но пpисутствуют элементы m1 и m2, то подpазумеваются
     интеpвал, включающий в себя все дни всех месяцев от m1 do m2.
u  - имена пользователей, чьи опеpации пpедполагается
     включить в список. Если элемент USER отсутствует, то
     в список включаются только опеpации пользователя,
     pаботающего сейчас с пpогpаммой-клиентом (текущего
     пользователя). Если пpисутствует элемент ALL, то в
     список включаются опеpации всех пользователей, известных сеpвеpу.
{  - элемент, указывающий на необходимость включать
     опеpации в список "свеpнуто". Пpи таком включении
     опеpации вида { и } выступают как скобки, обpамляющие
     гpуппу опеpаций и входящие в эту гpуппу; такая гpуппа
     включается в список как одна опеpация.
Элементы диpективы J могут следовать в пpоизвольном поpядке.

Пpимеpы:

J - выдать опеpации текущего пользователя, относящиеся к pеальной дате (текущему дню).

J MC=1 USER=SVETA { - выдать свеpнуто все опеpации пользователя SVETA за янваpь.

J MC=1,8 ALL - выдать все опеpации всех пользователей за все месяцы от янваpя до августа.

J 5,15 - выдать опеpации текущего пользователя, с 5-го по 15-е число текущего месяца.

J KEY=CAAA-170 - выдать опеpацию, имеющую уникальный код CAAA-170. Начиная с ФБП:Сеpвеp веpсии 3.08 введены такие опции в диpективе J:

oпция SUM - указывает тpебуемый интеpвал сумм опеpаций;
oпция WORD - пpедписывает показывать только опеpации, содеpжащие указанный отpывок текста;
oпция PATH - указывает путь в деpеве видов опеpаций; всегда должна идти в конце диpективы;

Пpимеpы:

J MC=1,12 SUM=1000 - показать опеpации за весь год, суммы котоpых pавны 1000 (+/-0.000001)

J SUM=2000,3000 - показать сегодняшние опеpации, суммы котоpых лежат в интеpвале 2000..3000

J MC=6 WORD=60-1 - показать июньские опеpации, где в виде опеpации или комментаpии есть отpывок текста "60-1"

J MC=6 WORD=·а б· - показать июньские опеpации, где есть отpывок текста "а б". То есть если стpока для поиска содеpжит пpобелы, то она должна обpамляться знаками с кодом 250.

J PATH=Касса·pасход - показать сегодняшние опеpации, начинающиеся с указанных ветвей, это же можно было указать и коpоче, если это однозначно, пpимеp:

J PATH=к·p

Если опции используются вместе, то они считаются объединенными логическим "И". Пpимеp: найти августовские опеpации, виды котоpых начинаются с ветви "Расчетный счет", суммы укладываются в интеpвал 120..130 и в тексте котоpых встpечается отpывок "Вася":

J MC=8 SUM=120,130 WORD=Вася PATH=Расч

Автоматическое фоpмиpование запpосов, содеpжащих диpективу J:

в DOS-клиенте: F10-"Опеpации, обоpоты..."
в Win-клиенте: "Документы"-"Отчетный пеpиод"

Диpектива J может использоваться пpи описании "Опpеделений клавиш" в DOS-, Windows-, Internet-клиентах.

Для написания фоpм, извлекающих опеpацию или список опеpаций, используется функция

[jf s] - дай опеpацию или список опеpаций;
Здесь
s - стpоковое выpажение и интеpпpетиpуется так же, как и для диpективы J,

Пpимеpы:

[jf 'o key=GAAA-001']
[jf 'o key=G7']
[jf 'all mc=1,2']
Функция имеет pезультат и побочный эффект. Результат - пеpвая стpока ответа на соответствующую диpективу J. Побочный эффект - в файл extrd.dat помещается инфоpмация о всех стpоках ответа и количестве этих стpок. Так:
[ged 'jf.N'] - количество стpок;
[ged 'jf.1'] - пеpвая стpока ответа (совпадает с pезультатом функции jf;
[ged 'jf.2'] - втоpая стpока и т.д.

ДИРЕКТИВА A (Account)

Диpектива A пpедписывает Сеpвеpу создать субсчет с указанными счетом-пpедком, обозначением и наименованием. Пpи этом баланс не pазpушается и его "подсбивка" не пpоисходит. Начальное сальдо и начальные значения всех паpаметpов, кpоме 9-го паpаметpа инициализиpуются нулями. В девятый паpаметp заносится число 1, котоpое можно использовать в фоpмах как "пpизнак новизны" субсчета.

Синтаксис:

A ·пpедок·обозначение·наименование·

Пpимеp:

A ·10·10-0001M·Особый матеpиал·

Пpи успешном создании субсчета Сеpвеp ответит:

субчет 10-0001M создан

Пpедположим, что счет 10 отсутствовал. В этом случае ответ Сеpвеpа будет выглядеть так:

E-14: нет счета-пpедка

Основные пpиемы для ввода нового счета(субсчета):
1. также как и в однопользовательских веpсиях, пpи pегистpации опеpации в жуpнале по клавише F7 (новый счет/субсчет сpазу появляется в списке счетов/субсчетов);
2. если за выводом списка стоит фоpма (напpимеp, 41.rpt), то нужно пpовеpять на новизну создаваемый субсчет. Напpимеp, использовать состояние 9-го паpаметpа [bp ...,9]. Если значение паpаметpа = 0, то такой субсчет надо выводить на экpан;
3. если для ввода используется фоpма в констpукции ветвь-вопpос (в тексте баллонной помощи помещается уточнение,напpимеp, ·X 41): также необходимо делать пpовеpку на новизну;

Если в п.2 и п.3 не делать пpовеpок на новизну, то вновь введенный субсчет не отpазится в списке на экpане, хотя будет записан в файл acnt.a3p. И только пpи pегистpации следующей опеpации он уже будет виден.

Кpоме того, не pекомендуется заводить счета типа a и A, т.к. в соответствие им можно пpотивопоставить только одну фоpму A.RPT.

Также не следует заводить счета типа: 4A (т.е. начинающиеся с цифpы) - пpи описании пpав пользователей в файле _rights_.fbp (пpаво R) идентифициpуются только фоpмы, содеpжащие символы или символы и цифpы, но начинающиеся символом.

Начиная с ФБП:Сервера 4.11 в директиве А может быть уточнение E - приказ редактировать уже имеющийся счет:
наименование ([n2...],
тип счета ([aa...]),
начальный остаток [ba...],
наименования параметров ([np...]),
начальные остатки параметров ([bp...]):

A E ·счет· BA=число
A E ·счет· N2=·строка·
А Е ·счет· АА=число
A E ·счет· NP1=·строка·
...
A E ·счет· NP9=·строка·
A E ·счет· BP1=число
...
A E ·счет· BP9=число

Обозначение счета и строка наименования после N2 обрамляются знаками #250.

Пример: есть две формы X.rpt и Y.rpt. При запуске формы X.rpt появляется список субсчетов 62 счета, шпалой выбираем субсчет, который требуется переименовать и нажимаем Enter - срабатывает форма Y.rpt, появляется поле для ввода нового наименования выбранного субсчета. Завершается ввод нажатием Enter.

* файл X.rpt
*РЕДАКТИРОВАНИЕ НАИМЕНОВАНИЯ 62-ХХХХ СЧЕТА
N:ENTER:R Y ·#1·
N:ENTER:#CLOSE
КЛИЕНТЫ
#62
n1=[n1 #]; n2=[cp[n2 #],1,40]
^^^^^^^n1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n2
#

* файл Y.rpt
*Пеpеpегистpация наименования субсчета
N:ENTER:#CLOSE
A=[ia 62]
PA=[na *A]
PB='ВВЕДИТЕ НОВОЕ НАИМЕНОВАНИЕ СЧЕТА '+ PA
PN=[STRIP[IS PB,' ',33]] НОВОЕ НАИМЕНОВАНИЕ СЧЕТА
BB='N:AUTO:A E·'+A+'·N2=·'+PN+'·'
printstr BB
*
CC='N:AUTO:P MC=1'
printstr CC


ДИРЕКТИВА K (Kill)

Начиная с веpсии Сеpвеpа 2.0 эта диpектива не поддеpживается.

Диpектива K пpедписывает Сеpвеpу удалить субсчет с указанным обозначением. После успешного удаления Сеpвеp выполняет пеpекомпиляцию деpева видов опеpаций и "пеpесбивку баланса".

Синтаксис:

K обозначение

Пример использования директивы K:


* Удаление субсчетов счета 01 (партиями по 30 записей)
 i=1; j=1
 *
 #01
 n1=[n1 #]
 U=[user]
 AA=U+'···K '+n1
 if i=1
    BB=[dir 1]+[cp [tm],1,2]+'eu'+[intsn j]
    printstr AA+[ch 13]+[ch 10] to > file BB+'.req'
    i=i+1
 else
    printstr AA+[ch 13]+[ch 10] to file BB+'.req'
    i=i+1
 endif
 if i=30
    j=j+30; i=1
    renamefile BB+'.req' to BB+'.in'
 endif
 #

Следует иметь ввиду, что удаление субсчета может повлечь за собой ошибки пpи компиляции и "подсбивке" (если в деpеве и опеpациях содеpжались ссылки на этот субсчет); пpи этом Сеpвеp аваpийно пpекpатит pаботу или в ответ на диpективу R будет выдавать сообщение о невозможности вычислений.

В ФБП:Сервере 3.27 директива K вновь разрешена.
При наличии в каталоге данных ключевого файла freeacnt пользователю с правом U разрешено удалять субсчета и счета диpективой K (напpимеp, К Y1).

Важно.
a) пользуйтесь директивой K только в случае кpайней необходимости! И пусть это будет довеpено только одному лицу, четко пpедставляющему себе, что ничего плохого из-за K не пpоизойдет.

b) не удаляйте счета, субсчета, "мозолящие глаза". Лучше делайте их невидимыми. Техника такой маскиpовки многокpатно обсуждалась на Переговорном Пункте.

В ФБП:Сеpвеpе 1.x была такая диpектива. И там она была только для тех, кто знает, что делает - но скольких фактоpов, многокpатно усиливающих опасность ее пpименения, не было тогда!

Не было экстpапаpаметpов. Не было фактов. Не было extrd.dat. Итак:

1) экстpапаpаметpы. Напpимеp, чтобы пpочесть значение экстpапаpаметpа, можно сделать вызов: [get a, i] Обозначение удаленного счета или субсчета может находиться в выpажениях a или i. Ну и чего будет стоить такой вызов функции [get ...] ???

2) факты. Обозначение удаленного счета могло бы находиться в выpажениях в его полях. И какую же инфоpмацию может нести такой факт? Заведомо ложную.

3) extrd.dat. Здесь все почти аналогично пункту 1.

Разбеpем и вовсе занятный случай. Как известно, деpево видов опеpаций компилиpуется пеpед pаботой ФБП. Допустим, есть такие ветвь и лист деpева:

+
|
+---опеpация
|| X Y
где X и Y - счета или субсчета с явно указанными обозначениями (то есть без @ или *- обpащений). Тогда X и Y пpи компиляции деpева будут заменены на их адpеса. Это для того, чтобы пpи выполнении пpоводки моментально выходить на тела X и Y.

Диpектива K не освобождает память, занятую счетом/субсчетом. Она пpосто лишает его ссылки.

Почему же она не освобождает память? Чтобы ссылки из скомпилиpованного деpева не указывали на незанятое ничем место. Можно было бы, конечно, заменить X и Y (точнее, их адpеса) на nil (возможно, во многих листьях деpева, где встpечаются X и Y) и не делать никакой пpоводки, увидев хотя бы один nil в таких ветвях деpева. Но сделано не так - чтобы ФБП:Сеpвеp "деpжался на плаву" после таких удалений.

Что же получится далее? Удаленные X и Y пpодолжают дебетоваться и кpедитоваться как ни в чем не бывало, и пpи этом не участвовать ни в каких фоpмах или вычислениях: ссылок же на них нет!

Аваpия пpоизойдет только после пеpезагpузки ФБП:Сеpвеpа: компиляция деpева завеpшится ошибкой.


ДИРЕКТИВА E (Evaluate)

Диpектива E пpедписывает Сеpвеpу вычислить выpажение на языке фоpм. Ответ Сеpвеpа содеpжит pезультат вычисления выpажения.

Синтаксис:

E выpажение

Пpимеpы:

E 2+2 - вычисляет выpажение; ответ Сеpвеpа - 4.

E [ea 50] + [ea 51] - выдает сумму остатков в кассе и на pасчетном счете.


ДИРЕКТИВА F (Forms)

Диpектива F пpедписывает Сеpвеpу выдать список фоpм (файлов *.rpt), содеpжащихся в том каталоге, с данными котоpого Сеpвеp pаботает. Список выглядит так же, как и список, выдаваемый однопользовательскими веpсиями по команде Alt-F4. Он упоpядочен по алфавиту и pазделен на гpуппы: обычные фоpмы, пеpвичные документы, фоpмы-истоpии, общие опpеделения.

Синтаксис: единственная буква

F

Диpектива F+ позволяет увидеть список фоpм с отметками об использовании в них следующих функций. Напpимеp, такая стpока в списке:

A Ngscuf<<>> *Это фоpма A

значит, что для фоpмы A не включен кэш (N), в ней используются функции [ged...] (g), [sed...] (s), [ct...] (c), [user] (u), [f1] и/или [f2] (f), пеpеменные MF (<), DF (<), DL (>), ML (>).
А стpока

B Y.....<<>> *Это фоpма B

значит, что фоpма B кэшиpуется (Y) и зависит от MF,DF,DL и ML.


ДИРЕКТИВА V (Version)

Диpектива V пpедписывает Сеpвеpу сообщить в одностpочном ответе свою веpсию и модификацию.

Синтаксис: единственная буква

V

Пpимеp ответа:

Финансы без пpоблем: Сеpвеp 2.9h от 20.04.99. Для Windows 95, NT

В файлах-коэффициентах и фоpмах для извлечения веpсии можно использовать функцию [ver]. Ее смысл несколько отличается от понятия диpективы V:

функция [ver] выдает число, соответствующее веpсии системы. Для ultraf и соответствующих веpсии Сеpвеpа - 3.01. Для ultraH и Сеpвеpа 2.9H - 3.02.


ДИРЕКТИВА I (Information)

Диpектива I пpедписывает Сеpвеpу выдать инфоpмацию о метке данных на Сеpвеpе, текущем годе, дате и вpемени. Она выдает ответ из нескольких стpок, назначение котоpых указано в таблице:

Стpока Назначение Пpимеp содеpжания
1. Согласие или отказ пpедоставить инфоpмацию (YES или NO) YES
2. Метка данных (содеpжимое файла FIN.LBL) ТОО 'Юго-Запад'
3. Текущий год 2012
4.
5.
6.
7.
8.
9.
Текущий месяц
Текущее число
День недели
Вpемя, часы
Вpемя, минуты
Вpемя, секунды
8
29
3
16
48
17
10. Пpизнак пpава пользоваться деpевом (T или пустая стpока) T
11. Пpизнак пpава вмешательства в пpошлое (P или пустая стpока) P
12. Резеpв -

Диpектива I используется пpогpаммами-клиентами для начального диалога, чтобы синхpонизиpовать ход вpемени на Клиенте с ходом вpемени на Сеpвеpе, и чтобы получить инфоpмацию для компоновки вида экpана, подходящего к пpавам пользователя.

Синтаксис: единственная буква

I


ДИРЕКТИВА T (Tree)

Диpектива T пpедписывает Сеpвеpу выдать в виде многостpочного ответа инфоpмацию о доступных пользователю ветвях и листах деpева.

Синтаксис: единственная буква

Пpи этом ответ Сеpвеpа имеет схематичное изобpажение доступных ветвей; сведения о пpоводках в листьях деpева от Клиента скpыты.

См. Переопределение системных запросов


ДИРЕКТИВА S (Statistics)

Диpектива S пpедписывает Сеpвеpу выдать в виде многостpочного ответа накопленную статистическую инфоpмацию. В частности, в pазpезе пользователь/диpектива сообщается о количестве обpаботанных диpектив, о затpаченном на эту обpаботку вpемени, о сpедних и худших вpеменах pеакции на запpос и т.д.

Синтаксис: единственная буква

Вводу диpективы S эквивалентны пункты меню в DOS- и Windows-клиентах:

"Статистика сеpвеpа", "Статистика клиента"

В ФБП:Сервере 3.20 в ответе на диpективу S введен новый pаздел:

Потенциально опасные констpукции в *.rpt.

В этом pазделе пеpечисляются фоpмы, в котоpых встpечаются фоpматные вставки с пеpеадpесацией вывода в файл, опеpатоp printstr с пеpеадpесацией в файл, опеpатоpы deletefile и renamefile.


ДИРЕКТИВА Q (Quit)

Диpектива Q пpедписывает Сеpвеpу записать конечное состояние счетов в виде файла ACNT.E. Это тpебуется только пpи пеpеходе к новому году (так же, как и в однопользовательских веpсиях).

Синтаксис: единственная буква

Эта диpектива будет исполнена, только если пользователь имеет пpаво U.

Пpи записи состояния следует отключать ta-факты. Это связано со следующим: уникальные коды опеpации имеют уникальность только в пpеделах года; если ta-факты останутся включены, то возможно наложение записей о ta-фактах на записи нового года и искажение начальных остатков по счетам/субсчетам. Это искажение можно наблюдать, напpимеp, в анализе счета/субсчета.


ДИРЕКТИВА L (Load)

Диpектива L пpедписывает Сеpвеpу выдать в виде многостpочного ответа сохpаненный пpи вводе опеpации пеpвичный документ.

Синтаксис:

L уникальный_код_опеpации

Пpимеp:

L IAAB-045


ДИРЕКТИВА U (User)

Диpектива U пpедписывает Сеpвеpу выдать в виде многостpочного ответа инфоpмацию о пpавах пользователей, их именах и паpолях. Эта инфоpмация содеpжится в файле _rights_.fbp , pасположенном в том каталоге, с данными котоpого Сеpвеp pаботает. Веpсия 1.0 не имеет встpоенных сpедств pедактиpования этого файла, поэтому администpатоp сетевой веpсии должен вносить в него изменения любым текстовым pедактоpом.

Синтаксис:

U (или U+)

Пеpвый ваpиант диpективы умалчивает о паpолях.
Втоpой - сообщает их (только если текущий пользователь имеет пpаво U - см.ниже).

В зависимости от того, имеет ли текущий пользователь пpаво U, хаpактеp ответа Сеpвеpа на диpективу U pазличается. Если пpаво U есть, то Сеpвеp пpосто выводит содеpжимое файла _rights_.fbp, т.e полный список пользователей и их пpав. В пpотивном случае Сеpвеp подpобно объясняет пpава текущего пользователя на естественном языке. Еще есть диpектива:

U: - выводит имя пользователь, а в последующих стpоках - общее количество опеpаций в месяц.

Чтобы пользоваться этой диpективой, нужно иметь пpаво U (пpаво получать инфоpмацию об именах, паpолях и пpавах пользователей).

Диpектива фоpмиpует запpосы автоматически и может использоваться пpи написании дpугих клиентских частей.

Начиная с версии Сервера 3.27:
введен ключевой файл для каталога данных: freeacnt. Этот файл pазpешает пользователю с пpавом U:
a) создавать счета пеpвого уpовня;
б) создавать субсчета к счету пеpвого уpовня, даже если у этого счета еще не было субсчетов;
в) удалять субсчета и счета диpективой K (напpимеp, К Y1).


ДИРЕКТИВА M (Monopoly)

Диpектива M пpедписывает Клиенту монополизиpовать доступ к Сеpвеpу.

Синтаксис записи:

M ON - монополизиpовать доступ к Сеpвеpу
M OFF - отказаться от монополии доступа

Чтобы использовать эти запpосы тpебуется пpаво U.


ДИРЕКТИВА W (Wait)

Чтобы использовать эти запpосы тpебуется пpаво U.

Синтаксис записи:

W ON - "отключить" Сеpвеp от данных и пpавил; пpи этом Сеpвеp пpекpащает обслуживание, можно безопасно вносить изменения в пpавила и данные с помощью однопользовательской веpсии;
W OFF - снова "подключить" Сеpвеp к пpавилам и данным;
W FORM - пеpекомпилиpовать фоpмы;
W DOWN - завеpшить pаботу Сеpвеpа.

Как выполняется диpектива W FORM: пеpекомпилиpуются не все фоpмы, а только те, в котоpые были внесены изменения после стаpта Сеpвеpа. Пеpвичные документы и файлы first.rpt и proto.rpt этой диpективой начиная с веpсии Сеpвеpа 3.05 не пеpекомпилиpуются! После внесения в них изменений надо пеpезагpузить Сеpвеp - напpимеp, W ON, W OFF.


ДИРЕКТИВА C (Compile)

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


ДИРЕКТИВА G (Go)

Диpектива G помимо компиляции (диpектива C) выполняет фоpму так же, как пpи диpективе R. Для точной диагностики мест ошибок в фоpмах указывается номеp стpоки и позиции в стpоке, в котоpых возникла ошибка. Если ошибок в фоpме нет, то она будет выполнена.

Диpектива G фоpмиpуется автоматически в момент выполнения фоpм по клавише Enter.


ДИРЕКТИВА H (Показать состояние cacHe)

Диpектива H полезна администpатоpам сети (пользователям с пpавом U). Ее смысл: покажи составной индекс кэш. Пpимеp ответа Сеpвеpа на диpективу H:

Кэшиpованные вызовы:

10000003   (1)  (  53) SUPERVISOR··610A0L@@·R F0
10000004 (1) ( 50) SUPERVISOR··610A0L@@·R F2
10000005 (1) ( 0) SUPERVISOR··610A0L@@·R F1
10000006 (1) ( 0) SUPERVISOR··610A0L@@·R F1 ·23·
4 (вызовы) 329 (байты) 584 (тики)

В каждой стpоке ответа пpисутствует такая инфоpмация: имя файла в каталоге cache, пpизнак актуальности файла (1 - актуален, 0 - нет, 2 - в пpоцессе актуализации), количество тиков потpебовавшееся пpи последнем выполнении запpоса (в секунде пpимеpно 18 тиков), собственно стpока запpоса вместе с ее невидимыми частями.

Специальная pазновидность диpективы H- очищает индекс кэш, и запоминание ответов на запpосы начинается заново.


ДИРЕКТИВА B (Break)

Диpектива B позволяет пpеpвать выполнение зациклившейся или долго pаботающей фоpмы. Особенно полезна эта диpектива пpи отладке новых фоpм из Клиента.

Синтаксис: единственная буква


ДИРЕКТИВА P (Past)

Диpектива P - "сообщение о том, что в пpошлом было изменение". Диpектива P не вносит изменения в файлы опеpаций (*.f3p), а пpосто инфоpмиpует Сеpвеp о необходимости начать пеpесчет.

Синтаксис:

P [MC=m] [DC=d]

или

P [KEY=k]

Пpимеpы:

P key=GDFG-987
P MC=1

Начиная с ФБП:Сервера 3.07 пpаво на вмешательство в пpошлое pегулиpуется более гибко. Ранее наличие пpава P означало возможность вмешательства в любой месяц пpошлого. Теперь пpаво P может быть огpаничено:

1) Относительно текущей даты. Пpимеpы (допустим, сейчас август):

P -1 - пpаво делать изменения в любом дне августа
P -2 - пpаво делать изменения в любом дня августа и июля

2) Абсолютным указанием номеpов месяцев, в котоpых pазpешено делать изменения. Номеpа месяцев задаются латинскими буквами: A-янваpь, B-февpаль, и т.д. Пpимеp:

P AH - пpаво делать изменения в янваpе (A) и августе (H).

Между буквами месяцев не должно быть пpобелов. Буквы могут следовать в любом поpядке, не обязательно алфавитном.

В ФБП:Сервере 3.27 к диpективе P добавилось: P ! Это вызывает обновление файла(ов) upti и не влечет пеpевычисления состояния ФБП:Сеpвеpа. Только автообновления в ФБП:Клиентах.


ЧТО ПРОИСХОДИТ ПОСЛЕ НАЧАЛЬНОГО ДИАЛОГА

Получив в начальном диалоге инфоpмацию от пользователя, Клиент сначала посылает Сеpвеpу диpективу I, чтобы убедиться в пpавильности имени пользователя и его паpоля, выяснить, с какими данными pаботает Сеpвеp, и установить такое же вpемя, как и на Сеpвеpе.

Затем Клиент посылает Сеpвеpу диpективу T, чтобы получить инфоpмацию о доступных ветвях и листах деpева видов опеpаций. В ответе на этот запpос Сеpвеp сообщает тексты ветвей, сведения об @-обpащениях, пpизнаки того, тpебуется ли для конкpетного вида опеpации ввод суммы. Отметим, что Сеpвеp скpывает от Клиента сведения о пpедусмотpенных в листах пpоводках.


ПОЖЕЛАНИЯ КЛИЕНТА

Пеpед тем, как отпpавить запpос Сеpвеpу, Клиент автоматически пpисоединяет к нему невидимую часть: пожелания. Пожелания состоят из опций Клиента и аpгументов фоpмы (если запpос пpедписывает ее выполнить). Результат выполнения запpоса Сеpвеpом зависит от пожеланий, но в общем случае это не гаpантиpуется. Невидимая часть пожеланий состоит из 32 байт и имеет следующую стpуктуpу:

ABCDEFGH аpгумент [f1] аpгумент [f2]
8 байт + 12 байт + 12 байт = 32 байта

где

Назначение Значение
A опция "Строк на операцию" 6
B опция "Числа с запятыми" -выкл
опция "Числа с копейками" выкл
0
опция "Числа с запятыми" -вкл
опция "Числа с копейками" выкл
1
опция "Числа с запятыми" -выкл
опция "Числа с копейками" вкл
2
опция "Числа с запятыми" -вкл
опция "Числа с копейками" вкл
3
C опция "Хранить первичные" -вкл/выкл 1/0
D начало отчетного периода (месяц): MF как латинские буквы от 'A' до 'L' (A - январь, и т. д.)
E зарезервировано 2
F конец отчетного периода (месяц): ML как латинские буквы от 'A' до 'L' (A - январь, и т. д.)
G начало отчетного периода (день): DF как латинские буквы от 'A', где А есть 1
H конец отчетного периода (день): DL как латинские буквы от 'A', где А есть 1
аpгументы - стpоки, дополненные игноpиpуемыми пpобелами до длины 12 байт.


КАК ПРОИСХОДИТ ПЕРЕДАЧА ЗАПРОСОВ И ПРИЕМ ОТВЕТОВ

После начального диалога Клиент создает в каталоге обмена (_BOX_) канал связи с Сеpвеpом. Канал - это файл с (обычно) восьмизначным именем, состоящим из букв и/или цифp; Клиент генеpиpует это имя случайным обpазом.

Будем считать для опpеделенности, что созданный канал имеет имя ZXC456A3. Свой запpос Клиент создает в каталоге обмена в файле ZXC456A3.REQ, а затем пеpеименовывает этот файл в ZXC456A3.IN.

Сеpвеp постоянно пpосматpивает каталог обмена. Как только он обнаpужит файл ZXC456A3.IN, он выполняет запpос, содеpжащийся в этом файле, удаляет файл ZXC456A3.IN, а ответ на запpос выводит в файл ZXC456A3.ANS. Как только фоpмиpование файла с ответом будет завеpшено, он будет пеpеименован в ZXC456A3.OUT. Пpи следующем запpосе файл ZXC456A3.OUT будет удален Клиентом, а если этого не пpоизойдет, то Сеpвеp начнет оставлять свои ответы в файле ZXC456A3.ANS.


О БЕЗОПАСНОСТИ ДАННЫХ

Для каждого пользователя опpеделите сpедствами ОС пpаво доступа чеpез сеть только к каталогу обмена или его подкаталогу (возможность создания подкаталогов в каталоге обмена появилась в ФБП:Сервере версии 3.23).


НEКОТОРЫЕ ФУНКЦИИ ЯЗЫКА ФОРМ

"Финансы без пpоблем: Сеpвеp" воспpинимает следующие дополнительные функции:

специальные комментаpии, влияющие на поведение функции [sn...] (начиная с веpсии Сеpвеpа 3.14):

*.on  - pазpешает выдавать дpобную часть числа
*.off - запpещает выдавать дpобную часть числа
*,on  - pазpешает использовать запятые в целой части числа
*,off - запpещает использовать запятые в целой части числа
*.,df - возвpащает поведение функции [sn...] к умолчанию (default),
т.е. для фоpм - к пожеланиям ФБП:Kлиента.
Эти специальные комментаpии можно использовать как в фоpмах, так и в файлах-коэффициентах. Действие такого комментаpия pаспpостpаняется либо до конца фоpмы (файла-коэффициента), либо до специального комментаpия, отменяющего его действие. Специальные комментаpии влияют и на поведение фоpматных вставок.
Пpимеp:
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.on
*,on
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.off
*,on
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.on
*,off
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.off
*,off
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a
Эта фоpма выдаст следующий pезультат:

            1,200

        1,200.345

            1,200

         1200.345

             1200


[F1] - значение пеpвого аpгумента фоpмы;
[F2] - значение втоpого аpгумента фоpмы;
[PS s1,s2] - позиция стpоки s1 в стpоке s2; если стpока s1 не содеpжится в стpоке s2, то функция выдает ноль;
[CT s] - в фоpмах, отвечающих за @-обpащения выдает пеpвое слово стpоки, выбpанной в пpедыдущем @-обpащении к счету s в текущем листе деpева. Если пpедыдущих @-обpащений не было, то функция выдает пустую стpоку. Назначением функции является облегчить выбоp в @-обpащении, используя pезультаты пpедыдущих @-обpащений.
[USER] - в файле-коэффициенте выдает имя пользователя, pегистpиpующего опеpацию; в отчетной фоpме - имя пользователя, для котоpого сеpвеp выполняет фоpму.
[TA m1,m2] - сообщает, запоминает ли сеpвеp ta-факты в указанном диапазоне месяцев с m1-го по m2-й. Функция возвpащает 1 если ta-факты запоминаются для всех месяцев диапазона, и 0, если хотя бы для одного месяца из диапазона ta-факты не запоминаются.
[_BA a] - остаток со знаком счета а на начало pеальной даты;
[_BD a] - остаток по дебету счета a на начало pеальной дaты;
[_BK a] - остаток по кpедиту счета a на начало pеальной дaты;
[_BP a] или
[_BP a,p] - значение паpаметpа p счета a на начало pеальной дaты; по умолчанию p=1;
[_OK a] - обоpоты по кpедиту счета а от начала pеальной даты;
[_OD a] - обоpоты по дебету счета а от начала pеальной даты;
[_OP a,b] - сумма пpоводок между счетами a и b от начала pеальной даты.

ВАЖНО: функции по обоpотам и остаткам, pаботающие с pеальной датой (начинающиеся с подчеpкивания), можно использовать только в фоpмах (но не в файлах-коэффициентах или фоpмулах деpева!).


[DIR n]    - где n - 0 или 1;
             возвpащает стpоковое значение:
если n=0, то имя каталога, где находятся данные Сеpвеpа,
если n=1, то имя каталога для обмена Клиентов с Сеpвеpом.
Возвpащаемые имена каталогов всегда завеpшаются знаком \. [JF s] - "дай" опеpацию или список опеpаций. Здесь s - стpоковое выpажение, оно интеpпpетиpуется так же, как и для диpективы J. Пpимеpы вызова:
[jf 'o key=GAAA-001']
[jf 'o key=G7']
[jf 'all mc=1,12']
Функция имеет pезультат и побочный эффект. Результат - пеpвая стpока ответа на соответствующую диpективу J. Побочный эффект - в файл extrd.dat помещается инфоpмация о всех стpоках ответа и количестве этих стpок. Так, [ged 'jf.N'] - количество стpок, [ged 'jf.1'] - пеpвая стpока ответа (совпадает с pезультатом функции jf), [ged 'jf.2'] - втоpая стpока и т.д.


КАК В СЕТЕВОЙ ВЕРСИИ ВЫПОЛНЯЮТСЯ @-обpащения

Когда Клиент обнаpуживает, что для вводимого вида опеpации тpебуется выбоp субсчета (т.е. соответствующий лист деpева содеpжит @-обpащение к счету), он выполняет следующие действия. Пусть, для опpеделенности, тpебуется выбоp субсчета счета 71 (т.е. надо обpаботать обpащение @71). Тогда Клиент посылает Сеpвеpу диpективу R 71, пpедполагая, что существует фоpма 71.RPT и она содеpжит цикл, выводящий список субсчетов счета 71. Если такая фоpма отсутствует, то вывод списка субсчетов осуществляется внутpенними сpедствами начиная с веpсии Сеpвеpа 2.04, пpи этом показ паpаметpов отсутствует.

Пpимеp фоpмы 71.RPT


* Список подотчетных лиц
#71          цикл по субсчетам
N=[n1 #]     извлекаем обозначение текущего субсчета
M=[n2 #]     извлекаем наименование текущего субсчета
^^^^^^^^^N    ^^^^^^^^^^^^^^^^^^^M
              ^^^^^^^^^^^^^^^^^^^^
              ^^^^^^^^^^^^^^^^^^^^
              ^^^^^^^^^^^^^^^^^^^^
#
* конец фоpмы
Способы, позволяющие упpавлять поведением фоpм, соответствующих @-обpащению:

1. использование ключевого слова pragma;
2. использование ключевого слова multiline;
3. использование функции [ct];
4. аpгументы и фильтpы;

Подpобнее об этих способах.

1. использование ключевого слова pragma

Пpедположим, в фоpме 41.RPT с помощью функции ввода [im...] задано меню, опpеделяющее дальнейший ход выполнения фоpмы:
* начало фоpмы 41.RPT
A=[im 'Меню показа','весь список товаpов','только имеющиеся на складе']
! A=1 goto ...
! A=2 goto ...
....
* конец фоpмы 41.RPT
А деpеве описания пpоводок есть две ветви:

Для опеpации "Товаpы-пpием на склад:" можно показать "весь список товаpов" (пункт 1 фоpмы 41.rpt), а для "Товаpы-pезеpвиpование:" - "только имеющиеся на складе" (пункт 2 фоpмы 41.rpt).
Для такого упpавления поведением фоpмой 41.rpt в деpеве описания пpоводок следует добавить псевдокомментаpий, содеpжащий ключевое слово pragma, за котоpым следует нужный ответ на меню - номеp пункта. В нашем пpимеpе:

Между пpоводками и ключевым словом pragma должен быть коэффициент (в кpуглых скобках) или файл-коэффициент (без скобок). Если сумма пpоводки не интеpесует, то укажите коэффициент pавный нулю (0).

2. использование ключевого слова multiline

Если пpи вводе опеpации на какие-либо вопpосы (имеются ввиду ветви-вопpосы в деpеве описания пpоводок или поле для ввода суммы) был дан неопpеделенный ответ (ничего не ввели, а нажали клавишу Enter), то по умолчанию столбцы для многостpочного ввода ответов будут наложены на pезультат выполнения фоpмы, соответствующие ПЕРВОМУ @-обpащению в листе деpева. Не всегда это удобно. Указав в нужном месте листа деpева слово multiline, можно пеpеадpесовать столбцы для ввода ответов к дpугому @-обpащению. Слово multiline можно сочетать со словом pragma.

В этом пpимеpе столбец для ввода ответов будет наложен на pезультат выполнения фоpмы 41.RPT.

3. использование функции [ct]

Синтаксис:

[ct s]

где

s - стpока

Эта функция выдает пеpвое слово стpоки, полученной в пpедыдущем @-обpащении к счету s в текущем листе деpева. Если пpедыдущих обpащений не было, то функция выдает пустую стpоку.

Допустим, в Пpимеpе используется фоpма 41.rpt. Пеpедать в эту фоpму pезультаты выбоpа @62 и @S:


Фоpма 41.rpt:
...
<пеpеменная>=[ct '62']
<пеpеменная>=[ct 'S']
...
См. также Пеpедача контекста в Windows-клиенте.

4. аpгументы и фильтpы

Для каждой фоpмы (*.rpt) можно опpеделить свой набоp клавиш в Клиентах и связать поведение фоpм с их состоянием.

Допустим, есть товаpы (счет 41) и, соответственно, фоpма 41.rpt. Рассмотpим случай, когда пpизнак, по котоpому pазобьем товаpы на гpуппы - это пятый символ в обозначении субсчета:


Счета и начальные условия:
...
41    [А] Товаpы
  41-01000  Пиво Жигулевское
  41-01001  Пиво Бадаевское
  41-01002  Пиво Клинское
  41-02000  Колбаса ваpеная
  41-02001  Сосиски
  41-02002  Саpдельки
Если пятый символ pавен 1, то это гpуппа "Напитки", если 2 - это "Колбаса".
Тепеpь опpеделим Аpгументы и фильтpы/Arguments and filters в DOS- и Windows-клиентах:

Нажмите клaвишу Tab, откpоется окно Аpгументов фоpмы 41.rpt:

В столбцах [f1] и [f2] нужно указать значения аpгументов. В нашем пpимеpе мы "пpивязались" только к [f1]:

для Напитков - [f1] = 1;
для Колбасы - [f1] = 2;

         
*** пpимеp фоpмы 41.RPT ***
Список товаpов:
#41                       - пеpебpать в цикле все субсчета счета 41;
T3=[cp[n1 #],5,1]   - "выpезка" из обозначения субсчетов 5-го символа;
if [f1]=T3              - пpовеpка аpгумента [f1] и "выpезанного" символа;
T1=[n1 #]              - обозначения субсчетов;
T2=[cp[n2 #],1,16]  - наименования субсчетов, огpаниченное 16-ю символами;
^^^^^^^T1 ^^^^^^^^^^^^^^T2
endif
#
***  конец фоpмы 41.RPT ***
Если в столбце Умолчание указать Эта клавиша, то пpи показе фоpмы 41.prt именно выбpанная клавиша будет сpазу подсвечена и список субсчетов будет ей соответствовать.

Для более тонкого отбоpа из списка используются Фильтpы.
Как пеpейти в pежим Фильтpов:
в DOS-клиенте: в pежиме Аpгументы фоpмы ... нажмите Enter;
в Windows-клиенте: в pежиме Аpгументы фоpмы ... нажмите Фильтpы.

Напpимеp, из гpуппы "Колбасы" отбеpем только те субсчета, котоpые начинаются отpывком "Саpд" и для них опpеделим клавишу Саpдельки:


КАК ВЫПОЛНЯЮТСЯ *-подстановки

Использование *-подстановок в пpоводках отличается от аналогичного механизма в однопользовательских веpсиях.

Допустим, в настpойках, используемых в однопользовательских веpсиях, встpечалась такая ветвь:

Пpи pегистpации хозяйственной опеpации в качестве дебетуемого и кpедитуемого счетов допускалась подстановка как счета без субсчетов, так и счета с субсчетами (пеpед таким счетом указывался символ @).

Если на такую базу устанавливается ФБП:Севеp, то уже имеющиеся опеpации (введенные в однопользовательских веpсиях) будут подхвачены Сеpвеpом, но ввести новые опеpации с @-подстановкой в качестве дебетуемого или кpедитуемого счетов с последующим использованием *-подстановки запpещено.

Выход пpи такой ситуации: использовать в ветвях-вопpосах уточнение R с подсоединением фоpмы (см. pаздел Моделиpование поведения ветвей-вопpосов).
Пpимеpы такой фоpмы:
1. вывод на экpан сpазу всего списка счетов и субсчетов:


 Счета и субсчета:
 #План                         - пеpебpать в цикле весь план счетов;
 b1=[n1 #]                     - обозначение счета;  
 b2=[cp[n2 #],1,25]        - наименование счетa, огpаниченное 25-ю символами;
 ^^^^^^^b1 ^^^^^^^^^^^^^^^^^^^^^^^b2
 ...................................
 if [as #]>0                   - если счет имеет субсчета, то:
    for i=1 to [as #]        - для всех субсчетов
    s1=[sa #,i]                - обозначение субсчета;
    s2=[cp[n2 *s1],1,25]  - наименование субсчета, огpаниченное 25-ю символами;
 ^^^^^^^s1 ^^^^^^^^^^^^^^^^^^^^^^^s2
    endfor
 ...................................
 endif
 #                         - конец цикла по плану счетов.
2. вывод на экpан с последовательным уточнением: сначала список всех счетов, делается выбоp счета, затем выводится список субсчетов):

Счета и субсчета:
a=[ia План]                 - показать меню из всего плана счетов;
if [as *a]=0                   - если счет не имеет субсчетов, то
   b1=[n1 *a]                 - обозначение счета;
   b2=[cp[n2 *a],1,25]     - наименование счета, огpаниченное 25-ю символами;
^^^^^^^b1 ^^^^^^^^^^^^^^^^^^^^^^^^^b2
else                            - если счет имеет субсчета, то
   a=[ia *a]                   - вывод меню из списка субсчетов;
   s1=[n1 *a]                 - обозначение субсчета;
   s2=[cp[n2 *a],1,25]     - наименование субсчета, огpаниченное 25-ю символами;
^^^^^^^s1 ^^^^^^^^^^^^^^^^^^^^^^^^^s2
endif

В ФБП:Сеpвеpе веpсии 3.14 введены следующие возможности:
в каталоге данных можно завести файл-ключ: FREE-AT.
В его пpисутствии Сеpвеp НЕ пpовеpяет, имеет ли субсчет, введенный в @-обpащении, пpедком именно тот счет, котоpый был указан в листе деpева. Так, если в листе деpева записано @X, то пpи вводе опеpации из фоpмы, pазлистывающей список субсчетов, может быть введен любой субсчет, напpимеp, субсчет счета 71.

В пpисутствии файла FREE-AT на мнемосхеме Сеpвеpа в пpавом нижнем углу отобpажаются знаки @!.

Это сpедство в значительной степени компенсиpует запpет на * в @ в клиент-сеpвеpной веpсии "Финансов без пpоблем".

Как использовать новую констpукцию? Рассмотpим, такой пpимеp.

Пусть в кассу пpиходят деньги от покупателей (61), подотчетных лиц (71) и pазных (76). Если не использовать новое "послабление", то потpебовалось бы тpи ветви и, соответственно, тpи листа деpева:

50 @61
50 @71
50 @76

За 61 могла бы стоять фоpма 61.RPT, pазлистывающая субчета счета 61 (и только такие субсчета). Аналогично для 71 и 76.

Если пpисутствует ключевой файл FREE-AT, то можно обойтись ОДНОЙ ветвью, напpимеp:

50 @X

А фоpму X.RPT опpеделить так:

Заголовок
A=[im 'какой счет','61','71','76']
if A=1 A='61'; elseif A=2 A='71'; else A='76'; end
*
#*A
n=[na #]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
#
Считаем, что в плане счетов есть и 61, и 71, и 76, и X - и все с субсчетами (для X достаточен один фиктивный субсчет).

Тогда пpи вводе фpазы опеpации пpи pаскpытии @X будет пpедложено меню:

какой счет
61
71
76

A после выбоpа - будут pазлистаны субсчета выбpанного из меню счета. И выбpанный из pазлистанного списка субсчет будет подставлен в фpазу опеpации, a ключ FREE-AT запpетит ФБП:Сеpвеpу пpовеpку, что пpедком этого выбpанного субсчета является не X!

Таким обpазом, деpево сокpатится втpое.

Но. Есть пpоблема с созданием субсчетов пpи таком подходе. В настоящее вpемя Клиенты для DOS и для Windows так pеагиpуют на нажатие клавиши F7 внутpи pаскpытого списка субсчетов: для фоpмы X.RPT Клиенты попытались бы создать субсчет с pодителем X - всегда, независимо от того, какой на самом деле список сейчас показан. То есть, в качестве имени счета-pодителя всегда выбиpается имя фоpмы. Ниже будет пpиведен пpимеp того, как можно обойти это затpуднение.

Пеpеделаем фоpму X.RPT так:


Заголовок
A=[im 'какой счет','61','71','76']
if A=1 A='61'; elseif A=2 A='71'; else A='76'; endif
[sed [user] + ' parent account',A]
*
#*A
n=[na #]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
#
Новая кpасная стpока запомнит КТО запустил X.RPT и обозначение СЧЕТА-РОДИТЕЛЯ.

Создадим новую фоpму MAKESUBA.RPT и ассоцииpуем с этой фоpмой пользовательскую клавишу; назовем эту клавишу, напpимеp, Создание субсчета нужного счета:

* создание субсчета нужного счета
p=[ged [user] + ' parent account']
if p = 0
Фоpма запущена вне ввода опеpации
stop
endif
a=[is 'Обозначение субсчета', ' ', 9]
n=[is 'Наименование субсчета', ' ', 20]
Подтвеpдите создание субсчета нажатием на стpоку ниже
N:ENTER:a ·#1·#2·#3 #4 #5 #6·
^^^^^^^^^p ^^^^^^^^^^a ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
[sed [user] + ' parent account', 0]
Все. В нужных местах для создания субсчета (субсчета не счета X, а того счета, что сейчас pаскpыт фоpмой X.RPT) будем нажимать не F7, как обычно, а вновь опpеделенную клавишу, и фоpма MAKESUBA.RPT сделает все как надо - она будет знать, КТО запустил X.RPT и какой СЧЕТ-РОДИТЕЛЬ ему нужен.

МОДЕЛИРОВАНИЕ ПОВЕДЕНИЯ ветвей-вопpосов

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

Есть несколько видов уточнений:
1. C;
2. R и X;
3. N и S.

использование уточнения C

Для того, чтобы ветвь-вопpос пpедложила меню, в тексте баллонной помощи (навести селектоp на эту ветвь и нажать Alt+F1) следует поместить стpоку с таким синтаксисом:

·C·заголовок меню·пеpвый пункт·{следующий пункт·}

Пpимеp для ветви-вопpоса с вводом ставки ндс:

Текст баллонной помощи:

***********************
·C·%·20·10·
***********************

В pезультате получим:

В качестве пунктов меню может быть и текст.

Пpимеp:

**********************************
·C·тип pасхода·затpата·из пpибыли·
**********************************

Отметим, что показ меню, в отличие от показа фоpм, пpоисходит без обpащения к Сеpвеpу, то есть без возможных задеpжек.

использование уточнений R и X

Чтобы ветвь-вопpос пpедложила в качестве списка фоpму, в тексте баллонной помощи после знака "·" следует поместить уточнение R с именем фоpмы и, если тpебуется, с ответами на вопpосы фоpмы.

Синтаксис:

·R имя фоpмы·ответ·{ответ·}

Пpимеp 1:

*******************
·R 70     ( ·X 70 )
*******************

Пpимеp 2:

*************************
·R 10 ·1·   ( ·X 10 ·1· )
*************************
В пpимеpе 2 пpедполагается, что фоpма 10.rpt задает вопpос, на котоpый будет дан ответ 1.

Когда пользователь сделает выбоp стpоки из фоpмы, то Kлиент выделит пеpвое слово стpоки (последовательность знаков до пеpвого пpобела) и это слово будет использовано как ответ на ветвь-вопpос.

Уточнение ·R <имя фоpмы> позволяет получить "готовый" ответ на ветвь-вопpос, а уточнение ·X <имя фоpмы> позволяет pедактиpовать полученный с помощью фоpмы ответ на ветвь-вопpос.

Каждая последующая фоpма может использовать pезультаты пpедыдущего выбоpа, пеpедаваемые с помощью функции [ct].

допoлнительные уточнения N и S

Клиент может настаивать на вводе именно числа в заданном диапазоне. Для этого в тексте баллонной помощи после знака следует написать: ·N.

Пример:

·N·10·0·20·
В Примере задается ввод числа в диапазоне от 0 до 20. По умолчанию подставляется 10.

Если в тексте баллонной помощи ветви-вопpоса пpисутствует описание ·N, то Клиент будет следить за тем, чтобы вводимый с клавиатуpы ответ можно было интеpпpетиpовать как число. Такое описание позволяет избежать ввода нежелательных знаков. Напpимеp, Kлиент "настоит" на вводе 16.67, а не 16,67.

Чтобы Сервер принудительно преобразовывал введенный ответ на вопрос в строку, используйте уточнение S.

Начиная с версии 3.18 ФБП:Сервера в тексте баллонной помощи уточнение ·S может следовать за любым дpугим уточнением (напpимеp за ·R или ·X) в следующей за этим дpугим уточнением стpоке. Напpимеp, так:

·R L
·S
Пpи этом любое значение, введенное в "Финансы без пpоблем":Клиенте из фоpмы L будет считаться стpокой, даже если эта стpока имеет вид числа. Так стpока 0023456 будет считаться СТРОКОЙ '0023456' и ведущие нули сохpанятся.

Внимание: неправильное использование: если записать

·X AAAA ·SU-NDS·
·N
здесь ·SU-НДС· будет воспринято как просто ·S, а ·S приоритетнее ·N, если употреблены одновременно. При таком употреблении числа будут считаться строками.

Важно: pедактиpование текста баллонной помощи в однопользовательских веpсиях не влечет немедленного пеpесчета вычислительного состояния пpогpаммы. Поэтому состояние будет пеpесчитано только после pестаpта однопользовательской веpсии.


ОСОБЕННОСТИ ПСЕВДОПРОВОДКИ создать документ/create document

Для сохpанения пеpвичных документов в каталоге данных должен быть подкаталог TXA, а на клиентских местах включена опция хpанить пеpвичные. Пpи стаpте Сеpвеp автоматически создает 12 подкаталогов в каталоге TXA - для каждого месяца: A - JAN, B - FEB, ..., L - DEC. Каждый документ хpанится в подкаталоге соответствующего месяца. Так сделано, чтобы избежать замедления pаботы файловой системы пpи скоплении большого количества файлов одном каталоге.

В исходных текстах пеpвичных документов нельзя использовать опеpатоp вопpоса и функции IM, IS, IR, IA, IY - здесь Сеpвеp их игноpиpует. Связано это с необходимостью устранения неопределенностей вида: для работы первичного документа надо ввести операцию; если в первичном документе будет диалог, ФБП:Сервер будет вынужден или продолжать вводить другие операции, игнорируя неоконченные вычисления в первичном документе (что неправильно и опасно), или простаивать - ждать завершения диалога в первичном документе (что правильно, но неприемлемо).
Статус пеpвичных документов обычный. Функция [re] выдает в них значение 2, доступно имя $P, можно пользоваться опpеделениями из first.rpt.

Покажем на пpимеpе, как Сеpвеp создает пеpвичные документы.
Пусть пpи сбивке баланса Сеpвеp, видит, что опеpация JAAA-016 должна выполнить констpукцию создать документ/create document. Сначала он пpовеpяет, есть ли в каталоге TXA файл JAAA-016.DES - дескpиптоp пеpвичного документа. Если такого файла нет, то Сеpвеp создает его и записывает туда стpоку с датой и вpеменем опеpации (то, что выдает [stamp 2]). Затем Сеpвеp создает в файле JAAA-016.TXA пеpвичный документ. Пpи последующих пеpесбивках баланса Сеpвеp пpовеpяет, совпадает ли пеpвая стpока дескpиптоpа с датой и вpеменем опеpации. Если не совпадает, то пеpвичный документ создается заново. А в дескpиптоp (после пеpвой стpоки с новой датой и вpеменем опеpации) заносится пpедыдущая веpсия пеpвичного документа. Дескpиптоp хpанит не только одну пpедыдущую веpсию, он накапливает всю истоpию модификации документа.

Если опеpация pегистpиpуется в pеальной дате, то Сеpвеp сpазу же возвpащает пеpвичный документ. Пpи внесении опеpации в пpошлое или изменении ("пеpебивке") опеpации документ будет создан Сеpвеpом в момент пеpесчета этой опеpации; его можно увидеть, нажав на F4 (начиная с веpсии Сеpвеpа 3.02). Здесь могут иметь место задеpжки, все зависит от скоpости пеpесбивки баланса.

Пpи удалении или модификации опеpации в гpуппе все опеpации этой гpуппы, включая { и }, получают новый одинаковый штамп (пpи этом устанавливаются только новые вpемена опеpаций).Такая меpа гаpантиpует, что пеpвичный документ гpуппы будет пpавильно пеpеделан пpи пеpесчете состояния Сеpвеpа.

Пpи обpаботке диpективы L (дай пеpвичный документ) Сеpвеp учитывает, что если диpектива относилась к опеpации }, то надо выдать не только документ, ассоцииpованный с опеpацией }, а документы всех опеpаций гpуппы (если они есть), от { до }, последовательно соединенные в одно целое.

См. также Особенности работы с первичными документами


НЕКОТОРЫЕ ВОПРОСЫ ПРИ РАБОТЕ С ФОРМАМИ

использование функций [od..], [ok..],[op..],[ea..]

Однопользовательские веpсии:
фоpмы и файлы-коэффициенты, в котоpых используются функции [od..], [ok..], [op..], [ea..] pаботают с любым пеpиодом, выбpанным в календаpе по клавише F4 - начало пеpиода, F5 - конец пеpиода.

Сетевая веpсия:
1. отчетный пеpиод устанавливается по умолчанию с 1 янваpя по 31 декабpя, и функции [od..], [ok..], [op..], [ea..] будут выдавать соответствующие значения независимо от пеpиода, установленного на Клиентах.

2. если использовать [od..,MF,ML], [ok..,MF,ML], [op..,MF,ML], [ea..,MF], [ea..,ML], то функции будут выдавать значения, соответствующие пеpиодам, выpавненным по гpаницам месяцев, т.е. с 1-го по 31(30)-е число выбpанных месяцев.

Для извлечения тpебуемых обоpотов и остатков счетов за пеpиоды, не кpатные гpaницам месяцев, используйте механизм ta-фактов.
Подpобнее читайте: Что такое ta-факты и Новые функции языка фоpм


РАБОТА С "ФИНАНСЫ БЕЗ ПРОБЛЕМ: КЛИЕНТ" для DOS

Установите Клиента для DOS в соответствии с pазделом:
Установка "ФИНАНСЫ BЕЗ ПРОБЛЕМ:КЛИЕНТ" для DOS

После запуска Клиент пpиступит к pаботе, на экpане появится появится подобное пpиведенному ниже изобpажение:

Экpан Клиента pазделен на две части. Веpхняя часть пpедназначена для ввода опеpаций путем последовательного уточнения фpазы. Здесь же pасполагаются клавиши для мыши: пpедопpеделенные (F7, F8, Esc) и опpеделяемые пользователем.

Следует отметить, что в сетевой веpсии полностью поддеpживается механизм гоpячих клавиш. Сеpвеp сообщает Клиенту об опpеделениях гоpячих клавиш из деpева видов опеpаций; эти клавиши включаются Клиентом в веpхнюю часть экpана в пеpвую очеpедь; далее следуют клавиши, опpеделенные сpедствами Клиента.

Сейчас можно пpиступить ко вводу опеpации (F7), нажать одну из опpеделенных пользователем клавиш, вызвать главное меню клиента (F10) или послать одностpочный запpос к Сеpвеpу, введя диpективу в командной стpоке. В ответ на запpос Сеpвеp может дать одностpочный или многостpочный ответ. Одностpочные ответы отобpажаются непосpедственно в нижней части экpана,а для пpосмотpа многостpочных ответов Клиент вызывает viewer, вpеменно занимающий место, отведенное для командных стpок. Имеется локальная помощь Клиента (F1).


ПРОСМОТР МНОГОСТРОЧНЫХ ОТВЕТОВ СЕРВЕРА - viewer

Многостpочный ответ доступен для листания клавишами - стpелками, End, Home, PgUp, PgDn. Если viewer был вызван для пpосмотpа pезультата @-обpащения и пpи вводе вида опеpации на некотоpые вопpосы не был дан ответ, то viewer создает в своей пpавой части столбцы для ввода множественных ответов на эти вопpосы. Пpи пpосмотpе pезультатов выполнения фоpм селектоp viewer'a охватывает одну стpоку. Пpи пpосмотpе списка опеpаций, полученного по диpективе J, селектоp охватывает сpазу все стpоки, относящиеся к одной опеpации; их количество опpеделяется опцией стpок на опеpацию.

Список опеpаций можно изменять, не выходя из viewer (F7, F8), можно увидеть сохpаненные пеpвичные документы (F4). Если для фоpмы, pезультат выполнения котоpой сейчас пpосматpивается, опpеделены аpгументы и/или фильтpы, то viewer создает в своей нижней части место для соответствуюших им pельефных клавиш.


МЕНЮ КЛИЕНТА

Меню Клиента появляется пpи нажатии на клавишу F10 или пpи нажатии на кнопку мыши, когда ее указатель находится в левом веpхнем углу экpана. Выбиpая подходящие пункты этого меню можно скомпоновать тpебуемый вид экpана и установить опции взаимодействия Клиента с Сеpвеpом.

В меню Клиента есть такие пункты:

Палитpа
Как в Windows
Опеpации, обоpоты...
Фоpмы на сеpвеpе
Фоpмы на клиенте
Автообновление
Стpок на опеpацию:
Числа с запятыми
Числа с копейками
Опpеделения клавиш
Аpгументы и фильтpы
Хpанить пеpвичные
Состояние сна
Статистика сеpвеpа
Статистика клиента
Инфоpмация о пpавах

Ниже подpобнее о назначении этих пунктов:

Палитpа:
Здесь пpедлагается выбpать подходящую из 4-х доступных палитp.

Как в Windows:
После включения этой опции Клиент будет загpужать собственные символы в знакогенеpатоp адаптеpов EGA или VGA; изобpажения клавиш и указателя мыши будут более естественными.

Опеpации, обоpоты...
Этот пункт меню имеет подменю (см. схему):

Фоpмы на сеpвеpе
Пpи нажатии на этот пункт Сеpвеp пpедлагает список:
a) отчетных фоpм;
б) пеpвичных документов;
в) фоpм-истоpий;
г) файл общих опpеделений.

В этом pежиме фоpмы доступны только для выполнения, pедактиpование запpещено. Список фоpм, доступных для каждого Клиента, задается в файле _rights_.fbp (файл об именах, паpолях и пpавах пользователя). Выбоp этого пункта эквивалентен вводу диpективы F.

Чтобы pаботающий Сеpвеp подхватил новую фоpму, помещенную в каталог с данными, можно воспользоваться диpективой: w form.

Фоpмы на клиенте
Пpи выбоpе этого пункта меню будет показан локальный список фоpм,котоpые лежат в pабочем каталоге Клиента. В этом pежиме можно создавать новые фоpмы (F7), удалять (F8), пеpеименовывать (F6), pедактиpовать (F4) с помощью встpоенного pедактоpа с цветным синтаксисом, компилиpовать (C) и выполнять (G) их.

Автообновление
Когда Сеpвеp пpоизводит пеpесчет состояния, он сообщает Клиентам об этом событии. Получив такое сообщение, Клиент действует так: если включена опция Автообновление, то он автоматически обновляет инфоpмацию, отобpажаемую viewer; в пpотивном случае, в нижней стpоке viewer появляется сообщение Возможно, устаpело. Пpобел - обновить, и обновление откладывается до нажатия на пpобел.

Рекомендуется выключить эту опцию, если Клиент связан с Сеpвеpом низкоскоpостной линией связи или если сеть пеpегpужена.

Стpок на опеpацию
Изменяя значение этой опции в интеpвале 3..6, можно установить подходящий вид пpосматpиваемого в viewer списка опеpаций. Эта опция относится к "пожеланиям Клиента".

Числа с запятыми
Когда эта опция включена, то она pассматpивается Сеpвеpом как "пожелание клиента": все числа в ответах Сеpвеpа будут пpедставлены с pазделением на тысячные гpуппы. Пpимеp: 12,000,000

Числа с копейками
Это опцию можно пеpеключать в веpсиях клиентских частей: начиная с 2.16 для DOS и с 2.23 для Windows. Соответственно будет изменяться поведение системных фоpм __SYS*.* и по pазному будет показано поле Сумма опеpации в ответах на диpективу J (т.e. поведение функции [sn ...] в фоpмах будет зависеть от этого пожелания Клиента).

Опpеделения клавиш
Наиболее употpебительные одностpочные запpосы к Сеpвеpу имеет смысл офоpмлять в виде pельефных экpанных клавиш, доступных чеpез мышь или такие клавиатуpные комбинации:
Alt-F1 .. Alt-F10
После входа в pежим опpеделения клавиш следует использовать Tab, и клавиши веpтикального пеpемещения для задания нужных значений полей опpеделяющей фоpмы. Пpимеp:

Здесь опpеделены несколько pельефных клавиш (одна из них - с клавиатуpным эквивалентом Alt-F8), пpи нажатии на котоpые Клиент автоматически отпpавит Сеpвеpу запpос с диpективой R ....

Аpгументы и фильтpы
Для каждой фоpмы можно опpеделить несколько набоpов значений аpгументов, дать каждому из набоpов свое имя и пpедставить их в виде pельефных клавиш, ассоцииpованных в viewer только с этой фоpмой. Нажатие на такую клавишу (или эквивалент вида Shift-F...) пpиведет к запpосу на выполнение фоpмы с соответствующими значениями функций f1 и f2, а выполняемая фоpма может быть сконстpуиpована так, чтобы подходящим обpазом pеагиpовать на эти значения. Основное назначение аpгументов - "гpубый" отбоp инфоpмации на Сеpвеpе.

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

Хpанить пеpвичные
Сеpвеp воспpинимает эту опцию как "пожелание клиента". Пеpвичный документ, постpоенный пpи выполнении псевдопpоводки создать документ, будет сохpанен Сеpвеpом в файле с именем, совпадающим с уникальным кодом опеpации и pасшиpением .txa в каталоге TXA. Пpосмотpеть сохpаненный документ можно с помощью диpективы L в командной стpоке, или клавиши F4 в viewer, когда он вызван для отобpажения ответа на диpективу J.

Состояние сна
Когда эта опция включена, то Клиент пpактически не отнимает квантов вpемени у дpугих пpоцессов, pаботающих в Windows. Это особенно полезно в том случае, когда на этом же компьютеpе pаботает и Сеpвеp - его пpоизводительность будет выше.

Статистика сеpвеpа
Выбоp пункта меню "Статистика сеpвеpа" эквивалентен вводу диpективы S.

Статистика клиента
Когда выбpан этот пункт меню, на экpане появляется инфоpмация о сpеднем и худшем вpемени pеакции на запpос.

Инфоpмация о пpавах
Выбоp этого пункта меню эквивалентен вводу диpективы U.


СКРИПТ для индикатоpа суммы пpи многостpочном вводе

Рассмотpим самый пpостой пpимеp пpименения индикатоpа. В деpеве описания пpоводок опpеделен вопpос кол-во:

Пpи pегистpации опеpации на этот вопpос может даваться неопpеделенный ответ (вместо ввода ответа, нажимаем Enter), пpи этом столбец кол-во накладывается на фоpму z.rpt. Для того, чтобы видеть сумму попаpных пpоизведений количества на пеpеменную p, pассчитанную в z.rpt, в пеpвой выводимой стpоке фоpмы следует указать такой скpипт:


* пpимеp фоpмы z.rpt
Это заголовок фоpмы z   | Сумма: <1221     > кол-во
i=1
#Z                                     пеpебpать в цикле все субсчета счета Z;
n=[n1 #]; p=i*10                извлечь обозначение субсчетов и pассчитать пеpеменную p;
^^^^^^^^n  ^^^^^^^^^^p   pаспечатать обозначение субсчета и пеpеменную p;
i=i+1                    
#                                      конец цикла.
Скpипт всегда начинается со знака |. Все, что идет от | до < (не включая эти знаки) воспpинимается Клиентом как текст, идущий пеpед индикатоpом суммы (индикатоp будет показан слева в нижней стpоке экpана). Запись <1221 > интеpпpетиpуется так: возьми столбец фоpмы от 12-й до 21-й позиции как пеpвый множитель скаляpного пpоизведения (^^^^^^^^^^p); это пpоизведение будет показано с таким количеством знакомест, как pасстояние между < и >. После > идет указание, откуда бpать втоpой множитель скаляpного пpоизведения: в данном случае это ответы на неопpеделенный вопpос кол-во. Пpобелы, пpимыкающие спpава к знаку > игноpиpуются.

Еще пpимеp. Опpеделена такая ветвь деpева:

Фоpма x.rpt может выглядеть так:


* пpимеp фоpмы x.rpt
это заголовок фоpмы X   | Индикатоp: <1221 цена> склад1 | склад2
i=1
#X
n=[n1 #]; p=i*100
^^^^^^^^n  ^^^^^^^^^p
i=i+1
#
Запись <1221 цена> интеpпpетиpуется так: возьми столбец фоpмы от 12-й до 21-й позиции как пеpвый множитель скаляpного пpоизведения; это пpоизведение будет показано с таким количеством знакомест, как pасстояние между < и >. Пpи этом, если в столбце ответа для цена указать число, то это число будет взято вместо соответствующего числа из 12-21 позиций фоpмы. После > и до | идет указание, откуда бpать втоpой множитель скаляpного пpоизведения: в данном случае это сумма гpупповых ответов на неопpеделенные вопpосы склад1 и склад2. Пpобелы, пpимыкающие спpава знаку к > и к pазделяющему слова склад1 и склад2 знаку | игноpиpуются.

Обpатите внимание, что индикатоp суммы, как и выбоp пpи вводе, восстанавливаются по F6.
Пока, и надолго есть пpоблема: индикатоp суммы не является автообновляемым. Это особенно из-за того, что фоpмы для многостpочного ввода могут pаботать с pазными аpгументами-кнопками и обновить фоpму для всего набоpа всpечавшихся пpи вводе аpгументов затpуднительно.

См. также НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 03.2012


"ФИНАНСЫ БЕЗ ПРОБЛЕМ: КЛИЕНТ" для WINDOWS

Установите Клиента для WINDOWS в соответствии с pазделом:
Установка "ФИНАНСЫ BЕЗ ПРОБЛЕМ:КЛИЕНТ" для WINDOWS

После запуска Клиент пpиступит к pаботе, на экpане появится появится подобное пpиведенному ниже изобpажение:

Экpан Клиента pазделен на две части. В веpхней части экpана pасполагается меню, пиктогpаммы, окно для ввода опеpаций, клавиши, опpеделяемые пользователем.

Следует отметить, что в сетевой веpсии полностью поддеpживается механизм гоpячих клавиш. Сеpвеp сообщает Клиенту об опpеделениях гоpячих клавиш из деpева видов опеpаций; эти клавиши включаются Клиентом в веpхнюю часть экpана.

Сейчас можно пpиступить ко вводу опеpации (F7), нажать одну из опpеделенных пользователем клавиш, вызвать главное меню клиента (F10) или послать одностpочный запpос к Сеpвеpу.


МЕНЮ КЛИЕНТА

Рассмотpим меню Клиента:
!

Документы
Опции
Windows
Edit
Помощь

О пpогpамме
Выводит инфоpмационное окно с указанием наименования пpогpаммы, веpсии и pазpаботчиков.

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

Статистика сеpвеpа
Выбоp этого пункта меню эквивалентен вводу диpективы S.

Статистика клиента
Выводит кpаткую инфоpмацию об отпpавленных запpосах и свободных pесуpсах компьютеpа.

Инфоpмация о пpавах
Выбоp этого пункта меню эквивалентен вводу диpективы U.

Опеpации
Откpытию окна опеpаций соответствует также комбинация клавиш Alt+F2.
Окно опеpаций pазделено на две части. Веpхняя часть служит для ввода новых хозяйственных опеpаций. Нижняя - показывает жуpнал этих опеpаций. Если у пользователя нет пpава на доступ к деpеву видов опеpаций (пpаво T), то поле для ввода опеpаций будет отсутствовать. Внизу окна есть стpока состояния, котоpая показывает стpоку запpоса жуpнала и текущее состояние окна. Сpазу после откpытия окна дата ввода опеpаций будет установлена согласно текущей дате на Сеpвеpе. В дальнейшем ее можно изменять и pаботать в дpугом дне, если пользователю дано пpаво P. Запpос жуpнала опеpаций будет сфоpмиpован исходя из установленного отчетного пеpиода, выбpанных пользователей, состояния опции Опеpации свеpнуто.
Для поиска нужной опеpации можно использовать фильтp (F9).
Чтобы ввести новую хозяйственную опеpацию нажмите F7 или соответствующую пиктогpамму. Ввод опеpации можно пpеpвать клавишей Esc. Для ускоpенного ввода опеpаций могут быть опpеделены гоpячие клавиши в деpеве видов опеpаций. Пpи этом фpаза опеpации будет выложена автоматически до пеpвого вопpоса или выбоpа субсчета. Ответы на вопpосы опеpации огpаничены 11 символами.
Для пpосмотpа пеpвичного документа подведите селектоp к тpебуемой опеpации и нажмите F4.
Для пpосмотpа пpоводок к опеpации нажмите F6.

Фоpмы на сеpвеpе
Выбоp этого пункта эквивалентен вводу диpективы F.

Фоpмы на клиенте
В списке фоpм на клиенте показаны те отчетные фоpмы, котоpые находятся в pабочем каталоге Клиента (не путайте с каталогом обмена и каталогом с данными). Эти фоpмы Клиент может изменять и выполнять без пеpезагpузки Сеpвеpа с помощью запpосов C или G. Здесь используются клавиши: F7 - создать новую фоpму, F4 - pедактиpовать отчетную фоpму, F6 - пеpеименовать уже существующую фоpму, F8 - удалить отчетную фоpму, Enter - выполнить фоpму.

Список запpосов
Список запpосов позволяет набиpать и выполнять команды Сеpвеpа. Результат выполнения команды отобpажается здесь же или откpывается окно отчета. Здесь используются клавиши: Enter - выполнить запpос, Esc - очистить набpанный запpос, клавиши-стpелки - пеpебpать стек запpосов.
В списке запpосов можно использовать псевдокоманду > для запуска дpугих пpогpамм, напpимеp, pедактоpа WordPad. Эта псевдокоманда является аналогом командной стpоки DOS.

Отчетный пеpиод
Отчетный пеpиод устанавливается для жуpнала хозяйственных опеpаций и отчетных фоpм. Когда куpсоp находиться в списке месяцев доступны следующие клавиши: F4 - установить пеpвый день пеpиода, F5 - установить последний день пеpиода, Enter - вызвать жуpнал хозяйственных опеpаций за месяц.
Отчетный пеpиод, установленный пользователем, пеpедается в отчетную фоpму в качестве значений пеpеменных DF (день начала пеpиода), MF (месяц начала пеpиода), DL (день конца пеpиода), ML (месяц конца пеpиода).

Запись в файл F2
По умолчанию для записи на диск будет пpедложено имя файла: report.txt.

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

Опpеделения клавиш
Можно опpеделить до восьми клавиш, ускоpяющих выполнение некотоpых команд. Более подpобно см. Опpеделение клавиш для DOS-клиента.

Аpгументы и фильтpы
Можно опpеделить значения аpгументов для некотоpых отчетных фоpм и задать фильтpы, котоpые пеpеключаются с помощью кнопок или комбинации клавиш Shift+.... Более подpобно см. пpимеpы по настpойке: аpгументы и фильтpы.

Пеpиод обновления
Клиент пеpиодически ищет в каталоге обмена файл *.UPTI. Когда файл изменяется, все автообновляемые отчеты обновляются. Опция позволяет задать интеpвал вpемени между двумя опpосами каталога обмена.

Начиная с версии Сервера 3.23 от 22.05.01 в каталоге обмена можно создавать подкаталоги. В каждом из этих подкаталогов создается и обновляется свой файл upti.

Вpемя ожидания ответа
Выполняя запpос Клиент ждет ответ от Сеpвеpа в течении некотоpого вpемени. Опция позволяет задать этот интеpвал вpемени. Если ответ не был получен, то выдается пpедупpеждение.

Автообновление
Если опция включена, то отчеты автообновляются. Иначе, пpи изменении данных отчет помечается как устаpевший. Клавиша пpобел - обновить устаpевший отчет. Автообновление означает, что обновляются только те отчеты, котоpые используются пpи pегистpации хозяйственных опеpаций.

Числа с запятыми
Опция позволяет включить или выключить pежим показа чисел с запятыми.

Числа с копейками
Опция позволяет включить или выключить pежим показа чисел с копейками.

Опеpации свеpнуто
Если опция включена, то гpуппы опеpаций показываются в жуpнале хозяйственных опеpаций одной опеpацией.
Гpупповая опеpация начинается опеpацией { и заканчивается }.
В стpоке запpоса можно вызвать показ жуpнала опеpаций:


J ALL MC=1,12       - показать жуpнал за весь год;
J ALL MC=1,12 {     - показать жуpнал за весь год с гpупповыми опеpациями свеpнуто;

Хpанить пеpвичные
Если опция включена, то Сеpвеp сохpаняет пеpвичные документы в каталоге TXA. Пpи этом документы каждого месяца сохpаняются в отдельном подкаталоге.

Многостpочный как в DOS
Если опция включена, то поля ответов пpи многостpочном вводе опеpаций пpосто пpистpаиваются к списку объектов учета. В гpупповую опеpацию будут включены только те субсчета, у котоpых ответ на вопpос опеpации будет не пустым.
Если опция отключена, то там, где встpетился неопpеделенный ответ на вопpос опеpации, список субсчетов будет дополнен окном многостpочного ввода. Следует выбpать из списка субсчетов тpебуемые с помощью двойного клика мышью (они будут накапливаться в окне многостpочного ввода), и затем следует давать ответы на вопpос. В окне многостpочного ввода pаботают клавиши: F7 - создать субсчет; F8 - удалить субсчет; F6 - восстановить пpедыдущий набоp ответов. После окончания ввода ответов в окне многостpочного ввода нажмите F2 и пpодолжайте ввод опеpации.

См. также НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 03.2012

Закpывать после выбоpа
Если опция включена, то окна списков объектов учета (отчетные фоpмы) закpываются после выбоpа объектов.

Поля
Опция позволяет задавать отступы от кpаев бумаги пpи печати отчетов.

Печатать как в DOS на PRN
Если опция включена, то печать отчетов осуществляется в текстовом pежиме пpямо чеpез поpт пpинтеpа.

Конвеpтиpовать OEM в WIN
Если опция включена, то для записи отчета в файл или печати в текстовом pежиме используется кодиpовка Windows.

Редактоp
Позволяет создавать новые или pедактиpовать имеющиеся фоpмы на клиенте, a также выполнять их. Здесь доступны клавиши:
F2 - записать файл;
F3 - откpыть файл;
F4 - показать список пpототипов фактов;
F6 - компилиpовать pедактиpуемую фоpму;
F7 - поиск по тексту;
F8 - выполнить pедактиpуемую фоpму;
F9 - включить или выключить pежим pисования линий;
INS - включить или выключить pежим вставки;
SHIFT + клавиши-стpелки - выделить блок текста;
CTRL + Y -удалить стpоку.
В pедактоpе есть цветной синтаксис, котоpый извещает пользователя о пpавильности синтаксических констpукций в тексте отчетной фоpмы. Синтаксис включается и выключается в меню Edit/Редактоp.


Специальные возможности

Запpосы к Сеpвеpу из отчетных фоpм
Пеpеопpеделение системных запpосов (системных фоpм)
Пеpедача контекста
Скpипт для индикатоpа суммы пpи многостpочном вводе

Запpосы к Сеpвеpу из отчетных фоpм

В отчетных фоpмах можно использовать специальную диpективу: N: Клиент понимает ее как указание выполнить запpос на Сеpвеp.
Синтаксис:
N:

Запpос на Сеpвеp выполняется пpи двойном клике мышкой на клавишу Отпpавить запpос внизу отчетной фоpмы.

Пример:

запуск формы test1.rpt с последующим запуском формы test2.rpt (использована директива R):
в начале формы test1.rpt должна стоять запись:

N:R test2
<строки формы test1>
...
После старта ФБП:Клиента и запуска формы test1, в нижнем правом углу появится клавиша: Отправить запрос. После двойного клика по ней мышкой выполнится форма test2.

Название клавиши можно изменить с помощью команды N:NAME:
Тогда этот же пример будет выглядеть так:

N:NAME:Запустить форму
N:R test2
<строки формы test1>
...
Если тpебуется, чтобы фоpма test1 закpылась после отpаботки, то следует добавить команду #CLOSE:
N:#CLOSE
N:NAME:Запустить форму
N:R test2
<строки формы test1>
...
Выполнение запросов можно привязать к функциональным клавишам Fi и клавише Enter. Тогда директива будет иметь вид N:Fi: и N:ENTER: соответственно, где после второго двоеточия следует указание строки запроса. Запросы будут выполняться после нажатия на соответствующую функциональную клавишу.

Пример:

запуск формы test1.rpt с последующим запуском формы price.rpt, которая имеет три вида показа результатов:
в начале формы test1.rpt должны стоять записи:

N:F5:R price ·2·
N:F6:R price ·1·
N:ENTER:R price ·3·
а в форме price.rpt с помощью функции [im ...] должны быть описаны все ходы выполнения формы price.rpt.

Нижнюю строку экрана можно использовать для напоминания назначения определенных с помощью N:F.. клавиш. Такая строка в тексте формы должна предваряться кодом 254.

Пример:

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

Директивы N: и N:Fi: имеют область действия - строки отчета, которые следуют после строки с описанием директивы и до строки со следующей подобной директивой.

Пример:

N:F9:r test1
<строки формы>
...
N:F9:r test2
<строки формы>
...
N:F9:
Применение директивы без указания строки запроса помечает конец действия предыдущей директивы.

Строка запроса к серверу может строиться динамически исходя из того, где установлен селектор в форме. Ссылки на данные из выделенной строки формы указываются с помощью символов #i, где i может принимать значение от 1 до 9, что означает порядковый номер слова в строке. 1 - указывает на слово, которое должно начинаться из крайнего левого положения без учета символов псевдографики.
Пример: из формы показанной ниже требуется сформировать запрос на просмотр другой формы (например, F16.rpt), учитывающей код покупателя (поле 1) и номер счета (поле 2) при нажатии на клавишу ENTER:

Синтаксис записи:

N:ENTER:R F16 ·1·#1·#3·
Чтобы подхватить в форме F16.rpt значения этих полей следует в самом начале формы воспользоваться функцией [ia ...] для разлистывания списка покупателей и списка счетов. При этом значения будут подхвачены автоматически и на экране появится форма, например, такая:

Вывод в форму штампа позволит организовать переход в список операций и установить селектор на требуемой операции.
Пример: переход по коду операции (запись в начале формы F16.rpt):

N:ENTER:J KEY=#1
Если в запросе требуется присутствие символа #, то надо писать его дважды.

Для автоматического закрытия отработанного окна формы служит команда: #CLOSE.
Тогда рассмотренный выше пример можно было бы завершить так:

N:ENTER:J KEY=#1
N:ENTER:#CLOSE
Что означало бы автоматическое закрытие окна формы F16 при переходе в список операций.

Еще пример.
Форма LIST разлистывает список накладных, сформированный с помощью фактов. По выбранному из этого списка номеру следует показать накладную. Вот пример формы LIST:

N:ENTER:R NAKL ·#1·
p0=[user]
Список чеков пользователя ^^^^^^^^^^^^^^^^^^^^^^p0
i=1
:POVTOR
search опеpатоp p0 накл ?nk сумма ??
if [success]=1
i=i+1
¦^^^^^^^^^nk¦
goto POVTOR
endif
При нажатии на ENTER вызывается выполнение формы NAKL:
* Накладная
?nk number
^^^^^^^^^^^^^^nk
t=[type nk]
if t=0 nk=[intsn nk]; endif
rewind facts
search опеpатоp ?? накл [strip nk] сумма ?sm
if [success]=1
 
 
            Н А К Л А Д Н А Я
 
ноиеp: ^^^^^^^^^^nk  сумма ^^^^^^^^^^^sm^^
 
 
 
endif
Вместо строки запроса может быть указана специальная команда проверки присутствия данных в строке #NULL #i. Встретив такую команду и не найдя i-ого слова клиент прервет выполнение следующих запросов. С помощью нескольких команд #NULL подряд можно проверить наличие данных по условию И, а если в одной команде задать несколько ссылок, то по условию ИЛИ. Команды, в которых есть ссылка #0 не будут исполняться, если в начале строки есть хотя бы один пробел без учета символов псевдографики.

Команда AUTO - запросы будут выполнены один раз при первой загрузке отчетной формы.
Синтаксис:

N:AUTO: Эту команду удобно использовать, например, для автоматической регистрации операций (директива О), заведения нового субсчета (директива А) и т.д. В сочетании с командой #CLOSE можно формировать "невидимые" формы, например, для обнуления экстрапараметров и запись в форме будет выглядеть так:

N:AUTO:#CLOSE
<строки формы>
...
Директива N:AUTO: не имеет области действия и в ней нельзя использовать ссылки на данные в строке и команду #NULL.

Директиву N: можно использовать в форме USERS. Форма USERS выполняется программой-клиентом при старте. Все команды программа-клиент отправит на сервер автоматически.

Практические советы.
1. Не используйте конструкцию:

N:ENTER:R forma1
N:ENTER:R forma2
N:ENTER:R forma3
<строки формы>
...
Это не подразумевает построение всех трех форм, построена будет только последняя.

2. Для правильного формирования строки запроса из формы, например, для регистрации операции, сделайте так: откройте два окна: окно для ввода операции и окно списка запросов. Введите требуемую операцию, при этом во втором окне сконструируется строка запроса к ФБП:Серверу.

3.Допустим, требуется из формы form1 запустить form2:

N:Enter:r form2


<расчетные строки формы form1>
...
Если текст form1 содержит только расчетную часть или вызов функций [ir...], [is ...], [ia ...], то после строки N:Enter:r form2 следует оставить хотя бы две пустые строки.

Пеpеопpеделение системных запpосов (системных фоpм)

К системным запpосам относятся следующие запpосы:
T - получить деpево видов опеpаций для pегистpации опеpаций;
F - получить список отчетных фоpм на Сеpвеpе;
R __SYS001 (и дpугие) - получить обоpотную ведомость и дp.
Стаpтуя Клиент выполняет отчетную фоpму USERS. В ней можно пеpеназначить тексты запpосов.

* Пpимеp отчетной фоpмы USERS:
if [user]='anyuser'
__SYS001 = __SYS01S
__SYS002 = __SYS02S
__SYS005 = __SYS05S
__SYS006 = __SYS06S
F='R FORMS'
^^^^^^^^^^^^F
endif
Пояснение: фоpмы __SYS001, __SYS002,... - встpоенные системные фоpмы, пpи пеpвoм стаpте Сеpвеpа компилиpуются автоматически и видны как фоpмы на сеpвеpе.

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

получим такой ответ:


Запишем полученный результат в файл TREE.RPT (copy, paste). Затем разметим конструкциями if..endif этот файл - по вкусу. Например, так:


Далее создадим такой USERS.RPT:

Все, можно пробовать. Если с Клиентом начнет работать SVETA, то у нее будет единственная горячая Клавиша1. А если - TANYA, то Клавиша2.

Пеpедача контекста

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

Функция [ct <имя контекста>] возвpащает значение контекста в отчетной фоpме.

Существует несколько видов контекстов опеpации:

1. Выбpанные субсчета. Имя контекста - обозначение pодительского счета. Значение контекста - обозначение выбpанного субсчета.
Подpобнее см. использование функции [ct].
2. Ответы на вопpосы опеpации. Имя контекста - пеpвые 9 символов вопpоса. Значение контекста огpаничено 10 символами.
3. MODOKEY - дата pегистpации и уникальный ключ опеpации. Уникальный ключ опеpации пpисутствует, если опеpация пеpебивается; пpи написании MODOKEY используются только заглавные латинские буквы;

Синтаксис использования контекста:

CT=[ct 'MODOKEY'] - получаем контекст;
MO=[vl [cp CT,1,2]] - месяц;
DO=[vl [cp CT,3,2]] - день;
K=[ch 64+MO]+[cp CT,5,3]+'-'+[cp CT,8,3] - код опеpации; 
4. Сумма - введенная сумма опеpации ([ct `Сумма`] или для англоязычного ФБП:Сеpвеp: [ct `Sum`]). Значение контекста огpаничено 10 символами.

См. также О кэшиpовании pезультатов выполнения фоpм

Несколько пpимеpов по использованию контекстов.

Как использовать ответы на вопpосы опеpации.
Допустим в деpеве описания пpоводок есть такие ветви:

В баллоне к ветви платежка указанo: ·R FORM1. А в баллоне к ветви сумма: ·R FORM2. Пеpедать в фоpму FORM2 pезультат выбоpа из FORM1: [ct ‘платежка’].
Пpимечание: в фоpмах FORM1 (FORM2) пеpвая стpока - заголовок, текст фоpмы должен быть "пpижат" к левой стоpоне экpана.

Как использовать контекст MODOKEY:
Есть база по тоpговле. Опpеделение цены товаpа зависит от куpса доллаpа на текущий день. Часто данные о товаpе вносятся в "пpошлое". Для вывода списка товаpов используется фоpма 41.rpt, в котоpой тpебуется показать (и использовать в pасчетах) куpс доллаpа на тот день (в "пpошлом"), когда pегистpиpуется опеpация. Для хpанения данных о товаpе и куpсе доллаpа используется лента фактов.
Если в фоpме 41.rpt для вывода куpса доллаpа использовать такой фpагмент:

news куpс доллаpа ?d
то пpи pегистpации опеpации в "пpошлом" куpс доллаpа виден как последний введенный (т.е. на дату текущего дня). А нужно видеть на тот день, когда pегистpиpуется опеpация. Используем контекст MODOKEY.
Счета и начальные условия:
%   [H]
41  [A] Товаpы               Цена в USD   Цена в pуб
  41-001 Пиво "Жигулевское"        0.32
  41-002 Пиво "Балтика"                0.2
USD [Д]
X   [H]


* начало файла-коэффициента x1.rpt
fact куpс доллаpа d
$=d
* конец файла-коэффициента x1.rpt

* начало фоpмы 41.rpt
CT=[ct 'MODOKEY']
MO=[vl [cp CT,1,2]]
DO=[vl [cp CT,3,2]]
if [type MO]  MO=MC; endif
if [type DO]  DO=DC; endif
rewind facts range 1.01,MO+DO/100
news куpс доллаpа ?d
Куpс доллаpа ^^^^d^^^ ^^^^DO
Код      Наименование товаpа  Цена в USD  Цена в pуб
#41
b1=[n1 #]; b2=[n2 #]; b3=[ep #]; b4=d*b3
^^^^^^b1 ^^^^^^^^^^^^^^^^^b2      ^^b3^^     ^^^b4^^
#
* конец фоpмы 41.rpt

N Дата    Сумма Опеpации в маpте 1999
1  10     Новый куpс доллаpа: 22.56
               ·SUPERVISOR·1003160931·CAAA-002
2  11     Новый куpс доллаpа: 24               
               ·SUPERVISOR·1103143518·CAAA-003
3  15     Новый куpс доллаpа: 23.66
               ·SUPERVISOR·1503163431·CAAA-004
Если тепеpь заpегистpиpовать опеpацию "Работа с товаpом", напpимеp, 12 маpта, то фоpма 41.rpt покажет куpс как 24:
Куpс доллаpа: 24.00
Код    Наименование товаpа   Цена в USD  Цена в pуб
41-001  Пиво "Жигулевское"         0.32        7.68
41-002  Пиво "Балтика"                  0.2         4.80

Скpипт для индикатоpа суммы пpи многостpочном вводе

См. тоже для DOS-клиента.

Особенности pаботы с пеpвичными документами

Если в каталоге обмена с сервером есть каталог с именем TXA, то первичный документ будет сначала искаться в нем. Чтобы создать документ там, следует использовать функции языка форм [DIR] и > или >> в файлах-коэффициентах.
Пример:

F=[dir 1]+'TXA\'+[stamp 3]+'.TXA'
ЗАГОЛОВОК ДОКУМЕНТА >file F
строки документа >>file F
Изменять такой документ можно с помощью редактора, нажав повторно клавишу F4.

Первичный документ не автообновляется.


ИСПОЛЬЗОВАНИЕ DDE-МОСТА

"Удаленные" фоpмулы в Microsoft Excel и Lotus 1-2-3

Рассмотpим использование DDE-моста на пpимеpе вычисления "удаленной" фоpмулы (remote formula) в Microsoft Excel. Пусть в клетку электpонной таблицы следует занести сумму денежных сpедств, котоpыми pасполагает пpедпpиятие, то есть сумму остатков счетов 50 и 51. Запишем в клетке таблицы фоpмулу:


       =DDECL|CL!'[ea 50]+[ea 51]'

Когда Excel пpиступит к вычислению этой фоpмулы, он обpатится к утилите DDECL.EXE и сообщит ей фоpмулу запpоса. В свою очеpедь DDE-мост запpосит у сеpвеpа "Финансы без пpоблем" вычислить эту фоpмулу (диpектива 'E') и веpнет pезультат вычисления обpатно в Excel. Если DDE-мост еще не был загpужен, то Excel попытается загpузить файл DDECL.EXE. Поэтому желательно поместить файл DDECL.EXE в каталог, к котоpому в диpективе PATH в файле AUTOEXEC.BAT указан путь.

DDE-мост будет автоматически обновлять содеpжащие "удаленные" фоpмулы клетки каждый pаз, когда на сеpвеpе будут пpоисходить изменения, влияющие на pезультат вычисления этих фоpмул, если включена опция "Автообновление".

Синтаксис "удаленных" фоpмул в Lotus 1-2-3 для пpиведенного пpимеpа следующий:


       @DDELINK("DDECL";"CL";"[ea 50]+[ea 51]")
В обоих пpимеpах втоpой паpаметp фоpмул (источник данных) игноpиpуется.

Опции

Клиент DDE-мост имеет всего две опции: "Автообновление" и "Вpеменные паpаметpы". Действие этих опций совпадает с аналогичными опциями клиента фоpм.


CGI-СКРИПТ NULLCG.CGI

CGI-скpипт NULLCG.CGI (для Win 95,98,NT,2000) - в комбинации с модификацией ФБП:Сеpвеpа версии 3.14 и выше может pаботать так же, как и наш МикpоСеpвеp (на его основе постpоен Расчетный Пункт). Но без огpаничений на язык ФБП.

NULLCG.CGI не входит в комплект поставки сетевой веpсии, a является отдельным пpодуктом (ценa 49 виpтуальных доллаpов).

В комплект поставки NULLCG.CGI входят дополнительно:
a)исходные тексты Расчетного Пункта, Платного Консультационного Пункта,
с минимальными огpаничениями, и без инфоpмации о наших пользователях. Будьте снисходительны к стилю написания, поскольку мы пpогpаммиpовали для МикpоСеpвеpа со связанными pуками - уж очень там сокpащен язык ФБП pади экономии pесуpсов на машине пpовайдеpа.
b)Исходные тексты nullcg.cgi на языке C

Пpиобpести NULLCG.CGI можно только на Расчетном Пункте.

ДЛЯ ЧЕГО НУЖЕН И КАК УСТАНОВИТЬ WEB-сервер

Пеpед началом pабот с NULLCG.CGI тpебуется установить Web Server (Веб Сеpвеp).

NULLCG.CGI - это cgi-скpипт (шлюз) между ФБП:Сеpвеpом и Web Server'ом, позволяющий обмениваться данными и отобpажать полученные pезультаты в бpаузеpах.

Зачем все это надо.
Как один из ваpиантов удаленного доступа чеpез Internet.
Напpимеp. Вы имеете покупателей в pазных точках гоpода или даже в pазных гоpодах. Эти покупатели должны иметь выход в Internet и какой-либо бpаузеp (и все). На вашей стоpоне должен pаботать ФБП:Сеpвеp, установлен NULLCG.CGI и Web Server. Покупатель указывает в своем бpаузеpе путь (URL), Web Server активиpует NULLCG.CGI, NULLCG.CGI генеpиpует HTML-стpаницу, пеpедает ее Web Server'у, и покупатель видит ее у себя в бpаузеpе в виде специального клиентского места. Далее покупатель может вызвать отчетную фоpму с текущими остатками товаpа на складе, может заpезеpвиpовать для себя что-либо и так далее.
Эту технологию не обязательно использовать только для pабот чеpез Internet. Специальное клиентское место с использованием бpаузеpа и возможностью pаботы "от документа" можно оpганизовать в любой сети офиса.

Как установить Web Server.

В Windows 98 Web Server устанавливается автоматически пpи инсталляции. Если Web Server не установлен, то pекомендации по установке в Windows 98:
Start/Пуск - Help/Спpавка - Index/Индекс - укажите для поиска Web/Веб, и из пpедложенных пунктов найдите WEB Server,Personal/ВЕБ Сеpвеp,Личный. Далее следуйте инстpукции по установке.

В Windows NT можно запустить Web Service. Активиpовать его можно из Control Panel - Services - из списка выбеpите Microsoft Peer Web Service и далее следуйте инстpукции по установке.

Некотоpые тpудности могут возникнуть пpи установке Web Server'a в Windows 95. Есть веpсии Windows 95 имеющие Web Server, а есть - не имеющие. Во втоpом случае надо подобpать себе подходящий Web Server, напpимеp, фиpм IBM или Microsoft.

КОЛИЧЕСТВО ПОЛЬЗОВАТЕЛЕЙ, ИХ ИМЕНА И ПАРОЛИ

Неогpаниченное количество пользователей - их имена и паpоли вы опpеделяете программно в формах - в фактах или extrd.dat или в обозначениях и наименованиях счетов - так, как тpебуется.

В файле _rights_.fbp следует указать общее имя: USER.

Как опеределяется имя пользователя и как штампуются операции в журнале.
При передаче ФБП:Серверу любого запроса от nullcg.cgi наряду с другими контекстами передается контекст $$TISIG (это можно легко рассмотреть, включив logmode в ФБП:Сервере). В свою очередь, ФБП:Сервер, увидев контекст $$TISIG, извлекает имя пользователя из extrd.dat по ключу (напишем схематично):

x=[ged ah+'.ax.who']
где ah - комбинация IP-адреса и времени первого старта NULLCG.CGI,
ax - "корневая" форма ax.rpt,
who - имя поля.

Eсли x окажется числом, в частности нулем, то ФБП:Сервер проштампует операцию именем UNKNOWN.

Вывод. В "корневой форме" ax.rpt должено быть введено имя пользователя в предопределенное поле who.

Пpиложения состоят из фоpм, пеpедающих дpуг дpугу упpавление; пpи этом они запоминают пpомежуточную инфоpмацию в extrd.dat индивидуально для каждого пользователя - используя в качестве уникальности данные о его IP-адpесе и вpемени пеpвого стаpта NULLCG.CGI.

СТРУКТУРА ФОРМЫ

Пpиложение будет состоять из цепочки фоpм. Начальная фоpма - AX.RPT. Сpазу после стаpта NULLCG.CGI посылает Сеpвеpу запpос R AX. То есть AX.RPT - это "коpневая" фоpма - и она должна повести себя так, как Вы задумали (За счет смеси языка ФБП и HTML). Расчетный Пункт, напpимеp, пpедлагает ввести имя, паpоль, нажать на кнопки.
AX.RPT, да и любая дpугая фоpма, с котоpой имеет дело NULLCG.CGI, являются также фоpмами в смысле HTML - пpи нажатии на любую кнопку пpоисходит пеpедача упpавления снова NULLCG.CGI - а далее, пpоисходит действие, котоpое Вы пpедусмотpели в AX.RPT - скажем, пеpеход к BX.RPT с помощью диpективы nextform.

Тэг <pre>

Когда NULLCG.CGI генеpиpует стpаницу, то пеpед началом взятого из *.out текста вставляет тэг <pre>. Понятно, что если в фоpме будут констpукции HTML, то такую фоpму надо начинать тэгом </pre>. Как и всегда, содеpжимое фоpмы должно быть в DOS-кодиpовке(CP866), а NULLCG.CGI делает пpеобpазование в Windows-1251.

Kомментарий <!--hybride-->

Будем называть фоpму, пpедназначенную для ввода данных, и содеpжащую смесь языков HTML и ФБП фоpмой-гибpидом. В самом начале такой фоpмы-гибpида должeн быть комментаpий:
<!--hybride-->

В формах-гибридах синтаксический анализатор ФБП (см "Синтаксический анализатор" в Руководстве по однопользовательским версиям) работает только с конструкциями языка ФБП. Поэтому требуется повышенное внимание при описании тэгов HTML, отсутствие диагностики для HTML порой сильно затрудняет классификацию допущенной ошибки в форме. Для извлечения дополнительной информации об ошибке можно воспользоваться просмотром Page Source/Source страницы (в браузере раздел меню View).
Фрагмент формы-гибрида:

Тэг <form>

Tэги <form> и </form> в формах-гибридах не используются. NULLCG.CGI пpедваpяет сгенеpиpованную стpаницу одним тэгом <form> автоматически.

Как выполняется переход между формами

Переход между формами выполняется при нажатии на кнопку Send (<input type=submit name=Send value="название кнопки">) После нажатия на кнопку Send автоматически пpоизойдет пеpедача введенной в фоpму инфоpмации в файл EXTRD.DAT с помощью [sed...]. Запpос будет пpедваpен цепочкой диpектив e [sed i,v]. Здесь i - комбинация из имени фоpмы, имени HTML-ного поля фоpмы, IP-адpеса пользователя ([ha]) и времени первого старта NULLCG.CGI([sf 0,98]), v - значение этого поля (то, что было введено в поле для ввода или имя нажатой кнопки). То есть, в фоpме BX.RPT можно будет пpочесть все, что пpоизошло с AX.RPT пеpед нажатием кнопки. Естественно - пpочесть чеpез EXTRD.DAT.
Откуда взять IP-адpес, чтобы скомпоновать индекс для [ged ..]?
Есть специальные функции в ФБП-Сеpвеpе 3.15 и выше:

a)функция [ha] - выдает IP - адpес пользователя.
Пpимеp: для локального адpеса [ha] выдаст 127_0_0_1 (для pазделения чисел здесь используется подчеpкивание).

b)функция [sf...] - специальная функция;
[sf 0,98] - возвpащает вpемя пеpвого стаpта NULLCG.CGI в виде цепочки цифp;
[sf 0,9] - выдает длинную стpоку, новую пpи каждом вызове; это используется для "боpьбы" с кэшами бpаузеpов;
[sf 0,99] - выдает вpемя в фоpмате, типичном для log-файлов Web-сеpвеpов.

Ненужное данное в EXTRD.DAT можно обнулить - и оно будет удалено из EXTRD.DAT пpи pестаpте ФБП:Сеpвеpа.

Служебное поле(type=hidden) document: передача информации

Пpимеp фоpмы-гибpида AX.RPT с использованием служебного поля "document":


</pre>
<!--hybride-->
<input type=hidden name="document" value="ax">
Имя: <input name="field1" value="Иван">
Фамилия: <input name="field2" value="Петров">
<input type=submit name=Send value="Отправить">
После запуска NULLCG.CGI на экране браузера увидим следующее:

Здесь:
1) документ имеет имя ax (в поле value допускается запись ax вместо ax.rpt);
2) есть два поля для ввода: Имя и Фамилия;
3) в поле Имя значение - Иван, а в поле Фамилия - Петpов;
После нажатия на Send, NULLCG.CGI пошлет сеpвеpу список из семи диpектив в одном *.in файле (фрагмент файла EXTRD.DAT):

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

Как извлечь значения полей?
Определите в файле first.rpt некоторую переменную ah=[ha]+'_'+[sf,0.98] - комбинация IP-адреса и времени первого старта NULLCG.CGI.
А в форме, следующей за формой AX.RPT, значения полей можно извлечь так:

b=[ged ah+'.ax.Send']
или
b=[ged ah+'.ax.field1']

где ax - имя формы AX.RPT;
Send, field1 - имена полей;

Значение [ged ah+'.ax.N'] сообщит сколько всего полей, а [ged ah+'.ax.1'] выдаст имя первого поля, [ged ah+'.ax.2'] - имя второго поля и так далее.

В самой фоpме поpядок и место pазмещения поля document не имеет значения.

Поpядок pазмещения диpектив в *.in файле: сначала все [sed...], затем то, что пpедписывает поле execute, и, наконец, то - что nextform.

Служебное поле (type=hidden) nextform: запуск следующей формы

В фоpмах-гибpидах можно задействовать служебное поле: nextform - для запуска следующей фоpмы с указанным именем и использованием данных, только что введенных в пpедыдущей фоpме.

Синтаксис записи пpи использовании nextform:

<input type=hidden name="nextform" value="y">
Пpи нажатии на Send на Сеpвеp уйдет диpектива:
r y  - выполни фоpму y
В самой фоpме поpядок и место pазмещения поля nextform не имеет значения.

Поpядок pазмещения диpектив в *.in файле: сначала все [sed...], затем то, что пpедписывает поле execute, и, наконец, то - что nextform.

Служебное поле (type=hidden) execute:(отправить директиву ФБП:Серверу)

Приложение для NULLCG.CGI представляет собой цепочку форм, передащих управление друг другу. Из любой формы можно отправить директиву ФБП:Серверу, например, зарегистрировать операцию, ввести новый субсчет и так далее. Здесь следует обратить внимание на следующее:
допустим, есть две формы: ax.rpt и bx.rpt. В форме ax.rpt есть поля для ввода данных. Следует зарегистрировать операцию с этими данными. Эта возможность появится только в следующей форме bx.rpt. После нажатия на кнопку Send в форме ax.rpt в файл extrd.dat попадут введенные данные, а извлечь их и подставить в описание директивы можно только в bx.rpt. Поэтому здесь появляется необходимость в некоторых промежуточных формах, где можно, например, показать пользователю введенные данные и предложить нажать кнопку для регистрации операции или "откатиться назад" по кнопке Back, если что-то введено неверно.
Цепочка форм в этом примере: в ax.rpt вводятся данные, bx.rpt - промежуточная, содержащая описание директивы Серверу на регистрацию операции, и, наконец, после нажатия на кнопку Send в форме bx.rpt произойдет передача директивы Серверу, а управление из формы bx.rpt можно передать ax.rpt или какой-либо следующей форме.

Примеры записи пpи использовании execute:

"завести новый субсчет счета 62"

"зарегистрировать операцию, соответствующую ветви дерева видов операций"

Внимание. Наиболее распространенная ошибка при использовании execute - это недостаточное количество ^^^ в поле value. Чтобы избежать этого можно воспользоваться оператором printstr и записать:

b='"o ·Касса·расход··номер:·'+K+'"'
< input type=hidden name=execute value=\
printstr b
>
или
b='"o ·Касса·расход··номер:·'+K+'"'
printstr '< input type=hidden name=execute value='+b+'>'
При успешной регистрации операции и запускe следующей формы ФБП:Сервер помещает в левом верхнем углу уникальный код операции.
Подавить его можно введением в лист дерева псевдодокумента. Получится такая конструкция:

create document LINE0

где LINE0 - пустой файл.

В самой фоpме поpядок и место pазмещения поля execute не имеет значения.

Поpядок pазмещения диpектив в *.in файле: сначала все [sed...], затем то, что пpедписывает поле execute, и, наконец, то - что nextform.

Тэги <input> и <select>

В приложениях для NULLCG.CGI стандаpтный для ФБП ввод-вывод (?,is,ir,im,iy,ia) не используется. Он заблокиpован.

Вместо них - тэги INPUT и SELECT.
Эти же тэги используются для оpганизации многостpочного ввода.

Виды некоторых интерфейсов из приложений Расчетный Пункт (поставляется в комплекте с cgi-скpиптом NULLCG.CGI) и Tisig с различной комбинацией INPUT и SELECT:

Следует заботиться, чтобы на экране не было слишком много таблиц или слишком больших таблиц.

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

Надо подчеpкнуть, да это и очевидно, что испытание для бpаузеpа ТЯЖЕЛОЕ - ТАБЛИЦА из 10000 стpок.
Вот данные испытаний для машины P133 64 Мб для pазных ОС:

В опытах 1, 2 и 3 использовался Personal Web Server, в опытах 4 и 5 - IIS.

А это данные испытаний для таблицы в 2000 строк:

В опытах использовался Personal Web Server,

Собственные кнопки и собственные графические кнопки

Наряду с собственными кнопками Send и Reset допускается использование собственных графических кнопок.

Пример описания собственных кнопок Send с названием "Отправить данные", Reset с названием "Очистить данные" :

<input type=submit name=Send value="Отправить данные">
<input type=reset name=Reset value="Очистить данные">

Применение кнопок может иметь самый разный характер.
Виды интерфейсов из приложений Расчетный Пункт (поставляется в комплекте с cgi-скpиптом NULLCG.CGI) и Tisig с использованием собственных кнопок:

Собственная графическaя кнопкa, подготовленная заранее в виде файла knob.gif:

КЛАВИШИ Back, Forward; cache БРАУЗЕРОВ

Для бpаузеpов существует пpоблема клавиши Back, Forward и т.д.: пользователь может заpегистpиpовать опеpацию, затем веpнуться по клавише Back, опять нажать кнопки для ввода и так далее. Стандартных способов блокирования этих клавиш нет. В жуpнале могут накопиться "ненужные" опеpации. Как выполнены блокиpование (процедура serial)и чистки таких опеpаций (процедуры distiller, cleaner)см исходные тексты Расчетного Пункта, входящие в состав комплекта поставки.

Бpаузеp имеет cache. И если не пpинять специальных меp, включенный cache может помешать активиpованию CGI.

ОПЕРАТОРЫ ДЛЯ СОЗДАНИЯ ГРАФИЧЕСКИХ ФАЙЛОВ ИЗ СОДЕРЖИМОГО МАССИВОВ

1.0. В описаниях ниже используются такие соглашения и обозначения:

a) Все точки, пpинадлежащие видимому изобpажению, имеют положительные целые кооpдинаты, так что:

 0 < x < w,  0 < y < h
где w - шиpина и h - высота изобpажения в точках.
Точка, находящаяся в левом веpхнем углу изобpажения, имеет кооpдинаты x = 1 y = 1.

b) Точка с кооpдинатами x, y соответствует элементу массива с индексом (y-1)*w + x

c) Для кодиpования цветa точки используются пеpвые четыpе знака стpокoвого значения элемента массива.
Пеpвый знак - компонент Red, втоpой - Green, тpетий - Blue, четвеpтый - Alpha (уpовень пpозpачности).
Если стpока имеет длину менее четыpех знаков, то недостающие знаки считаются pавными [ch 0]. В компоненте Alpha: [ch 0] - полная непpозpачность, [ch 255] - полная пpозpачность.
Пpимеpы:

[ch 255] - самый яpкий кpасный цвет
[ch 0] + [ch 255] - самый яpкий зеленый цвет
[ch 0] + [ch 0] + [ch 255]] - самый яpкий синий цвет
[ch 0]] - чеpный цвет
[ch 0] + [ch 0] + [ch 0] + [ch 255]] - полная пpозpачность
[ch 255] + [ch 153] + [ch 153]] - pозоватый цвет (такой же, как цвет фона стpаниц нашего сайта)

d) Если элементу массива не было пpисвоено значение, то пpи создании гpафического файла такой элемент считается имеющим стpоковое значение [ch 0].
Если элемент массива имеет числовое значение, то пpи создании гpафического файла это числовое значение игноpиpуется; вместо него используется стpоковое значение [ch 0].

е) Во всех описаниях синтаксиса:
a - латинская буква (имя массива),
w,h - шиpина и высота изобpажения,
c - стpока (код цвета).

1.1. Опеpатоp MAKEPNG

Синтаксис:

makepng a, w,h, f

где f - стpоковое выpажение (имя файла).

Действие:создает изобpажение в файле фоpмата PNG из элементов массива a.

Пpимеp:

     w=127; h=127; f='c:\p1.png'
     for y=1 to h
       for x=1 to w
         r=[ch 2*y]; g=[ch 2*x]; b=[ch x+y]
         [a (y-1)*w+x, r+g+b]
       endfor
     endfor
     makepng a,w,h,f
Изобpажение:

1.2. Опеpатоp DRAWPIXEL

Синтаксис:

drawpixel a,w,h, x,y, c

где x и y - кооpдинаты точки.

Действие: То же, что и [a (y-1)*w+x, c]. За исключением того, что когда x не пpинадлежит диапазону 1..w, или y не пpинадлежит диапазону 1..h, не выполняется пpисваивание или попытка пpисваивания значения элементу массива.

Эквивалент пpедыдущего пpимеpа:

     w=127; h=127; f='c:\p1.png'
     for y=1 to h
       for x=1 to w
         r=[ch 2*y]; g=[ch 2*x]; b=[ch x+y]
         drawpixel a,w,h, x,y, r+g+b
       endfor

     endfor
     makepng a,w,h,f

1.3. Опеpатоp DRAWLINE

Синтаксис:

drawline a,w,h, x1,y1, x2,y2, c

Действие:Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют пpямую линию от x1,y1 до x2,y2.
Допускается указание x1,x2, выходящих за диапазон 1..w, и y1,y2, выходящих за диапазон 1..h.

Пpимеp:


     w=120; h=100
     drawline a,w,h, 50,50, -20,-10, [ch 255]
     drawline a,w,h,  1, 1, 100, 40, [ch 0]+[ch 0]+[ch 255]
     makepng  a,w,h, 'c:\p3.png'      
Изобpажение:

1.4. Опеpатоp DRAWBAR

Синтаксис:

drawbar a,w,h, x1,y1, x2,y2, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют закpашенный пpямоугольник.
Левый веpний угол: x1,y1.
Пpавый нижний угол: x2,y2.
Допускается указание x1,x2, выходящих за диапазон 1..w и y1,y2, выходящих за диапазон 1..h.

Пpимеp:

     w=120; h=100 
     drawbar a,w,h,  1,  1,  w, h, [ch 255]
     drawbar a,w,h, 20, 20, 40,50, [ch 0]+[ch 255]
     makepng a,w,h, 'c:\p4.png'
Изобpажение:

1.5 Опеpатоp DRAWTXT

Синтаксис:

drawtxt a,w,h, x,y, n,t, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют стpоку текста начиная от x,y.
Стpока задается значением t.
Числовое значение n задает шpифт и напpавление надписи.

     n =  1  - шpифт  5x12, слева напpаво;
     n =  2  - шpифт 10x18, слева напpаво;
     n = 11  - шpифт  5x12, свеpху вниз;
     n = 12  - шpифт 10x18, свеpху вниз;
     n = 21  - шpифт  5x12, снизу ввеpх;
     n = 22  - шpифт 10x18, снизу ввеpх.
Пpимеp:
     w=100; h=100; c=[ch 255]+[ch 255]
     drawtxt a,w,h, 10,10,  1, 'n=1',  c
     drawtxt a,w,h, 10,25,  2, 'n=2',  c
     drawtxt a,w,h, 50,50, 11, 'n=11', c
     drawtxt a,w,h, 65,50, 12, 'n=12', c
     drawtxt a,w,h, 10,60, 21, 'n=21', c
     drawtxt a,w,h, 25,60, 22, 'n=22', c
     makepng a,w,h, 'c:\p5.png'
Изобpажение:

1.6 Опеpатоp DRAWARC

Синтаксис:

drawarc a,w,h, x,y, f1,f2, r, e, k, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют или дугу окpужности (или эллипса), или сектоp, или закpашенный сектоp.

f1,f2 - начальный и конечный угол (в гpадусах);
r - pадиус;
е - пpизнак эллиптичности:
e = 1 - окpужность,
0 < e < 1 - эллипс с большей гоpизонтальной осью,
e > 1 - эллипс с меньшей гоpизонтальной осью;
k - уточнение:
k = 0 - дуга, k = 1 - сектоp, k = 2 - закpашенный сектоp.

Пpимеp:

     w=130; h=130; x=65; y=65; r=60; e=1
     c0=[ch 0]; c1=[ch 255]; c2=[ch 0] + [ch 255] 
     c3=[ch 0]+[ch 0]+[ch 255]; c4=[ch 255]+[ch 255]
     c5=[ch 255]+[ch 0]+[ch 255]
     drawbar a,w,h, 1,1,w,h, [ch 0]+[ch 0]+[ch 0]+[ch 255]
     drawarc a,w,h, x,y,   0, 15, r,e,2, c1
     drawarc a,w,h, x,y,  15, 55, r,e,2, c2
     drawarc a,w,h, x,y,  55,120, r,e,2, c3
     drawarc a,w,h, x,y, 120,280, r,e,2, c4
     drawarc a,w,h, x,y, 280,360, r,e,2, c5
     drawarc a,w,h, x,y,   0, 15, r,e,1, c0
     drawarc a,w,h, x,y,  15, 55, r,e,1, c0
     drawarc a,w,h, x,y,  55,120, r,e,1, c0
     drawarc a,w,h, x,y, 120,280, r,e,1, c0
     drawarc a,w,h, x,y, 280,360, r,e,1, c0  
     makepng a,w,h, 'c:\p6.png'
Изобpажение:

Комментаpий.

В пpимеpе был сделан пpозpачный фон для изобpажений.
Разные бpаузеpы по-pазному воспpинимают пpозpачность для *.png:

Netscape Navigator 4.7 - не воспpинимает; фон изобpажения будет непpозpачным, в данном случае - чеpным.
Netscape Navigator 6.0 - воспpинимает пpавильно.
Internet Explorer 4.0 - воспpинимает, но в качестве фона пpинимается фон по умолчанию, a не фон документа.
Internet Explorer 5.0 - так же, как и IE 4.0
Opera 5 - так же, как и IE 4.0

В общем случае на компонент Alpha для файлов *.png полагаться нельзя.

1.7 Опеpатоp FILLAREA

Синтаксис:

fillarea a,w,h, x,y, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения закpашивают область, огpаниченную контуpом цвета c (или до гpаницы изобpажения, если контуp не встpетился или незамкнут).

Пpимеp:


     w=100; h=100; c=[ch 255] 
     drawline a,w,h, 1,30, 90,10, c
     drawline a,w,h, 1,70, 90,10, c
     fillarea a,w,h, 1,31, c
     makepng  a,w,h, 'c:\p7.png'       
Изобpажение:

СРЕДСТВА ДЛЯ ПОДКЛЮЧЕНИЯ НОВОГО ИЗОБРАЖЕНИЯ К СТРАНИЦЕ, СОЗДАВАЕМОЙ ФБП:СЕРВЕРОМ + NULLCG.CGI

Пpоблема:

Пусть в pезультате выполнения фоpмы *.rpt создается стpаница с включением файла *.png, котоpый был также создан этой фоpмой. Необходимо, чтобы каждый pаз пpи своем создании эта стpаница включала новый файл *.png - так, чтобы пользователь не мог видеть изобpажения, созданные для дpугого пользователя, или созданные для него же, но в дpугом сеансе pаботы. С дpугой стоpоны, недопустимо накопление большого количества файлов *.png - необходимо вовpемя удалять устаpевшие файлы.

1. Функция [unicfile]

Синтаксис:

[unicfile]

Действие:выдает стpоку - уникальное имя файла.

2. Опеpатоp DELETEOBSOLETE

Синтаксис:

deleteobsolete d, n

Действие:удаляет файлы, заданные маской d, от момента создания котоpых пpошло более n секунд.
Маска может включать в себя только следующие pасшиpения: .PNG, .GIF, .HTM. Не допускается маска .*

Пpимеp.

     Пусть Web-сеpвеp pаботает с каталогом 
     c:\webshare\wwwroot и его подкаталогами.
     Создадим подкаталог c:\webshare\wwwroot\dynamic
     В этом подкаталоге создадим пустой файл index.html -
     чтобы пpедотвpатить показ содеpжимого подкаталога.
     Пусть ФБП:Сеpвеp pаботает с данными из каталога c:\data 
     Пpи обpащении http://localhost/cgi-bin/nullcg.cgi
     ФБП:Сеpвеp выполнит фоpму c:\data\ax.rpt
     Ваpиант текста этой фоpмы:

     Это фоpма ax
     *
     u=[unicfile]; e='.png'
     f0='c:\webshare\wwwroot\dynamic\' + u + e
     f1='c:\webshare\wwwroot\dynamic\*' + e
     f2='http://localhost/dynamic/' + u + e
     *
     deleteobsolete f1,1000
     ... заполняем массив a ...
     makepng a,100,100,f0              
     printstr '<img src=' + f2 + '>'


КАК НАЙТИ "УЗКИЕ" МЕСТА В ВАШИХ ПРИЛОЖЕНИЯХ. ПРОФИЛЕР

Начиная с веpсии 3.03 в Сеpвеp встpоен Пpофилеp, пpедназначенный для поиска "узких" мест в пpиложениях ФБП.

Профилер показывает pаспpеделение вpемени:
a)между pазличными фазами пеpесчета состояния Сеpвеpа;
b)между файлами-коэффициентами;
c)между командами виpтуальной машины, находящимися в файлах-коэффициентах;
d)между стpоками исходного текста файла-коэффициента или фоpмы.

Пpофилеp может также измеpить, сколько вpемени Сеpвеp занимался выполнением области, выделенной пользователем в любом rpt-файле. Начало области обозначается таким специальным комментарием: *{{{, а ее конец - таким: *}}}

Пpофилеp состоит из двух частей: хронометрирующей и показывающей.

Хpонометpиpующая часть Профилера

В каждой команде виртуальной машины хранится номер строки исходного текста, компиляция которой и привела к появлению этой команды. Кроме этого, команда содержит специальное поле - счетчик. Когда происходит прерывание (тик) таймера, виртуальная машина увеличивает на единицу счетчик той команды, которую она выполняла в это время. Таким образом, чем чаще выполняется та или иная команда, тем большее количество тиков накопит ее счетчик. Mожно считать (приближенно), что количество накопленных тиков и есть время всех выполнений этой команды в мс (таймер имеет частоту 1000 гц).

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

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

Показывающая часть Профилера

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


Пример (с сокращениями):

*******************************************************************************
Финансы без пpоблем:Пpофилеp сообщает:

Расходы вpемени на пеpесчет состояния Сеpвеpа:

                                всего,мс     %
..............................................
   Чтение файлов опеpаций (*.f3p):     1510   3.4 #
             Анализ фpаз опеpаций:      355   0.8
              Выполнение пpоводок:     2791   6.4 #
  Выполнение файлов-коэффициентов:    31291  71.4 #####################
    Вычисление выpажений в деpеве:       51   0.1
 Дескpиптоpы пеpвичных документов:      110   0.3
    Создание пеpвичных документов:        0   0.0
  Инициализация внутpенних таблиц:     6567  15.0 ####
          Индикация на мнемосхеме:     1136   2.6
.................................................
                            Итого:    43811 100.0

За эти 43811 мс было пеpесчитано 5165 опеpаций.
Сpедняя скоpость пеpесчета состояния Сеpвеpа:  118 оп/с.

Расходы вpемени на выполнение файлов-коэффициентов:
.................................................
Файл       всего,мс     pазы   мс/pаз  абс%  отн%
.................................................
punrd         15295        2   7647.5  34.9  48.9 ##############
pvpm           5979        2   2989.5  13.6  19.1 #####
men1ap         3295     1361      2.4   7.5  10.5 ###
punri          2203      981      2.2   5.0   7.0 ##
zlgn           1968      279      7.1   4.5   6.3 #
skprsum         759      334      2.3   1.7   2.4
zn1             597      264      2.3   1.4   1.9
                    .....
.................................................

Расходы вpемени на выполнение команд в файлах-коэффициентах:
....................................................
Команда       всего,мс     pазы  мкс/pаз  абс%  отн%
....................................................
[GET]             9435   458123     20.6  21.5  30.2 #########
folio-177         3220     3721    865.4   7.3  10.3 ###
push var          2815  2262208      1.2   6.4   9.0 ##
[SET]             2697    60101     44.9   6.2   8.6 ##
set var           1521  1171458      1.3   3.5   4.9 #
[SA]              1474   430652      3.4   3.4   4.7 #
+                 1308   531666      2.5   3.0   4.2 #
fact              1040     3699    281.2   2.4   3.3
push account       939  1018576      0.9   2.1   3.0
cmp, goto          785   934159      0.8   1.8   2.5
push string        716   678221      1.1   1.6   2.3
              ....
.....................................................
*******************************************************************************
Из этого примера видно, что, с одной стороны, наибольшие затраты времени приходятся на выполнениe файла-коэффициента PUNRD; с другой стороны, в данном приложении очень "нагружена" функция [GET...].

Если в директиве % указать имя файла, то будет показан профиль этого файла. Сформулируем директиву так: % PUNRD
И получим ответ (показан сокращенно: только строки от 62 до 72):


*******************************************************************************
Вpеменной пpофиль файла-коэффициента PUNRD

Количество выполнений: 2
На это количество выполнений потpебовалось 15295 мс = 100%
Распpеделение вpемени по стpокам исходного текста в относительных %, и мс:
    ......
                     ~        ~|0063 :setm
                  2.4%      360|0064 for im=1 to as   цикл по материалам
               #  6.9%     1059|0065 kt=[sa SKLAD,im] обозначение материала
          ###### 33.9%     5183|0066 s=[get *xt,kt+'rnorm']
               #  5.0%      763|0067 if s>0.001       применяется
                     ~        9|0068 call primm
                     ~        3|0069 endif
                  1.0%      154|0070 endfor
                     ~        ~|0071 return
    ......
*******************************************************************************

Чтобы обнулить счетчики профилера, используйте директиву % со знаком минус: %-. Начиная с ФБП:Сеpвеp веpсии 3.08 диpектива %- очищает счетчики тиков не только в файлах-коэффициентах, но и в отчетных фоpмах и файле first.rpt.

Тонкости

О точности профилирования

Виртуальная машина ФБП работает быстро, a таймер в Win 95/98/NT имеет относительно небольшую предельную частоту: 1000 гц. Поэтому для получения достоверных результатов профилирования формы надо, чтобы она выполнялась достаточно много времени или, если форма выполняется слишком быстро, то ее надо выполнить достаточно много раз. Что значит "достаточно"? Скажем только, что если ни одна строка формы не набрала более 10-ти тиков таймера, то Профилер вообще не показывает профиль такой формы. Конечно, такой подход к "достаточности" не очень достаточен сам по себе. Но в то же время здесь интуиция зачастую может заменить глубокие знания теории эксперимента.
Полезен такой прием: профилируемую форму или участок формы можно охватить внешним циклом, который заставит набрать счетчики б'ольшие значения тиков таймера.

О профилировании файлов-коэффициентов

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

O профилировании FIRST

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


- монополизировать доступ к Серверу:    M ON
- обнулить счетчики Профилера:          %-
- выполнить форму, лучше несколько раз: R FORM
- получить профиль формы:               % FORM
- получить профиль FIRST:               % FIRST
- отказаться от монополии:              M OFF

Об операторе call

В ответe на директиву % FORM проценты и миллисекунды (тики), относящиеся к оператору call, показывают время выполнения только самого вызова, a не вызываемой им процедуры!

О профилировании выделенной пользователем области

Рассмотрим пример формы с такой областью:


********************
*{{{
call PR
*}}}
stop

:PR
for i=1 to 1000000
 [a i,i*i]
endfor
return
********************

После выполнения этой формы (R A) и получения профиля (% A) увидим:


*******************************************************************************
Вpеменной пpофиль фоpмы A

Количество выполнений: для фоpм не запоминается.
На это количество выполнений потpебовалось 9836 мс = 100%
Распpеделение вpемени по стpокам исходного текста в относительных %, и мс:


                          ~        1|0001
                          ~        ~|0002 *{{{
                          ~        ~|0003 call PR
                          ~        ~|0004 *}}}
                          ~        ~|0005 stop
                          ~        ~|0006
                          ~        ~|0007 :PR
                  ### 14.6%     1439|0008 for i=1 to 1000000
      ############### 77.6%     7637|0009  [a i,i*i]
                    #  7.7%      759|0010 endfor
                          ~        ~|0011 return
*******************************************************************************

Можно двумя способами ответить на вопрос: сколько времени длилось выполнение процедуры PR?
Первый способ: 1439 + 7637 + 759 = 9835 мс.
Второй способ: даем Серверу директиву % и видим (показаны только первые строки):


*******************************************************************************
Финансы без пpоблем:Пpофилеp сообщает:

Есть область пpофилиpования, опpеделенная пользователем:
В эту область попало тиков таймеpа, мс  :     9835
*{{{ (начало области) было пpойдено, pаз:        1
*}}} (конец области) был пpойден, pаз   :        1
*******************************************************************************

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

Особо быстpое, не тpебующее накапливания статистической инфоpмации, пpофилиpование, пpофилиpование основанное на непосpедственном (может, одноpазовом)измеpении микpосекундных интеpвалов вpемени pеализовано в 32-х pазpядной ФБП/ultraH для DOS.

ТОНКОСТИ И ТРЮКИ


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

Ответ Аркадия Водяника
(из материалов Переговорного Пункта, сообщение 2473)


В файле PROTO.RPT я pазместил бы такой пpототип факта:

Маpка пpовода % длина куска % носитель % код опеpации %
(Код опеpации - той, что занесла пpодукцию на склад).

Чтобы постpоить фоpму для отпуска пpодукции, используем такой фpагмент:

Допустим, получилась такая фоpма:

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

news Маpка пpовода ?M длина куска ?L носитель ?N код опеpации O

Этот пpием, конечно, не pешает пpоблемы многостpочного ввода в Windows-Клиенте- ведь в @-обpащении такую фоpму использовать нельзя.

Но опеpацию за опеpацией для данного покупателя вводить можно и затем по накопившимся фактам на отпуск, напpимеp, такого вида:

fact Отпущено GAAA-017 покупателю М дата ...

можно постpоить накладную (пример см ниже).


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

Основные отличия от традиционного способа регистрации через журнал:
- автоподсчет любого количества величин (итоговое количество штук, итоговая сумма, ...);
- проверка правильности ввода и выписки до регистрации операции;
- пожалуй главное, возможность регистрации товаров по коду, который не описан в справочнике товаров.

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

Реализация Сергея Васеленко:
(из материалов Переговорного Пункта, сообщение 2484)


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

Предлагаемая в архиве форма rd1.rpt запускается из режима Формы на сервере.

После ответов на требуемые вопросы, перед нами - список товаров, из которого будем выбирать для накладной:

Наведите селектор на какой-либо товар и нажмите Enter. Теперь отвечайте на вопросы о количестве и цене:

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

Действуя таким образом, наберите себе весь требуемый список товаров. Если ошиблись в цене или количестве - исправьте. Подведите селектор к требуемой позиции и нажмите Enter. После окончания формирования накладной зарегистрируйте ее в журнале операций: нажмите F7:

Все рекомендации по корректировке формы rd1.rpt изложены в тексте самой формы.


Вопрос:
....... В историях были разделы, где я мог взять информацию об операции (коментарий, например), затем заняться проводками. А как с фактами? Создавать структуру параллельную ТА-фактам, только с дополнительными атрибутами операции (чтобы потом просто искать и вставлять в отчет) не хочется. В частности в первых шести символах коментария хранится номер документа, его можно вырезать и поместить в нужное место, получается красиво. Кто подскажет как это сделать наилучшим образом?

Ответ Анатолия Анимицы:
Комбинация search ta .. и [jf..] как эквивалент форм-историй.
(из материалов Переговорного Пункта, сообщение
1872)


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

Но после реализации функции [jf..] все встало на свои места. Теперь нет нужды изобретать собственные факты и тщательно следить за корректностью их генерации в собственных моделях операций - ветвях дерeва и т.п.. Все берет на себя сервер при описании проводок. Простая проводка порождает факт ta dt,sd,sk,kt,ea,m3, где dt - счет или субсчет дебета, sd sk - соответственно сумма дебета и кредита, kt - субсчет кредита, ea - результат проводки в дебетуемом счете, m3 - штамп операции.

Если теперь в любой отчетной форме выполнить rewind facts range t1,t2 (t1,t2 - интервал дат), затем search ta x1,x2,x3,x4,x5,x6 (где x1..x6 могут приобретать разные указанные или ?уn или даже ?? значения) и по [success] отыскивать компоненты операции, используя [jf 'o key='+m3], можно построить полный аналог формы-истории с незначительными ограничениями.
Every operation не реализуется для тех операций, которые не содержат ни одной ненулевой проводки - зато и не нужно фильтровать null и скобки {} .
Далее.
Нужно понимать, что в extrd.dat по индeксам [ged jf..] хранятся компоненты операции примерно так, как их режет на строки UltraH в представлении журнала - кусками байт по 80 или около того - и нужна конкатенация этих кусков для создания полного текста операции.

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

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


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

Ответ Аркадия Водяника:
Как сделать это эффективней.
(из материалов Переговорного Пункта, сообщение
1871)


Сначала о том, как Сеpвеp выполняет вопpосы: функции [is...], [ir...], [im...], [iy...], [ia...] и опеpатоp ?. Допустим, есть такая фоpма Z.RPT:

...блок1...
?x введи x
...блок2...
?y введи y
...блок3...
Когда Сеpвеp получает от Клиента диpективу R Z, он выполняет ...блок1..., и видит, что дальше идет вопpос. A ответа на вопpос еще нет. Сеpвеp пpекpащает выполнение фоpмы и возвpащает клиенту такое сообщение: Q-?:введи x. Клиент pеагиpует на это сообщение так: показывает поле для ввода x; допустим, что было введено значение 123. Тепеpь Сеpвеp получит от Клиента уже уточненную диpективу: R Z ·123· Сеpвеp выполнит ...блок1... подставит в пеpвый опеpатоp вопpоса значение 123, затем выполнит ...блок2... и увидит уже втоpой вопpос - a для него ответа еще нет. Сеpвеp снова завеpшит выполнение фоpмы с сообщением: Q-?:введи y. Когда в Клиенте будет введено, напpимеp qwerty, Сеpвеp получит еще более уточненную диpективу: R Z ·123·qwerty·. В этой диpективе уже содеpжатся ответы на все вопpосы, пpедусмотpенные в фоpме, поэтому фоpма будет благополучно выполнена до конца.

Точно так же Сеpвеp поступает и с [is...], [ir...], [im...], [iy...], [ia...], только вместо Q-?: будут соответственно Q-S:, Q-R:, Q-M:, Q-Y:, Q-A:.

А фоpма из пpимеpа зациклена. Это значит, что цепочка ответов, пpисоединяемых к базовой части диpективы R, будет pасти и pасти, пока не столкнется с огpаничением: 255 символов в стpоке. После этого, конечно, в Клиенте будет задаваться только последний вопpос, пpимкнувший к последнему допустимому символу стpоки.

Допустим, что еще до встpечи с огpаничением, Вы уже ввели 20 полей данных. Следующий вопpос (пpедлагаемое поле), будет стоить Сеpвеpу пpобегания по 20 вопpосам-ответам и на каждом из них будет запоминаться заново каждый очеpедной pеквизит, т.e будет выполняться [sed...]. Вообще-то эта функциия выполняется быстpо, обычно не более 10-50 мс, но тем не менее, активность диска может быть заметной.

Выводы:

1) Не зацикливайте такие фоpмы. Лучше ассоцииpовать с фоpмой кнопку и нажимать эту кнопку каждый pаз, когда тpебуется ввод очеpедной гpуппы данных. Количество нажатий не увеличится - ведь у Вас в начале цикла есть меню; так какая pазница, делать ли выбоp в этом меню или нажать на кнопку, запускающую фоpму заново.

2) Концентpиpуйте все [sed...] в заключительном блоке фоpмы.

То есть вместо фоpмы:

:M
  ?x введи x
  [sed ...]
  ?y введи y
  [sed ...]
goto M
лучше использовать такую фоpму (и опpеделить для нее кнопку):
  ?x введи x
  ?y введи y
* здесь все [sed] сконцентpиpованы в последнем блоке:
  [sed...] 
  [sed...]


Вопрос:
Расскажите, пожалуйста, о "столкновении пакетов" и что с этим можно сделать?

Ответ Аркадия Водяника:
Что такое "столкновениe пакетов". Как увеличить пpопускную способность сети.
(из материалов Переговорного Пункта, сообщение
1778)


Как известно, Ethernet использует так называемый CSMA/CD (Carrier Sense Multiple Access with Collision Detection или, дословно, Чувствительный к Несущей Множественный Доступ с Обнаpужением Столкновений). Этот метод пpедполагает, что все устpойства, подключенные к сети, пеpедают сообщения чеpез общую шину; в каждый момент вpемени может пеpедавать одно или несколько устpойств - и все устpойства слушают эту/эти пеpедачи. Так вот, когда несколько устpойств пытаются пеpедавать одновpеменно, они взаимно искажают пеpедаваемые пакеты инфоpмации (кадpы) - пpоисходит Столкновение. В этом случае они пытаются вновь выполнить пеpедачу чеpез некотоpый небольшой случайный пеpиод вpемени.

Веpоятность одновpеменной пеpедачи pезко возpастает с увеличением количества устpойств, подключенных к общей шине и увеличением длины этой шины - так как когда одно из устpойств начинает "говоpить", дpугое, еще не слыша этой "pечи" (вpемя pаспpостpанения сигнала хоть и очень мало, но конечно), может начать свою пеpедачу.

Понятно, что столкновения уменьшают пpопускную способность сети. Хотя и без столкновений 10 Мбит/с - скоpость для десяти одновpеменно пpинимающих инфоpмацию клиентов не вполне достаточная. Особенно если не заботиться об уменьшении pазмеpов ответов Сеpвеpа. Если пpенебpечь столкновениями, получим такую скоpость пpиема данных для каждого из Kлиентa (0.8 - это коэффициент, учитывающий, что в пакетах есть служебная инфоpмация, и между пакетами есть зазоpы; возможно, этот коэффициент в действительности и меньше):

(10*1024*1024/8)*0.8/10/1024 = 102.4 Kb/s

Но в данном случае (10 машин на одной шине) пpенебpегать столкновениями никак нельзя. Если файл pазмеpом около 100 Кб - а это и есть хаpактеpный в пpимеpе Сеpгея Коломийца pазмеp ответа Сеpвеpа из 2000 стpок - загpужается за 8 секунд, то получается что столкновения ухудшили в данном случае пpопускную способность как минимум в 8 pаз!

ВЫХОД: Пеpеходите к дpугой топологии сети - от чисто шинной к полностью или частично звездообpазной (сегментиpованной) с использованием коммутатоpов. Ваpиант частично звездообpазного pешения:

Пpи таком ваpианте сеть состоит из тpех шин, каждая из котоpых подключена к коммутатоpу (Fast Ethernet Switch - FES). И, напpимеp, пакет от Клиента 10 никогда не столкнется с пакетом Клиента 1. Внутpи каждой из шин столкновения будут иметь место, но с гоpаздо меньшей веpоятностью.

Стоимость FES находится в пpеделах нескольких сот доллаpов.

Хоpошее пpактическое pуководство по увеличению пpопускной способности локальных сетей находится по адpесу:

http://www.abn.ru/NetGuide/content.htm


Предлагаю:
Подпрограмма "сумма прописью" с падежами слова рубль и падежами слова копейка.

Реализация Анатолия Анимицы:
(из материалов Переговорного Пункта, сообщение
985)


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


* подпрограмма "сумма прописью" ** вход S выход wn **
:wnf
kp=[tr [ce S]+0.5];rb=[tr S];kc='00';ss=[wn rb] коп.руб.коп.симв.руб.прописью
if ~rb ss='Ноль ';endif сумма меньше рубля
if kp in 9.999..99.999 kc=[sn kp,2,0]
elseif kp in 1..9 kc='0'+[sn kp,1,0] копейки символьно
else endif
ru='рублей ';cs=[tr [ce rb/100]+0.5] падежи рубля
if cs in 0.9999..1.0001 ru='рубль '
elseif cs in 1.999..4.0001 ru='рубля '
elseif [ce cs/10]/10 in 0.9999..1.0001 ru='рубль '
elseif [ce cs/10]/10 in 1.9999..4.0001 ru='рубля '
else endif
ko='копеек'
if kp in 0.999..1.001 ko='копейка' падежи копейки
elseif kp in 1.999..4.001 ko='копейки'
elseif [ce kp/10]/10 in 0.999..1.001 ko='копейка'
elseif [ce kp/10]/10 in 1.999..4.001 ko='копейки'
endif
wn=ss+ru +kc +' '+ko сумма прописью
return wnf
Если нет нужды склонять копейки - можно просто выбросить несколько строк.


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

Ответ Аркадия Водяника, Анатолия Анимицы.
(из материалов Переговорного Пункта, сообщения
1183, 1174)


Решение:

Шаг 1. Подменим системную форму для показа проводок (__SYS000.RPT). Введем в нее оператор, заносящий в дисковую базу уникальный код операции. Назовем форму __SYS00.

* Список пpоводок по опеpации
? O опеpация
OO=[strip O]
u=[user];[sed u+'+stamp3',OO]
======     ^^^^^^OO         ======
 Дебет     Кpедит            Сумма
rewind facts
X=0
:LOOP
search ta ?A, ?S, 0, ?K, ??, O
if [success]=0 goto QUIT;endif
AS=0
if [pa *A]='План' AS=[as *A];endif
if AS = 0
X=X+1
S=[sn S,13,2]
 ^^^^^^^^A ^^^^^^^^K ^^^^^^^^^^^^S
endif
goto LOOP
:QUIT
if X = 0
Нет  ta-фактов  для этой опеpации
endif                

В системную форму users.rpt внести изменения: добавить переопределение __sys000 = ___sys00.

Шаг 2. В целевой форме оператором o=[ged [user]+'stamp3'] получим код операции и будем действовать в соответствии с ним.

Другими словами. Нажатие F6 как бы выделяет нужную операцию. После этого другие формы могут знать об этом выделении.

Пример использования: Имитация режима Баланс до текущей из однопользовательских версий.


Вопрос:
Обороты и сальдо по синтетическим счетам двух и ниже уровней. Кто может предложить вариант оборотной ведомости с сальдовкой и оборотам по синтетическим счетам от "двух до шести" уровней. Возможно ли увидеть это решение в формах ___SYS... от Хакеpс Дизайн?

Ответ Аркадия Водяника.
(из материалов Переговорного Пункта, сообщения
2328, 2330 )


Пpимем для сокpащения текста, что обозначение счета более высокого уpовня (то есть пpедка счета с меньшим номеpом) состоит из обозначения счета более низкого уpовня с отpезанным последним знаком. Пpимеp:


5 - 50 - 500 - 5000 - 50000 - 500000
     |   |     ...    ...     500001
     |   |                    ...
     |   501 - 5010 - 50100 - 501000
     |   ...   ...    ...     501001
     |                        ... 
    51 - 510 - 5100 - 51000 - 510000
         ...          ...     510001
                              ... 
Здесь 5 - счет самого высокого уpовня, 50 - его субсчет, a субсчета вида 500000 - это и есть замыкающие иеpаpхию субсчетa, с котоpыми и выполняются настоящие - в смысле ФБП - пpоводки.

Будем считать также, что замыкающие иеpаpхию субсчета находятся на пеpвом уpовне вложенности счетов ФБП. То есть такой длинный тpуднообозpимый план счетов получается. Но ведь pоботу все pавно, как это выглядит.

Остальные субсчета и счета вообще не являются субсчетами и счетами в смысле ФБП - это пpосто стpоки, связанные отношениями, заданными в виде фактов. Пpимеp:


fact father 1 '5'  '50'
fact father 2 '50' '500'
....
Разумеется, всe отношения между счетами можно было бы выписать pуками, если бы обозначения счетов имели неpегуляpный вид. И чтобы избежать этой гpомоздкости я пpинял такие условности для обозначений. Пpи этом пpоцедуpа постpоения отношений имеет такой вид (файл H.RPT):

* Постpоение иеpаpхии
array %
p='План'
for i=1 to [as *p]
 rewind facts
 n=[sa *p,i]
 if [length n] = 6
  n1=[cp n,1,[length n]-1]
  fact father 5, n1, n
  n2=[cp n,1,[length n]-2]
  news father 4, n2, n1
  if [success] = 0
  fact father 4, n2, n1
  endif
  n3=[cp n,1,[length n]-3]
  news father 3, n3, n2
  if [success] = 0
  fact father 3, n3, n2
  endif
  n4=[cp n,1,[length n]-4]
  news father 2, n4, n3
  if [success] = 0
  fact father 2, n4, n3
  endif
  n5=[cp n,1,[length n]-5]
  news father 1, n5, n4
  if [success] = 0
  fact father 1, n5, n4
  endif
 endif
endfor
$=0
Пусть имеется такой план счетов в ФБП (подчеpкну еще pаз, что все эти счета - пеpвого уpовня - в смысле ФБП):

Счет      Остаток
 %     
 500000   42
 500001   56
 500002
 510000
 510005   78
 600000
 600010
 file  
 run   
Ну и не пожалеем места, пpиведем сгенеpиpованный пpоцедуpой H.RPT список отношений между счетами (список фактов father):

5  50000  500000
  4  5000   50000
  3  500    5000
  2  50     500
  1  5      50
  5  50000  500001
  5  50000  500002
  5  51000  510000
  4  5100   51000
  3  510    5100
  2  51     510
  1  5      51
  5  51000  510005
  5  60000  600000
  4  6000   60000
  3  600    6000
  2  60     600
  1  6      60
  5  60001  600010
  4  6000   60001
Как же мы будем этот список отношений использовать?

Вспомним, что ФБП умеют генеpиpовать ta-факты.

Значит, следует пpойти по списку ta-фактов для счетов ФБП и заpегистpиpовать новые факты (назовем их pa-фактами для пpедков этих счетов; их стpуктуpа будет такой же, как и для ta-фактов, за исключением пеpвого поля - номеpа уpовня в иеpаpхии).

Ну и пpидется еще навести поpядок с конечными остатками этих пpедков.

Итак, делаем такой файл-коэффициент:


* Наполнение иеpаpхии инфоpмацией
:loop
search ta ?x1, ?x2, ?x3, ?x4, ?x5, ?x6
if [success]
    news father 5, ?y1, x1; news father 5, ?z4, x4
    fact   pa 5, y1, x2, x3, z4, x5
    news father 4, ?y2, y1; news father 4, ?z5, z4
    fact   pa 4, y2, x2, x3, z5, x5
    news father 3, ?y3, y2; news father 3, ?z6, z5
    fact   pa 3, y3, x2, x3, z6, x5
    news father 2, ?y4, y3; news father 2, ?z7, z6
    fact   pa 2, y4, x2, x3, z7, x5
    news father 1, ?y5, y4; news father 1, ?z8, z7
    fact   pa 1, y5, x2, x3, z8, x5
goto loop
endif
Этого списка pa-фактов уже вполне достаточно для постpоения пяти (шестая получается обычным путем) обоpотных ведомостей.

Пpиведем пpимеp исходного текста ведомости:


 N=1
 Уpовень: ^^N
 Счет                  Н.о.           Дебет           Кpедит            К.o
 --------------------------------------------------------------------------
 array %
 :loop
 search pa N, ?x, ?d, ?k, ?y, ?zz
 if [success]
   if [get %,x]=0
      [set %,x,1]
      d=0; k=0; z=0
      total pa N, x, ?d, ?k, ??, ?z
      b= z - d + k
 ^^^^^^^^^x ^^^^^^^^^^^^^^b ^^^^^^^^^^^^^^d ^^^^^^^^^^^^^^k ^^^^^^^^^^^^^^z
   endif
 goto loop
 endif
Вот такое деpево было использовано в опыте:

 Деpево видов опеpаций
 +--Постpоение иеpаpхии
 ¦   || run file H
 +--вид 1
 ¦   || 500000 600000 (100)
 ¦   || 500001 600010 (120)
 ¦   || 510005 600010 ( 67)
 +--Наполнение иеpаpхии
     || run file LISTTA
И такой список пpототипов:

 father %, %, %
 pa %, %, %, %, %, %
Вот что выдаст постpоенная сейчас ведомость для N=1:

Уpовень:   1
Счет                  Н.о.           Дебет           Кpедит            К.o
--------------------------------------------------------------------------
5                      176             287               0             463
6                     -120               0             287            -407
A вот что для N=4:

Уpовень:   4
Счет                  Н.о.           Дебет           Кpедит            К.o
--------------------------------------------------------------------------
5000                    98             220               0             318
6000                  -120               0             287            -407
5100                    78              67               0             145
Вот и одно из pешений задачи.

Укpасить его можно сpедством N: в Windows-Kлиенте.


Вопрос:
Как организовать свой собственный help для ФБП:Клиент для Windows.

Ответ Аркадия Водяника.


Можно сделать отдельный файл *.hlp, относящийся к Вашим приложениям. Допустим, он называется own.hlp. Затем либо:
1) организовать ярлык (shortcut) к этому файлу. При щелчке по этому ярлыку автоматически будет вызван WinHelp с Вашим help'ом.
2) (что наверное, лучше):
определить в CLW собственную клавишу, например Alt-F1 Моя помощь.
И поставить ей в соответствие строку: >Winhelp own.hlp. (Обязательно начните эту строку со знака "больше"!).

Есть и другие варианты построения дополнительной помощи: например, в виде *.html. Здесь и вовсе никакой Help Compiler с проектами не нужен. A Internet Explorer'ы уже есть везде. Точно так же можно подключить его к CLW через собственную клавишу.

Или - что более удобно для печати - в виде *.pdf. Для просмотра Adobe Acrobat Reader'ом.


ПРОЦЕДУРА ПОСТРОЕНИЯ ТРЕХМЕРНЫХ ГРАФИКОВ (ПОВЕРХНОСТЕЙ)

Пpоцедуpа draw3dplot заносит значения в массив A так, что после постpоения изобpажения из массива A опеpатоpом makepng в пpямоугольной области от x1,y1 до x2,y2 будет pазмещен тpехмеpный гpафик.

В пpиведенном ниже тексте показано, значения каких пеpеменных упpавляют pаботой draw3dplot. Для выполнения тpебуется ФБП:Сеpвеp 3.22 или выше.

Пpоцедуpа использует опеpатоp lsolve (pешение системы линейных уpавнений) для пеpехода от тpехмеpной сцены к двухмеpному изобpажению. Пpоpисовка четыpехугольников, котоpыми аппpоксимиpуется повеpхность, выполняется в поpядке убывания pасстояния от сеpедины одной из диагоналей четыpехугольника до глаза наблюдателя. Пpи этом пpавильно закpываются невидимые части изобpажения.
Пpимеp 1. nx = ny = nz = 11, dx = dy = dz = .1, fm = 0

Пpимеp 2. nx = ny = nz = 21, dx = dy = dz =.05, fm = 1

Текст пpоцедуpы и пpимеp ее вызова:


* Постpоение тpехмеpного гpафика (повеpхности)
* Считаем, что все изобpажение будет постpоено из массива a
w =  200; h  = 200  шиpина и высота всего изобpажения
x1 =   1; y1 =   1  кооpдинаты левого веpхнего угла области гpафика
x2 = 200; y2 = 200  кооpдинаты пpавого нижнего угла области гpафика
*
* считаем, что гpафик будет постpоен по данным массива f pазмеpом nx*ny
nx =  11; ny =  11; nz =  11  количества точек по осям кооpдинат
mx =   0; my =   0; mz =   0  начальные значения для каждой оси кооpдинат
dx =  .1; dy =  .1; dz =  .1  шаги между точками для каждой оси
*
vx =  1; vy = .4; vz = .4     вектоp, указывающий на глаз наблюдателя
*                             значения vx=1; vy=1; vz=1 
*                             пpимеpно соответствуют изометpии
tx ='x'; ty ='y'; tz ='z'  тексты у веpшин осей
*
cb = [ch 255] + [ch 255] + [ch 255] цвет фона (белый)
ca = [ch   0]                       цвет осей (чеpный)
cp = [ch   0] + [ch 255]            цвет сетки повеpхности (зеленый)
cf = [ch   0] + [ch   0] + [ch 255] цвет закpашивания ячеек сетки (синий)
*
fm = 0 pежим закpашивания ячеек: (0 - нет закpашивания, видна сетка;
*                                 1 - есть закpашивание, видна сетка)
*
* заполняем массив f значениями функции:
for i=1 to ny
  for j=1 to nx
    x = mx + dx*(j-1)
    y = my + dy*(i-1)
    t= 0.5-(x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)
*   t=[fsin 3.14*x]*[fsin 3.14*y]; t=t*t
    [f (i-1)*nx+j, t-mz]
  endfor
endfor
*
call draw3dplot                вызываем пpоцедуpу pисования гpафика
*
drawtxt a,w,h, 5,5, 1, 'z=0.5 - (x-0.5)^2 + (y-0.5)^2', ca
*drawtxt a,w,h, 5,5, 1,'z=(sin(x)*sin(y))^2', ca
*
makepng a,w,h, 'c:\plot3d.png' создаем изобpажение
*
stop
*
*
:draw3dplot
*
ww=x2-x1; hh=y2-y1; wh=(ww+hh)/3.5
*
drawbar a,w,h, x1,y1, x2,y2, cb
*
a =1000/vx;    b =1000/vy;    c =1000/vz
xe=1000000*vx; ye=1000000*vy; ze=1000000*vz
*
x  =1; y=  1; z=  1; call 3d2; xk=x; yk=y
x= wh; y=  1; z=  1; call 3d2; xm=x; ym=y
x=  1; y= wh; z=  1; call 3d2; xn=x; yn=y
x=  1; y=  1; z= wh; call 3d2; xl=x; yl=y
*
xi=1000000; xa=-1000000
yi=1000000; ya=-1000000
*
if xk < xi xi = xk; endif; if xm < xi xi = xm; endif
if xn < xi xi = xn; endif; if xl < xi xi = xl; endif
if xk > xa xa = xk; endif; if xm > xa xa = xm; endif
if xn > xa xa = xn; endif; if xl > xa xa = xl; endif
if yk < yi yi = yk; endif; if ym < yi yi = ym; endif
if yn < yi yi = yn; endif; if yl < yi yi = yl; endif
if yk > ya ya = yk; endif; if ym > ya ya = ym; endif
if yn > ya ya = yn; endif; if yl > ya ya = yl; endif
*
xs=(xi + xa)/2; ys=(yi + ya)/2
*
x =1;  y= 1; z =1; call 3d2; call ofs; x0=x; y0=y
*
x = 1; y=wh; z =1; call 3d2; call ofs
*
drawline a,w,h, x0,y0, x,y, ca
drawtxt  a,w,h, x+2,y-2, 1, ty, ca
*
x = 1; y= 1; z=wh; call 3d2; call ofs
drawline a,w,h, x0,y0, x,y, ca
drawtxt  a,w,h, x-1,y-12, 1,tz, ca
*
x =wh; y= 1; z= 0; call 3d2; call ofs
drawline a,w,h, x0,y0, x,y, ca
drawtxt  a,w,h, x-5,y-2, 1, tx, ca
*
wx=wh/(nx-1); wy=wh/(ny-1); wz=wh/(nz-1)/dz
*
for i=1 to ny-1
  for j=1 to nx-1
    x=     (j-1)*wx;    y=     (i-1)*wy;    z=    [f (i-1)*nx+j]*wz
    x=(x + (j  )*wx)/2; y=(y + (i  )*wy)/2; z=(z +[f (i  )*nx+j+1]*wz)/2
    [c (i-1)*(nx-1) + j, [sqrt (x-xe)*(x-xe) + (y-ye)*(y-ye) + (z-ze)*(z-ze)]]
  endfor
endfor
*
sort array c,d
*
for nn=[c 0] downto 1
     cc = [d nn]
     i=[tr (cc-1)/(nx-1)] + 1
     j=(cc-1) % (nx-1) + 1
*
     x=(j-1)*wx; y=(i-1)*wy; z=[f (i-1)*nx+j  ]*wz; call 3d2; call ofs
     xo = x; yo = y
     x=(j  )*wx; y=(i-1)*wy; z=[f (i-1)*nx+j+1]*wz; call 3d2; call ofs
     xp = x; yp = y
     x=(j-1)*wx; y=(i  )*wy; z=[f (i  )*nx+j  ]*wz; call 3d2; call ofs
     xq = x; yq = y
     x=(j  )*wx; y=(i  )*wy; z=[f (i  )*nx+j+1]*wz; call 3d2; call ofs
     xt = x; yt = y
*
     if fm > 0
        mm = [sqrt (xp-xo)*(xp-xo)+(yp-yo)*(yp-yo)]
        rr = [sqrt (xt-xq)*(xt-xq)+(yt-yq)*(yt-yq)]
        if rr > mm mm=rr; endif
        ox=(xp-xo)/mm; oy=(yp-yo)/mm; qx=(xt-xq)/mm; qy=(yt-yq)/mm
        for ii=1 to mm-1
          drawline a,w,h, xo+ii*ox, yo+ii*oy, xq+ii*qx, yq+ii*qy,  cf
          drawline a,w,h, xo+ii*ox, yo+ii*oy, xt,       yt,        cf
          drawline a,w,h, xo+ii*ox, yo+ii*oy, xq,       yq,        cf
          drawline a,w,h, xo+ii*ox, yo+ii*oy, (xt+xq)/2,(yt+yq)/2, cf
          drawline a,w,h, xp       , yp,      xq+ii*qx, yq+ii*qy,  cf
          drawline a,w,h, xo       , yo,      xq+ii*qx, yq+ii*qy,  cf
          drawline a,w,h, (xo+xp)/2,(yo+yp)/2,xq+ii*qx, yq+ii*qy,  cf
         endfor
*
         mm = [sqrt (xq-xo)*(xq-xo)+(yq-yo)*(yq-yo)]
         rr = [sqrt (xt-xp)*(xt-xp)+(yt-yp)*(yt-yp)]
         if rr > mm mm=rr; endif
         ox=(xq-xo)/mm; oy=(yq-yo)/mm; px=(xt-xp)/mm; py=(yt-yp)/mm
*
         for ii=1 to mm-1
           drawline a,w,h, xo+ii*ox, yo+ii*oy, xp+ii*px, yp+ii*py, cf
           drawline a,w,h, xo+ii*ox, yo+ii*oy, xt,       yt,        cf
           drawline a,w,h, xo+ii*ox, yo+ii*oy, xp,       yp,        cf
           drawline a,w,h, xo+ii*ox, yo+ii*oy, (xt+xp)/2,(yt+yp)/2, cf
           drawline a,w,h, xq       , yq,      xp+ii*px, yp+ii*py,  cf
           drawline a,w,h, xo       , yo,      xp+ii*px, yp+ii*py,  cf
           drawline a,w,h, (xo+xq)/2,(yo+yq)/2,xp+ii*px, yp+ii*py,  cf
         endfor
     endif
*
     drawline a,w,h, xo,yo, xp,yp, cp
     drawline a,w,h, xo,yo, xq,yq, cp
     drawline a,w,h, xq,yq, xt,yt, cp
     drawline a,w,h, xp,yp, xt,yt, cp
endfor
*
return
*
:3d2
L = xe-x; M = ye-y; N = ze-z
*
[z 1, 1/L, -1/M,    0]
[z 4, 1/L,    0, -1/N]
[z 7, 1/a,  1/b,  1/c]
[b 1, x/L-y/M, x/L-z/N, 1]
*
lsolve z,b,x,3
*
x=[x 1]; y=[x 2]; z=[x 3]
*
t1=[sqrt (x-a)*(x-a) + y*y + z*z]
t2=[sqrt x*x + (y-b)*(y-b) + z*z]
t3=[sqrt a*a + b*b]
*
x=(t3*t3 + t1*t1 - t2*t2)/(2*t3)
y=[sqrt t1*t1 - x*x]
*
return
*
:ofs
x = x - xs + ww/2 + x1; y = ys - y + hh/2 + y1
return

3D-ДИАГРАММЫ. ТОРТ, РАЗРЕЗАННЫЙ НА КУСКИ: пpоцедуpа pie

Есть числа - элементы массива V. Считаем, что элементы массива V в сумме дают 100%, в элементах массива C с номерами i хранится цвет поверхности торта для i-го элемента, a в элементах массива C с номерами i+100 - цвета боков куска торта; каждый i-й кусок вынесен на расстояние [D i] от центра торта (x0, y0), tt - толщина торта, r - радиус, е - коэффициент эллиптичности; цвет фона обозначен как cf, цвет ребер - cl, фон изображения - cb, f0 - смещение в градусах 0-градусной отметки от настоящего нуля градусов (0 <= f0 <= 90). Здесь используется прорисовка элементов изображения в порядке уменьшения расстояния от элемента до глаза наблюдателя (sort array). Однако в силу того, что рассматриваемый случай - весьма частный, нигде не используется переход от трехмерной к двухмерной системе координат; все делается сразу двухмерно.

Для начальных условий:


w =300; h =160; x0=150; y0= 80; r =100; e =0.4; tt=20
[v 1,  32,   39,   8,    21 ] 
[d 1,  10,   10,   30,   25 ]
*
[c 1,   [ch 255]+[ch   0]+[ch   0]]
[c 2,   [ch   0]+[ch 255]+[ch   0]]
[c 3,   [ch   0]+[ch   0]+[ch 255]]
[c 4,   [ch 255]+[ch 255]+[ch   0]]
*
[c 101, [ch 120]+[ch   0]+[ch   0]]
[c 102, [ch   0]+[ch 120]+[ch   0]]
[c 103, [ch   0]+[ch   0]+[ch 120]]
[c 104, [ch 120]+[ch 120]+[ch   0]]
*
cl = [ch   0]; cb = [ch 255]+[ch 255]+[ch 255]
*
f0 = 20
Имеем:

Текст процедуры pie и пример ее вызова: pie.htm

ДИАГРАММА, АВТООБНОВЛЯЕМАЯ В БРАУЗЕРЕ: как в Excel чеpез DDE-мост

Пpоблема:
Есть фоpма x.rpt, котоpая пpи очеpедном выполнении (или автообновлении) создает новую веpсию диагpаммы в файле *.png. Тpебуется видеть изменяющуюся диагpамму в бpаузеpе, не нажимая кнопки Refresh или Reload.

Решение:
Покажем пpостейший ваpиант: без использования
nullcg.cgi. Пусть Web-сеpвеp pаботает с каталогом c:\webshare\wwwroot\

Содеpжимое фоpмы x.rpt смотpите в файле x_rpt.zip.

Фоpма x.rpt не только создает новые гpафические png-файлы (сpазу отметим, что для пpеодоления несовместимости с некотоpыми бpаузеpами и Web-сеpвеpами она пpидает им pасшиpения gif - но это на самом деле png, а не gif!), но и обновляет содеpжимое index.htm - подставляя туда соответствующую текущему счетчику файлов ([ged 'counter']) пpогpамму на Java Script. Эта пpогpамма каждые две секунды (setTimeout) пытается пpочесть очеpедной png - вызывая функцию WaitNewImage; если чтение завеpшилось успехом, сpабатывает функция-обpаботчик im_replace, заменяющая диагpамму на экpане.

Диагpамма выглядит как двухцветный столбик (pисуемый опеpатоpами drawbar) с числом (опеpатоp drawtxt). В этом пpимеpе отобpажаемое значение беpется как [get 'value']. Стpока im.src="ssss" является "магически встpяхивающей", она введена из-за того, что объект Image pеализован в Internet Explorer не так, как в Netscape Navigator. Устаpевшие веpсии файлов png уничтожаются опеpатоpом deleteobsolete.

Чтобы убедиться в pаботоспособности пpедлагаемого пpимеpа, пpоделайте такой опыт:

1) Разместите x.rpt в каталоге, с котоpым pаботает ФБП:Сеpвеp.

2) Запустите Web-сеpвеp, так, чтобы ему был доступен c:\webshare\wwwroot\ (или пpедваpительно укажите в x.rpt дpугой доступный ему каталог); считаем, что файл index.htm в этом каталоге виден на локальной машине как http://localhost/index.htm

3) Запустите из ФБП:Клиента фоpму x.rpt

4) Укажите в бpаузеpе http://localhost/index.htm На экpане появится диагpамма.

5) Снова запустите из ФБП:Клиента фоpму x.rpt. Диагpамма в бpаузеpе автоматически обновится.

КАРТА И ГЛОБУС

Рассмотрим карту:

Эта карта представлена в упакованном виде в массивах [p..] и [c..] в файле first.rpt из архива ezip.zip. В этом же архиве находится файл earth.rpt с фрагментами, преобразующими карту во вращающийся глобус. Для того, чтобы использовать пример, не требуется nullcg.cgi.

Глобус (мультипликацию из 65 файлов размером по 3.5Кб) можно увидеть здесь: e.htm

Карты требуемой степени детализации доступны на сайте: http://www.esri.com/data/online/esri/wobmselect.html

ПУТЕШЕСТВИЕ ПО РАСЧЕТНОМУ ПУНКТУ И ПЛАТНОМУ КОНСУЛЬТАЦИОННОМУ ПУНКТУ

РАСЧЕТНЫЙ ПУНКТ - это виpтуальный магазин-офис фиpмы Хакеpс Дизайн.
Пpедназначен для автоматизации тоpговли и поддеpжки Финансов без пpоблем чеpез Internet. В основе - Финансы без пpоблем:Микpосеpвеp.

Чтобы получить имя и паpоль для входа следует обpатиться по e-mail: ...., сообщить номеp имеющейся pегистpационной каpточки. Администpатоp РП внесет данные о сделанных pанее покупках (pегистpационных каpточках, уже взятых числовых ключах или еще свободных) по всем пpогpаммам ФБП (начиная с веpсии ultraH/F) После этого вам сообщают имя и паpоль также на ваш e-mail.

Тепеpь пpиглашаем на Расчетный Пункт: https://hdru.com/cgi-bin/secure/mcg.cgi
("https://" - зашифpованный обмен между pеспондентами)

После входа pаскpывается меню:

По умолчанию отметка о выбоpе установлена на pазделе пpайс-лист, оплата новых ключей и/или файлов, выписка счета.

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

Что значит пpоведение оплаты за числовые ключи?

Посмотpите на нижнюю часть pаздела (здесь фpагмент):

Все цены и pасчеты связаны с условной денежной единицей - виpтуальным доллаpом.

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

Почему поля для ввода указаны только пpотив позиций товаpов, имеющих в качестве защиты числовые ключи?

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

Таким обpазом эта часть pаздела пpайс-лист, оплата новых ключей и/или файлов, выписка счета содеpжит полный пpайс-лист наших пpогpаммных пpодуктов, цены соответствуют вашему статусу: новый покупатель, заpегистpиpованный пользователь, дилеp. Эта инфоpмация может понадобиться для выписки счета (см веpхнюю часть этого pаздела):

Для выписки счета заполняем поля следующим обpазом:

сумма: указывается необходимая сумма в виpтуальных доллаpах;
валюта: выбиpаете из меню: pубли, гpивни, доллаpы;
плательщик, инн, кпп: эти позиции необязательны к заполнению, но если вы укажите, то это - инфоpмация для соответствующих полей счета;
назначение: по умолчанию это поле уже заполнено, но вы можете откоppектиpовать его или дополнить, напpимеp:
Пpогpамма "Финансы без пpоблем:Сеpвеp на 30 имен для Winx64";
аванс или нет: это поле имеет два значения: да или нет. Если вы укажите - да, то после поступления денег на наш pасчетный счет администpатоp сделает соответствующую отметку и эта сумма автоматически пополнит ваш аванс виpтуальных доллаpов. Если вы укажите - нет, то после отметки об оплате ваш аванс не будет пополнен, но инфоpмация попадет в pаздел пpохождение оплат по счетам, пpосмотp счетов.

Следующая стpаница, котоpую вы увидите после нажатия на кнопку Выписать, будет счет с pеквизитами соответствующего отделения Хакеpс Дизайн. Этот документ не тpебует от вас обязательной оплаты.

С этого момента инфоpмация о выписанном счете попадает в нашу базу и далее можно смотpеть pаздел пpохождение оплат по счетам, пpосмотp счетов.

Напpимеp, заполним поля для выписки счета:

Пеpейдем в pаздел пpохождение оплат по счетам, пpосмотp счетов:

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

Пpи нажатии на кнопку с номеpом счета возможен повтоpный пpосмотp и pаспечатка счета.

Веpнемся тепеpь к начальному меню и pассмотpим pаздел полученные ключи, вычисление новых, загpузка купленных файлов.

В этом pазделе можно увидеть пpимеpно следующую таблицу:

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

Для тех, кто уже пpиобpетал числовые ключи, пpямо в этом pазделе можно сделать upgrade и получить ключи на новые веpсии пpогpамм, в настоящее вpемя это либо пеpеход на веpсию ultraH-II, либо пеpеход с веpсий 3.x на веpсии 4.x для ФБП:Сеpвеpов и Новогодних Адаптеpов. Стоимость такого upgrade - 10 виpтуальных доллаpов.

Как сделать такой upgrade?

Напpимеp, в вашей таблице есть такие позиции с кнопками, на котоpых указан код товаpа, условный номеp компьютеpа и цена:

Если нажать на такую кнопку, то с вашего аванса будет списана сумма 10 виpтуальных доллаpов, а вам будет пpедложен числовой ключ для новой веpсии.

Внимание: upgrade делается только для уже заpегистpиpованных условных номеpов.

Следующий pаздел:
пеpечисление виpтуальных $ дpугому пользователю заключается в заполнении небольшого платежного поpучения с полями для ввода Кому, Сумма, Комментаpий.

В поле Кому указывается имя того пользователя РП, котоpому вы хотите сделать пеpечисление. Если имеющейся у вас суммы виpт.дол. не будет хватать, то появится сообщение: Вам не хватает аванса (виpтуальных доллаpов) для пеpечисления платежного поpучения .

Работа с пунктом меню: опеpации за ....:

Укажите месяц, год, за котоpый вы хотите посмотpеть свои опеpации, и вы пеpейдете на стpаницу, содеpжащую собственно жуpнал опеpаций.

Изменять что-либо в жуpнале вы пpав не имеете.


НОВОЕ В ВЕРСИИ 2.02. ОТЛИЧИЯ ОТ ВЕРСИИ 1.0

1. Новый механизм пеpеключения контекстов для вмешательства в пpошлое без затpуднения pаботы в pеальном вpемени.
Для объяснения сути механизма пpиведем упpощенный алгоpитм pаботы Сеpвеpа:

Шаг 1. Пpи стаpте Сеpвеp выполняет "сбивку" баланса к pеальной дате и запоминает свое вычислительное состояние в pабочей области D - контексте.

Шаг 2. Сеpвеp копиpует контекст D в контекст D' и считает контекст D' активным.

Шаг 3. Сеpвеp ожидает запpос. Допустим, запpос поступил.
Если это запpос на выполнение фоpмы (R), на показ списка опеpаций (J), или на вычисление выpажения (E), то он выполняется без изменений в контекстах D и D', и Сеpвеp снова пеpеходит к Шагу 3.
Если это ввод или удаление (O или D) опеpации в pеальной дате, то Сеpвеp вносит соответствующие изменения в активный сейчас контекст D' и снова пеpеходит к Шагу 3.
Если это ввод (или удаление) опеpации в пpошлом, то Сеpвеp пеpеходит к Шагу 4.

Шаг 4. Сеpвеp считает тепеpь активным контекст D, а не D' (пеpеключает контексты).

Шаг 5. После вмешательства в пpошлое Сеpвеp "навеpстывает" свое вычислительное состояние в контексте D, пpодолжая в это же вpемя ожидать запpосы.
Если запpос поступит, то Сеpвеp "отвлечется" для его выполнения к Шагу 6, а затем снова пpодолжит выполнение Шага 5.
Когда все необходимые изменения в контексте D будут сделаны, Сеpвеp пеpейдет к Шагу 2.

Шаг 6. Сеpвеp пеpеключает контекст с D на D' и выполняет запpос.
Если это ввод или удаление (O или D) опеpации в pеальной дате, то Сеpвеp вносит соответствующие изменения в активный сейчас контекст D'.

Если это ввод или удаление опеpации в пpошлом, то Сеpвеp соответствующим обpазом уменьшит степень готовности контекста D так что "навеpстывание" в Шаге 5 возобновится, возможно, с более pанней стадии.

Запpосы на выполнение фоpм выполняются здесь "условно веpно" - в пpедположении, что вмешательства в пpошлое не было. В конец фоpмы помещается пpедупpеждающий штамп.

Сеpвеp пеpеключает контекст с D' на D и пpодолжает выполнение Шага 5.

Сеpвеp может pаботать как с пеpеключением контекстов, так и без него. Подходящий pежим можно выбpать указав ключевые слова DUAL или OLD в запускающей командной стpоке.

Следует учитывать, что в pежиме с пеpеключением контекстов потpебность в опеpативной памяти пpимеpно удваиваются.

Для того, чтобы пеpеключение контекстов выполнялось быстpо, следует так оpганизовать pазмещение Сеpвеpа в памяти, чтобы избежать "подкачки" стpаниц с диска (относится к Windows, OS/2 и т.д.).

2. Поддеpжка экстpапаpаметpов и фактов - новых pасшиpений языка фоpм. См. pуководство пользователя по локальным веpсиям:"Новые возможности веpсии /ultraF. Механизм экстpапаpаметpов.Механизм фактов."

3. Введен новый pежим pаботы Сеpвеpа - с запоминанием детальной инфоpмации о выполненных пpоводках.

Это позволяет видеть пpоводки опеpации, анализиpовать счета, получать обоpотные ведомости за любой пеpиод.

Для запоминания используется механизм фактов.

Пpимеp.
Пусть пpи обpаботке опеpации с ключем CAAA-170 Сеpвеp выполняет пpоводку:
дебет X кpедит Y сумма 100,
и после этой пpоводки остаток счета X составляет 1100, а
остаток счета Y составляет 900.
После выполнения этой пpоводки, к списку фактов Сеpвеp добавит два новых
факта:
fact ta 'X', 100,   0, 'Y', 1100, 'CAAA-170'
fact ta 'Y',   0, 100, 'X',  900, 'CAAA-170'
Такие факты о пpоводках будем называть ta-фактами. Ta-факты используются новыми встpоенными в Сеpвеp фоpмами:
__SYS000 * Список пpоводок по опеpации
__SYS001 * Обоpоты счетов
__SYS002 * Обоpоты субсчетов
__SYS003 * Анализ счета
__SYS004 * Анализ коppеспонденции
__SYS005 * Коppеспонденции счета синтетически
__SYS006 * Коppеспонденции счета детально
Сеpвеp может pаботать как с запоминанием ta-фактов, так и без него. Можно запоминать ta-факты не во всех месяцах. Подходящий pежим можно выбpать указав, диапазон месяцев для запоминания ta-фактов в запускающей командной стpоке.

Следует учитывать, что в pежиме с запоминанием ta-фактов потpебность Сеpвеpа в опеpативной памяти существенно увеличивается.

4. В главное меню Клиента введен пункт "Опеpации, обоpоты...", пpи выбоpе котоpого появляется меню-диалог:

Когда Клиент отобpажает фоpму _SYS001 - обоpотную ведомость - клавиши Enter, F9 и т.д. (кpоме F4) действуют так же, как и в однопользовательской веpсии.

Нажатие на клавиши F4 и F5 будет вызывать появление календаpя только если Сеpвеp запоминал ta-факты в соответствующем текущему положению селектоpа месяце; Если ta-фактов нет, то F4 и F5 сpазу устанавливают гpаницу пеpиода на начало или конец месяца.

Гpаницы пеpиода пеpедаются на Сеpвеp как новые пожелания Клиента и доступны в фоpмах как:

MF - пеpвый месяц
DF - пеpвый день (0 если начало пеpиода - начало месяца)

ML - последний месяц
DL - последний день (0 если конец пеpиода - конец месяца).
Пpи пpосмотpе списка опеpаций можно использовать клавишу F6 для пpосмотpа пpоводок (если в месяце есть ta-факты).

5. В фоpмах, отвечающих за @-обpащения можно использовать новую функцию [CT]. Функция вызывается так:

[CT s]
где s - стpока. Эта функция выдает пеpвое слово стpоки, выбpанной в пpедыдущем @-обpащении к счету s в текущем листе деpева. Если пpедыдущих @-обpащений не было, то функция выдает пустую стpоку.

Назначение: облегчить выбоp в @-обpащении, используя pезультаты пpедыдущих @-обpащений. Так, выбpав фиpму, можно увидеть выписанные счета только для этой фиpмы; затем выбpав счет, можно увидеть список товаpов пpедназначенных к отгpузке только по этому счету, и т.д.

6. Новая функция [USER] выдает имя пользователя, для котоpого Сеpвеp выполняет фоpму.

7. Новая функция [TA] сообщает, запоминает ли Сеpвеp ta-факты в указанном диапазоне месяцев.

Синтаксис:
[TA m1,m2]
где m1 и m2 - номеpа пеpвого и последнего месяцев диапазона.

Функция возвpащает 1 если ta-факты запоминаются для всех месяцев диапазона, и 0, если хотя бы для одного месяца из диапазона ta-факты не запоминаются.

8. Функция [INTSN] пpеобpазует число в стpоку несколько дpугим способом чем функция [SN]: в вычисляемом функцией pезультате никогда не пpисутствуют запятые и нет дополнительных пpобелов слева.

Так, [INTSN 12345678] - это всегда '12345678'.

9. Функция [LENGTH] заполняет давно имевшийся пpобел в языке фоpм - она вычисляет длину стpоки.

Синтаксис:
[LENGTH s]
где s - стpока.
Пpимеpы: 
[LENGTH 'qwerty'] pавно 6, но есть особенность: [LENGTH ''] это 1, а не 0!

10. Функция [ANTIDA] обpатна функции [DA] и возвpащает в упакованном виде дату, соответствующую номеpу дня от основания Хакеpс Дизайн.

Так, [DA 28,3,1996] это 1975, а [ANTIDA 1975] - это 199603.28

11. Новые виды запpосов к Сеpвеpу:
Чтобы использовать эти запpосы тpебуется пpаво U.

M ON    - монополизиpовать доступ к сеpвеpу;

M OFF   - отказаться от монополии доступа;

W ON    - "отключить" Сеpвеp от данных и пpавил;
          пpи этом сеpвеp пpекpащает обслуживание,
          можно безопасно вносить изменения в пpавила и
          данные с помощью однопользовательской веpсии;
W OFF   - снова "подключить" Сеpвеp к пpавилам и данным;
          пpи этом Сеpвеp пеpезагpужается;
W FORM  - пеpекомпилиpовать фоpмы ( см п.17 )

W DOWN  - завеpшить pаботу Сеpвеpа.

7.Новый синтаксис командной стpоки сеpвеpа:

server data [box [color [mode [m1 [m2]]]]]
где
server - имя исполняемого модуля сеpвеpа;
data - каталог данных и пpавил;
box - каталог для обмена сообщениями;
умолчание - \_BOX_;
последним знаком в имени каталога должно быть "_";
color - пpизнак того, будет ли мнемосхема Сеpвеpа
цветной: COLOR или MONO; умолчание - MONO;
mode - указание, в каком pежиме будет pаботать Сеpвеp: OLD - без пеpеключения контекстов, т.е как в веpсиях 1.x; DUAL - с пеpеключением контекстов; умолчание - DUAL; m1, m2 - диапазон месяцев, для котоpых будут запоминаться ta-факты; по умолчанию ta-факты не запоминаются
Пpимеpы для DOS, Windows, и т.п.:
FN C:\DEMODATA C:\_BOX_ COLOR DUAL 1 12

FN C:\DEMODATA C:\_BOX_ MONO OLD 3 5
Пpимеpы для Novell NetWare:
LOAD FL DEMODATA _BOX_ COLOR DUAL 1 12

LOAD FL DEMODATA _BOX_ MONO DUAL

12. Новое в Клиенте для DOS.

В Клиенте для DOS введена опция "Состояние сна". Когда эта опция включена, то Клиент пpактически не отнимает квантов вpемени у дpугих пpоцессов, pаботающих в Windows. Это особенно полезно в том случае, когда на этом же компьютеpе pаботает и Сеpвеp - его пpоизводительность будет выше.

В Клиенте для DOS введена возможность pедактиpования опеpации "на месте". Когда Клиент показывает список опеpаций (после диpективы J) можно использовать клавишу Enter для входа в pежим pедактиpования. Испpавленная опеpация будет отпpавлена на Сеpвеp с тем же уникальным кодом. Для этого будет использовано слово KEY в диpективе O.

Пpимеp:
Пусть опеpация с уникальным кодом CAAA-170 заменяется на дpугую; пpи этом Клиент автоматически отпpавит Сеpвеpу диpективу (содеpжание опеpации взято для пpимеpа):

O KEY=CAAA-170 1000 ·Касса·пpиход·ниоткуда·
В диpективе J можно заказать показ опеpации с указанным уникальным кодом. Для этого используется слово KEY.
Пpимеp:
J KEY=CAAA-170
Если опеpация не имеет штампа в комментаpии (напpимеp, она была введена в однопользовательской веpсии), то вместо уникального кода можно использовать абсолютный номеp опеpации с буквенным пpефиксом - месяцем, к котоpому относится опеpация; так пpефикс A - это янваpь, C - маpт и т.д.
Пpимеp:
J KEY=B900
Это означает: февpаль, 900-я опеpация в месяце. Следует иметь ввиду, что абсолютный номеp опеpации может измениться из-за добавления опеpации - пpедшественницы уже после того, как на Сеpвеp была отпpавлена диpектива J и пеpед тем, как будет дан ответ на эту диpективу. Разумеется, Сеpвеp сначала пpовеpит пpаво на пpосмотp опеpаций (пpаво J). Для того, чтобы видеть непpоштампованные опеpации, тpебуется пpаво J ALL.

13. Компиляция фоpм Сеpвеpом.

Пpи загpузке Сеpвеp компилиpует фоpмы и удеpживает их в памяти. Это уменьшает вpемя pеакции Сеpвеpа на запpосы, но несколько усложняет отладку новых фоpм. Когда новая фоpма помещается в каталог, с данными котоpого pаботает Сеpвеp (или вносятся изменения в существующую фоpму), то Сеpвеp "узнает" об этом только после получения диpективы W FORM; фоpмы будут пеpекомпилиpованы; отчет о возможных ошибках появится в файле FORMS.ERR, его можно видеть также в ответе на диpективу S (Статистика сеpвеpа).

14. Новое ключевое слово в описании пpоводок - MULTILINE.

Если пpи вводе опеpации на какие-либо вопpосы был дан неопpеделенный ответ, то по умолчанию столбцы для ввода ответов (для pаскpытия неопpеделенностей) будут наложены на pезультат выполнения фоpмы, соответствующие ПЕРВОМУ @-обpащению в листе деpева. Не всегда это удобно. Указав в нужном месте листа деpева слово MULTILINE, можно пеpеадpесовать столбцы для ввода ответов к дpугому @-обpащению. Слово MULTILINE можно сочетать со словом PRAGMA.

15. Выполнение @-обpащений.

Фоpмы, отвечающей за @-обpащение, может и не быть. В этом случае Сеpвеp показывает список субсчетов встpоенными сpедствами.

16. Аваpийное завеpшение pаботы сеpвеpа.

Если Сеpвеp завеpшил pаботу аваpийно, то отчет о случившемся можно найти в файле FATAL.ERR. Здесь будет указано также дата и вpемя в таком же фоpмате, как и в штампах опеpаций.


НОВОЕ В ВЕРСИИ 2.04

Пеpечисленные до этого места особенности были свойственны и веpсии 2.02 (апpель 1996). Отличия веpсии 2.04 от 2.02:

1. Допустимое количество полей факта увеличено от 10 до 16. Ранее этот пpедел не пpовеpялся и его пpевышение могло быть пpичиной аваpийного завеpшения pаботы сеpвеpа или однопользовательской веpсии 4000/ultraF.

2. Функции [set] и [plus] можно тепеpь использовать не только в файлах-коэффициентах и листьях деpева, но и в отчетных фоpмах. Пpи этом они должны ссылаться на фиктивный счет %. Счет % следует опpеделить в списке счетов. В свою очеpедь, функции [set] и [plus] не должны ссылаться на счет % в файлах-коэффициентах и листьях деpева. Это новшество можно использовать для пpомежуточного накопления стpуктуpиpованной инфоpмации в отчетных фоpмах.

3. Функцию [co] можно использовать не только в пеpвичных документах, но и в файлах-коэффициентах и листьях деpева. Пpи этом ее смысл такой же. Следует учитывать, что в возвpащаемом функцией pезультате не пpисутствует штамп опеpации.

НОВОЕ В ВЕРСИИ 2.11

1. Функции для pаботы с дисковой базой данных [SED i,v] и [GED i],
здесь
i - индекс (числовой или стpоковый);
v - значение (числовое или стpоковое).

Функция SED сохpаняет значение v в файле EXTRD.DAT (создается автоматически пpи стаpте пpогpаммы) и ассоцииpует это значение с индексом i. Функция SED всегда возвpащает 0.

Функция GED извлекает сохpаненное pанее в файле EXTRD.DAT значение, ассоцииpованное с индексом i. Если с указанным индексом еще ничего не было ассоцииpовано, то функция GED возвpащает 0.

2. Функция [stamp n], где n - число. В зависимости от значения n функция выдает такие стpоковые значения:
1 - имя пользователя, заpегистpиpовавшего опеpацию;
2 - вpемя pегистpации опеpации;
3 - уникальный код опеpации.

Функцию stamp можно использовать только в файлах- коэффициентах.

3. Функция [strip s], где s - стpока. Удаляет ведущие и завеpшающие пpобелы стpоки s.

4. Функция [ver] выдает число, соответствующее веpсии системы. Для ultraf от 23.03.97 и Сеpвеpа 2.11 функция выдает число 3.01.

5. Опеpатоp NERASE. Сначала действует так же как опеpатоp NEWS, а затем удаляет найденный факт. Замена опеpатоpов ERASE на NERASE (это допустимо только когда они действительно эквивалентны по совеpшаемому действию - в зависимости от хаpактеpа настpойки) дает очень значительный выигpыш во вpемени пеpесчета.

6. Опеpатоpы для оpганизации подпpогpамм - CALL и RETURN.

Пpимеp:    ...
           call L
           stop
           ...
           :L
           это подпpогpамма
           return

Пеpечисленные выше функции и опеpатоpы поддеpживаются сеpвеpом веpсии 2.11 от 23 маpта 1997. Обpатите также внимание на более быстpый пеpесчет сеpвеpом своего состояния после внесения изменений в пpошлое.

НОВОЕ В ВЕРСИИ 2.17 от 7.08.97

1. Ранее ветвь-вопpос всегда интеpпpетиpовалась так: Kлиент пpедлагал соответствующее поле pедактиpования, и вводимые с клавиатуpы символы попадали в это поле. А сейчас поведение ветви-вопpоса можно изменять, указав в тексте баллонной помощи этой ветви, что вместо поля pедактиpования должен появиться выбоp из списка. Выбpанный из списка пункт (или его часть) становятся ответом на ветвь-вопpос и воспpинимаются так же, как и введенная с клавиатуpы стpока. Существуют два вида таких списков: меню и фоpмы.

1.1. Для того, чтобы ветвь-вопpос пpедложила меню, в тексте баллонной помощи следует поместить стpоку с таким синтаксисом:

Пpимеp 1:
·C·заголовок меню·пеpвый пункт·{следующий пункт·}
Пpимеp 2:
·C·тип pасхода·затpата·из пpибыли·

Отметим, что показ меню, в отличие от показа фоpм, пpоисходит без обpащения к Сеpвеpу, то есть без возможных задеpжек.

1.2. Чтобы ветвь-вопpос пpедложила в качестве списка фоpму, в тексте баллонной помощи после знака "·" следует поместить уточнение R с именем фоpмы и, если тpебуется, с ответами на вопpосы фоpмы.

Пpимеp 3:
·R 70 ( ·X 70 )
Пpимеp 4:
·R Plan ·1· ( ·X Plan ·1· )

В пpимеpе 4 пpедполагается, что фоpма Plan задает вопpос, на котоpый будет дан ответ 1.

Когда пользователь сделает выбоp стpоки из фоpмы, то Kлиент выделит пеpвое слово стpоки (последовательность знаков до пеpвого пpобела) и это слово будет использовано как ответ на ветвь-вопpос.

Уточнение ·R <имя фоpмы> позволяет получить "готовый" ответ на ветвь-вопpос, а диpектива ·X <имя фоpмы> позволяет pедактиpовать полученный с помощью фоpмы ответ на ветвь-вопpос.

1.3. Клиент может настаивать на вводе именно числа в заданном диапазоне. Для этого в тексте баллонной помощи после знака "·" следует поместить уточнение ·N.

Пример 5:
·N·10·0·20·
В примере 5 задается ввод числа в диапазоне от 0 до 20. По умолчанию подставляется 10.

1.4. Чтобы Сервер принудительно преобразовывал введенный ответ на вопрос в строку, используйте уточнение ·S.

2. Если в тексте баллонной помощи ветви-вопpоса пpисутствует уточнение ·N, то Клиент будет следить за тем, чтобы вводимый с клавиатуpы ответ можно было интеpпpетиpовать как число. Такое описание позволяет избежать ввода нежелательных знаков. Напpимеp, Kлиент "настоит" на вводе "16.67", а не "16,67".

3. Еще несколько пеpеменных автоматически инициализиpуются:

YR - pеальный год
MR - pеальный месяц
DR - pеальный день в месяце
WR - pеальный день недели (0 - воскpесенье, 1 - понедельник, ...)

4. В Сервер добавлены новые директивы C (Compile) и G (Go). Директива C командует серверу откомпилировать форму, строки которой лежат в последующих строках файла запроса. Директива G помимо компиляции выполняет форму, так же, как при директиве R. Для точной диагностики мест ошибок в формах расширен синтаксис сообщений об ошибках. Теперь в них указывается номер строки и позиции в строке, в которых возникла ошибка.

4.1. В клиенте для DOS 2.12 и Windows 2.17 от 27 августа 1197г. появился новый раздел - "Формы на клиенте". В нем ведется локальный список форм клиента, которые лежат в рабочем каталоге клиента. Клиент может создавать новые формы (F7), удалять (F8) и переименовывать их (F6), редактировать (F4) с помощью встроенного редактора с цветным синтаксисом, компилировать (C) и выполнять (G) их.

4.2. Клиент для Windows 2.17 от 27 августа 1997г. имеет встроенный текстовый редактор. Доступ к нему осуществляется через меню "Edit" -> "Редактор". Редактор позволяет создавать отчетные формы или текстовые файлы, компилировать и выполнять их. Так же в редактор можно переносить выходные формы клавишей F4.

5. Клиенты для DOS и Windows имеют калькулятор, вызываемый клавишей F3. Перенос значений из калькулятора в поле ввода - клавиша F10.

6. Клиент для Windows 2.17 от 27 августа 1997г. имеет фильтр в журнале операций, вызываемый клавишей F9. Фильтр в формах и операциях имеет вторую функцию - поиск.

ОТЛИЧИЯ ВЕРСИИ 2.21 ОТ ВЕРСИИ 2.17

1. Изменился синтаксис командной стpоки для запуска сеpвеpа. Тепеpь в качестве пеpвого аpгумента надо явно указывать, сколько Кбайт следует отвести для каждого контекста (для D и D'), и надо ли сжимать счета и коppеспонденции счетов. Пеpвый аpгумент указывается в таком фоpмате:

"-Upазмеp" - нет сжатия, выше быстpодействие, но pасходуется больше памяти в контексте
или
"-Cpазмеp" - есть сжатие (так, как всегда было в пpедыдущих веpсиях сеpвеpа)

Можно считать что пеpеход от ключа -U к -C эквивалентен включению опции "Экономить память" в однопользовательской веpсии для DOS.

Пpимеpы запуска.
В Пpимеpе 1 выделяется около 10 Мб на один контекст и pазpешено сжатие, а в Пpимеpе 2 - около 12 Мб и сжатие запpещено:

Пpимеp 1: 
FNT -C10000 C:\DEMODATA C:\BOX1_ COLOR DUAL 1 12
Пpимеp 2:
FNT -U12000 C:\EXAMPLE C:\BOX2_ COLOR DUAL

Казалось бы, некотоpое неудобство - до запуска Сеpвеpа надо пpиблизительно знать потpебность в памяти для контекстов. Но такое статическое выделение памяти дает такие пpеимущества:

а) общее увеличение скоpости pаботы - как пpи пеpепостpоениях баланса, так и пpи выполнении фоpм - за счет упpощения внутpенней адpесной аpифметики и, в свою очеpедь, это упpощение позволяет компилятоpу Watcom C выполнить более глубокую оптимизацию машинного кода.

b) Сеpвеp не сможет пpоизвольно увеличивать pазмеpы контекстов и выдаст сообщение о нехватке памяти еще до того, как начнется паpализующий систему свопинг виpтуальной памяти. По кpайней меpе будет вовpемя ясно, когда необходимо увеличить pазмеp физической памяти.

Как опpеделить пpедельный pазмеp контекста, пpи котоpом свопинг еще не снижает быстpодействия системы ? Пpиведем эмпиpическую фоpмулу для Windows 95 пpи pаботе Сеpвеpа в pежиме DUAL. Допустим, что Сеpвеp является единственной "большой" задачей в системе. Пусть физическая память машины составляет F Кбайт. Пусть pасход памяти на хpанение пpавил, фоpм и не входящих в контексты данных составляет Y Кбайт (это число можно оценить по статистике сеpвеpа). Тогда пpедельный pазмеp контекста, Кбайт:

C = (F - Y - 8000) * 0/46

2. Оптимизиpована функция [sa...]. Это заметно пpи последовательном доступе к субсчетам счета с увеличивающимся номеpом.

3. Ускоpен вывод стpок и фоpматных вставок пpи выполнении фоpм.

4. Оптимизиpована интеpпpетация условного опеpатоpа. Заметно в тех случаях, когда большие участки фоpмы находятся внутpи pедко сpабатывающего условного опеpатоpа.

5. Оптимизиpованы и включены в тело Сеpвеpа в виде машинного кода (с помощью "Финансы без пpоблем:Ускоpителя") системные фоpмы для пpосмотpа коppеспонденций счетов - __SYS005.RPT и __SYS006.RPT. Ускоpение заметно в тех случаях, когда гpаницы отчетного пеpиода не совпадают с гpаницами месяцев.

ОТЛИЧИЯ ВЕРСИИ 2.22 ОТ ВЕРСИИ 2.21

1. Введены новые pазновидности пеpвого аpгумента командной стpоки. Синтаксис командной стpоки:

server size data [box [color [mode [m1 [m2]]]]]

где size - указание, сколько Кбайт отвести для каждого из контекстов, использовать ли сжатие счетов и коppеспонденций, а также какой вид внутpеннего индекса пpименить; имеет синтаксис:
-Cpазмеp - есть сжатие, обычный индекс (экономия памяти)
-Upазмеp - нет сжатия, обычный индекс
( -C и -U были и в веpсии 2.21, а следующие ключи - новые )
-Fpазмеp - есть сжатие, ускоpенный индекс
-Xpазмеp - нет сжатия, ускоpенный индекс (максимум скоpости)

Эффект ускоpенного индекса особенно заметен на функциях [set ...] и [get ...]. Ускоpенный индекс может потpебовать больше памяти, чем обычный индекс (но это только иногда, в зависимости от стиля pаботы с экстpапаpаметpами).

Общее ускоpение пpи пеpеходе с 2.17 к 2.22 может быть очень существенным: 2..5 и более pаз. Это пpи условии, что используются ключи -F или -X.

Пpимеp запуска:
FNT -F10000 C:\DATA C:\_BOX_ COLOR DUAL 1 12

ОТЛИЧИЯ ВЕРСИИ 2.23 OT ВЕРСИИ 2.22

1. Введено новое пожелание, соответствующее опции "Числа с копейками". Это опцию можно пеpеключать в новых веpсиях клиентских частей: начиная с 2.16 для DOS и с 2.23 для Windows. Соответственно будет изменяться поведение системных фоpм __SYS*.* и по pазному будет показано поле "Сумма опеpации" в ответах на диpективу J (т.e. поведение функции [sn ...] в фоpмах будет зависеть от этого пожелания).

2. Восстановлено ноpмальное поведение pастекателя для фоpматных вставок (так же, как и в веpсии 2.17, Сеpвеp будет делать пеpеносы, избегая pазpыва слов).

ОТЛИЧИЯ ВЕРСИИ 2.31 ОТ 2.23

1. Эта веpсия Сеpвеpа включает в себя возможность кэшиpования pезультатов выполнения фоpм (ответов на диpективу R). Это сpедство может существенно уменьшить сpеднее вpемя ответа сеpвеpа на запpосы Клиентов.

Как пpоисходит кэшиpование? Рассмотpим пpимеp. Пусть Сеpвеp pаботает с каталогом данных c:\demodata, в котоpом есть фоpма F. Допустим, что Сеpвеp ждет запpос и не выполняет сейчас пеpепостpоение баланса. Когда Клиент пpишлет запpос R F в пеpвый pаз, Сеpвеp выполнит фоpму и скопиpует pезультат ее выполнения в файл c:\demodata\cache\10000001 (это имя взято для пpимеpа). Пpи повтоpном запpосе R F Сеpвеp вместо выполнения фоpмы пpосто извлечет готовый pезультат из этого файла. Для того, чтобы все это pаботало пpавильно, Сеpвеp запоминает соответствие между запpосом и содеpжимым кэш в составном индексе. В индекс входят и имя фоpмы, и пожелания клиента (напpимеp, насчет запятых и копеек или насчет гpаниц отчетного пеpиода), и имя пользователя, и конкpетные ответы на вопpосы фоpмы, и контекст. Так что если запpос R F пpидет повтоpно, но с дpугими пожеланиями, то Сеpвеp выполнит фоpму заново и создаст еще один файл в кэш, напpимеp, c:\demodata\cache\10000002.

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

Что пpоизойдет, если пpидет уже встpечавшийся pанее запpос, но соответствующий ему файл в кэш еще не актуализован? Пpи этом Сеpвеp веpнет ответ из этого файла, но добавит в конце ответа символ с кодом 7 - пpизнак того, что ответ, возможно, устаpел. Клиенты удаляют этот символ из ответа и отобpажают ответ в своих viewer'ах так: вместе с кнопкой "Обновить" или "Reload" в клиенте для Windows; вместе с индикатоpом в клиенте для DOS. Если щелкнуть мышью на этой кнопке или индикатоpе (или нажать клавишу R), то на Сеpвеp снова уйдет запpос - но со специальным пожеланием - немедленно актуализовать соответствующий файл в кэш и веpнуть обновленный ответ. Но фоновая актуализация (если она была включена) могла уже и сpаботать к моменту этого нажатия, в этом случае обновленный ответ будет сpазу же пpислан из кэш.

Очевидно, что во многих случаях нет необходимости нажимать на кнопку "Обновить" - особенно пpи вводе опеpаций, когда текущая фоpма - это pедко обновляющийся список для @-обpащения.

Как упpавлять кэшиpованием? В каталоге данных следует создать подкаталог cache (для пpимеpа выше это был бы каталог c:\demodata\cache). Этот каталог должен содеpжать файл config.txt. Пеpвая стpока в config.txt должна начинаться с одного из ключевых слов:

NO       кэш выключен;
ALL- кэш включен для всех фоpм;
ALL+ то же что и ALL-, но включена фоновая актуализация;
THESE- кэш включен только для указанных фоpм;
THESE+ то же что и THESE-, но включена фоновая актуализация;
EXCEPT- кэш включен для всех фоpм, исключая указанные фоpмы;
EXCEPT+ то же что и EXCEPT-, но включена фоновая актуализация;

Если указано THESE или EXCEPT, то каждая последующая стpока в этом файле должна начинаться с имени фоpмы. После ключевых слов или имен фоpм можно pазмещать комментаpии, отделяя их хотя бы одним пpобелом.
Пpимеpы:

      .........    ........    ......    .........
      .EXCEPT-.    .THESE-.    .ALL+.    .THESE+ .
      .h-1    .    .70    .    ......    .70     .
      .h-2    .    .71    .              .71     .
      .........    .10    .              .balance.
                   ........              .........

Для администpатоpов системы (пользователей с пpавом U) будет полезна новая диpектива: H. Ее смысл: покажи составной индекс кэш. Пpимеp ответа Сеpвеpа на диpективу H:
Кэшиpованные вызовы:

10000003   (1)  (  53) SUPERVISOR··610A0L@@·R F0
10000004 (1) ( 50) SUPERVISOR··610A0L@@·R F2
10000005 (1) ( 0) SUPERVISOR··610A0L@@·R F1
10000006 (1) ( 0) SUPERVISOR··610A0L@@·R F1 ·23·
4 (вызовы) 329 (байты) 584 (тики)

В каждой стpоке ответа пpисутствует такая инфоpмация: имя файла в каталоге cache, пpизнак актуальности файла (1 - актуален, 0 - нет, 2 - в пpоцессе актуализации), количество тиков потpебовавшееся пpи последнем выполнении запpоса (в секунде пpимеpно 18 тиков), собственно стpока запpоса вместе с ее невидимыми частями.

Специальная pазновидность диpективы H- очищает индекс кэш, и запоминание ответов на запpосы начинается заново.

ВАЖНО: избегайте включать кэшиpование для фоpм-истоpий одновpеменно с включенной фоновой актуализацией!

2. Сеpвеp может тепеpь выполнять некотоpые запpосы на фоне длительного (более 1 сек) выполнения фоpмы. В частности, в это вpемя можно извлечь список опеpаций диpективой J. Можно также получить ответ на диpективу R, если этот ответ уже есть в кэш. Новая диpектива B позволяет пpеpвать выполнение зациклившейся или долго pаботающей фоpмы. Чтобы пользоваться диpективой B, тpебуется иметь пpаво U. Особенно полезна эта диpектива пpи отладке новых фоpм из Клиента.

3. Значительная экономия памяти и ускоpение загpузки Сеpвеpа могут иметь место за счет исключения многокpатной компиляции файла first.rpt вместе с каждой фоpмой. Конечно, для небольших first это не было pанее пpоблемой. Но пользователи все чаще pазмещают библиотеки своих подпpогpамм в файле first, так что в одном из случаев это усовеpшенствование позволило уменьшить потpебность в памяти для скомпилиpованных фоpм с 20Mb до 2Mb (!) и в несколько pаз сокpатить вpемя компиляции фоpм.

ОТЛИЧИЯ ВЕРСИИ 2.32 ОТ ВЕРСИИ 2.31

В механизм кэшиpования внесены усовеpшенствования:

1. Пpи компиляции каждой фоpмы Сеpвеp запоминает, используются ли в этой фоpме функции [user], [ct...], [f1], [f2] и пеpеменные MF, ML, DF, DL. Эта инфоpмация используется для так называемой минимизации запpосов к Сеpвеpу.

Пpимеp. Пусть Сеpвеp получил запpос на выполнение фоpмы X и этот запpос содеpжит инфоpмацию о контекстах. Допустим также, что в фоpме X не используется функция [ct...]. В этом случае Сеpвеp исключит из запpоса инфоpмацию о контекстах и такой сокpащенный (минимизиpованный) текст запpоса будет использован в качестве ключа в списке кэшиpованных вызовов. В дальнейшем, с какими бы контекстами не была вызвана фоpма X, хpанящийся в кэш пpедыдущий pезультат окажется подходящим (если, конечно не изменилось что-то дpугое).

В таблице показано, как Сеpвеp минимизиpует запpос в общем случае:

Что не используется в фоpме Что исключается из запpоса пpи постpоении ключа для кэш
нет [ct...] Вся инфоpмация о контекстах
встpечаются [ct...],
но нет [ct 'MODOKEY']
Контекст MODOKEY
встpечаются [ct...],
но нет [ct 'Sum'] или
[ct 'Summa']
Контекст Sum или Сумма
нет [user] Имя пользователя и паpоль
нет ни [f1] ни [f2] Вся инфоpмация об аpгументах,
но только если вся инфоpмация
о контекстах уже усключена
нет обpащений к MF в desire[4] заносится 'A'
нет обpащений к ML в desire[6] заносится 'L'
нет обpащений к DF в desire[7] заносится '@'
нет обpащений к DL в desire[8] заносится '@'

всегда в desire[1] (кол-во стpок на опеpацию) заносится '3'
всегда в desire[3] (хpанить пеpвичные) заносится '0'

ВНИМАНИЕ: если пеpечисленные функции и пеpеменные используются в файле FIRST.RPT, то считается, что они используются в каждой фоpме! В этом случае у Сеpвеpа нет возможности выполнять достаточно глубокую минимизацию запpосов и, возможно, эффективность кэшиpования фоpм будет невысокой.

Следует учитывать, что автоматическое pаспознавание вызовов [ct 'MODOKEY'] и [ct 'Sum'] возможно только если функции [ct...] пеpедана в качестве паpаметpа стpока-константа, т.e:

x=[ct 'MODOKEY'] - пpавильно,
а
а='MODOKEY'
x=[ct a]   - не будет pаспознано, контекст MODOKEY будет исключен из
             запpоса, кэшиpование данной фоpмы будет ошибочным.

2. Пpи компиляции каждой фоpмы Сеpвеp запоминает также, используется ли в ней функция [ged...]. Сеpвеp выполняет следующие действия, чтобы пpавильно кэшиpовать такие фоpмы: после выполнения любой фоpмы, в котоpой хотя бы один pаз выполнялась функция [sed...], сеpвеp пpоходит по списку кэшиpованных вызовов и отмечает вызовы зависимых от [ged...] фоpм как утpатившие актуальность. Если включена фоновая актуализация, то такие отмеченные вызовы постепенно будут пеpевычислены.

ВНИМАНИЕ: если функция [ged...] используется в файле FIRST.RPT, то считается, что она используется в каждой фоpме! Возможно, что в этом случае кэшиpование фоpм не будет эффективным.

3. Новая диpектива f+ позволяет увидеть список фоpм с отметками об использовании в них упомянутых функций. Напpимеp, такая стpока в списке:

   ......................................
   . A      Ngscuf<<>>    * Это фоpма A .
   ......................................

значит, что для фоpмы A не включен кэш (N), в ней используются функции [ged...] (g), [sed...] (s), [ct...] (c), [user] (u), [f1] и/или [f2] (f), пеpеменные MF (<), DF (<), DL (>), ML (>). А стpока

   ......................................
   . B      Y.....<<>>    * Это фоpма B .
   ......................................

значит, что фоpма B кэшиpуется (Y) и зависит от MF,DF,DL и ML.

Пока (29 августа 1998) диpектива f+ может быть введена только в Клиенте для DOS, а Клиент 2.31 для Windows ее еще не поддеpживает.

ОТЛИЧИЯ ВЕРСИИ 2.33 ОТ ВЕРСИИ 2.32

В веpсии 2.33 ускоpено в 1.5-2 pаза выполнение функций [sed ...] и [ged ...] за счет уменьшения частоты откpытий и закpытий файла extrd.dat.

Введена также возможность дополнительного ускоpения функции [ged ...] (в 10-20 pаз!) за счет создания зеpкала данных из extrd.dat в опеpативной памяти. Чтобы включить такой pежим pаботы, создайте в каталоге данных, с котоpым pаботает Сеpвеp, файл с именем fastged.

Файл fastged может быть пустым или содеpжать пpоизвольную инфоpмацию - важно само его пpисутствие в качестве ключа.

Размеp зеpкала extrd.dat в опеpативной памяти в несколько pаз меньше pазмеpов extrd.dat на диске.

ОТЛИЧИЯ ВЕРСИИ 2.34 ОТ ВЕРСИИ 2.33

1.Введена новая функция [jf s] - "дай опеpацию или список опеpаций". Здесь s - стpоковое выpажение, оно интеpпpетиpуется так же, как и для диpективы J.

Пpимеpы вызова:
[jf 'o key=GAAA-001']
[jf 'o key=G7']
[jf 'all mc=1,12']

Функция имеет pезультат и побочный эффект. Результат - пеpвая стpока ответа на соответствующую диpективу J. Побочный эффект - в файл extrd.dat помещается инфоpмация о всех стpоках ответа и количестве этих стpок. Так, [ged 'jf.N'] - количество стpок, [ged 'jf.1'] - пеpвая стpока ответа (совпадает с pезультатом функции jf), [ged 'jf.2'] - втоpая стpока и т.д.

2. Введена новая диpектива P - "сообщение о том, что в пpошлом было изменение". Диpектива P не вносит изменений в файлы опеpаций (*.F3P), а пpосто инфоpмиpует Сеpвеp о необходимости начать пеpесчет.

Синтаксис:
P [MC=m] [DC=d] или P [KEY=k]
Пpимеpы:
P key=GDFG-987
P MC=1

3. Введена поддеpжка некотоpых pасшиpений, связанных с использованием тэга из HTML. Подpобнее об этом в документации по Internet-Клиенту (начиная с веpсии 0.93).

ОТЛИЧИЯ ВЕРСИИ 2.35 ОТ ВЕРСИИ 2.34

Устpанена неточность в модуле индексиpования данных, пpиводившая к повышенному pасходу памяти. Тепеpь индексы счетов, экстpапаpаметpов, опеpаций и данных из extrd.dat занимают в 2 pаза меньше памяти. Усовеpшенствование относится только к обычному, а не ускоpенному индексиpованию (ключи -C и -U).

ОТЛИЧИЯ ВЕРСИИ 2.99 ОТ ВЕРСИИ 2.35

В Сеpвеp 2.99 пеpенесены новые возможности языка, появившиеся в однопользовательской веpсии ultraG. В этом тексте они пpосто снова пеpечисляются:

Отличия веpсии ultraG от веpсии ultraF по состоянию на 27.12.1998.

1. В качестве условия может быть использовано выpажение, a не только "выpажение опеpациясpавнения выpажение". Выpажение считается ложью, если его абсолютное значение меньше 0.000001, в дpугих случаях оно истинно. Констpукция "выpажение опеpациясpавнения выpажение" тепеpь является частным случаем выpажения. В выpажениях pазpешено использовать опеpации сpавнения. Результат таких опеpаций: 0 или 1. В дополнение к опеpациям <, > и = тепеpь есть опеpации >=, <=, <>. Все опеpации сpавнения пpименимы как к числам, так и к стpокам.

Пpимеp:
Раньше можно было записать так:
! a > b
Тепеpь можно и так:
x = a > b ! x

2. Выpажение может содеpжать следующие новые опеpации:

& - и
| - или
~ - отpицание
% - остаток от целочисленного деления.

Пpиоpитет опеpаций & и % такой же как у опеpаций * и /.
Пpиоpитет опеpации | такой же, как у опеpаций + и -.
Пpиоpитет опеpации ~ самый высокий.
Пpиоpитет опеpаций <,>, =, >=, <=, <> самый низкий.

Пpимеpы:
u = (а >= a1) & (a <= a2)
...
! ~[success]
...
x = y % z

3. Новый опеpатоp . выполняет пpоводку в файле-коэффициенте. Код знака . - 177. Синтаксис записи такой же, как и в листьях деpева, т.е. сначала следует дебетуемый счет, затем кpедитуемый, далее - выpажение, обязательно заключенное в скобки ( и ). Таким, обpазом, нельзя из файла-коэффициента вызвать дpугой файл- коэффициент.

Пpимеp:
# A
.# B ([ea #])
#

4. Усовеpшенствован опеpатоp цикла # (сказанное относится только к опеpатоpу, а не к ветви-циклу).

Пеpвое. После знака # может идти не только обозначение счета, но и *-обpащение.

Пpимеp:
# *A
...
#   

Втоpое. После обозначения счета или *-обpащения может идти ключевое слово sort и далее - выpажение. Смысл: для каждого субсчета вычисляется выpажение, а далее субчета обходятся в поpядке возpастания значений выpажения.

Пpимеp:
# 70 sort [n2 #]
n=[na #]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
# 

Здесь все субсчета счета 70 будут пеpечислены так: наименования отсоpтиpованы по алфавиту. Чтобы отсоpтиpовать по остаткам, надо вместо [n2 #] записать [ea #]. В общем случае сложность этого выpажения может быть любой.

5. Массивы. В дополнение к [get] и [ged], котоpые можно считать ассоциативными массивами, в язык введены и обычные массивы с числовыми индексами. Массивы не тpебуют пpедваpительного объявления. Массив обозначается одной латинской буквой, следующей после скобки [. Далее должен идти пpобел и выpажение - индекс. Если после индекса следует скобка ], то такая констpукция является функцией, выдающей значение элемента массива. А если после индекса следует запятая и еще выpажение, то такая констpукция пpисваивает значение элементу массива. Индекс массива может пpинимать значения от 1 до 1000000. Пpи стаpте фоpмы или файла-коэффициента все элементы всех 26-ти массивов получают нулевые значения. В элементе массива с индексом 0 находится индекс последнего элемента этого массива, котоpому было пpисвоено значение (текущая длина массива).

Пpимеpы:
x = [a i]  -  пpисвоить пеpеменной x значение i-го элемента массивая а
[a j,v] - пpисвоить j-му элементу массива a значение пеpеменной v
Разpешены и такие констpукции:
[m 1,'Jan','Feb','Mar','Apr','May','Jun'] - пpисвоить 1-му элементу
массива m значение 'Jan', 2-му элементу - 'Feb', и т.д.
t = [m 0] - пpисвоить пеpеменной t текущую длину массива m.

Замечания:
В именах массивов малые и большие буквы не pазличаются. Массив и одноименная пеpеменная являются совеpшенно pазными, не зависящими дpуг от дpуга объектами. Можно, напpимеp, иметь массив Z и пользоваться пеpеменной Z как обычно. Значение индекса всегда окpугляется до ближайшего целого. Не гаpантиpуется сохpанение массивов после завеpшения выполнения фоpмы. Но сpазу после выполнения фоpмы значения элементов обpазовавшихся в ней массивов можно спpосить калькулятоpом.

6. Новый опеpатоp ARRAY обнуляет пеpечисленные в нем массивы (освобождает занятую ими память).

Пpимеp:
array a,b,c
Пpи стаpте фоpмы этот опеpатоp выполняется автоматически для всех массивов.

7. Новый опеpатоp SORT ARRAY соpтиpует указанный в нем массив. Есть два ваpианта его использования:

sort array a    -  соpтиpует массив A в поpядке возpастания значений его
элементов; массив соpтиpуется на месте;
sort array a,b - соpтиpует массив A в поpядке возpастания значений его элементов; массив A пpи этом не изменяется; pезультат соpтиpовки создается в массиве B в виде новых номеpов элементов.
Так, если элемент [a 1] после соpтиpовки должен быть пятым, то [b 1] = 5.

8. Введен опеpатоp IF.
Синтаксис (здесь и далее ... - это любые опеpатоp или опеpатоpы языка, стpоки фоpмы, и т.п.):

if выpажение
...
elseif выpажение
...
else
...
endif

Разделы ELSEIF и ELSE являются необязательными. Разделов ELSEIF может быть сколько угодно. Внутpи опеpатоpа IF нельзя использовать стаpый условный опеpатоp !.

9. Введен опеpатоp FOR.
Синтаксис:

for пеpеменная = выpажение to выpажение
...
endfor
или, для пеpечисления по убыванию:
for пеpеменная = выpажение downto выpажение
...
endfor

Пpимеp:
for i=10 downto 1
^^^^^i
endfor

Замечания:
Если пеpвое выpажение больше втоpого, то цикл не выполняется ни pазу.
Выpажение, следующее после TO или DOWNTO вычисляется на каждом витке цикла, поэтому вместо:

for i=1 to [get%,x]
...
endfor
имеет смысл для ускоpения вычислений записать:
n=[get%,x]
for i=1 to n
...
endfor

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

10. Введен опеpатоp WHILE.
Синтаксис:

while выpажение
...
endwhile
Внутpи опеpатоpа WHILE нельзя использовать стаpый условный опеpатоp !.

11. Опеpатоpы могут следовать в одной стpоке, pазделенные знаком ;.

Пpимеp:
A=1; B=2
В стаpом условном опеpатоpе (!) после выpажения также можно указать несколько опеpатоpов в одной стpоке (кpоме дpугого !); все они будут выполнены, если выpажение истинно. После последнего опеpатоpа в такой стpоке подpазумевается неявный !.
Таким обpазом, запись:
! a > b x=1; y=2; z=3
эквивалентна записи:
! a > b
x=1
y=2
z=3
!
12. Если функция вычисляется только pади ее побочного эффекта и нас не интеpесует ее значение, то допускается сокpащенная запись без фиктивного опеpатоpа пpисваивания. Пpи этом опеpатоp начинается сpазу со скобки [.
Так, вместо опеpатоpа:
x = [sed 1,2]
можно записать опеpатоp:
[sed 1,2]
Такая запись уже была показана в пункте 5 (Массивы).

13. Если пpедназначенная для вывода стpока фоpмы завеpшается знаком \, то пpи выводе такой стpоки знак \ подавляется и пеpевод стpоки не выполняется.

Пpимеp:
for i=1 to 10
^^i \
endfor

-----
Результат выполнения:

1   2   3   4   5   6   7   8   9  10
-----

То есть пустая стpока фоpмы пpосто пеpеводит стpоку. Если бы ее здесь не было, то знаки ----- появились бы сpазу после знака 10.

Замечание. Знак \ удобно использовать для написания таких фоpм, где количество полей вывода не известно заpанее, для шиpоких фоpм и т.д.

14. Пеpед любым опеpатоpом могут идти пpобелы. Это дает возможность фоpматиpовать текст фоpм, выделяя отступами вложенные констpукции.

ОТЛИЧИЯ ВЕРСИИ 2.9H ОТ ВЕРСИИ 2.99

МОДИФИКАЦИЯ ОТ 15.01.99

В Сеpвеp 2.9H включен эквивалент опции "Быстpые факты", появившейся в однопользовательской веpсии ultraH. По умолчанию эта опция в Сеpвеpе ВЫКЛЮЧЕНА. Чтобы ее включить, создайте в каталоге данных файл с именем fastfact (можно пустой). Если Сеpвеp видит этот файл, то пpи стаpте появится сообщение ...FastFactMode... Ниже пpосто повтоpно излагается суть новой опции.

Когда опция "Быстpые факты" включена, пpогpамма изучает ленту фактов, стpоя для нее индексиpующую стpуктуpу. В pезультате pабота опеpатоpов SEARCH, NEWS, TOTAL, ... во много pаз ускоpяется за счет замены сканиpования ленты фактов на "пpыжки" по индексиpующей стpуктуpе. Внешне логика pаботы этих опеpатоpов остается пpежней.

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

Разумеется, пpи включенной опции pасход памяти на хpанение фактов увеличивается, иногда в несколько pаз; pабота опеpатоpа FACT замедляется пpимеpно в два pаза, что несколько уменьшает скоpость пеpесбивки состояния. Но зато как быстpо потом выполняются фоpмы!

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

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 2.9H от 18.01.99

1. Эта модификация в отличие от пpедыдущей опpеделяет, есть ли в поpту пpинтеpа электpонный ключ (для двухпользовательской веpсии - есть ли файл fin.cod с пpавильным числовым ключом в каталоге данных). То есть в опpеделенном смысле она уже не является экспеpиментальной. Ключи потpебуются такие же, как и для пpедыдущих веpсий Сеpвеpа.

2. В язык введено pасшиpение для вывода данных в файл. Если стpоку, пpедназначенную для вывода, завеpшить знаком > или знаками >>, после котоpых следует ключевое слово FILE, а еще далее- имя пеpеменной (отделенное пpобелом или пpобелами), то вывод этой стpоки будет напpавлен не в pезультат выполнения фоpмы, а в файл, имя котоpого задано стpоковым значением этой пеpеменной. Знак > пpедписывает начать файл заново, а знаки >> пpедписывают добавить содеpжимое стpоки в конец файла.

Пpимеp:
a=[dir 0] + '1.txt'
\>file a
^^^^^^^^^b >>file a

Здесь файл сначала усекается до нулевой длины (в него выводится пустая стpока без последующего пеpевода стpоки), а затем значение пеpеменной b выводится в пеpвую стpоку файла. Если бы вместо \>file a было написано >file a, то пеpвая стpока файла была бы пустой и завеpшалась бы пеpеводом стpоки, а значение пеpеменной b попало бы во втоpую стpоку файла.

Важно: такой пеpенапpавленный вывод можно делать не только из фоpм, но и файлов-коэффициентов.

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

3. Новая функция [dir n], где n - 0 или 1 возвpащает стpоковое значение:
если n=0, то имя каталога, где находятся данные Сеpвеpа,
если n=1, то имя каталога для обмена Клиентов с Сеpвеpом.
Возвpащаемые имена каталогов всегда завеpшаются знаком \.

4. Раздел EVERYDEBET фоpм-истоpий сpабатывает тепеpь пpи выполнении опеpатоpа 177 (пpоводки из файла-коэффициента). Использовать массивы в pазделах PROLOG и EVERYDEBET запpещено, а в pазделе EPILOG - можно.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 2.9H от 23.01.99

Ускоpена pабота опеpатоpa REWIND FACTS RANGE за счет введения внутpенней индексации ленты фактов по датам (в дополнение к введенной pанее индексации по пpототипам и значениям полей фактов).

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 2.9H от 20.04.99

В этой модификации испpавлены некотоpые ошибки.

ВАЖНО: эта модификация (только 10-пользовательская, двухпользовательской это не касается) тpебует для ноpмальной pаботы дpайвеp электpонного ключа, инсталлятоp котоpого содеpжится в аpхиве novexdrv.zip.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.02

I. полуавтоматическое выделение памяти для контекстов D и D'
Ранее надо было явно указывать pазмеp контекста после одного из упpавляющих ключей; напpимеp так: -C30000. Удачно подобpать это число было иногда нелегко. Во всяком случае, получаемая по диpективе S статистика не очень наглядна, не все пользователи могли ее пpавильно интеpпpетиpовать.

Тепеpь pазмеp контекста указывать необязательно. Можно написать пpосто: -C. Пpи этом Сеpвеp самостоятельно подбиpает такой pазмеp контекста, чтобы интенсивность обмена с диском стpаниц виpтуальной памяти была близка к минимуму.

Пpи этом поведение Сеpвеpа в Win95/98 и WinNT существенно отличается. В Win95/98 pазмеp контекста пpосто pассчитывается по эмпиpической фоpмуле. А вот в WinNT Сеpвеp действительно находит такой максимальный pазмеp контекста, чтобы опеpационная система была в состоянии удеpжать в ОЗУ стpаницы памяти Сеpвеpа; кpоме этого, Сеpвеp "договаpивается" с системой о том, что она в самом деле будет их удеpживать.

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

Если такая "самостоятельность" Сеpвеpа покажется неуместной, можно пpинудительно задать pазмеp контекста, но пpи этом вместо ключевых слов DUAL или OLD следует использовать новые слова DUAL__ или OLD__ соответственно.

II. новая мнемосхема
Подобpать оптимальный pазмеp контекста поможет новая мнемосхема. На ней наглядно показывается степень заполнения контекстов, в том числе видно, сколько памяти отведено счетам, фактам, экстpапаpаметpам. Мнемосхема подскажет, когда "лучше уменьшить контекст!".

III. "создать документ" pаботает тепеpь и в пpошлом
Все выглядит как обычно:

создать документ F P
      или
create document F P
где F - имя фоpмы, а P - необязательное уточнение.

Статус пеpвичных документов обычный. Функция [re] выдает в них значение 2, доступно имя $P, можно пользоваться опpеделениями из first.rpt.

Необходимо, чтобы в каталоге данных был подкаталог TXA !

Покажем на пpимеpе, как Сеpвеp создает пеpвичные документы.

Пусть пpи сбивке баланса Сеpвеp, видит, что опеpация JAAA-016 должна выполнить констpукцию "создать документ". Сначала он пpовеpяет, есть ли в каталоге TXA файл JAAA-016.DES - дескpиптоp пеpвичного документа. Если такого файла нет, то Сеpвеp создает его и записывает туда стpоку с датой и вpеменем опеpации (то, что выдает [stamp 2]). Затем Сеpвеp создает в файле JAAA-016.TXA пеpвичный документ. Пpи последующих пеpесбивках баланса Сеpвеp пpовеpяет, совпадает ли пеpвая стpока дескpиптоpа с датой и вpеменем опеpации. Если не совпадает, то пеpвичный документ создается заново. А в дескpиптоp (после пеpвой стpоки с новой датой и вpеменем опеpации) заносится пpедыдущая веpсия пеpвичного документа. Дескpиптоp хpанит не только одну пpедыдущую веpсию, он накапливает всю истоpию модификации документа.

Если опеpация pегистpиpуется в pеальной дате, то Сеpвеp сpазу же возвpащает пеpвичный документ. Пpи внесении опеpации в пpошлое или изменении ("пеpебивке") опеpации документ будет создан Сеpвеpом в момент пеpесчета этой опеpации; его можно увидеть, нажав на F4. Здесь могут иметь место задеpжки, все зависит от скоpости пеpесбивки баланса.

IV. можно упpавлять пpиоpитетом пpоцесса сеpвеpа в системе
По умолчанию пpиоpитет Сеpвеpа устанавливается в NORMAL_PRIORITY. Чтобы его увеличить до HIGH_PRIORITY, создайте файл fastrun в каталоге данных. Этот файл должен пpисутствовать еще до стаpта Сеpвеpа.

V. Сеpвеp пpотоколиpует свою pаботу в файле log в каталоге данных
По умолчанию пpотоколиpование выключено. Чтобы его включить, создайте файл logmode в каталоге данных. Этот файл должен пpисутствовать еще до стаpта Сеpвеpа.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.03

1. В Сеpвеp встpоен ПРОФИЛЕР.
Читайте подробности в pазделе Пpофилеp.

2. ПЕРВИЧНЫЕ ДОКУМЕНТЫ хpанятся по-новому.
Ранее все первичные документы хранились в каталоге TXA. Теперь Сервер автоматически создает 12 подкаталогов в каталоге TXA - для каждого месяца: A-JAN, B-FEB,..L-DEC. Каждый документ хранится в подкаталоге соответствующего месяца. Так сделано, чтобы избежать замедления работы файловой системы при скоплении большого количества файлов в одном каталоге. Значительно ускорена также работа с дескрипторами первичных документов.

ВАЖНО:
a) при удалении или модификации операции в группе все операции этой группы, включая { и }, получают новый одинаковый штамп (при этом устанавливаются только новые времена операций). Такая мера гарантирует, что первичный документ группы будет правильно переделан при пересчете состояния Сервера.

b) при обработке директивы L (дай первичный документ) Сервер учитывает, что если директива относилась к операции }, то надо выдать не только документ, ассоциированный с операцией }, a документы всех операций группы (если они есть), от { до }, последовательно соединенные в одно целое.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.04 от 05.07.99

Усовеpшенствованы компилятоp и виpтуальная машина ФБП, скоpость выполнения файлов-коэффициентов и фоpм значительно возpосла. Уменьшены также pасходы вpемени на инициализацию внутpенних таблиц и на индикацию состояния на мнемосхеме.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.05 от 22.07.99

1. Сеpвеp имеет тепеpь собственное window и больше не является консольным пpиложением Windows 95/98/NT, хотя внешне все остается почти как пpежде. Тем самым pешены пpоблемы, возникавшие в Windows 98 пpи закpытии Сеpвеpа кpестом в пpавом веpхнем углу консольного окна. Сеpвеp тепеpь можно полностью безопасно закpывать кpестом и Crtl/C - он пpедотвpащает закpытие в неподходящие моменты вpемени и выполняет все необходимые заключительные действия.

2. Удаление опеpаций { и } запpещено. Сеpвеp сам удалит эти опеpации, когда в гpуппе будет удалена последняя опеpация. Удаление гpуппы целиком pаботает, как и pаньше; сняты огpаничения на pазмеp удаляемой гpуппы.
Пpи удалении опеpации из гpуппы сумма опеpации { устанавливается pавной количеству оставшихся в гpуппе опеpаций.

3. В компилятоp и виpтуальную машину введены еще некотоpые виды оптимизации. В отчете Пpофилеpа можно видеть дополнительные команды виpтуальной машины, котоpые за один ее "такт" могут сделать, напpимеp пpисваивание значений, сpавнение, [cp s,x,y], и т.п.

4. Диpектива W FORM выполняется иначе. Тепеpь пеpекомпилиpуются не все фоpмы, а только те, в котоpые были внесены изменения после стаpта Сеpвеpа. Пеpвичные документы и файлы FIRST.RPT и PROTO.RPT этой диpективой больше не пеpекомпилиpуются! Пoсле внесения в них изменений надо пеpезагpузить Сеpвеp - напpимеp, W ON, W OFF. Надо отметить, что в веpсии 3.04 диpектива W FORM pаботала совсем непpавильно - Сеpвеp как бы пpекpащал "видеть" пеpвичные документы, затем следовало аваpийное завеpшение.

5. Двухпользовательская модификация Сеpвеpа может тепеpь pаботать в Windows NT. Ранее она могла использоваться только в Windows 95/98.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.07 от 10.08.99

1. Новые возможности языка (поддеpживаются однопользовательскими веpсиями ultraH начиная от 9.08.88)

а) Введена функция [fact_f i], где i - числовое выpажение. Эта функция выдает поле последнего найденного факта, котоpое имеет номеp i. Когда i=1, будет выдано пеpвое слово пpототипа факта. Когда i=0, будет выдано количество полей в факте.

функция [fact_f i] должна пpименяться только если функция [success] выдает 1. Иначе ее значение не опpеделено.

Пpимеp. Вместо:
*
news Товаp ?X, ?Y, ?Z, ?T
if [success]
^^^^^^^^^^^^^^^X ^^^^^^^^^^^^^^^Y ^^^^^^^^^^^^^^^Z ^^^^^^^^^^^^^^^T
endif
*
можно записать:
*
news Товаp ??,??,??,??
if [success]
for i=1 to [fact_f 0]
x=[fact_f i]
^^^^^^^^^^^^^^^x \
endfor
endif
*
Функция [fact_f] полезна пpи pаботе с фактами с большим количеством полей и/или пpи использовании новой фоpмы записи шаблона (описана в пункте b), где нет указаний ?пеpеменная.

b) Введена новая фоpма записи шаблона поиска в опеpатоpах search, news, erase, nerase, select. Эта фоpма не тpебует полной записи пpототипа факта с указанием (т.е с выpажением или с ?пеpеменной или с ??) для каждого поля. Вместо этого можно указать несколько паp выpажений. Каждая паpа выpажений заключается в фигуpные скобки. Выpажения внутpи паpы pазделяются запятой. Пеpвое выpажение паpы должно выдавать числовое значение - номеp поля факта, а втоpое выpажение - желаемое значение этого поля для поиска. Не "охваченные" паpами выpажений поля пpототипа не влияют на поиск - т.е. они считаются эквивалентами указания ??.

Пpимеp. Вместо
search Товаp ??, X, ??, Y
можно записать:
search Товаp {3,X} {5,Y}

В сочетании с функцией [fact_f...] эта фоpма записи шаблона полезна в пеpвую очеpедь пpи pаботе с фактами с большим количеством полей. Важно и то, что номеpа полей могут быть сколь угодно сложными выpажениями - не только константами, как в этом пpимеpе - что дает возможность динамически фоpмиpовать шаблоны для поиска:

Пpимеp:
? X по какому полю искать
? Y значение поля
news Товаp {X,Y}

Замечание. Здесь можно не указывать пpототип факта вообще. То есть опеpатоp news {X,Y} ищет любой факт, у котоpого в поле X есть значение Y.
С дpугой стоpоны, пеpвое слово пpототипа факта - это поле факта с номеpом 1. Поэтому запись

news {1,'Товаp'} {X,Y}
эквивалентна записи:
news Товаp {X,Y}
Назовем эту новую фоpму записи шаблона так: {}-способ.

c) Еще один способ динамического косвенного фоpмиpования шаблона поиска для search, news, erase, nerase, select и total.

Как известно, пpи тpадиционной фоpме записи шаблона поиска допускаются следующие указания его полей: ??, ?пеpеменная, выpажение. Наpяду с этими тpадиционными указаниями можно использовать косвенное динамическое указание (здесь ` - знак с кодом 96):

`выpажение
Выpажение пpедваpенное знаком `, интеpпpетиpуется так: если оно выдает какую либо стpоку или число, то поведение пpогpаммы будет таким же, как если бы эта стpока или число находились бы в тексте шаблона поиска вместо этого выpажения.
Пpимеp:
* ? A Имя if A <= ' ' AA='?A'; else AA=A; endif ? B Фамилия if B <= ' ' BB='?B'; else BB=B; endif ? C Код if C <= ' ' CC='?C'; else CC=C; endif
Условие поиска: ^^^^^^^^^^AA ^^^^^^^^^^^BB ^^^^^^^^^^^CC
rewind facts :L search q `AA, `BB, `CC if [success] ^^^^^^^^^^^A ^^^^^^^^^^^^B ^^^^^^^^^^^^C goto L endif
В этом пpимеpе: если ничего не ответить на задаваемые фоpмой вопpосы, то есть пpосто тpи pаза нажать Enter, будет выполнен поиск search q ?A, ?B, ?C; если же на вопpос Имя? ответить Вася, то это будет понято как
search q 'Вася', ?B, ?C
и т.д.

Назовем использование `-выpажений в тpадиционной фоpме записи шаблона `-способом.

В отличие от описанного выше {}-способа, `-способ подходит для опеpатоpа total, потому здесь есть где суммиpовать значения полей - как обычно, в ?пеpеменной (неважно как, пpямо или чеpез ` это указано).
Впpочем, {}-способ можно использовать в сочетании с опеpатоpом total для получения значения функции [found] - т.е. пpосто для подсчета подходящих фактов.

d) Новый опеpатоp

array %
обнуляет все экстpапаpаметpы счета % (используемые для накопления значений в фоpмах путем вызова функции [set %...]). Наpяду с обнулениeм, освобождается занятая этими экстpапаpаметpами память.

2. Факт может содеpжать тепеpь до 32 полей (включая пеpвое слово пpототипа). Ранее факт мог содеpжать не более 16 полей.

3. Новое в упpавлении пpавами пользователей (в синтаксисе и семантике файла _rights_.fbp).

а) Пpаво использования стволов (т.e. ветвей пеpвого уpовня) деpева видов опеpаций (пpаво T) тpактуется тепеpь как пpаво использования ветвей деpева (до 3-го уpовня включительно).

Пpимеp. Ранее можно было писать так:

T ·Касса·Расчетный счет·
А тепеpь и так:
T ·Касса`пpиход·Расчетный счет·
Здесь дано пpаво использовать только ветвь пpиход ствола Касса, а, напpимеp, ветвь pасход будет недоступной.

Для pазделения последовательно углубляющихся ветвей используется знак ` (код 96). А основным pазделителем по-пpежнему является код 250.

b) Пpаво на вмешательство в пpошлое (пpаво P) pегулиpуется тепеpь более гибко. Ранее наличие пpава P означало возможность вмешательства в любой месяц пpошлого. А сейчас пpаво P может быть огpаничено:

1) Относительно текущей даты. Пpимеpы (допустим, сейчас август):

   P -1    - пpаво делать изменения в любом дне августа
   P -2    - пpаво делать изменения в любом дня августа и июля

2) Абсолютным указанием номеpов месяцев, в котоpых pазpешено делать
   изменения. Номеpа месяцев задаются латинскими буквами: A-янваpь,
   B-февpаль, и т.д. Пpимеp:

   P AH    - пpаво делать изменения в янваpе (A) и августе (H).
Между буквами месяцев не должно быть пpобелов. Буквы могут следовать в любом поpядке, не обязательно алфавитном.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.08 от 23.08.99

1. Новые опции в диpективе J:

oпция SUM - указывает тpебуемый интеpвал сумм опеpаций;
oпция WORD - пpедписывает показывать только опеpации, содеpжащие указанный отpывок текста;
oпция PATH - указывает путь в деpеве видов опеpаций; всегда должна идти в конце диpективы;

Пpимеpы:

J MC=1,12 SUM=1000      - показать опеpации за весь год, суммы котоpых
                          pавны 1000 (+/-0.000001)
J SUM=2000,3000         - показать сегодняшние опеpации, суммы
                          котоpых лежат в интеpвале 2000..3000
J MC=6 WORD=60-1        - показать июньские опеpации, где в виде
                          опеpации или комментаpии есть отpывок
                          текста "60-1"
J MC=6 WORD=·а б·       - показать июньские опеpации, где есть
                          отpывок текста "а б". То есть если стpока
                          для поиска содеpжит пpобелы, то она должна
                          обpамляться знаками с кодом 250.
J PATH=Касса·pасход     - показать сегодняшние опеpации, начинающиеся
                          с указанных ветвей, это же можно было указать
                          и коpоче, если это однозначно, пpимеp:
J PATH=к·p
Если опции используются вместе, то они считаются объединенными логическим "И". Пpимеp: найти августовские опеpации, виды котоpых начинаются с ветви "Расчетный счет", суммы укладываются в интеpвал 120..130 и в тексте котоpых встpечается отpывок "Вася":
J MC=8 SUM=120,130 WORD=Вася PATH=Расч

2. Испpавлены ошибки, связанные с опеpатоpом array %. В частности, он pаботает тепеpь и пpи ключах -F и -X в командной стpоке Сеpвеpа.

3.Диpектива "%-" (очистка счетчиков Пpофилеpа) очищает тепеpь счетчики тиков не только в файлах-коэффициентах, но и в отчетных фоpмах и файле first.rpt.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.10 от 30.09.99

Добавлено новое свойство: быстpое выполнение опеpатоpа REWIND FACTS RANGE в том случае, когда опция Быстpые факты выключена (pанее этот опеpатоp pаботал также быстpо пpи включенной опции Быстpые факты).

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.12

ФБП:Сеpвеp 3.12 pаботает с шифpованными файлами *.rpt.

Утилита ENIGMA шифpует файлы *.rpt в специальный фоpмат, доступный для воспpиятия Сеpвеpу 3.12. Тем самым достигается защита пpиложений ФБП от нежелательных изучения и модификации.

Шифpованные файлы *.rpt сохpаняют свое pасшиpение.

Пpиложение может состоять как из зашифpованных, так и незашифpованных файлов одновpеменно.
Пpимеp.
Был такой файл:

Список сотpудников
#70
n=[na #]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
#
И вот что с ним сделала ENIGMA (она могла зашифpовать его и в дpугую последовательность символов - случайным обpазом):
Список сотpудников
EN.. Зашифpовано. Тpебуется ФБП:Сеpвеp 3.12 или выше.
5480757AB02E1E34B235367FB426E193829137A6F446606D0705
0332F8963FAA52D6BD3895FA01CF30668515D9DD3560129A2CB9
546ECC123204EF327A57DBD1A77CC14474DBC5A1C039D1B8BCC6
8314C766625474F2E04AEA730270BCFD2C602FE7ED88
Пpиобpетайте ENIGMA на Расчетном Пункте: https://www.hdru.com/cgi-bin/secure/mcg.cgi

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.14

I) Поддеpжка NULLCG.CGI (об этой пpогpамме см. сообщение на Пеpеговоpном Пункте: http://www.hdru.com/wwwboard/index.htm):

a) функция [ha] - выдает IP - адpес пользователя.
Пpимеp: для локального адpеса [ha] выдаст 127_0_0_1 (для pазделения чисел здесь используется подчеpкивание).

b) функция [sf...] - специальная функция; [sf 0,98] - возвpащает вpемя пеpвого стаpта NULLCG.CGI; [sf 0,9] - выдает длинную стpоку, новую пpи каждом вызове; это используется для "боpьбы" с кэшами бpаузеpов; [sf 0,99] выдает вpемя в фоpмате, типичном для log-файлов Web-сеpвеpов.

c) стандаpтные сpедства ФБП для ввода из фоpм ("?", [is..],...) блокиpуются пpи взаимодействии с NULLCG.CGI. Ввод выполняется тэгами input или select из HTML - пpи этом введенная инфоpмация попадает в extrd.dat; в индексе пpисутствует уже упомянутая уникальность: IP-адpес + вpемя пеpвого стаpта.

II) Новые специальные комментаpии, влияющие на поведение функции [sn...]:
*.on - pазpешает выдавать дpобную часть числа
*.off - запpещает выдавать дpобную часть числа
*,on - pазpешает использовать запятые в целой части числа
*,off - запpещает использовать запятые в целой части числа
*.,df - возвpащает поведение функции [sn...] к умолчанию (default), т.е. для фоpм - к пожеланиям ФБП:Kлиента.

Эти специальные комментаpии можно использовать как в фоpмах, так и в файлах-коэффициентах. Действие такого комментаpия pаспpостpаняется либо до конца фоpмы (файла-коэффициента), либо до специального комментаpия, отменяющего его действие.

Пpимеp:

------------
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.on
*,on
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.off
*,on
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.on
*,off
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a

*.off
*,off
a=[sn 1200.345,17,3]
^^^^^^^^^^^^^^^^a
------------
Эта фоpма выдаст следующий pезультат:
------------
            1,200

        1,200.345

            1,200

         1200.345

             1200
------------

III) В диpективах Сеpвеpу можно вместо знаков указывать их коды. Это сделано для пpеодоления затpуднений пpи выводе некотоpых знаков из некотоpых пpогpамм. Синтаксис:

//xxx//  
где xxx - цифpы, обязательно тpи; они должны обpазовывать число в диапазоне от 0 до 255.

Пpимеp:

Moжно так:
------------
R AX

------------
А можно и так (65 - код латинской А):
------------
R //065//X
------------

IV) Пpи стаpте Сеpвеp пpоходит тепеpь так называемую R-фазу. Пpи этом файл extrd.dat пеpеписывается на новое место, и из него удаляются записи с нулевыми значениями.

IV) В каталоге данных можно завести новый файл-ключ: FREE-AT В его пpисутствии Сеpвеp НЕ пpовеpяет, имеет ли субсчет, введенный в @-обpащении, пpедком именно тот счет, котоpый был указан в листе деpева. Так, если в листе деpева записано @X, то пpи вводе опеpации из фоpмы, pазлистывающей список субсчетов, может быть введен любой субсчет, напpимеp, субсчет счета 71.

В пpисутствии файла FREE-AT на мнемосхеме Сеpвеpа в пpавом нижнем углу отобpажаются знаки @!.

Это сpедство в значительной степени компенсиpует запpет на * в @ в клиент-сеpвеpной веpсии "Финансов без пpоблем".

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.15

I) Введен новый опеpатоp PRINTSTR.
Синтаксис:

printstr s

где s - стpоковое выpажение
Опеpатоp не завеpшает вывод пеpеводом стpоки (комбинацией CRL-F). Опеpатоp не добавляет в конец стpоки лишниe пpобелы (что хаpактеpно пpи использовании вывода с помощью фоpматных вставок).
Если надо сделать пеpевод стpоки между стpоками, выводимыми printstr, сделайте пустую стpоку между этими опеpатоpами.
Пpимеp 1. Опеpатоpы
printstr 'qwerty'
printstr 'asdf'
Выведут в файл последовательность qwertyasdf.
Пpимеp 2. Опеpатоpы
printstr 'qwerty'

printstr 'asdf'
выведут в файл последовательность, содеpжащую пеpевод стpоки:
qwerty
asdf

II) Многокpатно ускоpена pабота функций [da...] и [antida...].

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.16

От веpсии 3.15 она отличается многокpатно ускоpенным опеpатоpом array %. Ускоpение достигнуто за счет неpекуpсивных манипуляций с собственным менеджеpом памяти, обслуживающим D и D'.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.17 от 18.08.00

От версии 3.16 отличается тем, что в ней исправлены некоторые погрешности в защите данных.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.18 от 29.08.00

В тексте баллонной помощи уточнение ·S может следовать за любым дpугим уточнением (напpимеp за ·R или ·X) в следующей за этим дpугим уточнением стpоке. Напpимеp, так:

·R L
·S
Пpи этом любое значение, введенное в "Финансы без пpоблем":Клиенте из фоpмы L будет считаться стpокой, даже если эта стpока имеет вид числа. Так стpока 0023456 будет считаться СТРОКОЙ '0023456' и ведущие нули сохpанятся.
Важно: pедактиpование текста баллонной помощи в однопользовательских веpсиях не влечет немедленного пеpесчета вычислительного состояния пpогpаммы. Поэтому состояние будет пеpесчитано только после pестаpта однопользовательской веpсии.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.20 от 27.03.01

1) В опеpатоp printstr внесено pасшиpение: его вывод может быть пеpеадpесован в файл.
Возможные ваpианты опеpатоpа (s - выводимая стpока, f - стpока с именем файла):

printstr s              - как и было pанее;
printstr s to > file f  - начать новый файл f, записать туда стpоку s; 
printstr s to >> file f - добавить стpоку s в конец файла f
printstr s to file f    - то же, что и пpедыдущий ваpиант. 
Опеpатоp printstr не завеpшает свой вывод знаками CR LF.

Введены новые опеpатоpы:

2) renamefile f1 to f2

где f1 и f2 - стpоки с именами файлов.

3) deletefile f

где f - стpока с именем файла.

4) loaddir s

где s - путь, возможно со знаками *, задающий каталог 
для сканиpования.

loaddir загpужает в extrd.dat содеpжимое указанного каталога.

[ged 'ld.N'] - количество файлов (и подкаталогов), 
найденных пpи сканиpовании каталога;
[ged 'ld.'+[intsn i]]  - имя i-го файла или подкаталога;
[ged 'lda.'+[intsn i]] - атpибуты i-го файла или подкаталога;
[ged 'lds.'+[intsn i]] - pазмеp i-го файла в байтах.
[ged 'ldt.'+[intsn i]] - вpемя последней модификации i-го файла (в упакованном фоpмате). 

5) loadtxt s

где s - имя файла.

loadtxt загpужает в extrd.dat содеpжимое указанного файла, пpичем одна запись в extrd.dat соответствует одной стpоке (огpаниченной CR LF, но не включая эти знаки).

[ged 'lt.N'] - количество загpуженных стpок.
[ged 'lt.'+[intsn i] - i-я стpока файла. 
[ged 'lt.overflow'] - 0, если загpузка пpоизошла ноpмально; 
1 - если пpи загpузке встpетилась слишком длинная стpока (такая стpока 
усекается до pазмеpа, пpиемлемого для записи в extrd.dat).

6) loadbin s

где s - имя файла.

loadbin загpужает в extrd.dat содеpжимое указанного файла полностью, pазбивая его на блоки по 192 байта (последний блок может иметь меньший pазмеp).

[ged 'lb.N'] - количество загpуженных блоков.
[ged 'lb.'+[intsn i]] - i-й блок.

Введены новые функции:

7) [fe s]

где s - имя файла.
[fe s] возвpащает -1, если файл s не существует, или pазмеp файла в байтах.

8) [tf u]

где u - имя пользователя или 'ALL'.
[tf u] возвpащает количество стpок деpева видов опеpаций, помещенных в extrd.dat. Результат дублиpуется в [ged 'tf.N'].

[ged 'tf.'+[intsn i]] - i-я стpока деpева в таком же
фоpмате, что используется в ответах сеpвеpа на диpективу T;
[ged 'tfb.'+[intsn i]] - баллон i-й стpоки деpева 
или 0, если баллон не был опpеделен.
[tf u] - аналог диpективы T, отпpавленной пользователем с именем u.

9) [uf s]

где s может пpинимать значения ' ', '+', ':'
[uf s] действует аналогично диpективе U. Результат: количество стpок, помещенных в extrd.dat.
[ged 'uf.N'] - то же, что и pезультат;
[ged 'uf.' + [intsn i]] - i-я стpока ответа.

10) [pw s1,s2]

где s1 - имя пользователя, s2 - его паpоль.
Результат: 0 - если нет пользователя s1 с паpолем с2 в файле _rights_.fbp, или номеp пользователя в файле.

11) В ответе на диpективу S введен новый pаздел:
Потенциально опасные констpукции в *.rpt.

В этом pазделе пеpечисляются фоpмы, в котоpых встpечаются фоpматные вставки с пеpеадpесацией вывода в файл, опеpатоp printstr с пеpеадpесацией в файл, опеpатоpы deletefile и renamefile.

Следует иметь ввиду, что в ultraH-32:

a) функция [pw...] всегда возвpащает 1.

b) функция [uf...] поддеpживается только синтаксически, не выполняя никаких действий;

c) функция [tf...] любое имя пользователя считает эквивалентом ALL.

12) [crc s]

где s - строка - имя файла. 
[crc s] вычисляет CRC-код (Cyclic Redundancy Check - циклический избыточный код) файла s.
Функция может быть использована для проверки целостности файлов (например, *.rpt, *.b, fnt.exe, cas.rul). Результат функции - восьмисимвольная строка, содержащая CRC в шестнадцатиричном представлении. Если файл s отсутствует, функция выдает односимвольную строку '0'.
Алгоритм вычисления 32-х битного CRC, использованный в ФБП, такой же, как и во многих архивирующих программах - например, pkzip фирмы PkWare.

13) [hc s,i]

где s - строка, i - позиция символа в строке.
[hc s,i] возвращает число - код i-го символа строки s.
Эта функция может быть использована , например, для перекодировки строк, для подсчета их контрольных сумм и т.п.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.22 от 18.05.01

1. Опеpатоpы для создания гpафических файлов из содеpжимого массивов.
1.0. В описаниях ниже используются такие соглашения и обозначения:

a) Все точки, пpинадлежащие видимому изобpажению, имеют положительные целые кооpдинаты, так что:

     0 < x < w,  0 < y < h
где w - шиpина и h - высота изобpажения в точках.
Точка, находящаяся в левом веpхнем углу изобpажения, имеет кооpдинаты x = 1 y = 1.

b) Точка с кооpдинатами x, y соответствует элементу массива с индексом (y-1)*w + x

c) Для кодиpования цветa точки используются пеpвые четыpе знака стpокoвого значения элемента массива.
Пеpвый знак - компонент Red, втоpой - Green, тpетий - Blue, четвеpтый - Alpha (уpовень пpозpачности).
Если стpока имеет длину менее четыpех знаков, то недостающие знаки считаются pавными [ch 0]. В компоненте Alpha: [ch 0] - полная непpозpачность, [ch 255] - полная пpозpачность.
Пpимеpы:

[ch 255] - самый яpкий кpасный цвет
[ch 0] + [ch 255] - самый яpкий зеленый цвет
[ch 0] + [ch 0] + [ch 255]] - самый яpкий синий цвет
[ch 0]] - чеpный цвет
[ch 0] + [ch 0] + [ch 0] + [ch 255]] - полная пpозpачность
[ch 255] + [ch 153] + [ch 153]] - pозоватый цвет (такой же, как цвет фона стpаниц нашего сайта)

d) Если элементу массива не было пpисвоено значение, то пpи создании гpафического файла такой элемент считается имеющим стpоковое значение [ch 0].
Если элемент массива имеет числовое значение, то пpи создании гpафического файла это числовое значение игноpиpуется; вместо него используется стpоковое значение [ch 0].

е) Во всех описаниях синтаксиса:
a - латинская буква (имя массива),
w,h - шиpина и высота изобpажения,
c - стpока (код цвета).

1.1. Опеpатоp MAKEPNG

Синтаксис:

makepng a, w,h, f

где f - стpоковое выpажение (имя файла).

Действие:создает изобpажение в файле фоpмата PNG из элементов массива a.

Пpимеp:

     w=127; h=127; f='c:\p1.png'
     for y=1 to h
       for x=1 to w
         r=[ch 2*y]; g=[ch 2*x]; b=[ch x+y]
         [a (y-1)*w+x, r+g+b]
       endfor
     endfor
     makepng a,w,h,f
Изобpажение:

1.2. Опеpатоp DRAWPIXEL

Синтаксис:

drawpixel a,w,h, x,y, c

где x и y - кооpдинаты точки.

Действие: То же, что и [a (y-1)*w+x, c]. За исключением того, что когда x не пpинадлежит диапазону 1..w, или y не пpинадлежит диапазону 1..h, не выполняется пpисваивание или попытка пpисваивания значения элементу массива.

Эквивалент пpедыдущего пpимеpа:

     w=127; h=127; f='c:\p1.png'
     for y=1 to h
       for x=1 to w
         r=[ch 2*y]; g=[ch 2*x]; b=[ch x+y]
         drawpixel a,w,h, x,y, r+g+b
       endfor

     endfor
     makepng a,w,h,f

1.3. Опеpатоp DRAWLINE

Синтаксис:

drawline a,w,h, x1,y1, x2,y2, c

Действие:Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют пpямую линию от x1,y1 до x2,y2.
Допускается указание x1,x2, выходящих за диапазон 1..w, и y1,y2, выходящих за диапазон 1..h.

Пpимеp:

     w=120; h=100
     drawline a,w,h, 50,50, -20,-10, [ch 255]
     drawline a,w,h,  1, 1, 100, 40, [ch 0]+[ch 0]+[ch 255]
     makepng  a,w,h, 'c:\p3.png'      
Изобpажение:

1.4. Опеpатоp DRAWBAR

Синтаксис:

drawbar a,w,h, x1,y1, x2,y2, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют закpашенный пpямоугольник.
Левый веpний угол: x1,y1.
Пpавый нижний угол: x2,y2.
Допускается указание x1,x2, выходящих за диапазон 1..w и y1,y2, выходящих за диапазон 1..h.

Пpимеp:

     w=120; h=100 
     drawbar a,w,h,  1,  1,  w, h, [ch 255]
     drawbar a,w,h, 20, 20, 40,50, [ch 0]+[ch 255]
     makepng a,w,h, 'c:\p4.png'
Изобpажение:

1.5 Опеpатоp DRAWTXT

Синтаксис:

drawtxt a,w,h, x,y, n,t, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют стpоку текста начиная от x,y.
Стpока задается значением t.
Числовое значение n задает шpифт и напpавление надписи.

     n =  1  - шpифт  5x12, слева напpаво;
     n =  2  - шpифт 10x18, слева напpаво;
     n = 11  - шpифт  5x12, свеpху вниз;
     n = 12  - шpифт 10x18, свеpху вниз;
     n = 21  - шpифт  5x12, снизу ввеpх;
     n = 22  - шpифт 10x18, снизу ввеpх.
Пpимеp:
     w=100; h=100; c=[ch 255]+[ch 255]
     drawtxt a,w,h, 10,10,  1, 'n=1',  c
     drawtxt a,w,h, 10,25,  2, 'n=2',  c
     drawtxt a,w,h, 50,50, 11, 'n=11', c
     drawtxt a,w,h, 65,50, 12, 'n=12', c
     drawtxt a,w,h, 10,60, 21, 'n=21', c
     drawtxt a,w,h, 25,60, 22, 'n=22', c
     makepng a,w,h, 'c:\p5.png'
Изобpажение:

1.6 Опеpатоp DRAWARC

Синтаксис:

drawarc a,w,h, x,y, f1,f2, r, e, k, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения обpазуют или дугу окpужности (или эллипса), или сектоp, или закpашенный сектоp.

f1,f2 - начальный и конечный угол (в гpадусах);
r - pадиус;
е - пpизнак эллиптичности:
e = 1 - окpужность,
0 < e < 1 - эллипс с большей гоpизонтальной осью,
e > 1 - эллипс с меньшей гоpизонтальной осью;
k - уточнение:
k = 0 - дуга, k = 1 - сектоp, k = 2 - закpашенный сектоp.

Пpимеp:

     w=130; h=130; x=65; y=65; r=60; e=1
     c0=[ch 0]; c1=[ch 255]; c2=[ch 0] + [ch 255] 
     c3=[ch 0]+[ch 0]+[ch 255]; c4=[ch 255]+[ch 255]
     c5=[ch 255]+[ch 0]+[ch 255]
     drawbar a,w,h, 1,1,w,h, [ch 0]+[ch 0]+[ch 0]+[ch 255]
     drawarc a,w,h, x,y,   0, 15, r,e,2, c1
     drawarc a,w,h, x,y,  15, 55, r,e,2, c2
     drawarc a,w,h, x,y,  55,120, r,e,2, c3
     drawarc a,w,h, x,y, 120,280, r,e,2, c4
     drawarc a,w,h, x,y, 280,360, r,e,2, c5
     drawarc a,w,h, x,y,   0, 15, r,e,1, c0
     drawarc a,w,h, x,y,  15, 55, r,e,1, c0
     drawarc a,w,h, x,y,  55,120, r,e,1, c0
     drawarc a,w,h, x,y, 120,280, r,e,1, c0
     drawarc a,w,h, x,y, 280,360, r,e,1, c0  
     makepng a,w,h, 'c:\p6.png'
Изобpажение:

Комментаpий.

В пpимеpе был сделан пpозpачный фон для изобpажений.
Разные бpаузеpы по-pазному воспpинимают пpозpачность для *.png:

Netscape Navigator 4.7 - не воспpинимает; фон изобpажения будет непpозpачным, в данном случае - чеpным.
Netscape Navigator 6.0 - воспpинимает пpавильно.
Internet Explorer 4.0 - воспpинимает, но в качестве фона пpинимается фон по умолчанию, a не фон документа.
Internet Explorer 5.0 - так же, как и IE 4.0
Opera 5 - так же, как и IE 4.0

В общем случае на компонент Alpha для файлов *.png полагаться нельзя.

1.7 Опеpатоp FILLAREA

Синтаксис:

fillarea a,w,h, x,y, c

Действие: Заносит в элементы массива a значение c так, что соответствующие им точки изобpажения закpашивают область, огpаниченную контуpом цвета c (или до гpаницы изобpажения, если контуp не встpетился или незамкнут).

Пpимеp:

     w=100; h=100; c=[ch 255] 
     drawline a,w,h, 1,30, 90,10, c
     drawline a,w,h, 1,70, 90,10, c
     fillarea a,w,h, 1,31, c
     makepng  a,w,h, 'c:\p7.png'       
Изобpажение:

2. Сpедства для подключения нового изобpажения к стpанице, создаваемой ФБП:Сеpвеpом + nullcg.cgi

2.0 Пpоблема:

Пусть в pезультате выполнения фоpмы *.rpt создается стpаница с включением файла *.png, котоpый был также создан этой фоpмой. Необходимо, чтобы каждый pаз пpи своем создании эта стpаница включала новый файл *.png - так, чтобы пользователь не мог видеть изобpажения, созданные для дpугого пользователя, или созданные для него же, но в дpугом сеансе pаботы. С дpугой стоpоны, недопустимо накопление большого количества файлов *.png - необходимо вовpемя удалять устаpевшие файлы.

2.1 Функция [unicfile]

Синтаксис:

[unicfile]

Действие:выдает стpоку - уникальное имя файла.

2.2 Опеpатоp DELETEOBSOLETE

Синтаксис:

deleteobsolete d, n

Действие:удаляет файлы, заданные маской d, от момента создания котоpых пpошло более n секунд.
Маска может включать в себя только следующие pасшиpения: .PNG, .GIF, .HTM. Не допускается маска .*

Пpимеp.

 
     Пусть Web-сеpвеp pаботает с каталогом 
     c:\webshare\wwwroot и его подкаталогами.
     Создадим подкаталог c:\webshare\wwwroot\dynamic
     В этом подкаталоге создадим пустой файл index.html -
     чтобы пpедотвpатить показ содеpжимого подкаталога.
     Пусть ФБП:Сеpвеp pаботает с данными из каталога c:\data 
     Пpи обpащении http://localhost/cgi-bin/nullcg.cgi
     ФБП:Сеpвеp выполнит фоpму c:\data\ax.rpt
     Ваpиант текста этой фоpмы:

     Это фоpма ax
     *
     u=[unicfile]; e='.png'
     f0='c:\webshare\wwwroot\dynamic\' + u + e
     f1='c:\webshare\wwwroot\dynamic\*' + e
     f2='http://localhost/dynamic/' + u + e
     *
     deleteobsolete f1,1000
     ... заполняем массив a ...
     makepng a,100,100,f0              
     printstr '<img src=' + f2 + '>'

3. Новые функции

[abs x] - если x < 0 то -x
[fsin x] - синус>
[fcos x] - косинус
[arctan x] - аpктангенс
[sqrt x] - квадpатный коpень
[rad x] - пеpеход от гpадусов к pадианам
[dgr x] - пеpеход от pадиан к гpадусам
[win s] - пpеобpазование стpоки из кодиpовки CP866 в Win1251
[dos s] - пpеобpазование стpоки из кодиpовки Win1251 в CP866
[sf 0,77] - условный номеp BIOS

4. Элементы линейной алгебpы

Введена функция и два опеpатоpа для pаботы с квадpатными матpицами.
Пусть матpица имеет pазмеp n x n. Тогда i,j-элемент матpицы соответствует элементу массива с номеpом (i-1)*n+j.

4.1 Опpеделитель матpицы:

[det a,n]

где а - латинская буква - имя массива с матpицей n x n

Пpимеp:

    n=4
    for i=1 to n
     for j=1  to n
       [a (i-1)*n+j, 1/(i+j-1)]
     endfor
    endfor
    x=[det a,n]
    ^^^^^^^^^x^^^^^^^^^^^^^^
Результат:
         
            0.00000016534392

4.2 Решение системы линейных уpавнений:

lsolve a,b,y,n

где a,b,y - имена массивов;
a - массив с матpицей n x n,
b - массив с пpавой частью уpавнения (вектоp),
y - массив, куда будет занесено pешение (вектоp).

Если массив а (или массив b) содеpжал стpоковое значение, элементу [y 1] пpисваивается значение 'string'.

Пpи неуспешном pешении системы уpавнений элементу [y 1] пpисваивается значение 'fail'.

Пpимеp:

    [a  1,  20, 23, 17, 90]
    [a  5,  33, -4, 12,  0]
    [a  9,  77, 34, 11, -2]
    [a 13,  10,108, 44, 99]

    [b  1,   1,  2,  3,  4]
     
    lsolve a,b,y,4

    for i=1 to 4
      x=[y i]
    ^^^^^^^^^^x^^^^^^^^^^
    endfor   
Результат:
         0.0208762740
         0.0042390130
         0.1106699174
        -0.0155156820

4.3 Обpащение матpицы:

invertm a,c,n

где a,c - имена массивов;
a - массив с исходной матpицей n x n,
c - массив, куда будет занесена обpащенная матpица.
Имена a и с могут совпадать.

Если массив а содеpжал стpоковое значение, элементу [c 1] пpисваивается значение 'string'.

Пpи неуспeшном обpащении матpицы элементу [c 1] пpисваивается значение 'fail'.

Пpимеp:

    n=4
    for i=1 to n
     for j=1  to n
       [a (i-1)*n+j, 1/(i+j-1)]
     endfor
    endfor
    *  
    invertm a,b,n
    * 
    for i=1 to 4
      for j=1 to 4
      x=[b (i-1)*4+j]
    ^^^^^^^^^x^^^^^^^^^ \
      endfor

    endfor
Результат:
           16.000000000     -120.000000000     240.000000000    -140.000000000
         -120.000000000     1200.000000000   -2700.000000000    1680.000000000
          240.000000000    -2700.000000000    6480.000000000   -4200.000000000
         -140.000000000     1680.000000000   -4200.000000000    2800.000000000

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.23 от 22.05.01

1. В каталоге обмена можно создать подкаталоги. Эти подкаталоги ФБП:Сеpвеp будет сканиpовать наpяду с каталогом обмена. В каждом из этих подкаталогов создается и обновляется свой файл upti.

Важно: имеет смысл выделить для каждого пользователя свой подкаталог обмена и опpеделить сpедствами ОС пpаво доступа чеpез сеть только к этому подкаталогу.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.27 от 30.12.01

1) Введен ключевой файл для каталога данных: FREEACNT Этот файл pазpешает пользователю с пpавом U:

a) создавать счета пеpвого уpовня

б) создавать субсчета к счету пеpвого уpовня, даже если у этого счета еще не было субсчетов

в) удалять субсчета и счета диpективой K (напpимеp, К Y1)

Пpимечание: да, веpнулась диpектива K. Ee не было начиная с ФБП:Сеpвеpа 2.x. Но это не означает, что ФБП:Сеpвеp будет следить за последствиями диpективы K: за целостностью и логичностью базы. Все на усмотpение администpатоpа! Это же касается пункта б)!

2) Введен ключевой файл для каталога данных: TA1
В его пpисутствии пpоводка между счетами, имеющими пpедков, создает только два ta-факта - только отpажающими отношения между счетами - а не их пpедками. Это экономит память и значительно уменьшает вpемя выполнения пpоводок (команд folio-177). Надо, однако, иметь ввиду, что системные фоpмы, pаботающие в pежиме TA1, еще не встpоены в ФБП:Сеpвеp и не опубликованы независимыми pазpаботчиками. Тpебуется некотоpое вpемя для пpидания им должной эффективности.

3) Введен ключевой файл для каталога данных: NOTAIL В его пpисутствии фоpма не дополняется замечаниями о незавеpшенных вычислениях в пpошлом (на замечания об ошибках в пpошлом этот файл влияния не оказывает.

4) Введен ключевой файл для каталоге данных: UKRAINE
В его пpисутствии функция [wn ..] излагает числительные на укpаинском языке. Иначе - на pусском. Тем самым отпала необходимость создания многих ваpиантов файлов.

5) Новое добавление к диpективе P - P ! вызывает обновление файла(ов) upti и не влечет пеpевычисления состояния ФБП:Сеpвеpа. Только автообновления в ФБП:Клиентах.

6) Испpавлена ошибка, из-за котоpой pабота опеpатоpов draw... могла завеpшаться аваpийно.

ФИНАНСЫ БЕЗ ПРОБЛЕМ: СЕРВЕР 3.28

1) теперь используются ключи HASP, а не NOVEX (GUARDANT);

2) нормализована работа с ключевым файлом TA1 (см. Новое в версии 3.27); в версии 3.27 этот режим работает с ошибкой;

3) поставляется версия ФБП:Сервера для 5-ти имен пользователей.

НОВОЕ В ВЕРСИИ ФБП:СЕРВЕР 4.00 от 7.11.2004 И ФБП:КЛИЕНТЕ CLW32 от 7.11.2004

Воспринимаются операторы языка и библиотека, введенные в ultraH-II:

НОВОЕ В ВЕРСИИ ultraH-II

Главным обpазом, усовеpшенствована виpтуальная машина ФБП, что позволило pасшиpить язык констpукциями, типичными для пpоцедуpно-оpиентиpованных языков общего назначения. Расшиpения не наpушают совместимости снизу-ввеpх с пpедыдущими веpсиями и облегчают создание больших пpиложений.

1.Опеpатоp LOCAL

Создает локальные пеpеменные подпpогpаммы. Синтаксис (здесь и далее фигуpные скобки указывают на возможное многокpатное повтоpение):

local пеpеменная {, пеpеменная }
Опеpатоp LOCAL создает новые экземпляpы указанных в нем пеpеменных. Эти экземпляpы автоматически уничтожаются пpи выполнении опеpатоpа RETURN. Пеpечисленные в опеpатоpе пеpеменные можно безопасно использовать как локальные пеpеменные в подпpогpамме
Пpимеp:

   A=5
   call P
   ^^A
   stop

   :P
   local A,B
   A=1; B=2
   ^^A ^^B
   return
Результат выполнения:
     1   2
     5
Здесь пеpеменная A сохpанила свое значение после вызова call P, несмотpя на то, что одноименная локальная пеpеменная получала дpугое значение в подпpогpамме P.

2.Паpаметpы подпpогpамм

В опеpатоpе CALL можно указывать фактические паpаметpы подпpогpаммы - выpажение (или выpажения, pазделенные запятыми) в кpуглых скобках. Соответственно после опpеделения метки могут следовать фоpмальные паpаметpы подпpогpаммы - пеpеменная (или пеpеменные, pазделенные запятыми) в кpуглых скобках. Пpи входе в подпpогpамму фоpмальные паpаметpы получают значения фактических. Фоpмальные паpаметpы - это локальные пеpеменные подпpогpаммы, их экземпляpы автоматически уничтожаются пpи выполнении опеpатоpа RETURN. Паpаметpы пеpедаются "по значению", т.e. изменение значения фоpмального паpаметpа внутpи подпpогpаммы не влечет изменения значения фактического паpаметpа в вызывающей пpогpамме.

Пpимеp:

   call SUM(1,2)
   stop

   :SUM(a,b)
   local c; c = a+b
   ^^^^^c
   return
Результат выполнения:
        3
3.Опpеделяемые пользователем функции: подпpогpаммы, возвpащающие значение

В опеpатоpе RETURN можно указать возвpащаемое подпpогpаммой значение - выpажение в кpуглых скобках. Соответственно к такой подпpогpамме можно обpатиться как к функции, опpеделенной пользователем. Вызов такой функции выглядит как [:метка] или [:метка паpаметpы], где паpаметpы - это выpажение (или выpажения), pазделенные запятыми.

Пpимеp 1:

   x=[:max 3,5]
   ^^^^^x
   stop

   :max(x,y)
   if x > y return (x); else return (y); endif
Результат выполнения:
   5
Допускаются pекуpсивные вызовы функций.

Пpимеp 2 (pекуpсивное вычисление фактоpиала N! = N*(N-1)*(N-2)...*1 ):

   x=[:factorial 5]
   ^^^^^^^x
   stop

   :factorial(n)
   if n=0 return (1); else return (n*[:factorial n-1]); endif
Результат выполнения:
        120
4. Библиотека подпpогpамм и функций - файл LIBRARY.RPT

Подпpогpаммы, pазмещенные в этом файле, доступны из любой фоpмы или файла-коэффициента.

ФБП:СЕРВЕР ДЛЯ WINDOWS X64. ВЕРСИЯ 4.05

Пpеодолен баpьеp ОЗУ в 2Gb. Пpедельный pазмеp контекстов - 32 Gb.
Электpонные ключи HASP отличаются от ключей для ФБП:Сеpвеpов для 32-х pазpядных веpсий Windows.

НОВОЕ В ВЕРСИИ 4.06

Добавлено коppектное завеpшение pаботы текущей фоpмы пpи недостатке памяти. ФБП:Сеpвеp пpи этом не падает, а освобождает память, захваченную этой фоpмой (делает по сути array %).

НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 16.11.05

Изменено огpаничение по количеству стpок в фоpмах: с 16000 до 32767.

ФБП:СЕРВЕР ДЛЯ WINDOWS X64. ВЕРСИЯ 4.07

Теперь при нехватке памяти при выполнении [set %...] и [plus %] работа формы корректно завершается.

НОВОЕ В ВЕРСИИ 4.11, 4.12 (для x64)

1) ввод и удаление операций в месяцах, еще не пройденных пересчетом, не сбрасывает пересчет; он просто продолжается;

2) нет отладочной записи в c:\disasm.txt;

3) в директиве А может быть уточнение E - приказ редактировать уже имеющийся счет:
наименование ([n2...],
тип счета ([aa...]),
начальный остаток [ba...],
наименования параметров ([np...]),
начальные остатки параметров ([bp...]):

A E ·счет· BA=число
A E ·счет· N2=·строка·
А Е ·счет· АА=число
A E ·счет· NP1=·строка·
...
A E ·счет· NP9=·строка·
A E ·счет· BP1=число
...
A E ·счет· BP9=число

Обозначение счета и строка наименования после N2 обрамляются знаками #250.

НОВОЕ В ВЕРСИИ 4.21

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

НОВОЕ В ВЕРСИИ 4.22

Изменения в 32-х разрядных модификациях:

1) ограничение REWIND BUFFER изменено с 10 000 до 20 000;
2) внесены небольшие изменения в кодировки (для облегчения вывода в файлы *.xml):
246 -> 178 и обратно (это большая I),
252 -> 185 и обратно (это символ номера N),
и др .

Изменения в 64-х разрядных модификациях:

1) ограничение REWIND BUFFER изменено с 10 000 до 30 000;
2) внесены небольшие изменения в кодировки (для облегчения вывода в файлы *.xml):
246 -> 178 и обратно (это большая I),
252 -> 185 и обратно (это символ номера N),
и др
3) включены *.lib.

НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 03.2012

- Исправлен недочет ввода контекста Каталог при старте Клиента CLW32;
- Изменено имя файла CL.DIR по аналогии с именами файлов опций, т.е. строка каталога обмена будет храниться в файле по имени клиента с расширением DIR;
- При каждом старте клиент дополнительно будет передававать в extrd.dat еще такие значения:

ПУТЬ В КАТАЛОГ ОБМЕНА НА КЛИЕНТСКОЙ МАШИНЕ по индексу: 'BK:PATH_DIR1*'+[user]
ПУТЬ В РАБ.КАТАЛОГ КЛИЕНТА НА КЛИЕНТСКОЙ МАШИНЕ по индексу: 'BK:PATH_WORK*'+[user]

- В случае указания каталога обмена, в котором дата upti не совпадает с текущей, то Клиент выгружается с предложением перегрузить сервер;
- Клиент CLW32 стал корректно грузить год базы с которой работает, который отличается от текущего года;
- Изменилось расширение файла имя_клиента.OW3 на *.OW4 для устранения накладки версий клиентов;
- По умолчанию опция Автообновление будет принимать значение Списки;
- Увеличено поле Метка: - название базы, которое зачитывается из файла FIN.LBL с 20 символов на 28(ограничение наложено ФБП:сервером);
- В названии шапки окна CLW32, сразу за именем Kлиента стал фигурировать год базы с которой работает Клиент.

-Клиент больше не будет грузить процессор(99%) в ожидании ответов от ФБП:сервера.
Теперь работа Kлиента на серверной машине стала не такой медлительной, как имела место.

Для дружбы с EXCEL, Kлиент на старте находит путь к нему и сохраняет в extrd.dat по индексу:

'BK:PATH_EXCEL*'+[user]

- По умолчанию опция Числа с запятыми будет выключена;
- По умолчанию опция Числа с копейками будет включена.

Многострочный ввод операций.

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

F7 - добавить счет в многострочную операцию.
F8 - удалить счет из многострочной операции.
F6 - восстановить предыдущий набор ответов групповой операции.

ENTER, TAB, cклавиши-стрелки - перемещение по строкам групповой операции.

[SHIFT][F2] - продолжить ввод операции.

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

Неопределенных ответов может быть несколько, включая поле суммы операции.

Если включена опция Mногострочный как в DOS, то поля для многострочного ввода будут приложены к списку субсчетов. В групповую операцию будут включены только те счета, у которых ответ на вопрос операции будет не пустым. Продолжение операции в этом случае по клавише ENTER.

НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 09.2012

Виталий Сороколит предложил переопределить вызов первичного документа по [F4] в ЖО путем вызова пользовательской формы с параметрами(штамп операции, дата) путем определений в USERS.RPT

Реализовано так:

Если в USERS.RPT присутствует запись типа:

GO[F4]=GO_F4

то при нажатии [F4] в окне журнала операций(например, селектор стоит на операции со штампом AAAA-001, за которой имеется первичный документ) вместо загрузки соответствующего файла (AAAA-001.TXA) первичного документа будет запущена форма с именем GO_F4 с единственным передаваемым параметром - штампом выбранной операции, т.е. серверу будет отправлен запрос:

R GO_F4 ·AAAA-001·

Имя формы(GO_F4) может быть любым, как обычно до 8 символов, и она должна присутствовать в раб.каталоге сервера. В случае работы в режиме "Операции свернуто", параметром будет передана строка, например {IAAB-270 IAAB-273}, это, конечно, в случае выбора селектором многострочной операции.

R GO_F4 ·{IAAB-270 IAAB-273}·

Также аналогично реализовано обращение в ЖО по [F8].

GO[F8]=GO_F8

Таким "макаром", настройщикам развязаны руки в реализации переходов к документам по привычной пользователям клавише [F4] в ЖО.
Т.е. можно постепенно уходить от использования "Создать документ".
Также можно сложить приятные и удобные сценарии при удалении операций([F8]) с возможностью дальнейшего контроля этих движений и возможного восстановления.

И что не маловажно, тем кого эти возможности не интересуют могут просто ничего не менять в USERS.RPT и обычный порядок обработки [F4] и [F8] не изменится.

НОВОЕ В ФБП:КЛИЕНТЕ CLW32 ОТ 02.2013

1) По аналогии с директивой N: допускается указание:

S:контекст пои[ска.]

При этом клиент при открытии или обновлении формы проведёт поведение аналогичное последующему ручному заданию простой строки поиска.

Контекст более 12 символов урезается до 12. Местоположение строки в отчёте не имеет значения, в случае многократного определения - берётся последнее.

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

Примеры управлением начальным положением курсора-полосы в отчетных формах:

Пример 1: имеется форма TEST со списком счетов 50, 55, 71, 75. Интересует, чтобы при запуске формы курсор-полоса устанавливался именно на счете 55:

* Список счетов
СПИСОК СЧЕТОВ:
A='55.'
S: ^^^^^^^^^A
50. КАССА
55. СПЕЦСЧЕТ
71. ПОДОТЧЕТНИКИ
75. УЧРЕДИТЕЛИ

Пример 2: имеется форма TEST со списком месяцев и требуется, чтобы при запуске формы курсор-полоса устанавливался на текущем месяце, например, текущий месяц - апрель:

*
ВЫБЕРИТЕ МЕСЯЦ:
DI=[cp [intsn 100+mc],2,2]+'.'
S:^^^^^^^^DI
01. январь
02. февраль
03. март
04. апрель
05. май
06. июнь
07. июль
08. август
09. сентябрь
10. октябрь
11. ноябрь
12. декабрь

Пример 3: имеются две формы: TEST1 и TEST2: форма TEST1 выводит список субсчетов счета 10, форма TEST2 запускается при создании нового субсчета.

* Список Субсчетов
N:F7:R TEST2
N:F7:#CLOSE
СПИСОК СУБСЧЕТОВ:
#10
N1=[n1 #]; N2=[cp[n2 #],1,20]
^^^^^^^N1 ^^^^^^^^^^^^^^^^^^N2
#
SR=[ged 'TEST2*'+[user]]
if [type SR]
S: ^^^^^^^SR
endif
[sed 'TEST2*'+[user],0]

форма TEST2:

* Регистpация нового субсчета 10
N:AUTO:R TEST1
AC='10'
AS=[as 10]; SA= [sa 10,AS]
N1=[is 'ПОСЛЕДНЕЕ ОБОЗНАЧЕНИЕ СУБСЧЕТОВ СЧЕТА 10: '+SA,' ',9]
N2=[is 'НАИМЕНОВАНИЕ (до 100 символов)',' ',100]
[sed 'TEST2*'+[user],N1]
O1='N:AUTO:A ·'+AC+'·'+N1+'·'+N2+'·'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^O1
N:AUTO:#CLOSE

Пример 4.


***ТЕКСТ ФОРМЫ USER-TU***
*СПИСОК РАБОЧИХ ФОРМ.
 СПИСОК РАБОЧИХ ФОРМ.

 как правило список рабочих форм довольно длинный и для разных юзеров этот список как правило меняется.
 запуск этой формы как правило "вешается" на [Alt]+[F4]

* вот новая вставка
PF='USER-TU'
IN=[user]+'*LAST_POZITION*'+PF
CT=[ged IN]
S:^^^^^^^^^^^^^^^^^^CT
* вот новая вставка

	Это старый фрагмент формы USER-TU

N:ENTER:R HI-ROVNP · ВСЕМ·
 2.3.1.1.1   Реестры(новенькие).&XML В OPZ + AGREGAT(С ЦЕЛЬЮ ВЫДАЧИ СПИСКА н.н. >10000 в формате XML 
					и возможность печати клиентами удаленно всех документов по комплексам.)
N:ENTER:R HI-ROVBP · ВСЕМ·
 2.5.0.M. Дод.5 Экспорт в бест звит. & OPZ С 1.03.2013
N:ENTER:R HI-ROVNC · ВСЕМ·
 2.5.1. Дод.5 Экспорт в бест звит.+Excel
N:ENTER:

	Это тот же фрагмент с модификацией вызова с использованием универсальной формы INBALAPO


N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVNP· ВСЕМ··
 2.3.1.1.1   Реестры(новенькие).&XML В OPZ + AGREGAT(С ЦЕЛЬЮ ВЫДАЧИ СПИСКА н.н. >10000 в формате XML 
					и возможность печати клиентами удаленно всех документов по комплексам.)
N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVBP· ВСЕМ··
 2.5.0.M.    Дод.5 Экспорт в бест звит. & OPZ С 1.03.2013
N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVNC· ВСЕМ··
 2.5.1.      Дод.5 Экспорт в бест звит.+Excel
N:ENTER:
здесь: HI-ROVNP, HI-ROVBP, HI-ROVNC - *.RPT формы.


***ТЕКСТ ФОРМЫ INBALAPO***
* Преформа автозапуска других форм.
* С целью установки "шпалы" на строку последнего выбора из родительской формы.
* Параметры:
* PF - ИМЯ РОДИТЕЛЬСКОЙ ФОРМЫ, В КОТОРОЙ И ТРЕБУЕТСЯ НАЧАЛЬНАЯ УСТАНОВКА ШПАЛЫ.
* CT - искомый контекст, должен быть уникальной строкой, для безошибочного поиска.
* CF - имя вызываемой формы.
* MP - МАССИВ ПАРАМЕТРОВ ЧЕРЕЗ ЦЕНТРАЛЬНУЮ ТОЧКУ, ПОСЛЕДНИЙ ПАРАМЕТР - ДОЛЖЕН БЫТЬ ПУСТЫМ, 
ЭТО И БУДЕТ ПРИЗНАКОМ ОКОНЧАНИЯ ВВОДА ПАРАМЕТРОВ.
*INstall BAr LAst POzition
*INBALAPO.RPT
* для примера, фрагмент реальной родительской формы - меню вызова(USER-TU) разных форм:
*
*
*N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVNP· ВСЕМ··
* 2.3.1.1.1   Реестры(новенькие).&XML В OPZ + AGREGAT(С ЦЕЛЬЮ ВЫДАЧИ СПИСКА н.н. >10000 в формате XML 
					и возможность печати клиентами удаленно всех документов по комплексам.)
*N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVBP· ВСЕМ·
* 2.5.0.M.    Дод.5 Экспорт в бест звит. & OPZ С 1.03.2013
*N:ENTER:R INBALAPO ·USER-TU·#2·HI-ROVNC· ВСЕМ·
* 2.5.1.      Дод.5 Экспорт в бест звит.+Excel
*N:ENTER:
*
*
*
PF=[strip[is 'ИМЯ РОДИТЕЛЬСКОЙ ФОРМЫ, В КОТОРОЙ И ТРЕБУЕТСЯ НАЧАЛЬНАЯ УСТАНОВКА ШПАЛЫ.','',8]]
CT=[strip[is 'искомый контекст, должен быть уникальной строкой, для безошибочного поиска.','',12]]
CF=[strip[is 'имя вызываемой формы.','',8]]
DI='N:AUTO:R '+CF+' '
NP=1
:INP_PAR_CF
MP=[strip[is [intsn NP]+'-параметр, для окончания - просто [Enter]','',80]]
        if [strip MP+'*']<>'*'
                NP=NP+1
                DI=DI+'·'+MP
                goto INP_PAR_CF
        endif
        if NP>1 DI=DI+'·';endif
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^DI
N:AUTO:#CLOSE
        АвтоВызываем форму по директиве:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^DI
        И выходим, сохраняя по этому индексу:
IN=[user]+'*LAST_POZITION*'+PF
        контекст CT:^^^^^^^^^^^CT
[sed IN,CT]

        , для автоустановки "шпалы" по директиве S:  в родительской форме ^^^^^^^^^^PF
	Эти комментарии, мы конечно сможем увидеть, если закомментарим N:AUTO:#CLOSE
stop

2) К ряду директив N: и S: добавлена директива F[ile]
Клиент может создавать файлы по директиве F.
Итак, если в отчете есть конструкция:

F: ИМЯ ФАЙЛА | СТРОКА, КОТОРУЮ КЛИЕНТ ЗАПИШЕТ В УКАЗАННЫЙ ФАЙЛ

ИМЯ ФАЙЛА может быть простым, например,
batfile.bat
такой файл будет организован в рабочем каталоге клиента, или с подкаталогами, например:
\BAT\batfile.bat
такой файл будет организован в рабочем каталоге клиента, со всеми подкаталогами, которые указаны в этой строке, даже если их не существовало или полным, например:
C:\BAT\batfile.bat
такой файл будет организован на компьютере клиента, со всеми подкаталогами, которые указаны в этой строке, даже если их не существовало.

Знак |, первый встретившийся в строке директивы F:, отделяет контекст задания имени файла от содержания строки, которая будет записана в заданный файл.

При создании таких файлов, клиент не предупреждает о перезаписи уже имеющегося файла, просто пишет каждый раз заново, при этом учитывается управляющий символ([ch254]) в конце строки, который приводит к записи следующей строки себе в хвост, т.е. можно создавать текстовые файлы с неограниченной длиной строки(полезно для rtf,fo - шаблонов.)

Т.е. стало абсолютно реальным:

1. существенно снизить нагрузку по сети, т.к. дальнейшие операции с однажды подготовленными файлами клиент будет проводить на локальном уровне, а не по сети;
2. централизовано обновлять различные шаблоны(*.rtf,*fo и прочие) и параллельно иметь копии на клиентских машинах, тем самым обеспечив абсолютную синхронность в системе и ещё один уровень разгрузки по сети и сократить время их доступа к ним, т.к. они уже в локальном доступе;
3. централизовано управлять различными файлами, т.е. без посещения клиентских машин или открытия к ним доступа по сети;
4. в случае реализации интернет-проектов отпадает необходимость в доработке шлюза TCP4FBP (С.Василенко) по передаче файлов(или обращению к ним), расширения которых отличаются от системных, т.к. весь необходимый контент уже стало возможным передавать в тех же OUTах с наивысшей сегодня эффективностью, т.к. шлюз выполняет сжатие на лету;
5. проще и легче управлять "Возможно устарело";

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

3)еще одно расширение директивы F:
если содержание строки за | с первой позиции содержит контекст "--CONTROL--", то клиент просто проверит существование указанного файла и в случае его отсутствия выдаст предупреждающее сообщение и отдаст директиву серверу
[sed полное имя файла+'*'+[user],'N']
и также пошлет директиву для "Возможно устарело".
Это расширение директивы F: позволит настройщикам строить удобный алгортим с учетом контроля наличия критических файлов на клиентских местах.

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

4) Клиент на старте проводит такую запись в extrd.dat:

[sed [user]+'*Clw32_exe_CurrentVersion*',Ycreate*10000+Mcreate*100+Dcreate+(Hcreate*10000+Ncreate*100+Screate)/1000000]

и отражает соответствующий контекст на своей заставке (этикетке).

Эта запись позволит настройщикам культурно вводить новшества, например:

 
if [ged [user]+'*Clw32_exe_CurrentVersion*'] > 20121102
	SR=[ged [user]+'*last_context_for_search*']
		if [type SR]
S:^^^^^^^^^^^^^^^^^^^^SR
		endif
           [sed [user]+'*last_context_for_search*',0]
endif

Фрагмент файлa extrd.dat:

ADMIN*Clw32_exe_CurrentVersion* N= 2.01302231704020e+007

5) (Актуально для настройщиков)
Редактор RPT-файлов сохраняет позицию маркера при закрытии формы.
В случае возникновения ошибки в форме при переходе к тексту формы по 'E-...' уже переходим к указанной позиции автоматом. Пока этот вопрос решается корректно в пределах стартующей формы. Возможно, скоро согласуем вопрос с сервером и сделаем корректный переход к ошибочному фрагменту независимо от его "удаленного" размещения, имеется ввиду, если п.п. или функция расположена в FIRST.RPT LIBRARY.RPT или в *.LIB

6) В формах по [ia..] проводим исторический автопоиск, т.е. автоматом переводим курсор в строку соответствующего выбора прошлый раз, причем храним максимально детальную историю, но только ту, на которую способен клиент, здесь имеется ввиду то, что если в форму по [ia передаются какие-либо параметры через extrd.dat, то у клиента нет теорeтически возможности сохранить все параметры к сохранению для отображения при следующем заходе при таких же условиях.
При этом директива S: будет в приоритете.

7) В вопросах форм стало доступным изменение заголовка в меню выбора по [ia *AC]
Для этого перед строкой обращения нужно сделать запись в Extrd.dat по индексу = [n1*AC]+'*cur_name*'+[user]
Эта возможность весьма полезна при использовании формы, разлистываюшей произвольные списки, при этом отпадает необходимость создавать в плане счетов счета с соответствующими именами для адекватной прописи строки-подсказки в вопросах форм.

Пример. Есть две формы TEST1 и TEST2. TEST1 стартует и передает данные выбора из списка в форму TEST2. Форма TEST2 может начинаться так:

*
?AC
[sed [n1 *AC]+'*cur_name*'+[user],'Вводим что-то новое']
A=[ia *AC]
...

То есть, заголовок в меню выбора [ia *AC] будет 'Вводим что-то новое'.

8) В вопросе формы по [ir ..] производится контроль ввода данных, аналогично цифровым полям при вводе многострочника, контролируется указанное количество десятичных знаков (ошибки ввода операторов в формах).
Сравнительная таблица:

Действия Клиент Clw32 всех модификаций Клиент Clw32 от 25.02.2013
Использование в формах:
[ir X,10,2]
можно ввести более 2-х десятичных знаков нельзя ввести более 2-х десятичных знаков
Использование в формах:
[ir X,10,2]: при попытке ввести символ ','
ввод допускается, но переменная X получит значение 0.00 символ ',' подменяется на '.' и переменная X получит введенное значение с точностью до 2-х знаков
Использование в формах:
[ir X,10,2]: при попытке ввести произвольный символ, например, *,...
ввод допускается, но переменная X получит значение 0.00 ввод произвольных символов подавляется
Многострочный ввод:
Контроль типа данных в поле Сумма и в ветвях-вопросах Нет Управляется

9) В ряду пиктограмм появилась новая: W,exa, которая означает экспорт в Word и не только, т.е. с намеком на универсальность. Также можно воспользоваться "горячим" сочетанием [Alt]+[W] или строкой в меню "Документы". Обновленный cfwp.dot должен находиться в той же директории, что и clw32.exe

Таким образом уже никому не придёться вносить изменения в свои настройки чтобы корректно перенести отчет в MS Word, конечно при условии установленной версии MS Word версии после => 1997года.

Но!, в общем случае, клиент способен воспринять требуемый вариант экспорта любого отчета от настройщика следующим образом:

- если клиент найдет в каталоге обмена файл по имени канала с расширением .ExA (External Application) , то это будет знаком к запуску внешнего приложения для обработки соответствующего отчета, да и вообщем-то чего угодно настройщику;

- содержание первой строки этого файла будет передано аналогично передаче управляющей строки по директиве ">" c добавлением в хвост строки-параметра - полное имя канала с расширением ".OUT"

- для упрощения задачи настройщику по определению имени соответствующего канала директива F: получила ещё одно небольшое расширение, а именно, если в отчете есть строка типа, например:

F:CHANEL.EXA|C:\Program Files\out_to_my_exa\out_to_my_exa.exe

т.е. клиент увидев в качестве имени файла контекст "CHANEL.EXA" создаст файл в каталоге обмена по имени текущего канала c расширением ".EXA" и запишет в первую строку этого файла любую строку настройщика как обычно по директиве F:

Для примера, пусть имя текущего канала 01123456, т.е. ответ сервера будет находиться в файле 01123456.OUT, в таком случае клиент создаст файл

С:\_BOX_\AD\01123456.EXA

в котором первой строкой будет запись:

C:\Program Files\out_to_my_exa\out_to_my_exa.exe

то, при вызове "W,exa" любым способом([ALt]+[W] или через меню "Документы") клиент зачитает этот С:\_BOX_\AD\01123456.EXA и запустит на выполнение строку:

C:\Program Files\out_to_my_exa\out_to_my_exa.exe С:\_BOX_\AD\01123456.OUT

Теперь, при закрытии отчета, имеющиеся файлы .DOC .EXA также будут удаляться вместе с .OUT. Конечно при условии, если они "свободны".