Принцип уникальной записи
В алгоритмах записи в любой базе данных существует стандартный принцип таблиц. В которую записываются единицы номенклатуры. Однако в данной ситуации каждая номенклатура уникальна и только по ошибке может быть записана дважды.
Если вдруг захотите создать 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 тогда
ТаблПачки.новаястрока();
ТаблПачки.НачНомер= Число(ТаблОст.Номер);
ТаблПачки.Колво = -Число(ТЗБСО.Номер)*ТекЗн;
Конецесли;
КонецЦикла;
возврат ТаблПачки
Конецфункции
Будьте аккуратны данная функция сбивает в пачки и минусовые пачки. (То что кол-во отрицательное в минусовой пачке,в функции учтено)
Итого:
Данный алгоритм интересен сам по себе. Конечно, если элементы идут через один, такая форма записи не эффективна. Но если элементы имеют свойство сбиваться в последовательности. Данный алгоритм сильно облегчит жизнь.
Пример базы. В файле.
Очень красивое и оригинальное решение! «Скобки» нужны только для пояснений. Теоретическим обоснованием тут является «интервальная арифметика». Похожими способом работает операционная система (диспетчер оперативной памяти) в любом компьютере — блоки адресов памяти по требованию процессов занимаются и освобождаются. Вам еще понадобится алгоритм «сборки мусора», который будет запускаться время от времени, убирая ненужные «скобки». Либо список «занятых» и «свободных» блоков, которые будут сразу объединяться. Тема хорошо разработана в рамках исследования алгоритмов диспетчеризации памяти, посмотрите эти алгоритмы!
В публикации, кажется, нужно расшифровать аббревиатуру БСО (непонятно, что это такое).
🙂 БСО — Бланки строгой отчетности. В регистре если есть скобка 1 с ресурсом -1. И к ней будет прибавлена 1 с ресурсом 1. То в данном измерении 1 будет ресурс: 0. И в остатках он будет отсутствовать. Поэтому исходя из строения самой 1с это будет удалено при обрезке базы.