АКЦИЗЫ или что делать, если БСО много

Как оприходовать 100 000 000 БСО (Бланки строгой отчетности), так чтоб база не стала? И при ошибке не пришлось препроводить все документы, связанные с этим БСО.

Принцип уникальной записи

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

    Если вдруг захотите создать 100 000 000 записей в регистре. Я не буду вам мешать. 

Может ПАЧКИ спасут положение

Бухгалтер в накладной пишет следующее К001-К201 006005001-006010000

Что делать если не возможно или излишне емко записывать поштучно.

Может существует способ записать пачками?

Приход №1

    движ. Приход: 006000001-007000000

    движ. Приход: 007000001-008000000

Списание испорченного №1 006005501-006005501

    Упс. Теперь нашу пачку нужно разбить. Ладно давайте сделаем это.

    движ. Расход: 006000001-007000000

    движ. Приход:006000001-006005500

    движ. Приход:006005502-007000000

Расход №1

    движ. Расход: 006000001-006005500

Отмена списания испорченного №1 007005501-007005501

     Упс. теперь у нас в записях:

     +(006000001-007000000)

     -(006000001-006005500)

    Можно конечно заставить бухгалтера думать как же там записи ложатся. Но если там одна извилина? и та уже на пенсии?

Ведь с номером 006005501 она «никак » не могла повлиять на номера 006000001-006005500 🙂

 

 СКОБОЧНЫЙ АЛГОРИТМ

А давайте запишем приход так:

Приход № 1 

(1,2,3,4,5,6,7,8,9,10),11

Расход №1 

4)5(6    результат: (1,2,3,4),5,(6,7,8,9,10),11

 Расход №2

 )1,2,3,4(  результат: ()1,2,3,4(),5,(6,7,8,9,10),11 или 1,2,3,4,5,(6,7,8,9,10),11

 Отменяем Расход №1

4(5)6    результат:  1,2,3,4,(5,()6,7,8,9,10),11  или 1,2,3,4,(5,6,7,8,9,10),11  

 

Как видим любое движение не приводит к сбоям. А что будет если движение не верное

Например:

 

Приход №1

(1,2,3,4,5,6,7,8,9,10),11

 

Приход №2

 

(1,2,3,4,5,6,7,8,9,10),11

результат:

((1,2,3,4,5,6,7,8,9,10)),11 Как видим это легко записать. Т.е. элементов с 1 по 10 , по 2 штуки. А если далее Расход

Расход №1

 

4)5(6    результат: ((1,2,3,4),5,(6,7,8,9,10)),11 отлично мы видим что элементов с 1-4,6-10 , по 2 штуки , а элемент 5 один.

 

 Как записать в регистре?

Давайте попробуем записать скобками один элемент.

Например, 100. Получиться примерно так 99 ( 100 ) 101 . А если элемент 1 то : ( 1 ) 2. Мы видим, что скобки могут располагаться до элемента и после. Если оприходовать в регистр, ресурс 0 не получим остатка и скобка будет потеряна. Значит записать скобки для 1 как 0,1 нельзя. Можно записать 1,2.

 

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

Пусть это будет + или — .Это гарантирует нам , уничтожение двух противоположены скобок.

 

Третий момент. Всегда нужно иметь точное количество бланков.

 

Итак можно записать в регистрах следующую запись (1,2,3,4,5,6,7,8,9,10),11

так:  

Измерение: 1 ресурс:-1

Измерение: 11 ресурс: +11  Вместо 11 может быть вполне 100 000 000 и это будет записано двумя скобками

Сумма ресурса даст 10.

 

Недостаток:

Если нужно узнать есть ли в наличии скажем элемент 5 нужно. С самого начала посчитать колво открытий и закрытий скобок. 

Как с этим работать?

1. Записи в регистре.

Измерение: номер , Ресурс: ресурс

Если приход с 1 по 10 то

Движение расход: Номер: 1 ресурс: -1 

Движение приход: Номер: 11 ресурс: 11

 Если расход 5 то

Движение приход: Номер:5 Ресурс:5

Движение расход : Номер:6 Ресурс:-6

2 Преобразователь скобок в пачки 

Код для 7.7 

Функция Пачки(ТаблОст)
ТаблОст.сортировать("Номер+");
таблПачки =Создатьобъект("ТаблицаЗначений");
таблПачки.новаяКолонка("НачНомер");
таблПачки.новаяКолонка("КонНомер");
таблПачки.новаяКолонка("Колво");

текзн=0;
ТаблОст.Выбратьстроки();
Пока ТаблОст.ПолучитьСтроку()=1 Цикл
Если ТекЗн<>0 тогда
ТаблПачки.КонНомер= Число(ТаблОст.Номер)-1;
ТаблПачки.Колво =ТаблПачки.Колво+число(ТаблОст.Номер)*ТекЗн;
Конецесли;
ТекЗн=ТекЗн-ТЗБСО.Ресурс/Число(ТЗБСО.Номер);
Если ТекЗн<>0 тогда
ТаблПачки.новаястрока();
ТаблПачки.НачНомер= Число(ТаблОст.Номер);
ТаблПачки.Колво = -Число(ТЗБСО.Номер)*ТекЗн;
Конецесли;
КонецЦикла;
возврат ТаблПачки
Конецфункции

 

Будьте аккуратны данная функция сбивает в пачки и минусовые пачки. (То что кол-во отрицательное в минусовой пачке,в функции учтено)

 

Итого:

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

Пример базы. В файле.

 

2 Comments

  1. ildarovich

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

    В публикации, кажется, нужно расшифровать аббревиатуру БСО (непонятно, что это такое).

    Reply
  2. artms

    🙂 БСО — Бланки строгой отчетности. В регистре если есть скобка 1 с ресурсом -1. И к ней будет прибавлена 1 с ресурсом 1. То в данном измерении 1 будет ресурс: 0. И в остатках он будет отсутствовать. Поэтому исходя из строения самой 1с это будет удалено при обрезке базы.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *