Имя: Пароль:
1C
1С v8
Алгоритм определения свободного номера документа
0 Gorr
 
28.04.14
12:55
Возможно тема уже не раз обсуждалась, однако поиск готового решения  не дал. Что не устраивает в стандартном механизме автонумерации, это то что он допускает образование неиспользованных пространств номеров.
Корректировку неправильных номеров с последующим ОбновитьНумерациюОбъектов не предлагать - геморой. Запрет редактирования номера в документе тоже не вариант.
Итак, есть мысль использовать для поиска нового свободного номера запрос. Для поиска номера выделить отдельный справочник который предварительно заполнить элементами с номерами кода от "000000" до "999999". В запросе сделать выборку первого кода из справочника отсутствующего в выборке номеров документов с начала года.
Возможно, для оптимизации, есть смысл при начале работы системы загрузить справочник во временную таблицу, сделать индексацию и использовать менеджер временных таблиц для хранения в памяти на протяжении всего сеанса работы пользователя.
1 Maxus43
 
28.04.14
12:58
т.к. номера строковые - не сделать номральный контроль нумерации (сортировка строки это далеко не сортировка Чисел), нормально платформа в этом плане работает
2 bolobol
 
28.04.14
12:59
А в самой конфе настройку пропускать номера отменили что ли?
3 bolobol
 
28.04.14
13:00
"Освобождать автоматически" - не оно?
4 х86
 
28.04.14
13:02
(0)в документ пихай ссылу на твой справочник, вот и будет тебе номер
5 МихаилМ
 
28.04.14
13:13
"Для поиска номера выделить .. справочник который предварительно заполнить элементами с номерами кода "000000" до "999999" "
-
достаточно заполнить номерами ВТ.

ищите приводились примеры запросов поиска пропущенных номеров.
6 Gorr
 
28.04.14
13:36
(3) пробовал - не работает ни так ни сяк. судя по описанию в статье ИТС это для того чтобы авто присвоение номера выполнялось или при открытии формы как в 8.1 или при записи (8.2)
7 Gorr
 
28.04.14
13:38
(5) я и предлагаю создать справочник для заполнения ВТ. Алгоритм генерации последовательности выдает числовую, а не строковую последовательность поэтому врядли подойдет.
8 Злопчинский
 
28.04.14
13:38
сделай документ-болванку. единственное назначение - ведение нумератора. При необходимости присвоить твоему документу новый номер делай типа
.
ДокРегистратор.Новый();
ДокРегистратор.Записать(); //номер использован
ДокМой.НомерДок = ДокРегистратор.НомерДок;
9 bolobol
 
28.04.14
13:42
(6) А-А-А... Надежды рухнули...

(8) А уже проверку пропущенных номеров прицепляй к документу ДокРегистратор. Использованность его номеров - сделай документ-болванку. единственное назначение - ведение нумератора. При необходимости присвоить твоему документу номер делай типа
.
ДокРегистратор.Новый();
ДокРегистратор.Записать(); //номер использован

ДокМой.НомерДок = ДокРегистратор.НомерДок;
10 Kyon8
 
28.04.14
13:44
(7) Для заполнения ВТ можно в запрос передать параметр таблицу значений, справочник не нужен.
11 bolobol
 
28.04.14
13:44
и пока работает рекурсия, никто не пропустит ни одного номера!
12 bolobol
 
28.04.14
13:46
(10) Вот с такими тормозами в 1С потом и приходится разбираться. То регистр целиком с сервера на клиент затащат для разбора в цикле, то миллион записей с клиента на сервак гоняют в каждом документе при записи...
13 bolobol
 
28.04.14
13:52
(0) Да и в чём, собственно, задача? Если система пропустила номер, не достаточно ли проверить, что в базе нет предшествующего номера?
14 Kyon8
 
28.04.14
13:58
(12) Меня стандартный сервис нумерации устраивает, если что :) А так да, на количество записей не обратил внимания.

И алгоритм ТС не учитывает префиксы.
15 Serg_1960
 
28.04.14
14:12
Сомнения меня одолевают.

Пользователь пометил и удалил документ... номер "освободился" или считать "пропущеным"? :)

А если пользователь завёл номер документа "от балды". Ну, например типа "АБВ-01234/к"... а потом удалил документ - то это как? (см. первый вопрос) :))
16 bolobol
 
28.04.14
14:30
(15) А от балды - тупо не записывать, если в номере хвост не числовой, например. А вот удалённые старые номера - это от задачи ТС зависит.

(14) Префиксы учитывает, т.к. номер (числовая часть) и должна осваиваться с префиксами, зависит уже от кода, правда, нагрузка на соединение возрастает в разы, если в соединении "префикс + подстрока(номер) = документВбазе.номер" использовать.
17 bolobol
 
28.04.14
14:35
А ещё нужен механизм вставки номера, когда документ, например, задним числом вводится. Пользователь записывает неглядя, а документы сами перенумеровываются. Или пользователь вручную вводит номер, а всё что мешает - перенумеровывается... Сказка! Но для того мы рождены, чтоб одну кнопку сделать с микрофоном, как гугл)
18 1CLama
 
28.04.14
15:39
Номера перенумеровались и их сдали в налоговую - сказка :)))
А вообще я делал такой механизм. У меня был последний правильный номер по организации. При пометке удаления номер сбивался и менялась организация этого помеченного документа. Попытками пробовал установить новый номер
19 bolobol
 
28.04.14
15:45
(18) Отчёт никак на нумерацию не влияет, или вы про порядковый номер отчёта? Тут такое не рассматривается ещё.
А вот смена номера удалённому документу - это зло, хотя, много зла и своими силами бухгалтера делают...
20 vmv
 
28.04.14
15:54
как-то обсуждались тут "дырки", решение нашли на Вт, но прожорливо конеш
21 vmv
 
28.04.14
15:56
+(20) "дырки", т.е. пропущенные номера актуальны для договоров.

Вернее там не столько идея в косячности, скролько в пулл-резерве номеров для контрагента или договора.
22 Gorr
 
28.04.14
20:36
(15) проверку на валидность номеров я уже давно ввел так что номера типа " 33333/к5" не пройдут. но так было не всегда.
существующие же " 33333/к5" оставляем
Пользователь пометил и удалил документ... номер "освободился" или считать "пропущеным"? :)
Пользователь удалить документ не может в принципе - если док не нужен заставляю использовать повторно.
(14) над детальной реализацией префикации при поиске еще не задумывался. планирую использовать LIKE для поиска по шаблону.
23 Лефмихалыч
 
28.04.14
20:40
(0) чтобы не было дырок, надо у формы в свойствах автонумерацию отключить и номер нередактируемым сделать.
А алгоритмы все эти - это порожняк. На, вот, придумай оглоритм:
123/Х-12/УЙ000543-1
24 Лефмихалыч
 
28.04.14
20:40
+(23) а в каком-нить документообороте может и часто бывает еще и не такое...
25 Gorr
 
28.04.14
20:49
(23) все должно быть в пределах разумного.
26 Defender aka LINN
 
28.04.14
21:08
(25) Скажи это автору.
Wait, oh, shi...
27 Лефмихалыч
 
28.04.14
21:15
(26) зачет ж-)
28 Эмбеддер
 
28.04.14
21:28
сделать справочник или регистр сведений, куда записывать
начальный номер из диапазона/конечный номер из диапазона/использование
т.е. изначально там
1-9999999-ложь
при создании одного документа
1-1-истина
2-9999999-ложь
потом может быть такое, когда несколько номеров пропустили
1-10-истина
11-15-ложь
16-16-истина
17-9999999-ложь
29 Злопчинский
 
28.04.14
21:47
(9) никаких проверко пропущенных номеров к документу-регистратору применять не надо - масло масленое, блин. Если написать по уму, то случаи когда будут пропуски именно в документе нумераторе - будут ОЧЕНЬ редки. с ними - можно смириться.
.
30 Злопчинский
 
28.04.14
21:50
С какого хрена где-то удалять задним числом документ? нафиг никаких удалений. сторно и околоптиц. ибо нефиг.
31 Torquader
 
28.04.14
21:52
(30) В одной программе делали поиск "дыр" по индексу, то есть начинали с 1 и шли до того момента, когда после числа будет на два и более большее - вот мы и нашли свободный номер.
Пропуски были искоренены радикально, так как удалённый документ просто заменялся новым. Проблема была только в том, что нумерация шла не по порядку.
32 Gorr
 
28.04.14
22:28
Собственно сам запрос:
ВЫБРАТЬ ПЕРВЫЕ 1
    "А-" + СписокНомеров.Номер КАК СвободныйНомер
ИЗ
    СписокНомеров КАК СписокНомеров
        ЛЕВОЕ СОЕДИНЕНИЕ доки КАК доки
        ПО ("А-" + СписокНомеров.Номер = доки.Номер)
ГДЕ
    доки.Номер ЕСТЬ NULL

УПОРЯДОЧИТЬ ПО
    СписокНомеров.Номер
33 Gorr
 
28.04.14
22:29
+(32)С использованием справочника который всегда индексируется по коду должно работать достаточно быстро.
34 Злопчинский
 
28.04.14
23:24
(31) стоял вахтер и проверял пропуска, если пропуска не было - пускал и так
35 mistеr
 
29.04.14
00:09
(0) Ради чего это все? Чтобы прощать ошибки пользователей?
Программист всегда исправляет последнюю ошибку.