Глава 8. ТИПЫ ДОКУМЕНТОВ 
Главные и подчиненные таблицы 
Документом в нашей программе называются любые данные, отражающие некоторый 
факт, имевший место. Это может быть отдельный платеж 
или отгрузка товара, заключенный договор и т.д
. Как правило, такие факты имеют дату или даже 
несколько дат (у договора может быть дата подписания и 
дата завершения). Например, такая информация, как прайс
-лист тоже может считаться документом, если цены время 
от времени меняются или если для разных покупателей используются разные 
прайс-листы. 
В отличие от содержимого справочников, не все документы переносятся 
в новую базу данных, если мы создаем ее «
по остаткам предыдущего периода». Переносятся лишь те документы, 
которые нужны для работы в новом периоде. 
Для хранения документов используются таблицы базы данных. Каждый тип 
документов хранится в своей отдельной таблице. Эта таблица-
хранилище называется главной таблицей документа. Есть документы, для 
хранения которых главной таблицы достаточно. Например, для хранения 
отдельного платежа нам требуется всего одна строка таблицы и ряд 
колонок: «плательщик», «получатель», «дата 
платежа», «сумма» и т.д. 
Но существуют документы, требующие как минимум одной дополнительной таблицы
-хранилища. Например, документ о продаже должен иметь 
одну строку в главной таблице («продавец», «покупатель
», «дата» и т.д.) и 
множество строк в подчиненной таблице («товар», «количество
», «цена», «сумма»). 
Для некоторых документов может потребоваться более одной подчиненной таблицы, 
например, для хранения договора может потребоваться отдельно хранить «
Спецификацию поставки», а отдельно «График поставок и платежей
». Наша программа позволяет создавать несколько подчиненных таблиц первого уровня 
у одного документа. 
Следует заметить, что под документом мы понимаем нечто большее
, чем простой аналог бумажного документа. Скорее под документом 
подразумевается именно определенный факт. Например, при продаже товара 
может потребоваться распечатать счет-фактуру и накладную. Однако 
это вовсе не означает, что следует заводить  два отдельных 
типа документов в конфигурации. Достаточно завести тип документов «
Продажа товара», а распечатывать два разных документа на основании 
одной и той же информации. Разумеется, атрибуты документа 
типа «Продажа товара» (поля главной и подчиненной 
таблиц) должны быть подобраны таким образом, чтобы там 
умещалась вся необходимая для печати бумажных документов информация. 
Все документы в программе имеют уникальный внутренний номер ID, 
который поставляется генератором DOC_ID_GEN. Поле 
ID является связующим между главной таблицей и подчиненными таблицами документа
. Каждая подчиненная таблица имеет вдобавок уникальное поле N, 
значение для которого поставляется генератором с именем <имя_
подчиненной_таблицы>_N_GEN. При создании 
подчиненной таблицы, этот генератор создается в базе данных автоматически
. Уникальное поле N позволяет организовать ссылки одних документов на 
позиции других документов. Кроме того, главная таблица имеет 
поле DIR_ID,  в котором хранится уникальный внутренний 
номер папки, в которой находится документ в «Проводнике 
документов». Каждый документ находится в какой-то конкретной 
папке. Если вызвать окно «Проводника документов», то 
в нем можно создавать новые папки и перемещать документы между 
папками. Это сделано для удобства навигации по документам и 
для поддержания определенного порядка в делах. В программе имеется 
также окно «Поиска документов», в котором можно искать 
документы по некоторым общим признакам. Подробнее навигация по документам 
описана в соответствующей главе. 
Предположим, мы хотим создать тип документа «Продажа товара
». Для этого нам нужно придумать название для главной таблицы 
(пусть это будет SALE) и для подчиненной (
пусть это будет SALE_ITEM). После создания этих 
двух объектов метаданных, у нас возникнут две таблицы: 
SALE 
 
  
    | ID
INTEGER | 
    DIR_ID
INTEGER | 
   
  
    |   | 
      | 
   
  
    |   | 
      | 
   
 
 
SALE_ITEM 
 
 
Теперь мы можем добавить атрибуты «Продавец», «Покупатель
», «Дата», «№ накладной», «№счета-
фактуры» в главную таблицу: 
SALE 
 
  
    | ID
INTEGER | 
    DIR_ID
INTEGER | 
    VENDOR
INTEGER | 
    CUSTOMER
INTEGER | 
    SALE_DATE
DATE | 
    NAKL_NO
INTEGER | 
    FACTURE_NO
INTEGER | 
   
  
    | 1120 | 
    10 | 
    1012 | 
    2033 | 
    01.05.2003 | 
    144 | 
    144 | 
   
  
    |   | 
      | 
      | 
      | 
      | 
      | 
      | 
   
 
 
А в подчиненную таблицу добавить «Товар», «Количество
», «Цена», «Сумма»: 
SALE_ITEM 
 
  
    | ID
INTEGER | 
    N
INTEGER | 
    GOODS
INTEGER | 
    QUANTITY
INTEGER | 
    PRICE
DECIMAL(10,2) | 
    ITEM_AMOUNT
DECIMAL(18,2) | 
   
  
    | 1120 | 
    1 | 
    3021 | 
    1 | 
    120,00 | 
    120,00 | 
   
  
    | 1120 | 
    2 | 
    3052 | 
    12 | 
    100,00 | 
    1200,00 | 
   
  
    | 1120 | 
    3 | 
    1830 | 
    10 | 
    320,50 | 
    3205,00 | 
   
  
    |   | 
      | 
      | 
      | 
      | 
      | 
   
 
 
Разумеется, нам нужно самим придумать названия для всех атрибутов 
и полей таблиц. Мы рекомендуем использовать для названий полей 
английские атрибутов. Поля VENDOR и CUSTOMER имеют тип ссылки 
на справочник «Контрагенты», а поле GOODS подчиненной таблицы 
имеет тип ссылки на справочник «Товары». В приведенном 
примере показаны таблицы, в которых уже хранится один документ 
с ID = 1120. В главной таблице хранится одна 
запись с общими данными по документу, а в подчиненной 
таблице три записи о проданных товарах. 
 
 
               |