Имя: Пароль:
1C
1C 7.7
v7: Найти максимальный номер
,
0 wwrr3
 
05.12.17
12:03
Добрый день.
Семерка, документ, номер числовой. Нужно получить самый максимальный номер. Как это сделать, с учетом того, что последний номер по дате не обязательно максимальный?
В восьмерке то нет проблем, но вот в семерке..
1 2S
 
05.12.17
12:03
Как? Легко
2 Масянька
 
05.12.17
12:04
(0) Сортировка по номеру.
И при чем тут семерка?
3 Остап Сулейманович
 
05.12.17
12:04
(0) Ровно так же как в восьмерке.
4 aka AMIGO
 
05.12.17
12:04
Можно ввести новый документ, это и будет максимальный+1
5 Злопчинский
 
05.12.17
12:28
(4) Опередил! ;-)
6 Ёпрст
 
05.12.17
12:34
и, если несколько товарищей будут одновременно это делать, то способ в (4) не рабочий.
7 Ёпрст
 
05.12.17
12:35
ну да ладно, занимайтесь
8 пипец
 
05.12.17
12:36
хмм , зачем вводить ? Оо просто программно сделать на установитьновый номер и записать предидущий
ЗЫ вопрос если есть УРБД и есть дубли при этом )))
9 YFedor
 
05.12.17
12:41
Отобрать запросом. Но это будет максимальный номер из уже записанных, если кто-то открыл форму ввода нового документа, то там уже больший номер, но о нем мы не узнаем ...
10 Злопчинский
 
05.12.17
12:41
(6) а мы - обернем в транзакцию и попытаемся! если не свалиться на транзакции - значит "одновременно" делающих нет (грязное чтение?)
.
другое дело что на нескольких рабочих местах 5 человек могут создать новый документ и в итоге не записать его - а пока доки открыты - номер уже инкрементирован", в итоге может получиться максимальный номер, который отсутствует в базе.
.
но это тоже решаемо (?) созданием документа-регистратора для присвоения номеров ПРИ ЗАПИСИ документа, а не при открытии формы нового (?)
11 nordbox
 
05.12.17
12:42
(8)>>вопрос если есть УРБД и есть дубли при этом
там префиксы есть
12 бомболюк
 
05.12.17
12:43
МаксимальныйНомер = Число(Лев("9999999999999999999999999", Метаданные.Документы("ВидДокумента").ДлинаНомера));
13 Gimalaj
 
05.12.17
13:44
(6) Значит, последний номер документа получат все эти несколько товарищей.
14 Ёпрст
 
05.12.17
13:58
(13) нет
15 Масянька
 
05.12.17
14:05
(13) И "все эти товарищи" ломанутся записывать созданный док-т... С одинаковым максимальным номером... А оно возьмет сольет все в один док-т... Зато - с максимальным номером...
16 Ёпрст
 
05.12.17
14:07
(13,15) сразу видно, что вы не в курсе как в 7.7 присваивается новый номер
17 NSSerg
 
05.12.17
14:45
(6) Элементарно делается чтоб не какое-то действие не происходило одновременно.

СлужЭлСпрДляПолученияНомера.Блокировка(0); // На всякий случай
Пока СлужЭлСпрДляПолученияНомера.Блокировка(1)=0 Тогда
глПауза(100);
КонецЦикла;
...
Тут действия которые пользователи не должны выполнять одновременно
...
СлужЭлСпрДляПолученияНомера.Блокировка(0);
18 NSSerg
 
05.12.17
14:51
Хотя если кто-то параллельно создал документ с присвоением номера, а потом не захочет его сохранить - то естественно метод сработает неверно.
19 aka AMIGO
 
05.12.17
15:03
Док = создатьОбъект("Документ.ОченьНужныйДокумент");
Док.ОбратныйПорядок(1);
Док.ВыбратьДокументы();
Пока Док.ПолучитьДокумент()=1 Цикл
ОгромныйНомер = Док.НомерДок;
Прервать;
КонецЦикла;
20 aka AMIGO
 
05.12.17
15:04
Сообщить(ОгромныйНомер);
21 Злопчинский
 
05.12.17
15:08
(19) не факт что последний по оси времени будет с максимальным номеррм
22 YFedor
 
05.12.17
15:09
(21) скорее всего даже не будет
23 aka AMIGO
 
05.12.17
15:09
(21) угу.. прокол мой.
24 пипец
 
05.12.17
15:50
(11) даже если есть префиксы - могут быть дубли ))))
25 пипец
 
05.12.17
16:02
Док=СоздатьОбъект("Документ.РасходнаяНакладная");
    
    Док.Новый();
    
    Док.ДатаДок=РабочаяДата();
    
    Док.Установитьновыйномер("");
    

    Сообщить(""+(Док.НомерДок));

и предидущий - сколько бы сеансов не было - будет последний )))
26 Ёпрст
 
05.12.17
16:06
(25) будет не последний
27 Ёпрст
 
05.12.17
16:06
курите 1SDNLOCK
28 YFedor
 
05.12.17
16:07
(25) не совсем так.

Вот сидят еще пять человек с открытым окном ввода нового документа, а ты такой, шестой, взял и выполнил код из (25).

Но вот те пятеро взяли и закрыли документы без сохранения.
У тебя будет конечно номер не меньше, чем номер последнего, а больше, но не равен последнему.

Кроме того, если тебе дали в этом коде номер 25, то при следующем создании документа (ты же не записал его) присвоится номер 26, поэтому код не очень хорош
29 пипец
 
05.12.17
16:12
(26) при указанных (0) параметрах не понятно есть ли нумератор ...
(25) вполне совсем так, на исполнение метода - предыдущий документ ПОСЛЕДНИЙ, если кто не понял - документ я не записываю
30 пипец
 
05.12.17
16:13
(28) вполне совсем так, на исполнение метода - предыдущий документ ПОСЛЕДНИЙ, если кто не понял - документ я не записываю
31 YFedor
 
05.12.17
16:14
(29), (30) это ты не понял - номер не последний, т.к. номера, которые выданы тем пяти пользователям уже заняты и тебе выдадут номер следующий за теми пяти
32 Ёпрст
 
05.12.17
16:15
(31) так и есть
33 пипец
 
05.12.17
16:20
(31) открыл обработкой одну и ту же обработку из (25) - понажимал - номер один и тот же... у ВСЕХ пользователей ...
34 YFedor
 
05.12.17
16:21
я больше не буду тебя переубеждать
35 пипец
 
05.12.17
16:22
фу блин - в общем у всех пользователей при нажатии на внешний отчет с текстом из (25) показывает последний НЕ присвоенный номер, если не записывается документ, он всегда один и тот же
36 пипец
 
05.12.17
16:22
(34) а что меня переубеждать ... пробовал из принципа
37 Ёпрст
 
05.12.17
16:55
(36) ну давай так:
открой новый документ у 5 пользователей и свою поделку.
Посмотри результат, подумай.
38 NSSerg
 
05.12.17
17:09
(25)(36)(37) Даже если не создавать новый документ интерактивно - не будет последний.
Доказывается легко - делается обработка с получением номера в цикле, и запускается одновременно у двух или трех пользователей.
39 MetaDon
 
05.12.17
17:48
ПриЗаписи()
глНомерДок=Макс(глНомерДок,НомерДок);
40 FN
 
05.12.17
20:25
Единственный верный метод :
Док.новый()
Док.записать()
Возврат док. Номердок
41 Изучаю1С8
 
05.12.17
20:56
Задачка баян
42 Ёпрст
 
06.12.17
10:07
Ладно, самый правильный ответ
SQLLock + НовыйНомер()
http://www.1cpp.ru/docum/html/ODBC.html#getnewnumber

ну или всё тоже самое прямым запросом.