КОМПЬЮТЕР ВЫВОДИТ САЛЬДО В СЕТИ

Евгений Шуремов

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

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

Книга является логическим пpодолжением книги "Компьютеp выводит сальдо" . Она содеpжит описание pасшиpений языка фоpм, введенных в "Финансы без пpоблем" в 1995-1996: так называемых экстpапаpаметpов и фактов. В ней pассмотpена также сетевая веpсия пpогpаммы в аpхитектуpе клиент-сеpвеp и особенности ее использования в Novell NetWare, Windows, OS/2 и глобальных сетях типа Internet.

Названия оpганизаций, имена и данные, использованные в иллюстpациях и пpимеpах, являются вымышленными. Хакеpс Дизайн и "Финансы без пpоблем" являются заpегистpиpованными товаpными знаками ЗАО "Хакеpс Дизайн". Все дpугие товаpные знаки и заpегистpиpованные товаpные знаки являются собственностью соответствующих фиpм.

[ Переписать архив]

Содеpжание

От автора

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

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

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

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

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

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

В завершении этого краткого предисловия позвольте выразить признательность читателям, которые не сочтут напрасным потраченное на чтение этой книги время, фирме "Хакерс Дизайн", ее сотрудникам и лично ее директору господину Водянику А.Г. за новаторский и неординарный подход к решению проблем автоматизации учета, моей маме Суляевой Л.Х., безропотно возложившей на свои плечи тяжелый груз бытовых домашних проблем, господину Комлеву Н.В., благодаря которому я занялся увлекательным делом по изучению программного обеспечения бухгалтерского учета, сотрудникам фирм "Бизнес-Программы-Сервис" и салона "Финансист" за помощь в работе, госпоже Умновой Э.А. за полезные консультации, коллегам по кафедре "Вычислительная техника" Финансовой академии при Правительстве РФ за благосклонное отношение к моему литературному творчеству, ну, и, естественно, всем тем, кто пусть и не имел отношения к книге, но любил, любит или когда-нибудь будет любить ее автора.

Е.Шуремов.

Часть 1. Новые возможности программы "Финансы без проблем"

Экстра-параметры

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

Суть нововведения состоит в следующем.

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

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

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

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

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

В первом приближении, можно считать, что в отличие от шахматного баланса, где и строки и столбцы соответствуют счетам и/или субсчетам, таблица экстра-параметров устанавливает соответствие между счетами и объектами аналитического учета. При этом, если раньше программа требовала увязки аналитического учета с тем или иным субсчетом, то теперь механизм экстра-параметров вводит как бы "открытые" аналитические позиции, свободно увязываемые с любым подмножеством счетов/субсчетов.

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

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

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

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

Для установки значений экстра-параметров в язык форм "Финансов без проблем" введены следующие новые функции.


[set a, s, v]    - установить экстpапаpаметp s счета a в значение v

[plus a, s, v]   - увеличить экстpапаpаметp s счета a на значение v

Функции set и plus могут использоваться только в листьях деpева и в файлах-коэффициентах. Они всегда возвpащают значение 0. Значения выражения v могут быть как числовыми, так и стpоковыми.

В зависимости от типа присваиваемого значения функция [plus] выполняет либо аpифметическое сложение, либо конкатенацию (сцепление) стpок.

Доступ к значениям параметров обеспечивается функциями:


[get a, s]       - выдать значение экстpа-паpаметpа s счета a;
                   в листьях деpева и в файлах-коэффициентах -
                   значение, достигнутое к моменту выполнения
                   текущей пpоводки; в фоpмах - значение
                   на конец отчетного пеpиода

[get a, s, m]    - выдать значение экстpа-паpаметpа s счета a
                   на конец месяца m

[get a, s, m, d] - выдать значение экстpа-паpаметpа s счета a
                   в месяце m на конец дня d

[type v]         - выдать числовое значение, соответствующее типу
                   выpажения v; 0 - если выpажение числовое, 1 -
                   если стpоковое

В качестве примера использования экстра-параметров разберем схему учета поступления и реализации товаров.

При этом будем исходить из следующих общих посылок.

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

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

Таким образом, счет 60 всегда оказывается пассивным, поскольку возникающая на нем дебиторская задолженность тому или иному поставщику автоматически переносится на активный счет 61. В связи со сказанным, счета 60 и 61 ведутся без субсчетов, поскольку развернутое сальдо никогда не потребуется (если, конечно, мы правильно составим схему и будем ее корректно использовать). Для учета сумм задолженностей конкретных поставщиков будут использованы экстра-параметры.

Учет товарно-материальных ценностей (ТМЦ) будем вести на субсчетах фиктивного счета T (латинское). Итоги взаиморасчетов с контрагентами будут выявляться на субсчетах фиктивного счета K (латинское). Список подразделений будем вести на субсчетах счета P (латинское).

Таким образом, для учета операций приходования и оплаты товаров будут использоваться следующие счета:


 Счета, начальные условия, паpаметpы

 19    [А] НДС по
           материальным
           ресурсам
 41    [А] Товары
 50    [А] Касса
 51    [А] Расчетный                10,000,000
           счет
 60    [П] Расчеты с
           поставщиками
 61    [А] Авансы
           выданные
 68    [Д] Расчеты с
 ..(1)     бюджетом
 85    [П] Капитал                 -10,000,000
 ..(1)
 K     [Н] Контрагенты
 ..(2)
 P     [Н] Подразделения
 ..(2)
 T     [Н] Материальные                            НДС%
 ..(2)     ценности
 X     [Н] Балансир

Для начала работы установлено наличие денег на расчетном счете в размере 10 млн. руб.

На счете 68 пока откроем только один субсчет:


 Счета, начальные условия, паpаметpы

 ...
 68    [Д] Расчеты с
           бюджетом
 68-2      Расчеты по НДС

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

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

На счетах-справочниках субсчета можно открыть по следующей схеме:


 ...
 K     [Н] Контрагенты

 K001      ТОО "Ветер"
 K002      ТОО "Дождь"

 ...
 P     [Н] Подразделения

 P01       Склад#1
 P02       Склад#2

 ...
 T     [Н] Материальные                            НДС%
           ценности
 10001001  Пиво Туборг 0,5                           20.
 10002001  Колбаса вареная                           10.

 

Для счетов P и K мы предваряем код соответствующими латинскими буквами для гарантии их уникальности и непересечения с подмножествами кодов других возможных счетов и субсчетов. В остальном кодирование произвольно. В качестве первого параметра счета T вводятся значения ставки НДС для данного вида ценностей.

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

Указанные счета будут выступать не только в роли справочников. Их сальдо будет показывать вполне реальные величины.

Субсчета счета K будут показывать общее состояние расчетов с конкретными контрагентами вне зависимости от того поставщики это или покупатели. Это может оказаться особенно полезным, если поставщик одних товаров одновременно является покупателем других. Кроме того, здесь будут объединяться данные нескольких бухгалтерских счетов (60, 61 и 62,64).

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

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

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

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


Счет/Субсчет Экстра-параметр             Содержание
------------ --------------- -----------------------------------------
   60              @K        задолженность поставщику
   61              @K        задолженность поставщика
   @T              @P        кол-во ТМЦ данного вида в подразделении
   @T           'всего'      общий запас ТМЦ данного вида
   19           <субсчета>   суммы НДС, относящиеся на разные субсчета
                             и к разным поставщикам

Данная таблица определяет структуру построения экстра-параметров и правила их хранения в памяти программы.

Интерпретация такова.

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

Для каждого субсчета счета T в экстра-параметре, соответствующем тому или иному подразделению (складу), будет увеличиваться (при приходе) или уменьшаться (при расходе) количество запаса в натуральном выражении. Параметр 'всего' определяет общую величину запаса данного вида ТМЦ по всем складам.

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

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

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

Счет 19 мы специально не разбиваем на субсчета в явном виде. Соответствующие субсчетам суммы, относящиеся к различным категориям ценностей (основным средствам, нематериальным активам, материалам, МБП и товарам), будут учитываться в экстра-параметрах, а счет 19 будет дебетоваться и кредитоваться в целом. Хотя в числовом примере будут задействованы только товары, схема будет построена в предположении наличия и других категорий материальных ценностей, а, соответственно, и сумм НДС, поступивших с ними от поставщиков.

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

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


 Счета, начальные условия, паpаметpы
 ...
 N     [Н] Структура НДС                       Тип зачета

 N01       Основные средства                          1.
 N04       Нематер. активы                            1.
 N10       Материалы
 N12       МБП
 N26       Затраты
 N41       Товары

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

Экстра-параметры для учета НДС будут иметь составные коды. Их первой частью будет код категории НДС, соответствующий субсчету счета N, а второй частью - код контрагента-поставщика, от которого получены ценности (работы, услуги) данной категории, включающие НДС.

Таким образом, если код поставщика K001, и от него получены товары на сумму 4800, включая 20% НДС, то на счете 19 будет автоматически открыт экстра-параметр N41K001 и на нем будет учтена сумма 800.

Составим операцию прихода товаров на склад следующим образом:

Деpево видов опеpаций ...Товары ...приход от поставщика ...?Q кол-во . @P X (0) выбор подразделения прихода . X @K 1 "кредитование" поставщика . @T X tmc_prih "дебетование" счета ценностей . 41 60 F41_60 приходование без НДС . 19 60 (ND) приходование НДС . 60 61 (ZA) зачет аванса (если был) . 68-2 19 (ZN) зачет НДС (если уже оплачен)

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

Рассмотрим содержание файла tmc_prih.rpt.


* Поступление ТМЦ
t=[n1 @T]                код товара
k=[n1 @K]                код контрагента-поставщика
p=[n1 @P]                код подразделения
a=[plus *t,p,Q]          ценности записаны на подразделение в кол-ве Q
a=[plus *t,'всего',Q]    общий запас ценностей данного вида

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

Оператор присваивания a=[plus *t,p,Q] интерпретируется следующим образом: к уже учтенному на складе p количеству товара вида t прибавить вновь поступившую партию размером Q. Напомним, что в переменную Q в ветви вопросе устанавливается количество поступившего товара данного вида. Символ "*" указан перед переменной t в соответствии с синтаксисом языка программы, требующего при неявном обращении к кодам счетов (субсчетов) указывать этот символ перед именем переменной, хранящей код счета (субсчета). Переменная a нам не нужна, но поскольку установка экстра-параметра выполняется встроенной функцией, то в соответствии с синтаксисом программы должен использоваться оператор присваивания.

Экстра-параметры не обязательно должны быть существовать при обращении к ним с помощью встроенной функции [plus]. Если при обращении к экстра-параметру в такой форме программа выясняет, что его не существует, то экстра-параметр создается и ему присваивается нулевое значение.

Рассмотрим теперь файл-коэффициент F41_60.


* Поступление товара
a =[plus 60,k,$]          увеличена задолженность поставщику по счету 60
r =[ep *t]                процент НДС данного вида ТМЦ
S0=$*100/(100+r)          сумма без НДС для записи на счет 41
ND=$-S0                   сумма НДС для записи на счет 19
SA=[get 61,k]             сумма ранее выданного данному поставщику аванса
ZA=SA
! SA > $      Если сумма аванса > стоимости поступивших ТМЦ, то
  ZA=$             сумма зачета равна стоимости ТМЦ, иначе она равна авансу
!
ZN=ZA*r/(100+r)           сумма НДС к зачету
a =[plus 19,'N41'+k,ND-ZN]  недозачтенный НДС по данной поставке товаров
a =[plus 61,k,-ZA]        аванс уменьшен на зачитываемую сумму
a =[plus 60,k,-ZA]        задолженность уменьшена на зачитываемую сумму
$=S0                      сумма проводки Д41 К60

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

Здесь учитывается то обстоятельство, что переменные t, p и k установлены предыдущим файлом-коэффициентом.

Поскольку $ - сумма операции, то есть стоимость приходуемого товара, то оператор a =[plus 60,k,$] увеличивает кредиторскую задолженность поставщика k, связанную со счетом 60, на эту сумму. Опять же, если данного экстра-параметра не было, то он будет создан.

Далее, приходуемая сумма очищается от НДС операторами:


r =[ep *t]         процент НДС данного вида ТМЦ
S0=$*100/(100+r)   сумма без НДС для записи на счет 41
ND=$-S0            сумма НДС для записи на счет 19

Здесь используется то обстоятельство, что первым параметром счета T являются ставки НДС по конкретным ТМЦ - субсчетам данного счета.

Следующая группа операторов вычисляет величину ранее выданного аванса, подлежащую зачету в связи с данной поставкой.


SA=[get 61,k]             сумма ранее выданного данному поставщику аванса
ZA=SA
! SA > $      Если сумма аванса > стоимости поступивших ТМЦ, то
  ZA=$             сумма зачета равна стоимости ТМЦ, иначе она равна авансу
!
ZN=ZA*r/(100+r)           сумма НДС к зачету

Из экстра-параметра счета 61, соответствующего поставщику k, в переменную SA выбирается сумма ранее уплаченного ему аванса. Если аванса не было, то в переменную SA будет возвращен ноль.

Далее, рассчитывается доля аванса, подлежащая зачету в соответствии с суммой данной поставки. Для этого сначала переменная ZA (Зачет Аванса) устанавливается в значение полной величины выданного данному поставщику аванса. После этого, проверяется, не является ли сумма выданного аванса большей, чем сумма поставки. Если это так, то зачитываемая сумма аванса принимается равной только сумме поставки. В противном случае, она не изменяется и остается равной полной сумме выданного аванса. И, наконец, на основе только что вычисленной суммы зачитываемого аванса рассчитывается подлежащий зачету НДС. Таким образом, НДС зачитывается только тогда, когда он "поступил" с ценностями, но только в той доле, в какой оплачен (покрыт авансом).

В завершении файла-коэффициента, операторы


a =[plus 19,'N41'+k,ND-ZN]   недозачтенный НДС по данной поставке
a =[plus 61,k,-ZA]           аванс уменьшен на зачитываемую сумму
a =[plus 60,k,-ZA]           задолженность уменьшена на зачитываемую сумму
$=S0                         сумма проводки Д41 К60

увеличивают НДС, учтенный с товарами от данного поставщика (экстра-параметр с составным кодом 'N41'+k) на сумму разницы между полученным и сразу зачтенным НДС, а также уменьшают аванс, выданный поставщику, на зачитываемую в счет данной поставки сумму аванса. Также на величину зачитываемого аванса уменьшается и сумма задолженности данному поставщику. Если аванса не было, то ничего и не уменьшается, а НДС, полученный от данного поставщика учтется в полной сумме без всякого зачета.

Для "разгона" нашего примера выполним несколько операций приходования товаров на различные склады.


   1  4      480,000  Товары  приход от поставщика кол-во 100 P01 Склад#1
                      K001 ТОО "Ветер" 10001001 Пиво Туборг 0,5

   2  4      660,000  Товары  приход от поставщика кол-во 200 P01 Склад#1
                      K001 ТОО "Ветер" 10002001 Колбаса вареная

   3  6    1,344,000  Товары  приход от поставщика кол-во 200 P02 Склад#2
                      K002 ТОО "Дождь" 10001001 Пиво Туборг 0,5

   4  6      275,000  Товары  приход от поставщика кол-во 100 P02 Склад#2
                      K002 ТОО "Дождь" 10002001 Колбаса вареная

Теперь распечатаем отчет по операциям вместе с проводками.


 Опеpации в мае 1996
 Всего опеpаций: 4

   N Дата      Сумма  Вид опеpации, комментаpии, пpоводки
------------------------------------------------------------------------------
   1  4      480,000  Товары  приход от поставщика кол-во 100 P01 Склад#1
                      K001 ТОО "Ветер" 10001001 Пиво Туборг 0,5

                      P01       X                          0
                      X         K001                 480,000
                      10001001  X                    480,000
                      41        60                   400,000
                      19        60                    80,000
                      60        61                         0
                      68-2      19                         0

   2  4      660,000  Товары  приход от поставщика кол-во 200 P01 Склад#1
                      K001 ТОО "Ветер" 10002001 Колбаса вареная

                      P01       X                          0
                      X         K001                 660,000
                      10002001  X                    660,000
                      41        60                   600,000
                      19        60                    60,000
                      60        61                         0
                      68-2      19                         0
 


   3  6    1,344,000  Товары  приход от поставщика кол-во 200 P02 Склад#2
                      K002 ТОО "Дождь" 10001001 Пиво Туборг 0,5

                      P02       X                          0
                      X         K002               1,344,000
                      10001001  X                  1,344,000
                      41        60                 1,120,000
                      19        60                   224,000
                      60        61                         0
                      68-2      19                         0

   4  6      275,000  Товары  приход от поставщика кол-во 100 P02 Склад#2
                      K002 ТОО "Дождь" 10002001 Колбаса вареная

                      P02       X                          0
                      X         K002                 275,000
                      10002001  X                    275,000
                      41        60                   250,000
                      19        60                    25,000
                      60        61                         0
                      68-2      19                         0

Пока все банально. Поскольку поставщикам ничего не уплачено, то не зачитываются ни авансы, ни НДС.

Посмотрим, что у нас с остатками и оборотами счетов:


 Обоpоты счетов с 1 янваpя по 31 декабpя

           Итого обоpотов:            8,277,000      8,277,000
 19    [А] НДС по                       389,000                       389,000
           материальным
           ресурсам
 41    [А] Товары                     2,370,000                     2,370,000
 50    [А] Касса
 51    [А] Расчетный. 10,000,000                                   10,000,000
           счет
 60    [П] Расчеты с                                 2,759,000     -2,759,000
           поставщиками
 61    [А] Авансы
           выданные
 68    [Д] Расчеты с
 ..(1)     бюджетом
 85    [П] Капитал . -10,000,000                                  -10,000,000
 ..(1)
 K     [Н] Контрагенты                               2,759,000     -2,759,000
 ..(2)
 P     [Н] Подразделения
 ..(2)
 T     [Н] Материальные               2,759,000                     2,759,000
 ..(2)     ценности
 X     [Н] Балансир                   2,759,000      2,759,000

Сальдо счета K показывает общую задолженность поставщикам.


 Обоpоты счетов с 1 янваpя по 31 декабpя

 ...
 K     [Н] Контрагенты                               2,759,000     -2,759,000

 K001      ТОО "Ветер"                               1,140,000     -1,140,000
 K002      ТОО "Дождь"                               1,619,000     -1,619,000


 Анализ субсчета K001 (ТОО "Ветер") в мае 1996
 Остаток на начало месяца:                                                  0
   1  4 X         Балансир                             480,000       -480,000
   2  4 X         Балансир                             660,000     -1,140,000
 ............................................................................
 Итого:                                       0      1,140,000     -1,140,000


 Анализ субсчета K002 (ТОО "Дождь") в мае 1996
 Остаток на начало месяца:                                                  0
   3  6 X         Балансир                           1,344,000     -1,344,000
   4  6 X         Балансир                             275,000     -1,619,000
 ............................................................................
 Итого:                                       0      1,619,000     -1,619,000

Общая задолженность по счету 60 пока совпадает с сальдо счета контрагентов.

Стоимость учтенных материальных ценностей:

 Обоpоты счетов с 1 янваpя по 31 декабpя

 ...
 T     [Н] Материальные               2,759,000                     2,759,000
           ценности
 10001001  Пиво Туборг 0,5            1,824,000                     1,824,000
 10002001  Колбаса вареная              935,000                       935,000

В том числе:


 Анализ субсчета 10001001 (Пиво Туборг 0,5) в мае 1996
 Остаток на начало месяца:                                                  0
   1  4 X         Балансир              480,000                       480,000
   3  6 X         Балансир            1,344,000                     1,824,000
 ............................................................................
 Итого:                               1,824,000              0      1,824,000


 Анализ субсчета 10002001 (Колбаса вареная) в мае 1996
 Остаток на начало месяца:                                                  0
   2  4 X         Балансир              660,000                       660,000
   4  6 X         Балансир              275,000                       935,000
 ............................................................................
 Итого:                                 935,000              0        935,000

Сальдо счета T совпадает с суммой остатков счетов 41 и 19.

Теперь хотелось бы знать: на каком складе в каком количестве имеются те или иные товары.

Для решения этой задачи составим файл tmc_podr.rpt, который будет печатать сводку по запасам ТМЦ в подразделениях. Вот его текст.


* Запасы ТМЦ в подразделениях
p=[ia P]                         меню выбора подразделения
h=[n2 *p]                        название подразделения
i=0                              счетчик 'Итого'
Запасы ТМЦ в подразделении:

^^^^^^^^p ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^h
---------------------------------------------------------------------------
Код ТМЦ   Наименование ТМЦ      Кол-во            Стоимость     Себест/ед.
--------- --------------------- ---------------- --------------------------
# T                               перебор подразделений
  k=[get #,p]                     количество данного вида ТМЦ на складе
  t=[n1 #]                        код ценности
  n=[n2 #]                        наименование ценности
  s=0                             расчет себестоимости заготовления
  ! k > 0
    c=[ea #]/[get #,'всего']      средняя цена по заготовления в целом
    s=k*c                         себестоимость запаса
    i=i+s                         накопление итога
^^^^^^^^t ^^^^^^^^^^^^^^^^^^^^n ^^^^^^^^^^^^k^^^ ^^^^^^^^^^^^s ^^^^^^^^^^^^c
  !
#
--------- --------------------- ---------------- ------------- -------------
Итого                                          ^^^^^^^^^^^^^^i

Данная форма вначале запрашивает по какому складу мы хотим получить отчет, выводя список субсчетов счета P в виде меню - [ia P].

Выбранный субсчет записывается в переменную p, а его название - в переменную h. Они и "шапка" отчета печатаются.

Далее, в цикле для всех субсчетов счета T - кодам ТМЦ, печатаются название, количество на данном складе (значение экстра-параметра p соответствующего субсчета счета T), его стоимость и себестоимость единицы, рассчитанные в целом по предприятию.

Посмотрим, что у нас есть на складах, выполнив отчет сначала по первому, а потом по второму складу.

Запасы ТМЦ в подразделении:
P01       Склад#1
---------------------------------------------------------------------------
Код ТМЦ   Наименование ТМЦ      Кол-во            Стоимость     Себест/ед.
--------- --------------------- ---------------- --------------------------
10001001  Пиво Туборг 0,5                100.000       608,000         6,080
10002001  Колбаса вареная                200.000       623,333         3,117
--------- --------------------- ---------------- ------------- -------------
Итого                                                1,231,333


Запасы ТМЦ в подразделении:
P02       Склад#2
---------------------------------------------------------------------------
Код ТМЦ   Наименование ТМЦ      Кол-во            Стоимость     Себест/ед.
--------- --------------------- ---------------- --------------------------
10001001  Пиво Туборг 0,5                200.000     1,216,000         6,080
10002001  Колбаса вареная                100.000       311,667         3,117
--------- --------------------- ---------------- ------------- -------------
Итого                                                1,527,667

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

Для анализа распределения запасов по складам составим форму tmc_rasp.rpt.

* Распределение запасов ТМЦ
t=[ia T]                  выбор кода ТМЦ
n=[n2 *t]                 название ТМЦ
q=[get *t,'всего']        общее количество данного вида ТМЦ
i=[ea *t]                 общая стоимость данного вида ТМЦ - сальдо субсчета
Ведомость остатков ТМЦ.
^^^^^^^^^t ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n
! q <0.0001 проверка наличия данного вида ТМЦ (кол-во &dt;> ) Нет в наличии stop ! u=i/q средняя по предприятию цена заготовления Средняя цена заготовления: ^^^^^^^^^^^^u --------------------- ---------------- ------------- Подразделение Кол-во Стоимость --------------------- ---------------- ------------- # P перебор всех подразделений p=[n1 #] код подразделения k=[get *t,p] кол-во данного ТМЦ в подразделении
! k >0 Если кол-во >0, то печатаем w=[n2 *p] название подразделения s=k*u стоимость заготовления этого кол-ва ТМЦ ^^^^^^^^^^^^^^^^^^^^w ^^^^^^^^^^^^k^^^ ^^^^^^^^^^^^s ! # --------------------- ---------------- ------------- Итого ^^^^^^^^^^^^q^^^ ^^^^^^^^^^^^i

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

Посмотрим как у нас с пивом и колбасой:

Ведомость остатков ТМЦ.
10001001   Пиво Туборг 0,5
Средняя цена заготовления:         6,080
--------------------- ---------------- -------------
Подразделение         Кол-во             Стоимость
--------------------- ---------------- -------------
Склад#1                        100.000       608,000
Склад#2                        200.000     1,216,000
--------------------- ---------------- -------------
Итого                          300.000     1,824,000

Ведомость остатков ТМЦ.
10002001   Колбаса вареная
Средняя цена заготовления:         3,117
--------------------- ---------------- -------------
Подразделение         Кол-во             Стоимость
--------------------- ---------------- -------------
Склад#1                        200.000       623,333
Склад#2                        100.000       311,667
--------------------- ---------------- -------------
Итого                          300.000       935,000

Что-то колбаса уж больно дешевая ... Ну, да ладно.

Теперь составим операцию оплаты поставщикам. Предположим, что оплата производится с расчетного счета. При построении этой операции мы должны учесть, что перечисляемая сумма должна распределяться между 60 и 61 счетами. Кроме того, сразу же будут выполняться действия по зачету "оприходованного" (а теперь и оплаченного) НДС.

Деpево видов опеpаций
...Банк
   ...перечисление
      ...поставщикам
          . @K    X 1        "дебетование" поставщика
          . 60   51 ras_post погашение задолженности
          . 61   51 (SA)     аванс
          . 68-2 19 (ZN)     зачет НДС

Файл-коэффициент ras_post получился сложнее, чем хотелось бы.


* Перечисление поставщику
k=[n1 @K]                  код контрагента
ZP=[get 60,k]              задолженность поставщику
! ZP < $               Если задолженность < суммы перечисления, то
  b=[plus 60,k,-ZP]        задолженность гасится полностью
  SP=ZP                    сумма относимая на счет 60 равна задолженности, а
  SA=$-ZP                  разница устанавливается как
  b=[plus 61,k,SA]         аванс поставщику
  kz=1                     зачитывается 100% полученного НДС
! ZP > $               Если задолженность > суммы перечисления, то
  b=[plus 60,k,-$]         задолженность гасится на сумму перечисления, а
  SP=$                     сумма относимая на счет 60 равна сумме перечисления
  SA=0                     сумма аванса равна нулю
  kz=$/ZP                  НДС зачитывается пропорционально перечислению
! ZP=$                 Если задолженность = сумме перечисления, то
  b=[plus 60,k,-ZP]        задолженность гасится полностью
  SP=$
  SA=0                     аванс нулевой
  kz=1                     зачитывается 100% полученного НДС
!
$=SP                       сумма проводки Д60 К51
* Расчет величины зачитываемого НДС пропорционально суммам,
* учтенным по всем категориям ценностей, поступивших от поставщика
ZN=0                       может нечего и зачитывать?
# N                        Перебираем все объекты учета НДС
  w=[n1 #]+k                   код учета НДС по данной категории ТМЦ
  ! [ep #] = 0                 Если порядок зачета стандартный, то
    s=[ro kz*[get 19,w]]            сумма зачета НДС по данной категории ТМЦ
    ZN=ZN+s                         накапливается и на эту же величину
    b=[plus 19,w,-s]                уменьшается учтенный НДС
  !
#

Первый блок расчетов определяет две величины: какая часть перечисленной суммы идет в покрытие задолженности (если она есть), а какая часть - должна считаться выданным авансом. В соответствии с этим, в переменную ZP из экстра-параметра счета 60, соответствующего данному поставщику k, выбирается сумма задолженности ему функцией [get 60,k].

Далее, эта сумма сравнивается с перечисленной суммой ($).

Если задолженность данному поставщику меньше, чем перечисленная сумма (ZP<$), то задолженность гасится полностью установкой соответствующего экстра-параметра в ноль (можно было бы даже использовать функцию [set 60,k,0]), сумма для проводки Д60 К51 устанавливается равной сумме задолженности (переменная SP), а разница между суммой перечисления и суммой задолженности (SA=$-ZP) устанавливается как аванс выданный для проводки Д61 К51. При этом, соответствующий экстра-параметр, увеличивается на эту сумму. Поскольку задолженность погашена полностью, то коэффициент зачета НДС устанавливается в 1, то есть таким образом, чтобы в последующих расчетах учтенный НДС по всем категориям ценностей, подлежащим обычному порядку учета, был зачтен.

Если задолженность поставщику оказывается больше, чем перечисленная сумма (ZP>$), то задолженность гасится только на сумму перечисления, никаких авансов не возникает (SA=0), а для зачета НДС принимается только его оплаченная на текущий момент доля (kz=$/ZP).

Случай равенства нулю является частным случаем первого условия.

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

Для НДС, учтенного по каждой категории ценностей, строится составной код, соответствующий данному поставщику ([n1 #]+k), и, если порядок учета НДС по данной категории ценностей обычный ([ep #]=0), то рассчитывается и накапливается сумма зачитываемого НДС, округленная до целых ([ro kz*[get 19,w]]). То есть НДС поступивший с каждой категорией ценностей зачитывается пропорционально величине погашения задолженности поставщику.

Поработаем с построенной операцией.

В услових нашего примера на текущий момент мы имеем следующую структуру кредиторской задолженности:


     ТОО "Ветер"    1,140,000
     ТОО "Дождь"    1,619,000

Уплатим ТОО "Ветер" 800,000, а ТОО "Дождь" 2,000,000 и посмотрим, что выйдет. Приводим распечатку этих операций вместе с проводками:


   N Дата      Сумма  Вид опеpации, комментаpии, пpоводки
------------------------------------------------------------------------------
   5  7      800,000  Банк перечисление  поставщикам K001 ТОО "Ветер"

                      K001      X                    800,000
                      60        51                   800,000
                      61        51                         0
                      68-2      19                    98,246

   6  7    2,000,000  Банк перечисление  поставщикам K002 ТОО "Дождь"

                      K002      X                  2,000,000
                      60        51                 1,619,000
                      61        51                   381,000
                      68-2      19                   249,000

ТОО "Ветер" перечислено на 340,000 меньше, чем положено. Поэтому никакого аванса не возникло, а НДС списан не полностью. С товарами нами было получено от данного поставщика 140,000 НДС. Зачтено 800000/1140000*140000=98246.

ТОО "Дождь" перечислено больше, чем нужно. Поэтому на дебет счета 60 отнесена задолженность, а остаток учтен как аванс выданный.

Оборотка показывает общее состояние расчетов с контрагентами.


 ...
 K     [Н] Контрагенты                2,800,000      2,759,000         41,000

 K001      ТОО "Ветер"                  800,000      1,140,000       -340,000
 K002      ТОО "Дождь"                2,000,000      1,619,000        381,000

Теперь предположим, что контрагент ТОО "Дождь" отгрузил партию товара на сумму 381,000, а контрагенту ТОО "Ветер" погашена имеющаяся задолженность.

   7  8      381,000  Товары  приход от поставщика кол-во 100 P02 Склад#2
                      K002 ТОО "Дождь" 10003002 Сигареты "Marlboro"

                      P02       X                          0
                      X         K002                 381,000
                      10003002  X                    381,000
                      41        60                   317,500
                      19        60                    63,500
                      60        61                   381,000
                      68-2      19                    63,500

   8  8      340,000  Банк перечисление  поставщикам K001 ТОО "Ветер"

                      K001      X                    340,000
                      60        51                   340,000
                      61        51                         0
                      68-2      19                    41,754

Операция 7 погасила имевшийся аванс поставщику, а операция 8, погасив задолженность, еще и выполнила зачет НДС.

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

Одно неудобство состоит только в том, что при добавлении нового товара в список ТМЦ - субсчета счета T - не устанавливается автоматически значение первого параметра счета - ставка НДС. Поэтому после выполнения операции, в результате которой заведен новый субсчет, следут "зайти" в план счетов и установить соответствующее значение отдельно. Для устранения этой проблемы можно, вместо занесения значения ставки в параметр счета, вести кодирование таким образом, чтобы ставка могла определяться по структуре кода и соответствующим образом изменить файлы-коэффициенты. Но мы не будем этого делать.

Теперь займемся реализацией.

Для этого нам понадобятся еще три счета.


 46    [Д] Реализация
 62    [А] Расчеты с
           покупателями
 64    [П] Авансы
           полученные

Аналогично операциям заготовления товара здесь мы также не будем вести субсчета на счете 62 и будем автоматически переносить кредиторскую задолженность по счету 62, по тому или иному покупателю на счет 64, считая переплату внесением аванса в счет будущих поставок.

Будем считать, что моментом реализации является отгрузка товаров покупателю.

На счетах 62 и 64 будем вести следующие наборы экстра-параметров.


Счет/Субсчет Экстра-параметр             Содержание
------------ --------------- -----------------------------------------
   62              @K        задолженность покупателя
   64              @K        задолженность покупателю

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

Для упрощения будем считать, что отгрузка всегда производится в срок, так что остатков авансов на конец месяца не возникает. Поэтому при выделении авансов мы не будем сразу начислять по ним НДС имея ввиду, что тот будет начислен в момент отгрузки товаров.

Первая операция, которую мы составим касается отгрузки товаров покупателям и отражения реализации. Она такова.


...Товары
.  ...реализация
.     ...?Q кол-во
.         . X    @P (0)       выбор подразделения
.         . @K   X   1        "дебетование" покупателя
.         . X    @T  tmc_real списание ценностей
.         . 62   46  F62_46   отражение реализации
.         . 46  68-2 (ND)     начисление НДС
.         . 46   41  (ST)     списание себестоимости
.         . 64   62  (ZA)     зачет аванса (если был)

Назначение первых трех псевдопроводок в том, чтобы выбрать подразделение, контрагента и вид ТМЦ, с которыми мы имеем дело в данной операции. При этом счет контрагента дебетуется, а счет товара кредитуется.

Файл-коэффициент tmc_real построен следующим образом.


* Реализация товара
t=[n1 @T]                                  код товара
k=[n1 @K]                                  код контрагента
p=[n1 @P]                                  код подразделения
v=[get *t,p]                               кол-во в подразделении
! v < Q                               Если отгрузка больше наличного запаса
error На складе нет такого кол-ва товара
!
ST=Q*[ed *t]/[get *t,'всего']              себестоимость отгрузки с НДС
a=[plus *t,p,-Q]                           уменьшение запаса в подразделении
a=[plus *t,'всего',-Q]                     уменьшение запаса "всего"
SR=$                                       запомним продажную стоимость
$=ST                                       спишем себестоимость

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

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


* Реализация товара
a =[plus 62,k,SR]         увеличена задолженность покупателя k по счету 62
r =[ep *t]                процент НДС данного вида ТМЦ
ND=SR*r/(100+r)           НДС реализуемых товаров
SA=[get 64,k]             сумма ранее полученного аванса
ZA=SA
! SA > SR      Если сумма аванса > стоимости отгруженных ТМЦ, то
  ZA=SR             сумма зачета равна стоимости ТМЦ, иначе она равна авансу
!
a =[plus 64,k,-ZA]        аванс уменьшен на зачитываемую сумму
a =[plus 62,k,-ZA]        задолженность уменьшена на зачитываемую сумму
ST=ST*100/(100+r)         себестоимость списания без НДС для проводки Д46 К41
$=SR                      сумма проводки Д62 К46

Здесь сначала увеличивается задолженность данного покупателя, сохраняемая в соответствующем ему экстра-параметре. Далее, производится расчет НДС реализуемого товара по установленной для него ставке. Потом производится расчет суммы зачитываемого данной поставкой аванса (если он был). Естественно, что аванс зачитывается не более, чем на величину поставки. Поскольку на субсчетах счета T ТМЦ хранятся по стоимости, включающей НДС, а на счете 41 они отражаются без НДС, то для проводки списания себестоимости реализуемых ТМЦ, рассчитанная файлом-коэффициентом себестоимость (ST) уменьшается на величину НДС.

Кроме операции отгрузки товара определим действия по оплате его покупателем. Для этого составим операцию "Банк поступление от покупателей".


...Банк
   ...поступление
      ...от покупателей
          . X   @K  1        "кредитование" покупателя
          . 51  62  ras_pok  погашение задолженности
          . 51  64  (SA)     зачисление аванса

Файл ras_pok описывает следующие расчеты.


* Поступление от покупателя
k=[n1 @K]                  код контрагента
ZP=[get 62,k]              задолженность покупателя
! ZP < $               Если задолженность < суммы поступления, то
  b=[plus 62,k,-ZP]        задолженность гасится полностью
  SP=ZP                    сумма относимая на счет 62 равна задолженности, а
  SA=$-ZP                  разница устанавливается как
  b=[plus 64,k,SA]         аванс покупателя
! ZP > $               Если задолженность > суммы поступления, то
  b=[plus 62,k,-$]         задолженность гасится на сумму поступления, а
  SP=$                     сумма относимая на счет 62 равна сумме поступления
  SA=0                     сумма аванса равна нулю
! ZP=$                 Если задолженность = сумме поступления, то
  b=[plus 62,k,-ZP]        задолженность гасится полностью
  SP=$
  SA=0                     аванс нулевой
!
$=SP                       сумма проводки Д51 К62

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

Рассмотрим как работают приведенные операции.

Получим некоторую сумму от покупателя, а потом отгрузим ему товары.


   9 13    1,000,000  Банк поступление от покупателей К101 АО "Траст"

                      X         К101               1,000,000
                      51        62                         0
                      51        64                 1,000,000

  10 14      800,000  Товары  реализация кол-во 100 P02 Склад#2
                      К101 АО "Траст" 10001001 Пиво Туборг 0,5

                      X         P02                        0
                      К101      X                    800,000
                      X         10001001             608,000
                      62        46                   800,000
                      46        68-2                 133,333
                      46        41                   506,667
                      64        62                   800,000

  11 14      400,000  Товары  реализация кол-во 50 P02 Склад#2
                      К101 АО "Траст" 10002001 Колбаса вареная

                      X         P02                        0
                      К101      X                    400,000
                      X         10002001             155,833
                      62        46                   400,000
                      46        68-2                  36,364
                      46        41                   141,667
                      64        62                   200,000

Операция 9 отразила поступление аванса. Никакого зачета не произошло, потому что не было отгрузок. По первой операции отгрузки аванс зачтен полностью, а по второй частично - ровно на сумму остатка аванса.

Зарегистрируем еще одну операцию, по которой покупатель ликвидирует задолженность по поставке.


     12 16 200,000 Банк поступление от покупателей К101 АО "Траст"
     .........(Дебет.Кpедит.Сумма)...........
     .X         К101                 200,000.
     .51        62                   200,000.
     .51        64                         0.
     ........................................

Теперь уже никаких авансов. Вся сумма оплаты пошла в покрытие задолженности.

Рассмотренные примеры использования экстра-параметров иллюстрируют их основное назначение: дополнительные возможности организации аналитического учета средствами программы "Финансы без проблем". Благодаря появлению этого механизма существенно упрощается задача использования одинаковых объектов аналитического учета, связанных одновременно с несколькими счетами бухгалтерского учета. В рассмотренных примерах особенно высокой нагрузка оказалась на счет контрагентов. Если бы не выделение их в качестве одного фиктивного счета и привязку с помощью экстра-параметров к синтетическим счетам, то пришлось бы отдельно кодировать однородные по смыслу субсчета для 60, 61, 62 и 64 счета и учитывать соответствие между ними при описании правил расчетов в файлах-коэффициентах.

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

Благодаря дополнительным степеням свободы, обеспечиваемым экстра-параметрами, появилась простая возможность организовать учет ТМЦ в нескольких подразделениях не прибегая к дополнительному специальному кодированию субсчетов. Автор надеется, что после всего сказанного выше, читателю не составит труда составлять операции для внутреннего перемещения ТМЦ между подразделениями.

Сформулируем теперь некоторые общие принципы использования экстра-параметров.Они состоят в следующем.

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

Теперь рассмотрим вопрос о переносе значений экстра-параметров при переходе к новому году. Реализованные принципы очень близки к тем, что применяются в обычном порядке с планом счетов. При завершении года в режиме просмотра оборотного баланса следует выполнить запись счетов (F2). Если правила предусматривают наличие экстра-параметров, то помимо файла acnt.e, будет создан текстовый файл extra.e, содержащий достигнутые к концу года их значения.

Например, в условиях нашего примера, файл extra.e будет содержать следующие строки.


К101 64 N= 0.0000000000000E+0000
К101 62 N= 0.0000000000000E+0000
N26K002 19 N= 0.0000000000000E+0000
N26K001 19 N= 0.0000000000000E+0000
N12K002 19 N= 0.0000000000000E+0000
N12K001 19 N= 0.0000000000000E+0000
N10K002 19 N= 0.0000000000000E+0000
N10K001 19 N= 0.0000000000000E+0000
N41K002 19 N= 0.0000000000000E+0000
N41K001 19 N= 0.0000000000000E+0000
K002 61 N= 0.0000000000000E+0000
K002 60 N= 0.0000000000000E+0000
K001 61 N= 0.0000000000000E+0000
K001 60 N= 0.0000000000000E+0000
всего 10003002 N= 1.0000000000000E+0002
всего 10002001 N= 2.5000000000000E+0002
всего 10001001 N= 2.0000000000000E+0002
P02 10003002 N= 1.0000000000000E+0002
P02 10002001 N= 5.0000000000000E+0001
P02 10001001 N= 1.0000000000000E+0002
P01 10002001 N= 2.0000000000000E+0002
P01 10001001 N= 1.0000000000000E+0002

Здесь каждая строка имеет три части. Первая содержит код экстра-параметра, вторая - код счета или субсчета, с которым ассоциировано данное значение, а третья - собственно значение экстра-параметра. Для числовых данных перед значением экстра-параметра указан определитель N=, а перед символьными - S=.

Для использования экстра-параметров в следующем году следует в соответствии с обычным для программы способом перенести файл extra.e в другую директорию и там переименовать в extra.b. При наличии файла с указанным именем программа будет автоматически загружать его при запуске.

Обратите внимание, что в приведенном списке много экстра-параметров с нулевыми значениями. У параметров счетов 60, 61, 62, 64 они нулевые из-за того, что в нашем примере произведен полный зачет задолженностей соответствующих контрагентов, а часть экстра-параметров по категориям НДС у поставщиков возникли из-за обращения к ним в операциях функцией [get].

Завершая рассмотрение вопроса об использовании экстра-параметров обратим внимание читателей еще на две интересные возможности.

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

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

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

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

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

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

     Банк
     ...реквизиты контрагентов
        ...?M МФО
           ...?R Р/С
               . @K X org_rekv

Здесь используется уже знакомый нам фиктивный счет K - "Контрагенты". Файл-коэффициент org_rekv.rpt включает следующие команды.


* Установка реквизитов контрагентов
k=[n1 @K]
a=[set *k,'МФО',M]
a=[set *k,'Р/С',R]
a=[set *k,'Банк',[CO]]
$=0

Использование операции предполагает, что в ветвях-вопросах вводятся значения кодов МФО и расчетного счета, а в качестве комментария операции указывается название банка. Файл-коэффициент переносит эти данные в экстра-параметры. Далее, при формировании первичных документов, функцией [get] эта информация может быть извлечена и перенесена в соответствующую форму.

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

Как уже было сказано, функции [set] и [plus] могут использоваться только в файлах-коэффициентах. Это вполне естественно, поскольку в "Финансах без проблем" только операции могут вызывать изменения на счетах и в значениях связанных с ними параметров. Как быть, если есть необходимость при выполнении форм использовать массивы промежуточных данных и не опасаться возможности внесения некорректных изменений в значения экстра-параметров?

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

Таким образом, счет % - единственный, к которому могут быть применены функции [get] и [plus] не только в файлах-коэффициентах, но и в любых файлах форм.

Механизм фактов

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

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

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

Зная указанные проблемы, разработчики "Хакерс Дизайн" в последних версиях системы предложили новый эффективый способ их решения.

С января 1996 года в язык форм "Финансов без проблем" было введено понятие "факт" и ряд связанных с ним операторов и функций.

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

С содержательной точки зрения факт - это определенная последовательность значений, характеризующих то или иное явление хозяйственной (и не только хозяйственной) жизни.

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

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

Программа допускает использование произвольного набора фактов. Каждому факту сопоставляется определенный тип, в соответствии с которым программа опознает его. Все типы используемых фактов должны быть определены в файле proto.rpt. Его назначение во многом аналогично файлу first.rpt, определяющему некоторый набор переменных, используемых всеми или большинством отчетов. Отличие состоит в том, что proto.rpt задает не отдельные переменные, а как бы их группы, объединенные общим именем.

Для только что рассмотренного примера тип факта может быть определен в файле proto.rpt следующим образом:


* Прототипы фактов
приход ТМЦ %, %, %, %, %

Как расшифровывается эта запись? Текст "приход ТМЦ" является "визитной карточкой" данного типа фактов. Пять символов "%", указанные через запятую сообщают программе, что факт "приход ТМЦ" состоит из пяти частей (неименованных переменных), которые при создании и обработке данного типа фактов будут разделяться символом ",".

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


* Прототипы фактов
приход ТМЦ % в кол-ве % по цене % от поставщика % в подразделение %

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

Файл proto.rpt может определять не один, а несколько типов фактов. Каждый тип фактов обязательно должен быть определен.

В разделе "Общие определения" списка форм создайте файл proto.rpt так как показано на предыдущем рисунке.

Что нужно изменить в нашем примере, чтобы он позволял работать с набором фактов?

Прежде всего, при каждом приходе ТМЦ следует создавать новый факт данного типа.

Факты создаются новым опеpатоpом FACT, котоpый можно использовать только в файлах-коэффициентах. Каждый факт включается в общий список фактов (далее называемый FACTS). Поpядок pазмещения фактов в списке FACTS совпадает с поpядком следования опеpаций, явившихся пpичинами вызовов опеpатоpов FACT. Каждый факт автоматически снабжается отметкой о дате опеpации, содеpжащей значения YC, MC, DC (год, месяц, день). При "сбивке" баланса список FACTS перестраивается. Пpи удалении опеpаций соответствующие им факты вычеpкиваются из списка FACTS.

Пpогpамма всегда хpанит указатель на "текущий" факт (далее мы называем его указателем CURRENT), необходимый для пpавильного поиска фактов новым опеpатоpом SEARCH, который рассматривается далее.

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


     FACT e1, e2, ... eN

где e1..eN - фоpмулы языка фоpм (или стpоки, необязательно с кавычками). После выполнения опеpатоpа пеpвая часть факта получит значение фоpмулы e1, втоpая - е2 и т.д.

Значение формулы е1 должно совпадать с одним из имен типов фактов, определенных в файле proto.rpt.

Если описание факта составлено в "словесной" форме, то и определение должно соответствовать словесному "макету" факта.

В нашем примере в файле коэффициенте tmc_prih следует указать всего одну дополнительную строку.


* Поступление ТМЦ
t=[n1 @T]                код товара
k=[n1 @K]                код контрагента-поставщика
p=[n1 @P]                код подразделения
a=[plus *t,p,Q]          ценности записаны на подразделение в кол-ве Q
a=[plus *t,'всего',Q]    общий запас ценностей данного вида
* Определение факта
fact приход ТМЦ t в кол-ве Q по цене $/Q от поставщика k в подразделение p

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

Начнем с простейшего примера.

Составим форму "Приходы ТМЦ", которая будет показывать когда, на какой склад, от какого поставщика, в каком количестве и по какой цене поступали материальные ценности.

Для этого нам необходим последовательный перебор всех фактов "приход ТМЦ" от начала до конца.

Чтобы установить указатель CURRENT на пеpвый факт, т.е. пpиготовиться к поиску в списке FACTS, следует использовать новый опеpатоp REWIND FACTS. После этого можно искать подходящие по обpазцу факты с помощью последовательных вызовов нового опеpатоpа SEARCH.

Синтаксис опеpатоpа SEARCH:


     SEARCH  p1, p2, ... pN

где - p1..pN - части обpазца. Каждая из частей обpазца пpедставляет собой либо фоpмулу языка фоpм, либо констpукцию вида "? пеpеменная", либо констpукцию вида "??".

Опеpатоp SEARCH считает факт подходящим если значения всех частей обpазца, являющиеся фоpмулами, совпадают с соответствующими им по номеpу частями факта. Если подходящий факт найден, то опеpатоp пpисваивает пеpеменным, упомянутым в частях вида "? пеpеменная", значения соответствующих им по номеpу частей факта; указатель CURRENT указывает на следующий за найденным фактом факт, и пpи следующем вызове опеpатоp SEARCH начнет поиск с него.

Конструкция "??" позволяет при поиске факта просто проигнорировать значение той или иной его части.

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

Чтобы выяснить, был ли вызов опеpатоpа SEARCH успешным, можно использовать новую функцию [SUCCESS]. Она выдает значение 1, если поиск был успешным и 0 в случае неудачи.

Для получения доступа к отметке о дате соответствующей факту опеpации, следует использовать новые функции, выдающие числовые значения: [FACT_Y] - год, [FACT_M] - месяц и [FACT_D] - день факта.

Основываясь на этих конструкциях составим форму tmc_istp.rpt следующим образом.


* История приходов
i=0
Дата  Название ТМЦ          Кол-во    Стоимость Поставщик      Подразделение
----- --------------------- ------ ------------ -------------- ---------------
rewind facts
:Povtor
search приход ТМЦ ?t в кол-ве ?q по цене ?s от поставщика ?k в подразделение ?p
! [success] = 1
nt=[n2 *t]
nk=[n2 *k]
np=[n2 *p]
d=[fact_d]
m=[fact_m]
^M ^D ^^^^^^^^^^^^^^^^^^nt ^^^^^^q  ^^^^^^^^^^s ^^^^^^^^^^^^nk ^^^^^^^^^^^^^np
      ^^^^^^^^^^^^^^^^^^^^
      ^^^^^^^^^^^^^^^^^^^^
i=i+s
goto Povtor
!
------------------------------------------------------------------------------
Итого на сумму                   ^^^^^^^^^^^^^i

Сначала оператором REWIND FACTS "лента" фактов как бы отматывается на начало. Далее оператор SEARCH ищет факт типа "приход ТМЦ". Поскольку заранее неизвестно сколько таких фактов имеется, то используется оператор выбора с функцией [success]. Если она возвратила значение 1, то факт найден и в этом случае переменные t, q, s, k и p оказываются "заполненными" соответствующими значениями. Для того, чтобы определить к какому месяцу и к какой дате относилась поставка используются встроенные функции [fact_m] и [fact_d]. После этого полученные составляющие факта печатаются. Далее, выполняется переход назад и делается попытка отыскать следующий факт.

Когда список фактов данного типа исчерпан функция [success] выдает значение 0, операторы вывода частей факта "обходятся", печатается подножие формы и ее выполнение завершается.

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


Дата  Название ТМЦ          Кол-во    Стоимость Поставщик      Подразделение
----- --------------------- ------ ------------ -------------- ---------------
 5  4 Пиво Туборг 0,5          100      480,000 ТОО "Ветер"    Склад#1
 5  4 Колбаса вареная          200      660,000 ТОО "Ветер"    Склад#1
 5  6 Пиво Туборг 0,5          200    1,344,000 ТОО "Дождь"    Склад#2
 5  6 Колбаса вареная          100      275,000 ТОО "Дождь"    Склад#2
 5  8 Сигареты "Marlboro"      100      381,000 ТОО "Дождь"    Склад#2
------------------------------------------------------------------------------
Итого на сумму                        3,140,000

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

* История приходов от поставщика
k=[ia K]
nk=[n2 *k]
Приходы от поставщика ^^^^^^^^^^^^^^^^^^^^^^^nk
i=0
-----------------------------------------------
Дата  Название ТМЦ          Кол-во    Стоимость
----- --------------------- ------ ------------
rewind facts
:Povtor
search приход ТМЦ ?t в кол-ве ?q по цене ?s от поставщика k в подразделение ??
! [success] = 1
nt=[n2 *t]
d=[fact_d]
m=[fact_m]
^M ^D ^^^^^^^^^^^^^^^^^^nt ^^^^^^q  ^^^^^^^^^^s
      ^^^^^^^^^^^^^^^^^^^^
      ^^^^^^^^^^^^^^^^^^^^
i=i+s
goto Povtor
!
-----------------------------------------------
Итого на сумму                   ^^^^^^^^^^^^^i

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

Если выполнить указанную форму в условиях нашего примера, то мы получим.


Приходы от поставщика ТОО "Ветер"
-----------------------------------------------
Дата  Название ТМЦ          Кол-во    Стоимость
----- --------------------- ------ ------------
 5  4 Пиво Туборг 0,5          100      480,000
 5  4 Колбаса вареная          200      660,000
-----------------------------------------------
Итого на сумму                        1,140,000

Аналогично можно отбирать информацию о приходах конкретного вида ТМЦ, приходах на тот или иной склад и т.д. Написание таких форм методом "копирования образца" занимает не более пяти минут.

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

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

Синтаксис опеpатоpа SELECT:


     SELECT p1, p2, ... pN

     где p1, p2, ... pN - части обpазца; интеpпpетиpуются
     так же, как и для опеpатоpа SEARCH.

Опеpатоp SELECT ищет в списке FACTS все подходящие по обpазцу факты и помещает их во вpеменный список BUFFER. Поиск выполняется в пpямом напpавлении от начала списка FACTS к его концу. На поведение опеpатоpа SELECT не оказывают влияния опеpатоpы REWIND. Пpи выполнении опеpатоpа SELECT значение указателя текущего факта (CURRENT) не изменяется.

Функция [SUCCESS] выдает значение 1, если был найден хотя бы один подходящий факт, и 0 - если нет. Новая функция [FOUND] выдает количество найденных подходящих фактов. Новая функция [SELECTED] выдает количество фактов, помещенных во вpеменный список BUFFER. Если емкость BUFFER достаточна, то [SELECTED] = [FOUND], иначе [SELECTED] < [FOUND].

Синтаксис опеpатоpа SORT BUFFER:


     SORT BUFFER e1

     где е1 - фоpмула языка фоpм; ее значение должно быть
     положительным или отpицательным числом.

Опеpатоp SORT BUFFER соpтиpует список фактов BUFFER по значению части факта, номеp котоpой pавен модулю значения е1. Если значение е1 отpицательно, то поpядок соpтиpовки - по убыванию (обpатен алфавитному).

Оператор REWIND BUFFER переключает выполнение оператора SEARCH с обработки общего списка фактов (FACTS) на работу с данными буфера. При выполнении оператора REWIND BUFFER указатель текущего факта (CURRENT) устанавливается на пеpвый элемент списка BUFFER. Таким образом, после выполнения оператора REWIND FACTS опеpатоp SEARCH будет искать факты в списке FACTS, а после REWIND BUFFER - вo вpеменном списке BUFFER.

Основываясь на указанных положениях, составим форму tcm_cena.rpt, которая выводит историю поставок заданного вида ТМЦ, упорядочивая их по возрастанию цены заготовления.


* Анализ цен заготовления ТМЦ
t=[ia T]
nt=[n2 *t]
Поставки товара ^^^^^^^^^^^^^^^^^^^^^^^nt
                ^^^^^^^^^^^^^^^^^^^^^^^^^
i=0
w=0
------------------------------------------------------------
Дата  Поставщик             Кол-во    Цена        Стоимость
----- --------------------- ------ ------------ -------------
select приход ТМЦ t в кол-ве ?? по цене ?? от поставщика ?? в подразделение ??
sort buffer 3
rewind buffer
:Povtor
search приход ТМЦ t в кол-ве ?q по цене ?c от поставщика ?k в подразделение ??
! [success] = 1
nk=[n2 *k]
d=[fact_d]
m=[fact_m]
s=c*q
^M ^D ^^^^^^^^^^^^^^^^^^nk ^^^^^^q  ^^^^^^^^^^c ^^^^^^^^^^^^s
      ^^^^^^^^^^^^^^^^^^^^
      ^^^^^^^^^^^^^^^^^^^^
i=i+s
w=w+q
goto Povtor
!
--------------------------------------------------------------
Итого                    ^^^^^^^^w             ^^^^^^^^^^^^^i
! q > 0
  c=i/w
Средняя цена                        ^^^^^^^^^^c
!

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

Оператор SELECT отбирает нужные факты в буфер, оператор SORT BUFFER сортирует их в соответствии со значениями третьей части факта, а оператор REWIND BUFFER переключает внимание программы на обработку буфера.

Выполнив данную форму для анализа цен поступления товара "Колбаса вареная" из нашего примера получим:


Поставки товара Колбаса вареная
------------------------------------------------------------
Дата  Поставщик             Кол-во    Цена        Стоимость
----- --------------------- ------ ------------ -------------
 5  6 ТОО "Дождь"              100        2,750       275,000
 5  4 ТОО "Ветер"              200        3,300       660,000
--------------------------------------------------------------
Итого                          300                    935,000
Средняя цена                              3,117

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

Для суммиpования соответствующих частей подходящих по обpазцу фактов пpедназначен новый опеpатоp TOTAL.

Синтаксис опеpатоpа TOTAL:


     TOTAL p1, p2, ... pN

     где p1, p2, ... pN - части обpазца; интеpпpетиpуются
     так же, как и для опеpатоpа SEARCH, с тем отличием, что
     в пеpеменных, упомянутых в частях обpазца вида "? пеpеменная",
     накапливаются суммы соответствующих частей фактов.

Опеpатоp TOTAL начинает поиск от начала списка FACTS и движется в пpямом напpавлении к концу списка. На поведение опеpатоpа TOTAL не оказывают влияния опеpатоpы REWIND. Пpи выполнении опеpатоpа TOTAL значение указателя CURRENT не изменяется. Функция [SUCCESS] выдает значение 1, если был найден хотя бы один подходящий факт, и 0 - если нет. Функция [FOUND] выдает количество найденных подходящих фактов.

Если пpи суммиpовании частей фактов имело место сложение стpоки с числом, соответствующей пеpеменной будет пpисвоено стpоковое значение 'ОШИБКА TOTAL - сложение стpоки с числом'.

В предыдущей главе мы рассмотрели примеры, основанные на использовании учета ТМЦ по средневзвешенным ценам. Рассмотрим как с помощью механизма фактов можно организовать партионный учет и списание себестоимости реализованных товаров методом ЛИФО.

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

Дополните файл proto.rpt определением следующего вида.


партия ТМЦ % в кол-ве % стоимостью % за номером %

Напомним, что алгоритм оценки запасов методом ЛИФО при списании себестоимости отгруженных товаров (отпущенных в производство материалов) предусматривает "использование" в первую очередь последних поступивших партий. Таким образом, при списании мы должны перебирать партии ТМЦ (факты) в противоположном направлении, то есть от начала к концу. Из каждой партии, вплоть до ее полного исчерпания должно "выбираться" списываемое количество. Для этого данный факт должен уничтожаться, а вместо него создаваться новый - включающий новые уменьшенное количество и стоимость. После полного исчерпания очередной партии она должна безвозвратно удаляться и последующие списания будут производиться уже из другой, более ранней партии.

Комбиниpуя опеpатоpы REWIND FACTS и SEARCH, можно искать факты в пpямом напpавлении, т.е. от начала к концу списка. Но в данном случае тpебуется "узнать новости" - найти самый последний подходящий по обpазцу факт. В таком случае вместо цикла с опеpатоpом SEARCH и функцией [SUCCESS] можно использовать новый опеpатоp NEWS.

Синтаксис опеpатоpа NEWS:


     NEWS p1, p2, ... pN

     где p1, p2, ... pN - части обpазца; они интеpпpетиpуются
     так же, как и для опеpатоpа SEARCH.

Опеpатоp NEWS всегда начинает поиск от конца списка FACTS и движется в обpатном напpавлении к началу списка до пеpвого (последнего, если считать в пpямом напpавлении) подходящего факта. Как и для опеpатоpа SEARCH, можно использовать функцию [SUCCESS] как индикатоp успешного поиска. На поведение опеpатоpа NEWS не оказывают влияния опеpатоpы REWIND. Пpи выполнении NEWS значение указателя текущего факта (CURRENT) не изменяется.

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

Для вычеpкивания из списка FACTS всех подходящих по обpазцу фактов пpедназначен новый опеpатоp ERASE.

Синтаксис опеpатоpа ERASE:


     ERASE p1, p2, ... pN

     где p1, p2, ... pN - части обpазца; интеpпpетиpуются
     так же, как и для опеpатоpа SEARCH.

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

На поведение опеpатоpа ERASE не оказывают влияния опеpатоpы REWIND. Пpи выполнении ERASE значение указателя CURRENT не изменяется. Функция [SUCCESS] выдает значение 1, если был вычеpкнут хотя бы один факт, и 0 - если нет. Функция [FOUND] выдает количество вычеpкнутых фактов.

Отметим, что опеpатоp REWIND BUFFER не влияет на поведение опеpатоpов NEWS, TOTAL, ERASE, SELECT - они всегда ищут факты только в списке FACTS.

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


* Поступление ТМЦ
t=[n1 @T]                код товара
k=[n1 @K]                код контрагента-поставщика
p=[n1 @P]                код подразделения
a=[plus *t,p,Q]          ценности записаны на подразделение в кол-ве Q
a=[plus *t,'всего',Q]    общий запас ценностей данного вида
* Определение факта
fact приход ТМЦ t в кол-ве Q по цене $/Q от поставщика k в подразделение p
* Факт прихода новой партии
n=1
news партия ТМЦ t в кол-ве ?? стоимостью ?? за номером ?n
! [success]=1
  n=n+1
!
fact партия ТМЦ t в кол-ве Q стоимостью $ за номером n

Для того, чтобы присвоить новой партии уникальный номер мы сначала пытаемся найти последнюю партию и определить ее номер. Если такая партия есть ([success]=1), то значение номера последней партии "считанное" в переменную n увеличивается на единицу. В противном случае (не было ни одной партии ТМЦ данного вида), номер партии остается равным единице. Далее создается новый факт "партия ТМЦ".

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

Теперь эта операция будет выглядеть следующим образом.


Товары
...реализация
   ...?Q кол-во
       . X    @P (0)       выбор подразделения
       . @K   X   1        "дебетование" покупателя
       . X    @T  tmc_lifo списание ценностей
       . 62   46  F62_46   отражение реализации
       . 46  68-2 (ND)     начисление НДС
       . 46   41  (ST)     списание себестоимости
       . 64   62  (ZA)     зачет аванса (если был)

Мы всего-навсего заменили файл-коэффициент tmc_real.rpt на tmc_lifo.rpt. Вот его содержание.


* Реализация товара (ЛИФО)
t=[n1 @T]                                  код товара
k=[n1 @K]                                  код контрагента
p=[n1 @P]                                  код подразделения
v=[get *t,p]                               кол-во в подразделении
! v < Q                               Если отгрузка больше наличного запаса
error На складе нет такого кол-ва товара
!
******************* Расчет себестоимости отгрузки методом ЛИФО **************
ST=0           в переменной ST накапливается себестоимость отгружаемой партии
NO=Q           нераспределенный по партиям остаток списываемого количества

:Povtor
* ищем последнюю несписанную партию товара
NEWS партия ТМЦ t в кол-ве ?RP стоимостью ?SP за номером ?NP

! [success]=0             если такой партии нет, то это значит, что
error Ошибка в логике построения дерева операций!

! RP < NO  если количество товара в данной партии меньше нераспределенного, то
ST=ST+SP   стоимость партии списывается полностью, а
NO=NO-RP   нераспределенное по партиям кол-во уменьшается на размер партии

* после этого уничтожается запись о приходе партии за номером NP
ERASE партия ТМЦ t в кол-ве ?? стоимостью ?? за номером NP
goto Povtor  и переходим к новой партии
!

* в противном случае, то есть если размер очередной партии больше
* нераспределенного остатка, то
OP=RP-NO         вычисляется остаток партии товара в натуральном выражении
OS=OP*SP/RP      остаток стоимости партии
ST=ST+NO*SP/RP
ERASE партия ТМЦ t в кол-ве ?X стоимостью ?X за номером NP
FACT  партия ТМЦ t в кол-ве OP стоимостью OS за номером NP
****************************************************************************
a=[plus *t,p,-Q]                           уменьшение запаса в подразделении
a=[plus *t,'всего',-Q]                     уменьшение запаса "всего"
SR=$                                       запомним продажную стоимость
$=ST                                       спишем себестоимость с НДС

Первая и последняя части файла те же, что и в файле tmc_real.rpt. Отличие состоит в изменении правил расчета списываемой себестоимости.

Алгоритм состоит в следующем.

Сначала оператор NEWS ищет последний зарегистрированный факт о приходе данного товара. При этом, в переменные RP, SP и NP считываются размер, стоимость и номер партии, соответственно. Если партия не найдена - значит имеет место какая-то ошибка в логике построения дерева операций и файлах-коэффициентах (это тоже бывает).

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

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

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

Для упрощения "натурных" экспериментов с построенной операцией заведем новый вид ТМЦ, определим его приходы и реализацию с помощью следующих операций:


  13 17      200,000  Товары  приход от поставщика кол-во 100 P01 Склад#1
                      K001 ТОО "Ветер" 10001002 Пиво "Балтика"

                      P01       X                          0
                      X         K001                 200,000
                      10001002  X                    200,000
                      41        60                   166,667
                      19        60                    33,333
                      60        61                         0
                      68-2      19                         0

  14 20      220,000  Товары  приход от поставщика кол-во 100 P01 Склад#1
                      K002 ТОО "Дождь" 10001002 Пиво "Балтика"

                      P01       X                          0
                      X         K002                 220,000
                      10001002  X                    220,000
                      41        60                   183,333
                      19        60                    36,667
                      60        61                         0
                      68-2      19                         0

  15 23      250,000  Товары  реализация кол-во 150 P01 Склад#1
                      К102 АО "Восток" 10001002 Пиво "Балтика"

                      X         P01                        0
                      К102      X                    250,000
                      X         10001002             320,000
                      62        46                   250,000
                      46        68-2                  41,667
                      46        41                   266,667
                      64        62                         0

Легко видеть, что при реализации 150 бутылок пива "Балтика" должно быть списано 2200*100+2000*50 = 320000. Напомним, что по построению файла-коэффициента F62_46.rpt с 41 счета списывается стоимость, очищенная от НДС.

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


  10 14      800,000  Товары  реализация кол-во 100 P02 Склад#2
                      К101 АО "Траст" 10001001 Пиво Туборг 0,5

                      X         P02                        0
                      К101      X                    800,000
                      X         10001001             672,000
                      62        46                   800,000
                      46        68-2                 133,333
                      46        41                   560,000
                      64        62                   800,000

  11 14      400,000  Товары  реализация кол-во 50 P02 Склад#2
                      К101 АО "Траст" 10002001 Колбаса вареная

                      X         P02                        0
                      К101      X                    400,000
                      X         10002001             137,500
                      62        46                   400,000
                      46        68-2                  36,364
                      46        41                   125,000
                      64        62                   200,000

Теперь в операции 10 списана большая себестоимость, а в операции 11 - меньшая.

При составлении операций по оценке запасов методом ЛИФО мы использовали свой набор фактов для того, чтобы сохранить полную информацию фактов "приход ТМЦ" для последующего формирования рассмотренных выше отчетов о движении ценностей. Набор фактов "партия ТМЦ" для этого не может использоваться, поскольку при операциях реализации сведения о поступивших партиях уничтожаются или модифицируются.

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

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

При переходе к следующему году "накопленные" системой факты переносятся точно также, как и экстра-параметров. При выполнении записи счетов в режиме просмотра оборотного баланса наряду с файлами acnt.e и extra.e, будет создан текстовый файл facts.e, содержащий записи о фактах.

В условиях нашего примера, файл facts.e будет содержать следующие строки.


4.5.1996
S=приход ТМЦ
S=10001001
N= 1.00000000000000E+0002
N= 4.80000000000000E+0003
S=K001
S=P01

4.5.1996
S=партия ТМЦ
S=10001001
N= 1.00000000000000E+0002
N= 4.80000000000000E+0005
N= 1.00000000000000E+0000

4.5.1996
S=приход ТМЦ
S=10002001
N= 2.00000000000000E+0002
N= 3.30000000000000E+0003
S=K001
S=P01

4.5.1996
S=партия ТМЦ
S=10002001
N= 2.00000000000000E+0002
N= 6.60000000000000E+0005
N= 1.00000000000000E+0000

6.5.1996
S=приход ТМЦ
S=10001001
N= 2.00000000000000E+0002
N= 6.72000000000000E+0003
S=K002
S=P02

6.5.1996
S=приход ТМЦ
S=10002001
N= 1.00000000000000E+0002
N= 2.75000000000000E+0003
S=K002
S=P02

8.5.1996
S=приход ТМЦ
S=10003002
N= 1.00000000000000E+0002
N= 3.81000000000000E+0003
S=K002
S=P02

8.5.1996
S=партия ТМЦ
S=10003002
N= 1.00000000000000E+0002
N= 3.81000000000000E+0005
N= 1.00000000000000E+0000

14.5.1996
S=партия ТМЦ
S=10001001
N= 1.00000000000000E+0002
N= 6.72000000000000E+0005
N= 2.00000000000000E+0000

14.5.1996
S=партия ТМЦ
S=10002001
N= 5.00000000000000E+0001
N= 1.37500000000000E+0005
N= 2.00000000000000E+0000

17.5.1996
S=приход ТМЦ
S=10001002
N= 1.00000000000000E+0002
N= 2.00000000000000E+0003
S=K001
S=P01

20.5.1996
S=приход ТМЦ
S=10001002
N= 1.00000000000000E+0002
N= 2.20000000000000E+0003
S=K002
S=P01

23.5.1996
S=партия ТМЦ
S=10001002
N= 5.00000000000000E+0001
N= 1.00000000000000E+0005
N= 1.00000000000000E+0000

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

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

Часть 2. Многопользовательская система "Финансы без проблем"

Зачем нужна сетевая версия?

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

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

В локальной, однопользовательской версии системы каждый пользователь ведет собственную базу данных на своем компьютере. Именно в нее (и только в нее) попадают введенные бухгалтером операции. Здесь же хранятся план счетов, дерево операций и файлы форм. Именно на их основе (и только на их основе) локальная версия программы "Финансы без проблем" выполняет расчеты и формирует отчеты.

Если в бухгалтерии работает несколько человек, то для того, чтобы при использовании локальной версии получить сводные отчеты необходимо объединить данные на одном компьютере. Единственный способ это сделать - применить утилиту SUF.EXE, поставляемую с локальной версией. Безусловно, это хорошая, полезная программа, которая свои функции выполняет. Однако, не так-то приятно то и дело, при завершении квартала или года, возиться с дискетами: здесь данные "выгрузить" на дискету, там "загрузить" их с дискеты, да еще и контролировать: все ли и так ли "выгружено" и "погружено". Прямо как грузчик, а не бухгалтер. И все это вместо того, чтобы заниматься родным бухгалтерским делом.

Да это ладно бы. Четыре раза в год можно потерпеть. Но ведь этот босс то и дело просит подготовить оперативный отчет о состоянии дел.

В общем, дискета - это носитель информации. А человек - ее метаноситель. То есть носитель дискет, которые несут информацию.

Значительно приятнее работать в локальной вычислительной сети (ЛВС), когда компьютеры связаны друг с другом и можно выполнять операции пересылки данных от одного компьютера на другой даже не отрывая пятой точки от теплого, насиженного стула. Однако, если сеть используется только для пересылки данных, то все равно приходится выполнять не свойственные природе труда бухгалтера или менеджера функции - нажимать на лишние кнопки, чтобы выполнить эти дополнительные технологические операции пересылки/приема. Хорошо бы работать так, чтобы то, что введено на компьютере в другой комнате можно было тут же использовать на своем компьютере.

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

Как "устроена" и как работает сетевая версия (Часть 1.)

Сетевая версия программы "Финансы без проблем" состоит из двух частей: программы-сервера и программ-клиентов.

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

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

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

Каковы функции программы-сервера и программ-клиентов?

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

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

Работа строится по следующему принципу.

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

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

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

Поэтому, когда пользователь инициирует ввод операции, то последующий его диалог с программой-клиентом может сопровождаться запросами клиента к серверу, например, для отработки @-обращений, или псевдопроводок "создать документ".

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

Таким образом, обработка информации строится на основе постоянного "диалога" клиента и сервера. С пользователем же "разговаривает" только клиент.

Такая организация системы обработки данных называется архитектурой "клиент-сервер". На западе системы, построенные по данному принципу стали стандартом де-факто. Однако, как правило, они строятся немного на иных внутренних принципах, чем это организовано в системе "Финансы без проблем".

Особенности внутреннего устройства системы

Важнейшей отличительной чертой сетевой версии "Финансов без проблем" является то, что разработчики "Хакерс Дизайн" отказались от стандартных принципов построения систем в архитектуре "клиент-сервер" и реализовали собственную, специализированную технологию внутренней организации системы.

Как правило, системы сетевой обработки данных в архитектуре "клиент-сервер" строятся на основе универсальных программных средств - систем управления базами данных (СУБД) и систем управления запросами к базе данных, так называемых SQL-серверов. При таком построении системы задача разработчика программы отчасти упрощается за счет того, что он в своей прикладной программе реализует только те алгоритмы обработки данных, которые непосредственно касаются конкретной предметной области, в нашем случае - бухгалтерского учета, а функции хранения данных и доступа к ним организуются стандартными средствами управления базой данных, которая разработана другим разработчиком. Однако, СУБД являются стандартными средствами, построенными таким образом, чтобы хранить любые данные и поэтому не могут учитывать специфических свойств информации, возникающей в конкретной предметной области.

Поэтому, СУБД являются как бы дополнительным передаточным звеном между пользователем, данными и прикладной программой. При создании систем сетевой обработки данных по принципам "клиент/сервер" используется еще одно промежуточное звено - SQL-серверы, которые размещаются на центральном компьютере сети и обеспечивают доступ к общим для всех пользователей данным.

При таком построении системы прикладная программа, работающая на рабочей станции сети, при построении затребованного пользователем отчета, обращается к SQL-серверу с запросом на передачу ей нужных данных. Тот "переводит" запрос и обращается к СУБД, которая их извлекает. Полученные данные через межкомпьютерные соединения передаются на рабочую станцию сети, где программа-клиент выполняет их обработку и предъявляет полученные результаты пользователю системы.

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

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

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

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

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

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

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

В сетевой версии "Финансов без проблем" минимальной единицей обмена с сервером, является операция, в общем случае определяющая не одну, а множество проводок, благодаря чему средняя содержательность одной одной операции обмена клиента и сервера существенно выше, чем в системах, хранящих в централизованной базе данных непосредственно проводки. Любой многострочный документ или сложная групповая операция, специальным образом пакуются и передаются на сервер "в один присест". То же самое происходит и с выходными формами. Их строит сервер и за один прием передает уже построенную форму клиенту. В итоге, за счет сжатия и высокой информационной содержательности сообщений, нагрузка на сеть существенно снижается. Эксперименты показывают, что даже при больших объемах данных средняя загрузка сети при таком подходе составляет менее 10% от той, которая может эффективно обслуживаться средствами Novell Netware.

Немного технических деталей

Как уже было сказано, разработка включает две основные части: программу-сервер и программы-клиенты. В настоящий момент сервер "Финансов без проблем" поставляется для сред Novell Netware (NLM), Windows for Workgroups, Windows NT, а также для 32-разрядного расширения DOS фирмы Rational Systems - DOS/4GW. При желании пользователь может получить версию сервера для OS/2 или UNIX. Программы-клиенты реализованы для DOS, Windows, OS/2. В планы фирмы входит разработка клиентской части для компьютеров Macintosh.

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

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

Несмотря на высокую загрузку программы-сервера, она может функционировать на достаточно среднем по современным меркам компьютере. Рекомендуемая фирмой конфигурация - процессор не ниже 486DX66 с 16M байт памяти. Более точный расчет потребности в памяти может быть произведен по формуле 4M (пространство Novell Netware) + 500K (пространство загружаемого NLM) + 1K*количество счетов (объектов аналитического учета). В целом, оценка в 1К на один объект аналитического учета весьма завышена и представляет собой предельную величину, достигаемую при самой сложной организации учета. Средняя, типичная для большинства бухгалтерий, оценка - 300 байт.

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

Поскольку вся тяжесть проблем по обработке данных лежит на сервере, требования к техническим средствам рабочих мест самые минимальные. Ими вполне могут быть компьютеры на базе процессора 80286 и даже XT. В принципе, программе-клиенту достаточно всего 200К байт памяти.

Практически вся обработка осуществляется программой-сервером в памяти, поэтому скорость выполнения расчетов чрезвычайно высока. Так, полный перерасчет сальдо, оборотов и параметров аналитических счетов на тестовом примере, включающем 1000 операций (порядка 10 тыс. проводок) занимает не более 3 секунд на сервере 486DX66 c 16M оперативной памяти. Интересно отметить, что подобный расчет локальная версия программы осуществляет медленнее - за 5 секунд. Различие объясняется следующим обстоятельством.

Разработка программы осуществляется в среде Borland Pascal. Локальная версия скомпонована именно этим компилятором как 16-разрядное приложение. При создании сетевой версии паскалевский исходный текст с помощью специально созданного конвертора преобразован в программу на языке Си и скомпонован оптимизирующим компилятором Watcom C в полноценное 32-битное приложение. Такая технология разработки программ более надежна, чем прямое кодирование на Си поскольку позволяет избежать многих трудновыявляемых при работе с этим языком ошибок.

При конвертации из Паскаля в Си используются обращения только к стандартным библиотекам. За счет этого достигнута легкая переносимость программ практически в любую сетевую среду.

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

Установка системы

Комплект поставки сетевой версии программы "Финансы без проблем" включает:

1. Дискеты с программами и демонстрационным примером.

2. Электронный ключ защиты.

3. Регистрационную карточку.

4. Методические материалы по использованию программы.

На дискетах содержатся:

- версии сервера для Novell NetWare и DOS.

- программы-клиенты для DOS и Windows

- локальная версия программы

- демонстрационный пример

Дискета, содержащая сервер "Финансов без проблем" содержит следующие файлы:


     ................. B:\ ..................
     .    Name    .    Name    .    Name    .
     .HELP        .            .            .
     .dos4gw   exe.            .            .
     .fl       nlm.            .            .
     .fn       exe.            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     .            .            .            .
     ........................................
     .HELP         SUB-DIR  26/09/95  14:10 .
     ........................................

Файл fl.nlm используется совместно с Novell NetWare, а fn.exe - версия сервера для сред DOS, Windows, OS/2. В директории HELP содержатся файлы текстов помощи, выводимых при работе с системой.

Дискета с программами-клиентами содержит две директории: DOS и WIN. Легко догадаться о назначении их содержимого.


................ B:\DOS ................................ B:\WIN ................
.    Name    .    Name    .    Name    ..    Name    .    Name    .    Name    .
...          .            .            ....          .            .            .
.cl       exe.            .            ..ddecl    exe.            .            .
.cl       hlp.            .            ..formcl   exe.            .            .
.cl       ovl.            .            ..manager  xls.            .            .
.            .            .            ..readme   wri.            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
.            .            .            ..            .            .            .
................................................................................
...           UP--DIR    7/09/95  16:46....           UP--DIR   17/09/95  19:51.
................................................................................

В левом окне приведены файлы программы-клиента для DOS, а в правом - файлы программы-клиента для Windows. Пользователи локальной версии в файле manager.xls, наверное, узнали демонстрационный пример DDE-обмена с электронными таблицами.

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

Начнем с процедуры установки сервера. Для этого нужна дискета "Сервер".

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

1. Вставить электронный ключ из комплекта поставки в параллельный порт.

2. Скопировать файл FL.NLM в какой-либо каталог диска.

3. Создать каталог, в котором будут находиться данные и правила "Финансов без проблем" - файлы *.f3p, *.rpt, cas.rul, acnt.a3p. Будем называть этот каталог рабочим. Если в сети ведутся несколько бухгалтерий, то данные каждой из них должны находиться в своем рабочем каталоге.

4. Создать каталог _BOX_. Он может размещаться в любом месте файловой структуры и служит для обмена данными между клиентами и сервером.

5. В рабочем каталоге создать подкаталог HELP и скопировать в него содержимое одноименного каталога дискеты "Сервер".

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

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

Для DOS, Windows и OS/2 используется сервер fn.exe. Эта программа создана на основе системы DOS/4GW - 32-разрядного расширителя DOS фирмы Rational Systems.

Установка сервера в этом случае должна включать следующие шаги. Здесь также предполагается, что все действия выполняются применительно к диску машины-сервера.

1. Вставить электронный ключ из комплекта поставки в параллельный порт.

2. Скопировать файлы FN.EXE и DOS/4GW.EXE в какой-либо каталог диска. Путь к этому каталогу должен быть установлен командой DOS Path.

3. Создать каталог, в котором будут находиться данные и правила "Финансов без проблем" - файлы *.f3p, *.rpt, cas.rul, acnt.a3p. Будем называть этот каталог рабочим. Если в сети ведутся несколько бухгалтерий, то данные каждой из них должны находиться в своем рабочем каталоге.

4. Создать каталог _BOX_. Он может размещаться в любом месте файловой структуры и служит для обмена данными между клиентами и сервером.

5. В рабочем каталоге создать подкаталог HELP и скопировать в него содержимое одноименного каталога дискеты "Сервер".

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

7. Если предполагается использование сервера в среде Windows, то для запуска FN.EXE должен быть создан PIF-файл, включающий следующие параметры:

- разрешение работать в фоновом режиме

- потребность сервера в оперативной памяти

- достаточно высокий приоритет

- команду запуска сервера и его параметры запуска

- ассоциированную с сервером пиктограмму.

Пример определения параметров PIF-файла приведен на следующем рисунке.


     *** pif.bmp ***

Запуск и назначение параметров запуска будут рассмотрены далее.

При создании PIF-файла для запуска сервера рекомендуем, по крайней мере на первых порах, отключить функцию закрытия окна при выходе из программы. При наличии ошибок в дереве операций или некорректно заданных данных сервер выдает диагностические сообщения и его выполнение прекращается. Если окно сервера будет автоматически закрываться Windows, то прочесть в чем ошибка не удастся - придется искать диагностический файл FATAL.ERR в рабочем каталоге.

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

В поставочный комплект системы входит демонстрационный пример. Если у Вас есть желание ознакомиться с работой системы на его основе, то помимо основного рабочего каталога, в котором будут размещаться данные и правила реальной бухгалтерии, создайте на машине-сервере каталог DEMODATA и скопируйте в него содержимое дискеты "Правила", кроме подкаталога KNOBS. Автор рекомендует сделать это, поскольку дальнейшее изложение основано на использовании демонстрационного примера.

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

Для установки версии программы-клиента для DOS необходимы следующие действия. Предполагается, что они относятся к диску конкретной рабочей станции.

1. Создать каталог для размещения файлов программы-клиента. Желательно установить к нему путь командой DOS Path.

2. Скопировать все файлы из каталога \DOS дискеты "Клиент" в данный каталог.

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

Запуск системы

Запуск сетевой версии системы "Финансы без проблем" всегда начинается с запуска программы-сервера.

В среде Novell NetWare это выполняется с помощью директивы:


     LOAD FL <параметры>

При использовании сервера в среде DOS:


     FN <параметры>

При использовании в среде Windows следует запустить подготовленный ранее PIF-файл.

Если программа-сервер работает в среде DOS, то компьютер по существу становится выделенным сервером "Финансов без проблем". В среде Windows и OS/2 сервер является одним из DOS-приложений защищенного режима и допускает работу других DOS-приложений, в том числе программ-клиентов "Финансов без проблем".

Параметры, указываемые при запуске сервера версии 2.0 таковы:


     data [box [color [mode [m1 [m2]]]]]

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

Здесь:


     data   - имя рабочего каталога системы

     box    - имя каталога обмена сообщениями; по умолчанию \_BOX_;
              последним символом имени каталога должен быть символ "_"

     color  - признак того, будет ли мнемосхема, выводимая сервером
              на экран цветной (COLOR) или монохромной (MONO).
              Умолчание - MONO.

     mode   - режим работы сервера;

     m1, m2 - диапазон месяцев для запоминания проводок.

Параметры mode и m1,m2 будут рассмотрены позднее.

Главным является первый параметр. Он определяет с какой "бухгалтерией" будет работать сервер. Ничто (за исключением запуска сервера исключительно из DOS) не мешает запустить несколько серверов "Финансов без проблем" на одной машине, указав разные рабочие каталоги, и, тем самым, работать одновременно с несколькими бухгалтериями.

Очень внимательно следует отнестись к заданию второго параметра - каталога обмена. При старте сервер аккуратно стирает ВСЕ, что там находится. Поэтому и введено ограничение на имя данного каталога состоящее в том, что оно должно оканчиваться на символ "_". В противном случае, неровен час, после запуска сервера в форме


     fn xxx \

можно было бы лишиться всех данных на диске. Сервер строгий!

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

Итак, запускаем сервер.

Предположим, FN.EXE и DOS/4GW размещаются в директории D:\FBP. Файлы с тестовыми примерами, входящими в стандартную поставку системы, содержатся в директории D:\FBP\DEMOS\DEMODATA. Каталогом обмена данными назначен D:\FBP\_BOX_. Индикация мнемосхемы сервера осуществляется в монохромном режиме. Проводки не хранятся. Режим работы не задается.

Таким образом, параметры запуска сервера в данном случае таковы:


     D:\FBP\DEMOS\DEMODATA   D:\FBP\_BOX_

При запуске сервер, после некоторых "раздумий", выводит на экран окно следующего вида:


Финансы без пpоблем: Сеpвеp 2.02  Copyright (C) 1995,96 Хакеpс Дизайн
................................................................................

 ..................   ............  ...................      ...................
 . Запись счетов, ..... Ожидание .... Пеpеключение. D . Метка.NONAME           .
 . фактов, э-паp. .   . запpоса  .  . контекста:  . D'.   Год.1996             .
 ..................   ............  ...................      ...................
        ................... .........................        .Янваpь           .
 .............. . ............   ............  ............  .Февpаль          .
 . Добавление . . . Удаление .   .Постpоение.  .Выполнение.  .Маpт             .
 . опеpации   . . . опеpации .....баланса   ....фоpмы     .  .Апpель           .
 .     (O)    . . .    (D)   . ...          .  .   (R)    .  .Май              .
 .            . . .          . . .          .  .          .  .Июнь             .
 .............. . ............ . ............  ............  .Июль             .
....... .........       .      .      .   .                  .Август           .
. ..............  ................... . ...................  .Сентябpь         .
. . Извлечение .  . Восстановление  . . . Запоминание     .  .Октябpь          .
. . жуpнала    .  . состояния пеpед . . . состояния пеpед .  .Ноябpь           .
. .    (J)     .  . текущим днем    . . . текущим днем    .  .Декабpь          .
. ..............  ................... . ...................  ...................
.......................................                      .Итого            .
 Сегодня 2 июня 1996 года                                    ...................
 Пеpеключение контекстов pазpешено
 Данные в d:\fbp\demos\demodata\, обмен сообщениями чеpез d:\fbp\_box_\

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

Да и вообще, с сервером никак нельзя "разговаривать", кроме как формируя запросы через программу-клиента. В общем - "важный сеньор", доступ к которому иначе как через секретарей-клиентов невозможен. Впрочем, и на него есть управа. Нажав Ctrl-Alt-Del или кнопку Reset компьютера, на котором он выполняется можно показать ему "кто в доме хозяин".

Прошу особо обратить внимание на это обстоятельство! Если для подавляющего большинства сетевых прикладных программ завершение перезагрузкой смертельно, то для сервера "Финансов без проблем" - это не страшнее укуса комара. Таковы особенности его построения - данные не пропадут!

Конечно, не стоит отключать питание сервера сети в момент работы хотя бы одного из пользователей - не любят они этого (ни пользователи, ни машина-сервер). Тем более, если кроме программы-сервера "Финансов без проблем" запущены менее "стойкие" к подобному насилию приложения. Во всяком случае, завершать работу сервера крайне желательно только после завершения работы всех программ-клиентов. Сказанное выше призвано пояснить лишь одно - живучесть системы сетевой обработки данных, предоставляемой данной разработкой.

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

Итак, теперь мы знаем, как запустить программу-сервер, и как завершить ее выполнение.

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


     2.01R - версия  для  использования  в  реальном  режиме  работы
процессора; состоит из файлов CL.EXE, CL.OVL.

     2.01E - версия для защищенного режима работы процессора;  состоит
из файлов CE.EXE, CE.OVL, RTM.EXE, DPMI16BI.OVL.

Программа-клиент запускается без параметров вводом командной строки CL (для компьютеров с процессором НИЖЕ 80386) и CE или CL (для компьютеров с процессором НЕ НИЖЕ 80386).

При первом запуске клиента на экране появляется окно, запрашивающее каталог связи с сервером, имя пользователя и его пароль.


     ...............Финансы без пpоблем: Клиент...............
     .                                                       .
     . Каталог для связи с сеpвеpом:                         .
     .             Имя пользователя:                         .
     .                       Паpоль:                         .
     .........................................................

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

Правила определения прав пользователей мы рассмотрим далее. В настоящий момент нас интересует исследование основных правил работы с сетевой версией.

Пока же установим следующие параметры:


     ...............Финансы без пpоблем: Клиент...............
     .                                                       .
     . Каталог для связи с сеpвеpом: d:\fbp\_BOX_\           .
     .             Имя пользователя: supervisor              .
     .                       Паpоль:                         .
     .........................................................

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

После ввода имени и пароля клиент сообщает их серверу, который проверяет правильность их задания. Если параметры заданы неверно, то выдается сообщение:


      Сеpвеpу неизвестно такое имя или паpоль. Доступ запpещен...

и клиент завершает свою работу.

Если же все введено верно, то программа-клиент начинает работу.


  10:42  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................                                           . ..........
 .                                                                 . F8 Удалить .
 .                                                                 . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
................................................................................
>

Как видите, "лицо" программы-клиента существенно отличается от того, к чему мы привыкли, работая с локальной версией.

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

Сейчас клиент ждет запросов пользователя.

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


     F1    - вызов помощи
     F7    - начать ввод новой операции
     F10   - войти в главное меню программы
     Alt-X - закончить работу программы-клиента.

Кроме этого, в некоторых режимах работы можно использовать клавиши F8 и Esc.

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

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

Попробуйте самостоятельно поработать с системой помощи (клавиша F1).


  11:13  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 ....................................Помощь......................... ..........
 .           . Добpо пожаловать в 'Финансы без пpоблем: Клиент'.   . F8 Удалить .
 .           . Из этого места можно пpиступить ко вводу опеpации   . ............
 ............. (F7), нажать одну из опpеделенных пользователем     .
             . клавиш, вызвать главное меню клиента (F10) или      . Esc Снять .
             . послать одностpочный зап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авление мышью                           .
             .                                                     .
             ........................................... BS-откат ..

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

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

Нажмите клавишу F10. На экран будет выведено меню программы:



  11:20  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 . .  Палитpа: цветная 2   .                                       . F7 Новое .
 ...  Как в Windows: нет   .                                       . ..........
 . .........................                                       . F8 Удалить .
 . .  Опеpации, обоpоты... .                                       . ............
 ...  Файлы фоpм           .........................................
   .........................                                         Esc Снять .
   .  Автообновление       .                                         ...........
 ...  Стpок на опеpацию: 4 ......................................................
   .С Числа с запятыми     .
   .  Опpеделения клавиш   .
   .  Аpгументы и фильтpы  .
   .  Хpанить пеpвичные    .
   .  Состояние сна        .
   .........................
   .  Статистика сеpвеpа   .
   .  Статистика клиента   .
   .  Инфоpмация о пpавах  .
   .........................
   .  О пpогpамме          .
   .  Выход Alt-X          .
   .........................

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

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

Покиньте главное меню, нажав Esc.

Основные навыки работы с сетевой версией

Начнем с ввода операций.

Нажмите F7. В верхней части экрана появится что-то уже знакомое пользователям локальной версии.

11:27 supervisor, NONAME Финансы без пpоблем: Клиент 2.02R ................................................................... . . . F7 Новое . ....................... . .......... . 2 июня . F8 Удалить . . в общем поpядке . ............ ................................................................... Esc Снять . ........... ................................................................................ >

Для отказа от ввода операции в любой момент используется клавиша Esc.

Итак, система предлагает ввести дату текущего месяца. Если все в порядке, нажимаем Enter. На экран выводится список месяцев. В отличие от локальной версии месяц устанавливается для каждой операции. Можно выбрать тот, который Вам нужен. Дальше мы покажем, что вывод списка месяцев для тех или иных пользователей можно заблокировать. В этом случае система позволит им работать только в текущем месяце.


  11:31  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................                                           . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в о..........ке                                                . ............
 .......янваpя  ....................................................
       .февpаля .                                                    Esc Снять .
       .маpта   .                                                    ...........
 .......апpеля  .................................................................
       .мая     .
       .июня    .
       .июля    .
       .августа .
       .сентябpя.
       .октябpя .
       .ноябpя  .
       .декабpя .
       ..........

Итак, выбираем месяц и идем дальше.



  11:36  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................                                           . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке                                                . ............
 ...................................................................
    .в общем поpядке.                                                Esc Снять .
    .в начале дня   .                                                ...........
 ....в конце дня    .............................................................
    .................
 >
 

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

Выбираем "в общем порядке".


  11:40  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................................                           . ..........
 .   2 июня             .Матеpиалы     .                           . F8 Удалить .
 .  в общем поpядке     .Товаpы        .                           . ............
 ........................Заpплата      .............................
                        .Касса         .                             Esc Снять .
                        .Основные фонды.                             ...........
 ................................................................................
 >

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

Выберем "Касса" и продолжим.


  11:44  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .Касса                                      . F7 Новое .
 .......................      ........                             . ..........
 .   2 июня                   .pасход.                             . F8 Удалить .
 .  в общем поpядке           .пpиход.                             . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
 ................................................................................
>

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

Выберем "приход".


  11:47  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .Касса пpиход                               . F7 Новое .
 .......................             ...........................   . ..........
 .   2 июня                          .аванса от покупателей    .   . F8 Удалить .
 .  в общем поpядке                  .возвpат подотчетной суммы.   . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
 ................................................................................
 >

Далее, нас интересует приход "аванса от покупателей".


  11:49  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .12000000             .Касса пpиход аванса от покупателей         . F7 Новое .
 .......................                                           . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке                                                . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
 .............................................................................
 >

В качестве суммы операции наберем 12000000 и нажмем Enter.


  11:52  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .           12,000,000.Касса пpиход аванса от покупателей         . F7 Новое .
 .......................                                           . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке                                                . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
  Субсчет   Наименование покупателя      Задолженность
 62-000002  "Сеpп и молот"                           0
 62-000003  Фиpма "Неизвестная"                      0                         р
 62-000004  "Комсомолка"                             0                         р
 62-100001  МП "Азия и Афpика"                       0                         р

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

Выберем МП "Азия и Африка".


  11:58  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .           12,000,000.Касса пpиход аванса от покупателей         . F7 Новое .
 .......................С62-100001 МП                              . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке     в счет поставки товаров                    . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
................................................................................
>
>
>
> >r 62 ·1·

В нижней половине экрана отобразилась пока непонятная нам конструкция r 62 ·1·. Позже мы узнаем, что это такое. А пока продолжим ввод, в открывшееся поле комментария введем строку "в счет поставки товаров" и нажмем Enter. После краткого раздумья системы на экран будет выведен приходный кассовый ордер:


  12:06  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .           12,000,000.Касса пpиход аванса от покупателей         . F7 Новое .
 ....................... 62-100001 МП                              . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке     в счет поставки товаров                    . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
                                Фоpма N КО-1   . АОЗТ "Неизвестная фиpма"
                                               .
                                               .   К В И Т А Н Ц И Я  к
  АОЗТ "Неизвестная фиpма"                     .   ПРИХОДНОМУ КАССОВОМУ
                                               .   ОРДЕРУ  N
          ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР N           .
                                               .
                                               .
          ...........................          . Пpинято от :
          .    2 июня 1996 г.       .          . МП "Азия и Афpика"
          ...........................          .
 ............................................. .
 .Коppеспон-.Шифp  ана-.  Сумма   .Шифp целе-. . Oснование :
 .диpующий  .литическо-.          .вого наз- . . в счет поставки товаров
 .счет      .го учета  .          .начения   . .
 ............................................. .

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

Ввод операции закончен. Перед нами открылась следующая картина:



  12:15  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................                                           . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке                                                . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
                                                                     ................................................................................
>
>
>
>
>o mc = 6 dc = 2 12000000 ·Касса·пpиход·аванса от покупателей·С62-100001 МП···в
 счет поставки товаров ·
>

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

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

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

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

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

В только что введенной операции, после формирования ее типа, клиент обнаружил, что в определении проводок операции встречается @-обращение к субсчетам счета 62. Для конкретизации того, к какому субсчету относится операция, программа-клиент отправила серверу запрос на получение списка субсчетов для "предъявления" его пользователю в виде меню. Поэтому на одном из шагов формирования операции мы видели автоматически появившийся текст запроса к серверу в форме r 62 ·1·. Он и предписывал серверу построить выходную форму с перечнем субсчетов счета 62. Что означает символ "1" и зачем он был нужен в данном случае, мы разберем несколько позже.

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

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

Начните ввод операции "Товары прием". Дату и месяц введите по собственному усмотрению. Укажите какой-нибудь номер накладной, а заполняя поля "Кол-во, ед", "Наценка, %" и "Стоимость" ничего не вводя просто нажимайте Enter. В пропущенных при вводе (незаполненных) полях отобразились значения, начинающиеся символом "*" с последующим номером поля и программа представила нам перечень товаров, в котором незаполненные нами колонки отображены в верхней части таблицы.

Вашему взору откроется нечто подобное следующей видеограмме.


  14:22  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 . *3                  .Товаpы пpием N.накл. 133 Кол-во,ед *1      . F7 Новое .
 .......................Наценка,% *2                               . ..........
 .   2 июня                                                        . F8 Удалить .
 .  в общем поpядке                                                . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
  Субсчет  Товаp:весь список    Кол-во,ед.  Кол-во,ед   Наценка,%       Сумма
 41-000001 sony trinitron                0.
 41-100001 колбаса "Особая"              0.                                    р
 41-100002 колбаса "Доктоpская"          0.                                    С
 41-100003 мясо: свинина                 0.                                    р
           охлажденная                    .                                    р
 41-100004 колбаса "Сеpвелат"            0.                                    р
 41-100005 колбаса "Свиная"              0.          0                         р
 41-100007 колбаса гpудинка              0.                                    р
 41-100008 колбаса - сосиски             0.                                    р
 41-100009 мясо: говядина                0.                                    р
           охлажденная                    .                                    р
 41-100010 мясо: свинина имп.            0.                                    р
 41-100011 мясо: говядина имп.           0.                                    р
 41-100012 колбаса: свинина              0.

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

Здесь следует заполнить поля таблицы напротив тех товаров, которые приходуются в настоящий момент. Для перемещения из строки в строку используйте клавиши управления курсором, а по полям таблицы можно перемещаться с помощью клавиши табуляции - Tab. Только НЕ нажимайте Enter. Эта клавиша заканчивает ввод списка и вернуться к вводу можно будет только завершив ответ на все последующие вопросы и вызвав функцию корректировки, которую мы рассмотрим позднее.

Заполним несколько строк. К примеру так:


  Субсчет  Товаp:весь список    Кол-во,ед.  Кол-во,ед   Наценка,%       Сумма
 41-000001 sony trinitron                0.
 41-100001 колбаса "Особая"              0.
 41-100002 колбаса "Доктоpская"          0.        300          10   3,364,500
 41-100003 мясо: свинина                 0.
           охлажденная                    .
 41-100004 колбаса "Сеpвелат"            0.
 41-100005 колбаса "Свиная"              0.        100          20   2,430,000
 41-100007 колбаса гpудинка              0.
 41-100008 колбаса - сосиски             0.
 41-100009 мясо: говядина                0.
           охлажденная                    .
 41-100010 мясо: свинина имп.            0.        100          20   1,215,000
 41-100011 мясо: говядина имп.           0.
 41-100012 колбаса: свинина              0.

При переходе на следующую строку курсор устанавливается в первую доступную для корректировки колонку (Кол-во, ед). Калькулятор, к сожалению, недоступен.

Завершим ввод, нажав на Enter. Программа предложит нам выбрать поставщика. Это мы уже проходили. Я в книге выбрал субсчет 60-000006 - фирму "Луна".

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

После нажатия на Enter ввод операции завершен.

На экране отображается запрос, состоящий уже не из одной, а сразу из нескольких директив.


>o mc = 6 dc = 2 3 ·{· o mc = 6 dc = 2 2430000 ·Товаpы·пpием··N.накл. ·133··Кол-во,ед ·100··Наценка,% ·20·С41-100005 колбаса·С60-000006 Фиpма· o mc = 6 dc = 2 3364500 ·Товаpы·пpием··N.накл. ·133··Кол-во,ед ·300··Наценка,% ·10·С41-100002 колбаса·С60-000006 Фиpма· o mc = 6 dc = 2 1215000 ·Товаpы·пpием··N.накл. ·133··Кол-во,ед ·100··Наценка,% ·20·С41-100010 мясо:·С60-000006 Фиpма· o mc = 6 dc = 2 ·}· >

Фактически, сформировано несколько операций сразу. Группе однотипных операций предшествует специальная операция "{", а завершает операция "}", которые специальным образом объединяют их в одну группу. Значения номера месяца и номера дня (mc и dc) в каждой операции одинаковы и соответствуют указанным в начале формирования групповой операции величинам. В однотипных операциях различаются только поля, которые мы заполняли в многострочной таблице ввода.

Все сформированные операции сгруппированы и переданы "на съедение" серверу одним приемом.

Итак, общий принцип формирования групповых операций таков.

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

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

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

Вызовем главное меню системы и в нем выберем пункт "Операции, обороты".


   15:18  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 . .     С. SUPERVISOR     .                                       . F7 Новое .
 ...      . OLGA           .                                       . ..........
 . .      . еще имена      .                                       . F8 Удалить .
 . .........................                                       . ............
 ...      . опеpации всех  .........................................
   .     С. свеpнуто - {}  .                                         Esc Снять .
   .........................                                         ...........
 ...  Oпеpации пеpиода     ......................................................
   .  Обоpоты пеpиода      .
   .........................Товаpы·пpием··N.накл. ·133··Кол-во,ед ·100··Наценка,%
   .      . Янваpь <....1...0-000006 Фиpма·
   .      . Февpаль       ..Товаpы·пpием··N.накл. ·133··Кол-во,ед ·300··Наценка,%
   .      . Маpт          ..0-000006 Фиpма·
   .      . Апpель        ..Товаpы·пpием··N.накл. ·133··Кол-во,ед ·100··Наценка,%
   .      . Май           ..000006 Фиpма·
   .    6 .Июнь           ..
   .........................

В первом блоке данного меню отображаются имена пользователей системы. Имя, под которым мы вошли в программу-клиент SUPERVISOR. Против него стоит отметка. Если поставить курсор меню на пункт "еще имена" и нажимать Enter, то можно получить продолжение списка и, тем самым, найти того пользователя, данные которого нас интересуют. Дело в том, что в отличие от локальной версии сетевая запоминает авторство каждой операции.

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

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


  Дата          Сумма Опеpации {} пользователя SUPERVISOR с 1 янваpя по 31 дек
  2.06     12,000,000 Касса пpиход аванса от покупателей
                      62-100001 МП "Азия и Афp
                      в счет поставки товаров  ·SUPERVISOR·0206120438·FAAA-013

  2.06      7,009,500 Товаpы пpием  - ГРУППА { 3 оп. }
                      ·SUPERVISOR·0206144307·FAAA-014··FAAA-018

Все верно. Введено всего две операции. Во второй операции указано слово "ГРУППА" и в скобках показано количество входящих в нее однотипных операций - 3. Каждая операция сопровождается дополнительной информацией. Это так называемый "штамп" сервера. Он автоматически приписывается каждой операции. Штамп кодирует им пользователя (в нашем случае - SUPERVISOR), следующая строка цифр кодирует день, месяц, час, минуты и секунды завершения регистрации операции, последней составляющей является уникальный код операции. Для групповых операций приводится диапазон кодов.

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

При просмотре списка операций доступны клавиши F4, F5, F6, F7, F8, F9. Их назначение аналогично функциям локальной версии программы. Будьте осторожны с клавишей F8. Операцию легко можно удалить.

Исключение составляет клавиша F6, в локальной версии выводящая список проводок соответствующей операции. В разбираемом примере использования программы попытка выполнить просмотр проводок операции завершится неудачей. Для групповой операции программа заявит о том, что нельзя просмотреть проводки групповой операции, а для операции "Касса приход аванса от покупателей" будет выдано сообщение "Нет ta-фактов для этой операции". Что такое ta-факты мы разберем позже.

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

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


·4 Дата          Сумма Опеpации пользователя SUPERVISOR с 1 янваpя по 31 декабpя
 2.06              3 {
·                                              ·SUPERVISOR·0206144303·FAAA-014


 2.06      2,430,000 Товаpы пpием N.накл.  133 Кол-во,ед 100
                     Наценка,% 20 41-100005 колбаса "Свина
                     60-000006 Фиpма "Луна"
·                                              ·SUPERVISOR·0206144304·FAAA-015
 2.06      3,364,500 Товаpы пpием N.накл.  133 Кол-во,ед 300
                     Наценка,% 10 41-100002 колбаса "Докто
                     60-000006 Фиpма "Луна"
·                                              ·SUPERVISOR·0206144305·FAAA-016
 2.06      1,215,000 Товаpы пpием N.накл.  133 Кол-во,ед 100
                     Наценка,% 20 41-100010 мясо: свинина
                     60-000006 Фиpма "Луна"
·                                              ·SUPERVISOR·0206144306·FAAA-017
 2.06              0 }
·                                              ·SUPERVISOR·0206144307·FAAA-018


 2.06     12,000,000 Касса пpиход аванса от покупателей
                     62-100001 МП "Азия и Афp
·                     в счет поставки товаров  ·SUPERVISOR·0206154534·FAAA-019

С Найдено опеpаций: 6

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

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

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

Легко убедиться, что знакомая по локальной версии клавиатурная комбинация Alt-F3 не работает. Как сделать так, чтобы ее использование было возможным, мы рассмотрим далее. Построение оборотного баланса в сетевой версии системы "Финансы без проблем" выполняется через уже знакомое нам меню "Операции, обороты". Для этого здесь нужно выбрать пункт "Обороты периода". Клиент сформирует запрос и сервер ему ответит

...

  Счет        Н.остаток         Об.дебета        Об.кpедита         К.остаток
19                              1,240,364                           1,240,364
..(14)  Учет НДС по пpиобpет
41                              5,769,136                           5,769,136
..(39)  Товаpы
50                             12,000,000                          12,000,000
        Касса
60                                                7,009,500        -7,009,500
..(5)   Расчеты с поставщик.
62                                               12,000,000       -12,000,000
..(4)   Расчеты с покупател
X                                      -3         7,009,636        -7,009,639
        фиктив
Накл                                  133                                 133

Фиктив                          7,009,503                -3         7,009,506
..(5)   ные
.............................................................................
        Итого обоpотов:        26,019,133        26,019,133

СОбоpоты счетов с 1 янваpя  по 31 декабpя

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

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


  Счет           Н.остаток        Об.дебета       Об.кpедита        К.остаток
...
41-100002                         2,769,136                         2,769,136
        колбаса "Доктоpская"
41-100005                         2,000,000                         2,000,000
        колбаса "Свиная"
41-100010                         1,000,000                         1,000,000
        мясо: свинина имп.
СОбоpоты субсчетов с 1 янваpя  по 31 декабpя

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


Коppеспонденции счета 60

..........Дебет....................................
...................................................
          Итого дебет:                            0

..........Кpедит...................................
19        Учет НДС по пpиобpет  -         1,240,364
41        Товаpы                -         5,769,136
...................................................
          Итого кpедит:                   7,009,500
Сс 1 янваpя  по 31 декабpя

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

Все фоpмы

         Отчетные фоpмы:
01       * По основным сpедствам
10       * По матеpиалам
41       * По товаpам
60       * Поставщики ( счет 60 )
62       * Покупатели ( счет 62 )
70       * По заpплате
71       * По подотчетным
BALANCE  * "Встpоенная" фоpма баланса
BGROSS   * Главная книга
BOBOROT  * Обоpотная ведомость как в 2.0 - 3.0
PLAN     * План счетов
__SYS000 * Список пpоводок по опеpации
__SYS001 * Обоpоты счетов
__SYS002 * Обоpоты субсчетов
__SYS003 * Анализ счета
__SYS004 * Анализ коppеспонденции
__SYS005 * Коppеспонденции счета синтетически
__SYS006 * Коppеспонденции счета детально
         Фоpмы пеpвичных документов:
KART1    * Инвентаpная каpточка по ОС
LINE0    * пустой документ для подавления уникаль
NAKL1    * Пpиходная накладная по матеpиалам
NAKL2    * Расходная накладная по матеpиалам
NAKLT1   * Пpиходная накладная по товаpам
NAKLT2   * Расходная накладная по товаpам
PR-ORDER * Пpиходный кассовый оpдеp
RA-ORDER * Расходный оpдеp по выдаче заpплаты
ZAR1     * Платежная ведомость
         Истоpии:
H-1      * Журнал регистрации хоз/опеpаций (упрощ
H-11     * Жуpнал pегистpации хоз/опеpаций
H-3      * Распpеделение выpучки по дням недели
H-4      * Когда и сколько выдавалось заpплаты
H-8      * Истоpия: поставщик-товаpы
H-9      * Истоpия: товаp-пpиход-pасход
H-A      * Анализ счета
H-KASSA  * Кассовая книга
         Общие опpеделения:
FIRST    * Опpеделения для всех фоpм (FIRST.RPT)

Обратите внимание на формы с "интересными" названиями. __SYS - формы представляют собой определения на языке "Финансов без проблем" правил построения оборотного баланса, анализа корреспонденций и динамики счетов, а также списка проводок по операции. В локальной версии эти формы были встроены в программный код выполняемого модуля. Здесь же они описаны на языке системы "Финансы без проблем". Впрочем, эти описания здесь также включены в тело программы. Если пролистать содержимое файла FN.EXE, то можно найти там соответствующие тексты.

__SYS - формы можно выполнять и из списка файлов форм. Если интересно - поупражняйтесь в этом.

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

Язык запросов к серверу

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

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

Единcтвенная директива, отличная от буквы - "?". Она требует от сервера вывести перечень всех допустимых директив. Опробуем ее.

В строке запроса программы-клиента введите знак вопроса и нажмите Enter. По этому запросу будет сформирован следующий текст.

Получить инфоpмацию о каждой из этих диpектив можно диpективой вида:


        ? буква

Пpимеp:


        ? R

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

Если запрос состоит из нескольких директив (строк), то сервер выполняет все эти директивы друг за другом как единое целое.

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

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


     ДИРЕКТИВА R

Ди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мы);

В качестве примера применения директивы R в строке запроса введите:


     r BALANCE

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

Теперь попробуем ввести запрос


     R 41

В ответ на него сервер выполнит фоpму 41.RPT. В демонстрационном примере указанная форма имеет функцию выбора из перечня альтернатив - меню. Перед построением формы оно будет выведено на экран


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

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

Как следует из описания синтаксиса директивы R, при ее использовании кроме имени формы могут быть указаны параметры.

Попробуем их использовать. Введите запрос в следующей форме:


     R 41 ·2·

Символу "·" соответствует код 250. Для того, чтобы ввести его с клавиатуры нажмите клавишу Alt и не отпуская наберите на ЦИФРОВОЙ клавиатуре цифры 250. Этот символ надо набрать ДО и ПОСЛЕ параметра.

Если все сделано правильно, то после ввода запроса меню не появится: сервер будет считать, что выбран второй пункт меню. Сравните полученную форму с той, которая получается при указании в качестве параметра символа "1".

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


     ДИРЕКТИВА O

Диpектива O пpедписывает сеpвеpу добавить опеpацию к соответствующему файлу *.f3p и пересчитать итоги с учетом новой опе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 [s][MC=m][DC=d][PD=p] ·компонент·<компонент·>[·коммента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ации (см. текст ниже).

С примерами автоматического формирования директивы "O" мы уже встречались. Вряд ли имеет смысл формировать запросы данного типа вручную.


     ДИРЕКТИВА D

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

Синтаксис:


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

или


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

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


     ДИРЕКТИВА J

Ди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 мы уже сталкивались при формировании списков операций.


     ДИРЕКТИВА A

Ди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 создан

Если счет 10 отсутствовал, то сеpвеp сообщит:


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

     ДИРЕКТИВА K

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

Синтаксис:


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

Пpимеp. Удалим субсчет, созданный в пpедыдущем пpимеpе:


     K 10-0001M

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


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

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

Ручной ввод директив A и K вряд ли когда-нибудь потребуется Вам, поскольку дополнить список субсчетов или, наоборот, удалить ненужные можно непосредственно в процессе ввода операций.


     ДИРЕКТИВА E

Ди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

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

Список форм выдаваемый по директиве F мы уже видели при изучении основ работы с выходной информацией системы.

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


     ДИРЕКТИВА V

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

Попробуйте ввести данную директиву. В ответ получите что-то типа:

       => Финансы без пpоблем: Сеpвеp 2.02 от  9.04.1996. Для DOS/4GW
          Индекс скоpости пpоцесса: 9 Пеpеключение контекстов pазpешено

     ДИРЕКТИВА I

Диpектива I пpедписывает сеpвеpу выдать инфоpмацию о метке данных на сеpвеpе, текущей дате и вpемени.

Введите директиву. В ответ сервер пришлет следующую информацию.


YES
NONAME
1996
6
2
0
19
43
26
T
P
ALL Список фоpм

Она интерпретируется следующим образом.


    ...................................................
    .Стpока.Назначение              .Пpимеp содеpжания.
    ...................................................
    .     1.Согласие или отказ      .YES              .
    .      .пpедоставить инфоpмацию .                 .
    .      .(YES или NO)            .                 .
    ...................................................
    .     2.Метка данных(содеpжимое .NONAME           .
    .      .файла FIN.LBL)          .                 .
    ...................................................
    .     3.Год, к котоpому         .1996             .
    .      .относятся данные        .                 .
    ...................................................
    .     4.Текущий месяц           .6                .
    .     5.Текущее число           .2                .
    .     6.День недели             .0                .
    .     7.Вpемя, часы             .19               .
    .     8.Вpемя, минуты           .43               .
    .     9.Вpемя, секунды          .26               .
    ...................................................
    .    10.Пpизнак пpава           .T                .
    .      .пользоваться деpевом    .                 .
    .      .(T или пустая стpока)   .                 .
    ...................................................
    .    11.Пpизнак пpава вмешивать-.P                .
    .      .ся в пpошлое ( P или    .                 .
    .      .пустая стpока           .                 .
    ...................................................
    .    12.Резеpв                  .-                .
    ...................................................

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

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


     ДИРЕКТИВА T

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

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


     ДИРЕКТИВА S

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

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

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


Статистика сеpвеpа
  Кто\запpос:.    O  .    D  .    A  .    J  .    R  .    E  .    X  .  Итого
..............................................................................
SUPERVISOR   .       .       .       .       .   18  .    2  .   14  .   34
             .       .       .       .       .   14.7.    0.1.   12.0.   26.8
..............................................................................
OLGA         .       .       .       .       .       .       .       .
             .       .       .       .       .       .       .       .
..............................................................................
SVETA        .       .       .       .       .       .       .       .
             .       .       .       .       .       .       .       .
..............................................................................
DIMON        .       .       .       .       .       .       .       .
             .       .       .       .       .       .       .       .
..............................................................................
AUTOMAT      .       .       .       .       .       .       .       .
             .       .       .       .       .       .       .       .
..............................................................................
Итого запpосы.       .       .       .       .   18  .    2  .   14  .   34
Итого вpемени.       .       .       .       .   14.7.    0.1.   12.0.   26.8
..............................................................................
Сpеднее вpемя.       .       .       .       .    0.8.       .    0.8.    0.8
Худшее вpемя .       .       .       .       .    2.8.    0.1.    6.8.    6.8
..............................................................................
Сеpвеp стаpтовал в 18:05 и к моменту этого отчета отpаботал 6825 сек.
Коэффициент загpуженности сеpвеpа: 0.00

Запpосы с худшими вpеменами обpаботки:
O (0.0 сек):            :
D (0.0 сек):            :
A (0.0 сек):            :
J (0.0 сек):            :
R (2.8 сек):SUPERVISOR  : R balance
E (0.1 сек):SUPERVISOR  : E 2+2
X (6.8 сек):SUPERVISOR  : V

Распpеделение полезной памяти в базе D', байт:
Пеpеменные:                       80,768   25.0%
Счета и субсчета ( 191):         105,735   32.8%
Индексы счетов и субсчетов:       23,010    7.1%
Экстpапаpаметpы:                       0    0.0%
Индексы экстpапаpаметpов:              0    0.0%
Стpуктуpы для фактов:             94,758   29.4%
Таблица коppеспонденций:          18,524    5.7%

Итого:                           322,795  100.0%


Общее pаспpеделение памяти, байт:
База D:                          408,000, из 24000 блоков свободно 3421
База D':                         544,000, из 32000 блоков свободно 10962

Деpево и файлы-коэффициенты:      48,181
Скомпилиpованные фоpмы:          234,646
Индексы опеpаций:                    312

Итого занято памяти:           1,235,139

Было сделано обменов D - D':           0


     ДИРЕКТИВА L

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

Синтаксис:


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

Остальные директивы пока рассматривать не время - мы их разберем далее, применительно к разбору соответствующих возможностей системы "Финансы без проблем".

Разграничение прав пользователей

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

Рассмотрим как реализовано разделение прав пользователей в демонстрационном примере, поставляемом с программой.

Для просмотра прав пользователей используется директива U.

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

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

Введем директиву U+. В ответ получим следующие данные.


* описания в файле _RIGHTS_.FBP
SUPERVISOR
 T ·ALL·
 R ALL
 J ALL
 D ALL
 E
 P
 U

OLGA
 T ·Касса·{·}·
 R H-KASSA 60 62 70 71
 J SVETA

SVETA
 T ·Касса·Товаpы·{·}·
 R H-KASSA 41 60 62 70 71
 J OLGA
 D OLGA

DIMON
 R ALL
 E

AUTOMAT
 T ·Касса·

Их истолкование таково.

В системе зарегистрированы пользователи SUPERVISOR, OLGA, SVETA, DIMON и AUTOMAT. Ни один из них не назначил пароля на вход в систему.

Права пользователей описываются следующими параметрами.


     T - право использовать те или иные ветви дерева операций;
     R - право выполнять те или иные формы;
     J - право просматривать операции других пользователей;
     D - право удалять операции других пользователей;
     P - право вводить операции, предшествующие текущему дню;
     E - право получать информацию директивой E (калькулятор);
     U -  право  получать  информацию  об  именах,  паролях  и  правах

пользователей по директиве U, а также право выполнять директивы K (удаление счетов и субсчетов) и Q (запись состояния счетов для перехода на следующий год).

Права типа T, R, J и D должны сопровождаться дополнительными параметрами, указывающими КАКИЕ ИМЕННО ветви дерева и формы могут использоваться, а также операции КАКИХ пользователей разрешено просматривать и удалять. Если разрешение должно включать доступ КО ВСЕМ ветвям дерева, формам и операциям ЛЮБЫХ пользователей, то вместо перечисления можно использовать ключевое слово ALL.

Таким образом, пользователь SUPERVISOR имеет возможность:

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

Пользователь OLGA имеет право вводить операции только по ветви "Касса", использовать формы H-KASSA.RPT, 60.RPT, 62.RPT, 70.RPT, 71.RPT, а также просматривать операции пользователя SVETA. Больше не разрешено ничего.

Пользователь SVETA имеет право вводить операции, связанные с ветвями "Касса" и "Товары", использовать формы H-KASSA.RPT, 41.RPT, 60.RPT, 62.RPT, 70.RPT, 71.RPT, а также просматривать и удалять операции пользователя OLGA. Больше не разрешено ничего.

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

И, наконец, пользователь AUTOMAT - это, наверное, кассир-оператор за интеллектуальным кассовым аппаратом. Ему нельзя ничего, кроме ввода операций по кассе.

Мы неспроста вошли в систему под именем SUPERVISOR. В противном случае многие особенности сетевой версии системы "Финансы без проблем" так и не удалось бы увидеть.

Сейчас, когда мы достаточно подкованы, можно запустить еще одного клиента. Например, под именем OLGA.


     ...............Финансы без пpоблем: Клиент...............
     .                                                       .
     . Каталог для связи с сеpвеpом: d:\fbp\_BOX_\           .
     .             Имя пользователя: olga                    .
     .                       Паpоль:                         .
     .........................................................

Попробуем что-нибудь ввести.


 С 20:46  olga, NONAME                         Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 ..............................                                    . ..........
 .   2 июня             .Касса.                                    . F8 Удалить .
 .  в общем поpядке     .......                                    . ............
 ...................................................................
                                                                     Esc Снять .
                                                                     ...........
 ................................................................................
 >

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


o mc = 6 dc = 2 6000000 ·Касса·pасход·оплата·аванса поставщику·С60-000006 Фиpм
а·

Теперь попробуем использовать директиву U. Будет выведено следующее сообщение:


      Вы, OLGA, имеете такие пpава:
      пpаво пользоваться ветвями: Касса, {, }
      пpаво запускать фоpмы: H-KASSA, 60, 62, 70, 71
      пpаво использовать диpективу E без основных функций языка фоpм
      пpаво видеть опеpации пользователя SVETA

И все. Никакой информации о правах других пользователей.

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

Попробуйте войти в программу-клиент под именем DIMON. В этом случае экран будет совсем беден, а любая попытка что-нибудь ввести окончиться неудачей.

Итак, мы разобрались с типами прав пользователей, предоставляемыми системой "Финансы без проблем". Теперь разберемся как можно их изменить.

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

Рассмотрим структуру представления файла _RIGHTS_.FBP и правила его заполнения.

Вот этот файл.


* Файл пpав пользователей Финансы без пpоблем: Сеpвеp 1.0

* Пользователь:
SUPERVISOR

* пpаво использовать диpективу U для пpосмотpа файла пpав пользователей
 U

* пpаво указывать гpаницы пеpиода для фоpм и пpоизвольные даты опеpаций:
 P

* пpаво использовать в диpективе E функции, выдающие сведения о счетах:
 E

* пpаво выполнять все фоpмы:
 R  ALL

* пpаво пользоваться всеми стволами деpева видов опеpаций:
 T ·ALL·

* пpаво видеть опеpации всех пользователей
 J  ALL

* пpаво удалять опеpации всех пользователей
 D  ALL

OLGA
 T ·Касса·{·}·
 J SVETA
 R H-KASSA 60 62 70 71

SVETA
 T ·Касса·Товаpы·{·}·
 J OLGA
 D OLGA
 R H-KASSA 41 60 62 70 71

DIMON
 R ALL
 E

AUTOMAT
 T ·Касса·

Фактически, файл содержит все то же самое, что мы видели, получив ответ на директиву U, работая под именем SUPERVISOR.

Структура файла прав пользователей такова.


имя_пользователя [пароль_пользователя]
   право
   право
   ...
имя_пользователя [пароль_пользователя]
   право
   право
   ...
...

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

После права T должно следовать уточнение - список доступных данному пользователю ветвей дерева операций. Элементы списка разделяются уже знакомым нам символом "·". Этим же символом список должен завершаться. Если доступны все ветви, то следует указать ключевое слово ALL.

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

Файл _RIGHTS_.FBP может содержать определения до 10 имен пользователей. Это лицензионное ограничение числа пользователей стандартного варианта поставки системы "Финансы без проблем". При необходимости использования большего числа рабочих мест с фирмой "Хакерс Дизайн" заключается отдельное соглашение.

Определение "горячих" клавиш

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

В программе-клиенте войдем в главное меню системы и выберем там пункт "Определения клавиш".


     .......................Опpеделения клавиш.........................
     . Alt Текст клавиши    Командная стpока                          .
     ..................................................................
     .  0                                                             .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     ..................................................................

Определения можно дать комбинациям клавиши Alt с функциональными клавишами.

В колонке Alt следует указать номер функциональной клавиши 0-9. Колонка "Текст клавиши" определяет текст, который будет отображен на экране в форме рельефной клавиши, а колонка "Командная строка" - соответствующий определяемой клавише запрос к серверу.

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

Составим определение клавиатурной комбинации Alt-F3, по которой будет вызываться оборотный баланс.

Для этого заполним таблицу следующим образом.


     .......................Опpеделения клавиш.........................
     . Alt Текст клавиши    Командная стpока                          .
     ..................................................................
     . F3  Оборотка         r __SYS001                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     .                                                                .
     ..................................................................

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

После рестарта определение клавиши будет добавлено.


 С 23:51  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
 ...................................................................
 .                     .                                           . F7 Новое .
 .......................                                           . ..........
 .                                                                 . F8 Удалить .
 .                                                                 . ............
 ...................................................................
   Оборотка .                                                        Esc Снять .
   ..........                                                        ...........
 ................................................................................
 

Появилась рельефная клавиша с надписью "Оборотка". Теперь построить оборотный баланс можно либо нажав Alt-F3 на клавиатуре, либо щелкнув мышью на экранной кнопке.

Еще о главном меню

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

Пункт "Палитра" предлагает выбрать один из четырех вариантов цветового оформления экрана программы. Здесь нет практически никаких отличий от локальной версии системы. То же касается и пункта "Как в Windows". Здесь определяется будет ли программа-клиент загружать собственные изображения символов в знакогенератор адаптеров EGA и VGA.

Опция "Количество строк на операцию" позволяет установить количество строк, выделяемых для отображения одной операции при просмотре их списка по запросу с директивой J. Это количество находится в диапазоне от 3 до 6.

Опция "Числа с запятыми" определяет, будут ли числа отображаться с делением на тысячные группы или нет.

Установленная опция "Хранить первичные" сообщает серверу о необходимости сохранения образов первичных документов, построенных при отработке псевдопроводки "создать документ". Документ сохраняется под именем, совпадающим с уникальным кодом операции. Его можно просмотреть по директиве L или после нажатия F4 при просмотре списка операций, вызванных директивой J.

Пункт меню "Статистика сервера" эквивалентен вводу директивы S. "Статистика клиента" выводит информацию о среднем и худшем времени реакции на запрос. Пункт "Информация о правах" эквивалентен вводу директивы U.

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

Разработчики рекомендуют отключать эту опцию, если используется низкоскоростное сетевое оборудование или сеть перегружена.

Пункт меню "Состояние сна" имеет смысл при использовании системы в среде Windows. Если этот режим включен, то клиент практически не отнимает квантов времени у других задач. Это особенно полезно при использовании клиента на том же компьютере, где работает программа-сервер.

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

Как работает сетевая версия (Часть 2).

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

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

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

Локальная версия при любых значимых изменениях данных за месяц N отрабатывала следующим образом. "Сбрасывалась" готовность данного месяца и всех последующих, а при попытке выполнить какую-либо форму производился перерасчет, начиная с этого месяца.

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

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

Таким образом, работа в реальном времени оптимизирована по сравнению с однопользовательскими версиями. Вмешательство в прошлое, конечно, требует обычного для "Финансов без проблем" объема вычислений. Однако, как показывают эксперименты, с этим "обычным объемом" сервер справляется примерно в два раза быстрее, чем версия 4000, за счет того, что при его разработке использован оптимизирующий 32-разрядный компилятор.

Еще одна особенность, позволяющая оптимизировать скорость выполнения вычислений при вмешательстве в прошлое, появилась во второй версии сетевой системы. Это так называемый механизм переключения контекстов.

Его суть состоит в следующем.


     Шаг 1. Пpи  стаpте  сеpвеp  выполняет  расчет  итогов  ("сбивку"
            баланса) к pеальной дате и запоминает свое  вычислительное
            состояние в pабочей области D - контексте.

     Шаг 2. Сеpвеp  копиpует  контекст  D  в  контекст  D'  и  считает
            контекст D' активным.

     Шаг 3. Сервер ожидает запрос. При поступлении запроса выполняются
            следующие действия.

            Если зап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  считает  активным  контекст  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ежим выбирается при запуске сервера. Ранее, рассматривая вопрос о запуске мы сознательно проигнорировали этот параметр. Теперь рассмотрим его подробнее.

Как уже указывалось, при запуске серверу должны передаваться следующие параметры:


     data [box [color [mode [m1 [m2]]]]]

Параметры data, box и color были рассмотрены ранее. Параметр mode дает указание серверу, в каком pежиме работать.

Здесь есть всего два варианта:


     OLD  - предусматривает работу без пеpеключения контекстов;
     DUAL - с пеpеключением контекстов.

По умолчанию выбирается DUAL.

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

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

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

Теперь рассмотрим вопрос почему при работе со списком операций нам не удавалось просмотреть проводки, сформированные по операции.

Тогда, если Вы помните, при попытке выполнить это действие, выдавалось сообщение:


     "Нет ta-фактов для этой операции".

Что же такое ta-факты?

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

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

Нап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отные ведомости за любой пе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оке.

Для этого и используются необязательные параметры запуска сервера m1 и m2. Они указывают серверу диапазон месяцев, для котоpых будут запоминаться ta-факты. Как уже указывалось, по умолчанию ta-факты не запоминаются.

Таким образом, запуск сервера для DOS, Windows и OS/2 в виде:


     FN C:\DEMODATA C:\_BOX_ COLOR DUAL 1 12

обеспечивает работу с запоминанием контекстов и всех проводок (ta-фактов) с января по декабрь, а запуск в виде


     FN C:\DEMODATA C:\_BOX_ MONO OLD 3 5

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

Для Novell NetWare эти варианты запуска сервера будут выглядеть так:


     LOAD FL DEMODATA _BOX_ COLOR DUAL 1 12

     LOAD FL DEMODATA _BOX_ MONO OLD 3 5

Следует иметь ввиду, что в pежиме с запоминанием ta-фактов потpебность сеpвеpа в опеpативной памяти существенно увеличивается. Впрочем, наверное, этого не следует сильно бояться. Память быстро дешевеет и на момент завершения написания книги вплотную приблизилась к 10$ за мегабайт.

Итак, мы разобрали особенности работы сервера. Теперь рассмотрим некоторые детали взаимодействия сервера с клиентом.

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

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

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

Отладка дерева операций и файлов-форм

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

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

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


     ДИРЕКТИВА W

     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мы

     W DOWN     - завеpшить pаботу сеpвеpа.

Для использования директивы W пользователь должен иметь право U.

Таким образом, когда новая фоpма помещается в каталог, с данными котоpого pаботает сеpвеp (или вносятся изменения в существующую фоpму), то сеpвеp "узнает" об этом только после получения диpективы


     W FORM

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

Отработка @-обращений и предопределенные ответы

Начиная с этого параграфа мы, наконец, переходим к рассмотрению новых элементов языка форм, появившегося в сетевой версии системы "Финансы без проблем".

Первая группа вопросов, которые нам предстоит разобрать, касается механизма отработки @-обращений.

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

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

Посмотрим, например, как устроена операция "Касса приход аванса от покупателей" в демонстрационном примере системы.


Касса
...пpиход
   ...аванса от покупателей
   .   . 50  @62     1    pragma 1
   .   . создать документ PR-ORDER @62

При выполнении этой операции проверяется, имеется ли соответствующая счету 62 форма. Она имеется. Вот ее текст.


* Покупатели ( счет 62 )
 Субсчет   Наименование покупателя    Задолженность
#62
n=[n1 #]     номеp субсчета;
m=[n2 #]     наименование субсчета;
q=[ea #]     сальдо по этому субсчету на момент pегистpации опеpации;
^^^^^^^^n  ^^^^^^^^^^^^^^^^^^^^^^^m  ^^^^^^^^^^^^^^^q
           ^^^^^^^^^^^^^^^^^^^^^^^
           ^^^^^^^^^^^^^^^^^^^^^^^
#

При вводе рассматриваемой операции, для отработки @-обращения клиент автоматически сформировал запрос к серверу в виде:


     >R 62

Реагируя на него, сервер построил форму 62.RPT и передал ее клиенту, который и вывел ее на экран в качестве меню выбора покупателя.

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

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

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

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

Рассмотрим как они влияют на внутреннее устройство описания отчетных форм и файлов-коэффициентов.

Начнем с исследования устройства формы 41.RPT демонстрационного примера. Вот она.


* По товаpам
Z0=0        для оpганизации счетчика;
Z1=0        для оpганизации счетчика;
A=[im 'Товаp:','для пpиема:     все','для pеализации: непустые']
! A=1
goto G0
! A=2
goto G1
!
:G0
 Субсчет  Товаp:весь список    Кол-во,ед.  Отпускная цена Наценка
#41
n=[n1 #]            номеp субсчета;
m=[n2 #]            наименование субсчета товаpа;
p=[ep #,2]          цена ед. товаpа (как 2-й паpаметp);
q=[ep #,1]          количество товаpа (как 1-й паpаметp);
v=[ep #,3]          наценка на товаp (как 3-й паpаметp);
! [f1] ='0'         аpгумент f1 установлен в "аpгументах и фильтpах" как нуль;
goto M
!
qq=[cp n,4,1]       выpезаем 4-й символ в номеpе для опpеделения гpуппы товаpов;
! qq = [f1]         отбиpаем только по виду ( см "Фильтpы и аpгументы");
goto M
!
* goto V
:M
^^^^^^^^n ^^^^^^^^^^^^^^^^^^^m ^^^^^^^^^q  ^^^^^^^^^^^^^p  ^^^^^v
          ^^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^^
Z0=Z0+1             подсчитаем, сколько наименований товаpов выбpано;
Z1=Z1+q*[ep #,2]    подсчитаем, на какую сумму выбpано товаpов;
:V
#
goto END

:G1
 Субсчет    Товаp: в наличии   Кол-во, ед  Отпускная цена
#41
n=[n1 #]            номеp субсчета;
m=[n2 #]            наименование товаpа;
p=[ep #,2]          отпускная цена товаpа (как 2-й паpаметp);
q=[ep #,1]          количество товаpа (как 1-й паpаметp);
! [f1] ='0'         установку f1 см в "Аpгументах и фильтpах";
goto E
!
qq=[cp n,4,1]       выpезаем 4-й символ в номеpе субсчета и по нему опpед. гpуппу товаpов;
*! q < 0.00001       отбеpем только товаpы с "ненулевым" количеством;
*goto L
*!
! qq = [f1]          отбиpаем только вид товаpа;
goto E
!
goto L
:E
! q < 0.00001
goto L
!
^^^^^^^^n ^^^^^^^^^^^^^^^^^^m  ^^^^^^^^q   ^^^^^^^^^^^p
          ^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^
Z0=Z0+1      подсчитаем, сколько наименований товаpов выбpано;
Z1=Z1+q*p    подсчитаем, на какую сумму выбpаны товаpы;
: L
#
: END

          Итого найдено наименований:      ^^^^^^^^^^Z0
          на сумму в отпускных ценах: ^^^^^^^^^^^^^^^Z1
stop

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


A=[im 'Товаp:','для пpиема:     все','для pеализации: непустые']

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

В первом случае, в отчетную форму выводится весь список товаров. (Мы пока игнорируем новое для сетевой версии понятие "Аргументы и фильтры, которое будет рассмотрено далее.) Во втором случае отбираются только те субсчета, для которых первый параметр (переменная q - количество товара) ненулевое, то есть товары, имеющиеся в наличии.

При вводе запроса с параметром в виде:


     >R 41 ·1·

сервер игнорирует конструкцию [im ...], считая, что выбран первый пункт меню. При вводе запроса в форме:


     >R 41 ·2·

сервер будет считать, что выбран второй пункт меню.

Таким образом, появляется возможность "урезать" диалог до минимума.

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

Рассмотрим как должно быть "устроено" дерево видов операций в данном случае.

Определение операции приема товаров в демонстрационном примере системы выглядит следующим образом.


     ...Товаpы
     .  ...пpием
     .  .  ...? DD N.накл.
     .  .     ...? Q Кол-во,ед
     .  .        ...? H Наценка,%
     .  .            . Накл  X (DD-[ea Накл])
     .  .            . @41   @60  NDS_SPN       pragma 1
     .  .            . 19-01 @60  (ND)          зачтен НДС
     .  .            . 19-92 @60  (SN)          зачтен СПН
     .  .            . @41   =1   (Y0)          новое количество
     .  .            . @41   =3   (E0)          установка наценки
     .  .            . @41   =2   (V)           отпускная цена
     .  .            . @41   =4   [ep @41,4]+Q  суммиpование пpиходов
     .  .            . @41   =5   [ep @41,5]+SO для пеpесчета
     .  .            . @41   =7   [ep @41,7]+ND учтен ндс
     .  .            . @41   =8   [ep @41,8]+SN учтен сн
     .  .            . Итого  X  ($) увеличим суммовой итог накладной
     .  .            . Стpока X  (1) увеличим номеp стpоки накладной
     .  .            . создать документ NAKLT1

Каким образом ввод операции связан с формой 41.RPT мы уже рассмотрели выше.

Когда мы вводили рассматриваемую операцию, для отработки @-обращения клиент автоматически сформировал запрос к серверу в виде:


     >R 41 ·1·

Реагируя на него, сервер, без лишних вопросов, построил форму, по определению заданному в файле 41.RPT и передал ее клиенту, который вывел ее на экран в качестве меню выбора списка товаров.

Однако встает вопрос, как клиент и сервер догадались о том, что при вводе этой операции требуется передать форме 41.RPT именно ответ "1"?

Взгляните внимательно на следующую строку в описании листа


     @41   @60  NDS_SPN       pragma 1

и ответ придет сам собой.

В приведенном выше фрагменте дерева операций встречается незнакомое доселе пользователям локальной версии "Финансов без проблем" заклинание "pragma 1", записанное на месте комментария. Оно и определяет, что при выполнении формы 41.rpt, следует в качестве ответа на первый (и единственный) вопрос формы автоматически подставлять значение "1" не вступая в диалог.

В другом месте дерева операций, при описании операции "Товары реализация", ключевое слово pragma задает другой контекст вызова формы 41.rpt.


pеализация
...? DD N.накл.
   ...? Q Кол-во,ед
       . Накл  X  (DD-[ea Накл])
       . 46-001  @41  REAL  "себестоимость"  pragma 2
       . 50    46-001 (SO)         "пpибыль" от пpодажи
       . 50    68-2   (ND)         "вошло" ндс
       . 50    68-22  (SN)         "вошло" сн
       . 68-2  19-01  (NZ)         уменьшение ндс
       . 68-22 19-92  (SZ)         уменьшение сн
       . 46-001  43-002  (0)       зачет издеpжек
       . 46-001  80-5 [ek46]       закpытие счета 46
       . @41   =1    [ep @41,1]-Q  уменьшение количества
       . Итого X  (P) увеличим суммовой итог накладной
       . Стpока X (1) увеличим номеp стpоки накладной
       . создать документ NAKLT2

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

Как работает сетевая версия (Часть 3).

При выполнении формы она может вступать в длительный диалог с пользователем и запрашивать у него ввод на "интересующие" ее вопросы.

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

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

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

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

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

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

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

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


  Субсчет  Товаp:весь список    Кол-во,ед.  Кол-во,ед   Наценка,%       Сумма
 41-000001 sony trinitron                0.
 41-100001 колбаса "Особая"              0.
 41-100002 колбаса "Доктоpская"          0.        300          10   3,364,500
 41-100003 мясо: свинина                 0.
           охлажденная                    .
 41-100004 колбаса "Сеpвелат"            0.
 41-100005 колбаса "Свиная"              0.        100          20   2,430,000
 41-100007 колбаса гpудинка              0.
 41-100008 колбаса - сосиски             0.
 41-100009 мясо: говядина                0.
           охлажденная                    .
 41-100010 мясо: свинина имп.            0.        100          20   1,215,000
 41-100011 мясо: говядина имп.           0.
 41-100012 колбаса: свинина              0.

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

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

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

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


 ...{
 .   . X   Мульти [ea Мульти]-1
 .   . X   Стpок  [ea Стpок] -$
 .   . X   Стpока [ea Стpока]
 .   . X   Итого  [ea Итого]
 .   . создать документ LINE0
 ...}
     . X   Мульти [ea Мульти]
     . создать документ LINE0

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

Что же определено в этих операциях?

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

Ага. Первая строка префикса групповой операции устанавливает "сальдо" фиктивного счета Мульти в 1. Вторая - устанавливает счетчик числа строк (счет Строк) равным количеству операций, входящих в группу по принципу:


     (сальдо - (сальдо - число_операций)) = число_операций

Третья запись сбрасывает в ноль "сальдо" счета Строка, который, судя по всему, должен учитывать число строк уже выведенных в текущий документ, а четвертая - обнуляет счетчик Итого (для чего, наверное поймем потом).

Кажется, я начинаю понимать, для чего нужна форма LINE0 ...

Постфикс групповой операции попроще. Здесь "сальдо" фиктивного счета Мульти сбрасывается в ноль.

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


 Счета, начальные условия, паpаметpы
 ...
 Фиктив[Н] ные                                 Тип фоpмы
           @
 Итого     накапливаемая сумма
           в многостpочном
           документе
 Мульти    пpизнак многостpочн.
           документа
 Стpок     количество стpок в
           текущем многостp.
           документе
 Стpока    N стpоки в текущем
           многостpочном
           документе
 ТипФоpмы

Догадки были правильными. И как это я раньше не догадался посмотреть в план счетов! Да, опыт приходит с годами ...

Рассмотрим теперь как формируются многострочные документы

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

Еще раз посмотрим на описание операции приема товара.


Товаpы
      ...пpием
      .  ...? DD N.накл.
      .     ...? Q Кол-во,ед
      .        ...? H Наценка,%
      .            . Накл  X (DD-[ea Накл])
      .            . @41   @60  NDS_SPN       pragma 1
      .            . 19-01 @60  (ND)          зачтен НДС
      .            . 19-92 @60  (SN)          зачтен СПН
      .            . @41   =1   (Y0)          новое количество
      .            . @41   =3   (E0)          установка наценки
      .            . @41   =2   (V)           отпускная цена
      .            . @41 =4 [ep @41,4]+Q суммиpование пpиходов
      .            . @41   =5   [ep @41,5]+SO для пеpесчета
      .            . @41   =7   [ep @41,7]+ND учтен ндс
      .            . @41   =8   [ep @41,8]+SN учтен сн
      .            . Итого X ($) увеличим суммовой итог накладной
      .            . Стpока X  (1) увеличим номеp стpоки накладной
      .            . создать документ NAKLT1

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

Посмотрим теперь на содержимое формы NAKLT1.RPT, определяющей формирование приходной накладной.


*
X=[n2 @60]              наименование поставщика;
! [ea Мульти] = 0       пpовеpка: если это не многостpочный документ, то
goto SH                 печатай сpазу "шапку";
! [ea Стpока] = 1       пpовеpка: если это 1-я стpока многостpочного докумен-
goto SH                 та, то печатай "шапку";
!
goto LI
:SH                     печать "шапки";

                         ПРИХОДНАЯ НАКЛАДНАЯ  N ^^^^^^^

 От кого: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X
 Кому   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C1
..............................................................................
.Nп/п.    Наименование товаpа            . Кол-во .  Цена ед.  .   Сумма     .
.    .                                   .   ед.  .  с НДС,СН  .    pуб      .
..............................................................................
:LI
A1=[n2 @41]            наименование матеpиала;
A2=1                   для одностpочной - номеp записи всегда 1
! [ea Мульти] = 1      для многостpочной накладной:
A2=[ea Стpока]         поpядковый номеp записи;
!
A3=$
*Q=K  ( см файл-коэффициент)
A4=A3/Q
.^^A2.^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A1.^^^^^^^Q.^^^^^^^^^^A4.^^^^^^^^^^^A3.
.    .^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .        .            .             .
! [ea Мульти] = 0      пpовеpка: если это нe многостpочный документ, то
goto HW                печатай "нижнюю шапку";
! [ea Стpока] = [ea Стpок] если в многостpочном документе номеp стpоки совпал
goto HW                с номеpом общего кол-ва стpок, то печатай "нижнюю шапку"
!
goto EX                если не совпал, то обойди "нижнюю шапку";
*
:HW                    "нижняя шапка"
Z1=[ea Итого]          итоговая сумма по столбцу "Сумма";
Z=[wn [ea Итого],pуб]  сумма - пpописью;
! [ea Мульти] = 0      если документ одностpоковый, то сумма pавна сумме
Z1=$                   заpегистpиpованной опеpации.
Z=[wn $,pуб]
!
..............................................................................
.                                                               ^^^^^^^^^^^Z1.
.Итого:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Z   .
.        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                     .                              .
..............................................................................
   Пpинял: _______________________       Сдал: _______________________
: EX

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

При каждом выполнении формы оператор


! [ea Мульти] = 0       пpовеpка: если это не многостpочный документ, то
goto SH                 печатай сpазу "шапку";
! [ea Стpока] = 1       пpовеpка: если это 1-я стpока многостpочного докумен-
goto SH                 та, то печатай "шапку";
!

проверяет, равно ли "сальдо" счета Мульти нулю. Это может быть в том и только в том случае, если выполняется одиночная операция, потому что при выполнении групповой операции сначала "отрабатывает" ее заголовок - операция "{", которая, как мы выяснили, устанавливает Мульти в единицу. При завершении же групповой операции (и это мы тоже, наконец, поняли) Мульти всегда устанавливается в ноль.

Таким образом, если Мульти - ноль, то есть документ заведомо состоит из одной строки, то форма выполняет переход к блоку печати "шапки" документа. То же самое выполняется, если Мульти не ноль, но Строка равна 1. Обратите внимание, что сальдо счета Строка, установленное префиксом групповой операции в ноль, к моменту выполнения формы уже увеличено на единицу псевдопроводкой:


     Стpока X  (1)

и потому номер строки при первом выполнении формы уже равен единице.

В противном случае (номер строки больше 1), вывод "шапки" документа будет пропущен.

В основной части формы, начинающейся с метки :LI, выводятся наименование товара (переменная A1), номер строки (переменная A2), количество (Q), цена (A4) и стоимость (A3).


:LI
A1=[n2 @41]            наименование матеpиала;
A2=1                   для одностpочной - номеp записи всегда 1
! [ea Мульти] = 1      для многостpочной накладной:
A2=[ea Стpока]         поpядковый номеp записи;
!
A3=$
*Q=K  ( см файл-коэффициент)
A4=A3/Q
.^^A2.^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^A1.^^^^^^^Q.^^^^^^^^^^A4.^^^^^^^^^^^A3.
.    .^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .        .            .             .

Далее, выполняется оператор выбора.


! [ea Мульти] = 0      пpовеpка: если это нe многостpочный документ, то
goto HW                печатай "нижнюю шапку";
! [ea Стpока] = [ea Стpок] если в многостpочном документе номеp стpоки совпал
goto HW                с номеpом общего кол-ва стpок, то печатай "нижнюю шапку"
!
goto EX                если не совпал, то обойди "нижнюю шапку";

Если это не групповая операция (сальдо счета Мульти = 0) или если для групповой операции номер строки документа (сальдо счета Строка) совпадает с общим количеством операций в группе и, соответственно, числом строк документа (сальдо счета Строк), то сразу печатается подножие документа. В противном случае, операторы, печатающие подножие, "обходятся" и цикл выполнения формы повторяется.

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

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

Все-таки жалко, что язык форм "Финансов без проблем" не C++, а то можно было бы освоить новую специальность. Радость по поводу понимания назначения формы LINE0 все же оказалась преждевременной ...

При использовании функции группового ввода следует иметь ввиду следующее.

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


   Пpимеp:
   ...отгpузка покупателю
   .  ...по пpедваpит. оплате
   .     ...? Q кол-во:
   .         . @62 X   (0)
   .         . @V  X   (0)   pragma 1
   .         . @T  X   (0)   multiline pragma 1
   .         . @62 46     OT1
   .         . 68-001 @62 (ND)

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

Аргументы и фильтры

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

В главном меню программы-клиента нами остался нерассмотренным всего один пункт - "Аргументы и фильтры". Он и предназначен для установки значений аргументов.

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


     ......Аpгументы и фильтpы.......
     . Фоpма    Apгументы   Фильтpы .
     ................................
     . 41                           .
     .                              .
     .                              .
     .                              .
     .                              .
     .                              .
     .                              .
     .                              .
     ................................

Далее, нажмите клавишу табуляции - Tab. Программа выведет таблицу следующего вида:


.........................Аpгументы фоpмы 41..........................
. Shift  Текст клавиши        [f1]         [f2]         Умолчание   .
.....................................................................
.  0                                                                .
.                                                                   .
.                                                                   .
.                                                                   .
.                                                                   .
.                                                                   .
.                                                                   .
.                                                                   .
.....................................................................

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

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


.........................Аpгументы фоpмы 41..........................
. Shift  Текст клавиши        [f1]         [f2]         Умолчание   .
.....................................................................
.        Все                  0                         Эта клавиша .
. F1     Колбасы              1                                     .
. F2     Напитки              2                                     .
. F3     Обувь                3                                     .
.                                                                   .
.                                                                   .
.                                                                   .
.                                                                   .
.....................................................................

При заполнении таблицы предусмотрите ответ "Да" на меню в колонке "Умолчание" для аргумента со значением 0. Завершите ввод нажатием на Enter.

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

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


* По товаpам
Z0=0        для оpганизации счетчика;
Z1=0        для оpганизации счетчика;
A=[im 'Товаp:','для пpиема:     все','для pеализации: непустые']
! A=1
goto G0
! A=2
goto G1
!
:G0
 Субсчет  Товаp:весь список    Кол-во,ед.  Отпускная цена Наценка
#41
n=[n1 #]            номеp субсчета;
m=[n2 #]            наименование субсчета товаpа;
p=[ep #,2]          цена ед. товаpа (как 2-й паpаметp);
q=[ep #,1]          количество товаpа (как 1-й паpаметp);
v=[ep #,3]          наценка на товаp (как 3-й паpаметp);
! [f1] ='0'         аpгумент f1 установлен в "аpгументах и фильтpах" как нуль;
goto M
!
qq=[cp n,4,1]       выpезаем 4-й символ в номеpе для опpеделения гpуппы товаpов;
! qq = [f1]         отбиpаем только по виду ( см "Фильтpы и аpгументы");
goto M
!
goto V
:M
^^^^^^^^n ^^^^^^^^^^^^^^^^^^^m ^^^^^^^^^q  ^^^^^^^^^^^^^p  ^^^^^v
          ^^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^^
Z0=Z0+1             подсчитаем, сколько наименований товаpов выбpано;
Z1=Z1+q*[ep #,2]    подсчитаем, на какую сумму выбpано товаpов;
:V
#
goto END

:G1
 Субсчет    Товаp: в наличии   Кол-во, ед  Отпускная цена
#41
n=[n1 #]            номеp субсчета;
m=[n2 #]            наименование товаpа;
p=[ep #,2]          отпускная цена товаpа (как 2-й паpаметp);
q=[ep #,1]          количество товаpа (как 1-й паpаметp);
! [f1] ='0'         установку f1 см в "Аpгументах и фильтpах";
goto E
!
qq=[cp n,4,1]       выpезаем 4-й символ в номеpе субсчета и по нему опpед. гpуппу товаpов;
*! q < 0.00001       отбеpем только товаpы с "ненулевым" количеством;
*goto L
*!
! qq = [f1]          отбиpаем только вид товаpа;
goto E
!
goto L
:E
! q < 0.00001
goto L
!
^^^^^^^^n ^^^^^^^^^^^^^^^^^^m  ^^^^^^^^q   ^^^^^^^^^^^p
          ^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^
          ^^^^^^^^^^^^^^^^^^^
Z0=Z0+1      подсчитаем, сколько наименований товаpов выбpано;
Z1=Z1+q*p    подсчитаем, на какую сумму выбpаны товаpы;
: L
#
: END

          Итого найдено наименований:      ^^^^^^^^^^Z0
          на сумму в отпускных ценах: ^^^^^^^^^^^^^^^Z1
stop

Здесь обе ветки алгоритма построения формы предусматривают возможность использования аргументов.

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

У нас определены только значения первого аргумента. Поэтому в форме анализируются только они. Это действие производится следующими операторами.


qq=[cp n,4,1]       выpезаем 4-й символ в номеpе для опpеделения гpуппы товаpов;
! qq = [f1]         отбиpаем только по виду ( см "Фильтpы и аpгументы");
goto M
!
goto V

Из кода счета, предварительно занесенного в переменную n, "вырезается" четвертый символ. Далее, проверяется, равен ли он значению функции f1. В этом случае, производится переход на блок операторов (метка :M), выполняющих вывод в текст формы данных по этому субсчету - товару. В противном случае, операторы вывода "обходятся" (goto V). Для нулевого значения аргумента любое сравнение выполняется автоматически. В этом случае все субсчета включаются в отчет.

Во второй ветви формы реализован тот же алгоритм.

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

Выдадим запрос серверу в форме


     >r 41

После короткого ожидания на экран будет выведена форма.


 С 23:50  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
   Субсчет  Товаp:весь список    Кол-во,ед.  Отпускная цена Наценка
  41-000001 sony trinitron                0               0       0
  41-100001 колбаса "Особая"              0               0       0             С
  41-100002 колбаса "Доктоpская"        300          12,336      10             р
  41-100003 мясо: свинина                 0               0       0             р
            охлажденная                                                         р
  41-100004 колбаса "Сеpвелат"            0               0       0             р
  41-100005 колбаса "Свиная"            100          29,160      20             р
  41-100007 колбаса гpудинка              0               0       0             р
  41-100008 колбаса - сосиски             0               0       0             р
  41-100009 мясо: говядина                0               0       0             р
            охлажденная                                                         р
  41-100010 мясо: свинина имп.          100          14,580      20             р
  41-100011 мясо: говядина имп.           0               0       0             р
  41-100012 колбаса: свинина              0               0       0             р
            копченая                                                            р
  41-100013 колбаса: поpосенок            0               0       0             р
            копченый                                                            р
  41-100014 мясо: шашлыки из              0               0       0

  Все .  Колбасы .  Напитки .  Обувь .
  ....  .........  .........  .......

Сеpвеp учел аpгументы: f1="0" f2=""

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

Внизу формы располагаются кнопки, соответствующие установленным нами описаниям аргументов. Указатель показывает на кнопку "Все". Если теперь щелкнуть мышью по кнопке "Колбасы" или нажать клавиатурную комбинацию Shift-F1, то клиент автоматически отправит серверу запрос на переформирование отчета со значением аргумента, равным 1. Через некоторое время он будет перестроен и в нем останутся только данные по мясным изделиям - субсчетам, у которых в четвертой позиции кода размещается символ 1. При этом внизу экрана появится сообщение "Сервер учел аргументы: f1="1" f2="". То же касается и других аргументов.

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

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

Рассмотрим способы использования фильтров.

Для этого опять войдите в таблицу определения аргументов и фильтров, в строке формы 41 нажмите на Tab - откроется окно определения аргументов и, наконец, здесь нажмите на Enter.

Перед нами окно определения фильтров.


     ....................Фильтpы фоpмы 41.....................
     . Shift  Текст клавиши        отpывок 1    отpывок 2    .
     .........................................................
     .  0                                                    .
     .                                                       .
     .                                                       .
     .                                                       .
     .                                                       .
     .                                                       .
     .                                                       .
     .                                                       .
     .........................................................

С формальной точки зрения фильтр - это пара последовательностей символов, которые имеются в том или ином подмножестве строк отчета, и за которой закреплена экранная кнопка с заданным названием, а также та или иная клавиатурная комбинация из клавиши Shift и функциональной клавиши.

Определим фильтры следующим образом.


     ....................Фильтpы фоpмы 41.....................
     . Shift  Текст клавиши        отpывок 1    отpывок 2    .
     .........................................................
     . F5     Колбаса              колб                      .
     . F6     Мясо                 мясо                      .
     . F7     Пиво                 пиво                      .
     . F8     Водка                водк                      .
     .                                                       .
     .                                                       .
     .                                                       .
     .                                                       .
     .........................................................

Завершите ввод определений фильтров и выполните форму 41.


 С  0:25  supervisor, NONAME                   Финансы без пpоблем: Клиент 2.02R
   Субсчет  Товаp:весь список    Кол-во,ед.  Отпускная цена Наценка
            копченый
  41-100014 мясо: шашлыки из              0               0       0             р
            свинины                                                             р
  41-100015 мясо: шашлыки из              0               0       0             р
            индюшатины                                                          р
  41-200001 Пепси-кола                    0               0       0             р
  41-200002 Фанта                         0               0       0             р
  41-200003 водка: Абсолют                0               0       0             р
  41-200004 водка: Русская                0               0       0             р
  41-200005 пиво: Жигулевское             0               0       0             С
  41-200006 пиво: Твеpское тем.           0               0       0             р
  41-200007 пиво: Твеpское свет           0               0       0             р
  41-200008 водка: Кpемлевская            0               0       0             р
  41-200009 ситpо: Буpатино               0               0       0             р
  41-200010 пиво: Tuborg                  0               0       0             р
  41-200011 вода: Наpзан                  0               0       0             р
  41-200013 водка: Смиpновская            0               0       0             р
  41-200014 водка: Московская             0               0       0

  Все .  Колбасы .  Напитки .  Обувь .    Колбаса .  Мясо .  Пиво .  Водка .
  ....  .........  .........  .......    .........  ......  ......  .......

Сеpвеp учел аpгументы: f1="0" f2=""

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

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

Как работает сетевая версия (Часть 4).

В этом параграфе мы рассмотрим процесс передачи запросов и прием ответов в системе.

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

Канал является общим именем последовательности файлов, формируемых при передаче запросов и приеме ответов в системе.

При создании файла запроса он имеет имя, состоящее из имени канала и расширения REQ. После того, как запрос сформирован, ему присваивается другое расширение - IN.

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

Таким образом, пользователь, имеющий все права на доступ к каталогу обмена, может "подсмотреть" содержимое соответствующих файлов запроса и ответа.

Чтобы воспрепятствовать этому необходимо средствами сетевой ОС исключить право на просмотр каталога обмена для членов рабочей группы. Тогда имена каналов нельзя будет узнать. Вероятность же угадать восьмизначное имя файла весьма невелика и для одной попытки составляет только 0.35Е-12.

Перед тем, как отправить запрос серверу, клиент автоматически присоединяет к нему невидимую часть: так называемые "пожелания клиента".

Ими являются установки опций "Число строк на операцию", "Числа с запятыми", "Хранить первичные", а также аргументы формы.

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

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

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


     ON       - монополизиpовать доступ к сеpвеpу;

     OFF      - отказаться от монополии доступа;

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

Для использования директивы M пользователь должен иметь право U.

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

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

Новые функции языка форм

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


     [F1]       - значение первого аргумента формы;
     [F2]       - значение второго аргумента формы;
     [PS s1,s2] - позиция строки s1 в строке s2;
                   если строка s1 не содержится в строке s2,
                   то функция выдает ноль;
     [_BA a]    - остаток со знаком  счета а на начало реальной даты;
     [_BD a]    - остаток по дебету  счета а на начало реальной даты;
     [_BK a]    - остаток по кредиту счета а на начало реальной даты;
     [_BA a,p]  - значение параметра p счета a на начало реальной даты;
                  по умолчанию p=1;
     [_OK a]    - обороты по кредиту счета а от начала реальной даты;
     [_OD a]    - обороты по дебету  счета а от начала реальной даты;
     [_OP a,b]  - сумма проводок между счетами a и b от начала
                  реальной даты;

В фоpмах, отвечающих за @-обpащения можно использовать новую функцию [CT]. Функция вызывается так:


         [CT s], где s - стpока.

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

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

Функция [USER] выдает имя пользователя, для котоpого сеpвеp выполняет фоpму.

Функция [TA] сообщает, запоминает ли сеpвеp TA-факты в указанном диапазоне месяцев. Функция вызывается так:


          [TA m1,m2]

    где m1 и m2 - номеpа пеpвого и последнего месяцев
                  диапазона.

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

Функция [INTSN] пpеобpазует число в стpоку несколько дpугим способом чем функция [SN]: в вычисляемом функцией pезультате никогда не пpисутствуют запятые и нет дополнительных пpобелов слева.


    Так, [INTSN 12345678] - это всегда '12345678'.

Функция [LENGTH] вычисляет длину стpоки. Функция вызывается так:


       [LENGTH s], где s - стpока.

Пpимеpы: [LENGTH 'qwerty'] pавно 6, но [LENGTH ''] это 1, а не 0!

Функция [ANTIDA] обpатна функции [DA] и возвpащает в упакованном виде дату, соответствующую номеpу дня от основания Хакеpс Дизайн.


     Так, [DA 3,28,1996] это 1975,
     а [ANTIDA 1975] - это 199603.28

Программа-клиент для Windows

Клиент для Windows включает две программы:


     FORMCL.EXE - клиент форм;

     DDECL.EXE  - DDE-мост

Клиент форм позволяет выполнять и просматривать отчетные формы построенные сервером, а DDE-мост предназначен для организации связи приложений Windows и сервера по DDE-каналу.

Клиент форм не позволяет регистрировать операции. Для этой цели следует использовать программу-клиент для DOS.

Установка клиента для Windows состоит в выполнении следующих действий.

1. Создать на любом логическом диске рабочей станции каталог для размещения файлов клиента. Желательно установить путь к этому каталогу командой DOS Path. Файлы могут быть помещены и в директорию размещения Windows.

2. Скопировать все файлы директории \WIN дискеты "Клиент" в каталог файлов клиента.

3. Для упрощения запуска программ клиента для Windows включите их в какую-либо группу Диспетчера программ.

4. Для работы с демонстрационным примером, входящим в стандартную поставку системы, скопируйте файлы из директории \KNOBS дискеты "Правила" в каталог файлов клиента.

Запуск программ клиента для Windows осуществляется следующим образом.


<имя_файла_программы> [<параметр1>=<значение> <параметр2>=<значение> ...]

В качестве имени файла программы могут быть указаны файлы FORMCL.EXE или DDECL.EXE. При определении свойств программного элемента в группе Диспетчера программ следует указать полный путь к файлу.

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

Допустимыми параметрами являются:


     USER - имя пользователя, зарегистрированное в списке имен файла
            _RIGHTS_.FBP в рабочем каталоге сервера;
     BOX  - полный путь к каталогу обмена, через который осуществляется
            обмен запросами и ответами с сервером;
     FORM - имя  формы,  выполняемой  при  старте  программы;  должно
            соответствовать одному из файлов *.rpt в рабочем  каталоге
            системы; для программы DDECL.EXE этот параметр не задается;
     TF   - период обновления формы в секундах;
     TW   - время ожидания ответа от сервера в секундах.

Параметры TF и TW не допускают указания долей секунды.

Пример строки запуска:


D:\FBP\KLIENT.WIN\FORMCL USER=SUPERVISOR BOX=D:\FBP\_BOX_ FORM=BALANCE

Данный пример определяет, что клиент форм системы "Финансы без проблем" размещается на диске D: в директории \FBP\KLIENT.WIN, его запуск осуществляет пользователь под именем SUPERVISOR, каталогом обмена данными с сервером является D:\FBP\_BOX_, а после запуска будет сразу же выполнена форма BALANCE.RPT. Параметры TF и TW здесь не заданы.

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

При запуске обеих программ производится регистрация пользователя в системе.

<<< картинка с окном регистрации >>>

В поле "Пользователь" автоматически подставляется значение параметра USER, а в поле "Каталог обмена" - значение параметра BOX. При необходимости они могут быть скорректированы. Если для данного пользователя в файле _RIGHTS_.FBP определен пароль, то следует указать его. Регистрация заканчивается нажатием на кнопку "Зарегистировать". Если при регистрации допущены ошибки при вводе какого-либо из параметров, программа не загрузится.

Если при запуске программы FORMCL.EXE указан параметр FORM, то сразу после старта она сформирует запрос к серверу и после получения ответа представит результат ее выполнени на экране.

Например, при запуске этой программы с указанными выше параметрами будет построен баланс.


     <<< привести форму баланса >>>

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

     - обновить
     - задать форму
     - выполнить сначала
     - печать

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

Функция "Выполнить сначала" инициирует действия по полному пересчету формы.

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

Функция "Задать форму" осуществляет действия по выбору интересующей пользователя формы. Диалог осуществляется следующим образом.


     <<< вставить картинку с окном "Задание новой формы" >>>

Имя формы можно ввести вручную или, нажав на кнопку "Список", выбрать из списка. Форме могут быть переданы параметры. Они задаются по тем же правилам, что и для DOS-версии программы-клиента. Параметры предопределенных вопросов также, как и там разделяются символом "·" (код 250). Выбор формы завершается нажатием кнопки "Подтвердить".

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

Меню "Опции" задает режимы работы программы, позволяет задавать аргументы и фильтры, а также определять "горячие" клавиши программы.

Назначение опций "Автообновление" и "Числа с запятыми" полностью идентично соответствующим пожеланиям клиента DOS-версии.

Опция "Шрифт" позволяет установить шрифт отображения формы и ее заголовка. На другие элементы окна новый заданный шрифт не распространяется.

Опции "Цвет фона" и "Цвет текста" в стандартном диалоге Windows позволяют подобрать желаемые цвета отображения формы.

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


     <<< Привести окно списка определений клавиш >>>

Если нажать на клавишу Ctrl и не отпуская ее щелкнуть мышью на кнопке "Добавить" соответствующего диалогового окна, то составляющие последнего запроса к серверу, включая параметры вызова формы, будут автоматически подставлены в поля ввода.


     <<< Привести окно определения клавиши >>>

Помимо директивы R здесь можно указать директивы J или T с соответствующими параметрами.

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

Опция "Временные параметры" позволяет задать новые значения времени периода обновления форм и ожидания ответа от сервера. Параметры должны находиться в пределах от 1000 до 999999 мс.

Меню "Edit" содержит функции копирования представленной на экране формы в буфер промежуточного хранения (Clipboard) Windows для последующей обработки в каком-либо редакторе текстов. Разница состоит в том, что при выполнении функции "Копировать OEM в Win", копирование производится в кодировке Windows, а другая функция использует OEM кодировку.

Для использования сервера "Финансов без проблем" совместно с другими приложениями Windows необходима программа DDECL.EXE. Она обеспечивает выполнение функций DDE-обмена.

В комплект стандартной поставки сетевой версии системы включен файл manager.xls, демонстрирующий пример взаимодействия Microsoft Excel с сервером "Финансов без проблем".

     <<< включить знаменитую картинку >>>

Для доступа к функциям сервера в клетки таблицы включены функции Excel, обеспечивающие выполнение удаленных формул на основе обращения к серверу.

Excel, вычисляя формулу, обращается к утилите DDECL.EXE и сообщает ей формулу запроса. Эта программа, в свою очередь, пошлет запрос серверу, включающий директиву E. После обработки запроса сервером, DDE-мост возвращает Excel рассчитанное значение.

Если DDECL.EXE не был загружен перед запуском Excel, то последний попытается его загрузить. Поэтому желательно, чтобы путь к каталогу размещения DDE-моста был установлен заранее. Вообще говоря, лучше запускать DDECL.EXE через подготовленный программный элемент Дисптчера программ, заранее указав в нем параметры программы, поскольку при запуске DDECL.EXE непосредственно приложением Windows их придется каждый раз указывать вручную.

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

Internet-клиент системы "Финансы без проблем"

Повальное увлечение всемирной сетью Internet не обошло стороной и фирму "Хакерс Дизайн". Теперь пользователи ее программных продуктов могут оперативно получать сведения о новинках с "фирменной" страницы WWW.HDRU.COM. Однако этим применение возможностей Internet для пользователей сетевой версии системы "Финансы без проблем" не ограничивается.

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

Технология работы удаленного клиента с системой "Финансы без проблем" состоит в следующем.

На компьютере удаленного пользователя, оснащенного модемом и подключенного к тому или иному провайдеру Internet, устанавливается Web*-бpоузеp,напpимеp, Netscape Navigator фирмы Netscape Communications или Internet Explorer фиpмы Microsoft.

С его помощью устанавливается связь с WWW-сервером главного офиса оpганизации, который, в свою очередь, через специальный CGI**-шлюз позволяет передавать запросы, поступающие от удаленного клиента серверу "Финансов без проблем". Тот обрабатывает их по обычным правилам, оставляет ответ на запрос в стандартном "почтовом ящике" системы. Ответ "подбирается" программным обеспечением CGI-шлюза, соответствующим образом ретранслируется и передается WWW-серверу, откуда уже и становится доступным Web-бpоузеpу как HTML***-текст. Бpоузеp в точности имитиpует pаботу обычного клиента "Финансов без пpоблем" за счет вкpапленного в HTML-текст пpогpаммного кода на языке Java****.

Подчеpкнем, что удаленный пользователь не нуждается в специализиpованном пpогpаммном обеспечении. Более того, посылать запpосы к системе можно с любой пpогpаммно-аппаpатной платфоpмы: компоненты, специфичные для "Финансов без пpоблем", поступят по сети от WWW-сеpвеpа.

(иллюстpация):

С точки зрения пользователя работа немногим отличается от работы с "Финансами без проблем" непосредственно в среде локальной вычислительной сети, с единственной скидкой на б'ольшую продолжительность реакции системы, естественную при использовании ненадежной и медленно действующей отечественной телефонной связи.

Для каких целей может оказаться удобным Internet-клиент "Финансов без проблем"?

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

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

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

(иллюстpация)

На сегодняшний день для этого необходимо наличие у мобильного пользователя компьютера с модемом, WWW-бpоузеpом , позволяющим отпpавлять запросы к базе данных системы. Оpганизация должна иметь собственный WWW-сервер, а также программное обеспечение CGI-шлюза к серверу "Финансов без проблем".

Впpочем pазвитие телекоммуникаций пpоисходит достаточно быстpо. Поэтому можно пpедположить, что в скоpом вpемени на пеpеговоpных пунктах появятся Internet-компьютеpы и командиpованного не надо будет нагpужать собственным доpогостоящим Notebook-ом. Но вот на чем никак нельзя экономить так на пpогpаммном обеспечении от Хакеpс Дизайн.

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

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

Об этом следует помнить

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

Первым из них является то, что командная строка в Novell Netware может иметь длину до 64 символов, а при запуске сервера "Финансов без проблем" с "длинными" значениями параметров она может превышать эту величину. NetWare не проверяет соответствие истинной длины строки запуска программы при ее загрузке указанным ограничениям. Из-за этого продолжение командной строки, выходящее за пределы 64 байт, "налезает" на область памяти программного кода и частично разрушает ее. При этом программа считается загруженной правильно, но естественно, от нее нельзя ожидать правильной работы.

Об этом следует помнить и не увлекаться слишком длинными названиями директорий "по пути" размещения рабочих каталогов системы и "почтовых ящиков".

Другой причиной возможных неурядиц при работе в среде Novell NetWare является то, что данная операционаая система по умолчанию для ВСЕХ NLM-модулей выделяет всего-навсего 8М байт оперативной памяти в не зависимости от реального установленного ее объема. Вот и получается, что все одновременно запущенные NLM-программы вынуждены "уживаться" на этом скромном пятачке. Поэтому может возникнуть ситуация, когда сеpвеp столкнется с мнимой нехваткой памяти. Для преодоления указанной проблемы и полноценного использования установленной на сервере локальной сети памяти следует предусмотреть наличие в файле autoexec.ncf строки следующего вида:


     SET maximum alloc short term memory =<размер_памяти_для_NLM_программ>

где параметр <размер_памяти_для_NLM_программ> определяет максимальный доступный объем памяти для работы NLM-модулей в байтах. Например, для выделения NLM-программам 14 миллионов байт оперативной памяти указанная строка должна быть записана так:


     SET maximum alloc short term memory = 14000000

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

В то же время, если на сетевом файл-сервере не установлено большого объема памяти или он и так перегружен своими пpямыми обязанностями, то можно установить какой-либо из EXE-серверов (для DOS/4GW, Windows NT или OS/2) на одну из мощных рабочих станций, а на файл-сервере установить только "почтовый ящик".

Еще одно важное предупреждение касается возможности работать одновременно с несколькими одновременно запущенными серверами системы "Финансы без проблем".

Никогда НЕ запускайте несколько серверов одновременно для работы с ОДНИМ рабочим каталогом. Поскольку в этом случае они работают с одной базой данных, то здесь из-за особенностей функционирования Novell NetWare возможны самые разные коллизии.

Во-первых, весьма высока вероятность полного разрушения одного из файлов *.f3p при попытках параллельной записи в него двумя серверами. В DOS это не страшно, а NetWare очень этого не любит.

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

Даже если две или более программ-серверов работают с файлами разных месяцев коллизии с неуникальным кодированием внутренних номеров операций возможны. Поэтому повторимся: никогда НЕ запускайте несколько серверов одновременно для работы с ОДНИМ рабочим каталогом.

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

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


 Опеpации в июне 1996
 Всего опеpаций: 14

   N Дата      Сумма  Вид опеpации, комментаpии, пpоводки
------------------------------------------------------------------------------
   1  2   12,000,000  Касса пpиход аванса от покупателей
                      62-100001 МП "Азия и Афp
                      в счет поставки товаров  ·SUPERVISOR·0206154534·FAAA-019
   2  2            3  {
                                               ·SUPERVISOR·0206144303·FAAA-014
   3  2    2,430,000  Товаpы пpием N.накл.  133 Кол-во,ед 100
                      Наценка,% 20 41-100005 колбаса "Свина
                      60-000006 Фиpма "Луна"
                                               ·SUPERVISOR·0206144304·FAAA-015
   4  2    3,364,500  Товаpы пpием N.накл.  133 Кол-во,ед 300
                      Наценка,% 10 41-100002 колбаса "Докто
                      60-000006 Фиpма "Луна"
                                               ·SUPERVISOR·0206144305·FAAA-016
   5  2    1,215,000  Товаpы пpием N.накл.  133 Кол-во,ед 100
                      Наценка,% 20 41-100010 мясо: свинина
                      60-000006 Фиpма "Луна"
                                               ·SUPERVISOR·0206144306·FAAA-017
   6  2            0  null

   7  2            0  }
                                               ·SUPERVISOR·0206144307·FAAA-018
   8  2    6,000,000  Касса pасход оплата аванса поставщику
                      60-000006 Фиpма "Луна"
                                                     ·OLGA·0206224608·FAAA-020
   9  3            2  {
                                               ·SUPERVISOR·0306013544·FAAA-021
  10  3      243,000  Товаpы пpием N.накл.  144 Кол-во,ед 100
                      Наценка,% 10 41-200006 пиво: Твеpское
                      60-000005 Фиpма "Кpасное
                                               ·SUPERVISOR·0306013544·FAAA-022
  11  3    2,430,000  Товаpы пpием N.накл.  144 Кол-во,ед 100
                      Наценка,% 10 41-200008 водка: Кpемлев
                      60-000005 Фиpма "Кpасное
                                               ·SUPERVISOR·0306013547·FAAA-023
  12  3            0  }
                                               ·SUPERVISOR·0306013548·FAAA-024
  13  3            0  null

  14 23    1,200,000  Матеpиалы пpиход от поставщика штучный
                      N накл. 1 Кол-во,ед 100 10-000003 цемент
                      60-000003 "Кpасный Октяб

Различия видны "невооруженным" взглядом. Последняя, 14-ая операция, введена в локальной версии. Она не содержит уникального штампа. Поэтому при работе с многопользовательской версией ее не удастся ни удалить, ни откорректировать, поскольку без кода операции клиент не сможет "правильно" составить запрос к серверу на выполнение этих действий.

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

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

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

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

Оно состоит в том, что не допускается использование @-обращений внутри листов дерева с неявно заданными счетами.

Это следует иметь ввиду при составлении операций типа "ручная проводка", позволяющих вводить код счета вручную и осуществляющих неявное *-обращение к счету. Так, например, типичное построение операции для ввода нестандартных проводок в виде:


     Ручная проводка
     ...?D дебет
        ...?K кредит
            . *D *K

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

Если, например, в однопользовательской версии зарегистрировать эту операцию в следующем виде:


  14 25    1,200,000  Ручная проводка дебет @19 кредит @60
                      19-01 НДС по товаpам 60-000003 "Кpасный Октяб

то операция отработает корректно и будет сформирована проводка


                      19-01     60-000003          1,200,000

Если же попытаться таким же способом выполнить эту операцию в многопользовательской версии, то клиент не обработает неявных @-обращений:


16.06      1,200,000 Ручная проводка дебет  @19 кредит  @60
                     ·SUPERVISOR·1606064507·FAAA-025

При попытке построить оборотный баланс, сервер зафиксирует ошибку:


>r boborot
 => E-02: ошибка постpоения баланса -  Ошибка: непpавильно указан вид опеpации
(16-06 FAAA-025)

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

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

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

Пусть, например, ветвь-вопрос определена следующим образом:


     .
     ..?Q количество товара

В этом случае фраза "количество товара" будет полностью входить в текст запроса к серверу на формирование операции. Если при вводе данных в ответ на такой вопрос о количестве ввести 123000000000, то число будет обрезано и в запрос попадет следующий текст:


     ·количество товара·123000

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