Яндекс.Метрика
  Афина. Как создавать и применять уникальные номера для первичных и выходящих документов. К содержанию
   

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

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

функция ПриВходе
переменные справочник(ПрихКассовыйОрдер, Номер) спрДок;
начало
  если не Редактирование то
    если ПоследнееЗначение(спрДок) то
      Номер := спрДок.Номер + 1
    иначе
      Номер := 1
    конец
  конец
конец

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

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

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

функция СледНомер : число
переменные
  переменные справочник(ПрихКассовыйОрдер, Номер) спрДок;
  колонка(справочник(ПрихКассовыйОрдер)) кДок;
  дата ДД;
начало
  ДД := НачалоКвартала(1, ДатаДок);
  СписокЗначений(документ:=спрДок, Результат:=кДок,
                 ДатаДок>=ДД, ДатаДок < ИзменитьДату(ДД,,,1));
  если количествоСтрок(кВП) > 0 то
    выход кДок(КоличествоСтрок(кДок)).Номер + 1;
  конец;
  выход 1
конец

Разберемся.
В локальную переменную ДД помещаем начало года (1 января). Функция ИзменитьДату меняет значение ДД вперед на год, т.е. в колонку кДок попадают все документы за обозначенный год.
Допустим, что ДатаДок имеет значение 10.12.2004 г., тогда в колонку кДок попадаются все документы только за 2004 год по условиям в функции СписокЗначений:

ДатаДок >= ДД, ДатаДок < ИзменитьДату(ДД,,,1)
Если такие документы есть (а это проверяется функцией КоличествоСтрок), то берется из списка самый последний документ и от него последний номер, через который мы получаем и номер для нового документа.

Если произошел переход на другой год, за который еще не сформирован ни один документ, то в колонке документов не будет (функция КоличествоСтрок вернет значение 0) и выход из функции произойдет со значением 1.

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

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

функция ПриВходе
начало
  если не Редактирование то
   
Номер := СледНомер
  конец
конец

функция ИзменилосьЗначениеДатаДок
начало
  Номер := СледНомер
конец

Функция ИзменилосьЗначениеДатаДок связана с изменением значения поля (объекта ввода) ДатаДок и выполняется всякий раз когда значение даты пользователем будет изменено.

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

  К содержанию
Hosted by uCoz