gifts2017

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

Опубликовал Михаил Эртель (artms) в раздел Управление - Теория учета

Как оприходовать 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 тогда 
			ТаблПачки.новаястрока(); 
			ТаблПачки.НачНомер= Число(ТаблОст.Номер); 
			ТаблПачки.Колво = -Число(ТЗБСО.Номер)*ТекЗн; 
		Конецесли; 
	КонецЦикла;
	возврат ТаблПачки 
Конецфункции

 

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

 

Итого:

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

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

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
БСО.rar
.rar 210,04Kb
31.10.12
4
.rar 210,04Kb 4 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей (ildarovich) 31.10.12 14:05
Очень красивое и оригинальное решение! "Скобки" нужны только для пояснений. Теоретическим обоснованием тут является "интервальная арифметика". Похожими способом работает операционная система (диспетчер оперативной памяти) в любом компьютере - блоки адресов памяти по требованию процессов занимаются и освобождаются. Вам еще понадобится алгоритм "сборки мусора", который будет запускаться время от времени, убирая ненужные "скобки". Либо список "занятых" и "свободных" блоков, которые будут сразу объединяться. Тема хорошо разработана в рамках исследования алгоритмов диспетчеризации памяти, посмотрите эти алгоритмы!
В публикации, кажется, нужно расшифровать аббревиатуру БСО (непонятно, что это такое).
2. Михаил Эртель (artms) 31.10.12 14:27
:) БСО - Бланки строгой отчетности. В регистре если есть скобка 1 с ресурсом -1. И к ней будет прибавлена 1 с ресурсом 1. То в данном измерении 1 будет ресурс: 0. И в остатках он будет отсутствовать. Поэтому исходя из строения самой 1с это будет удалено при обрезке базы.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа