Имя: Пароль:
1C
 
Выбрать Максимум (Строка) в запросе
0 ArturDoo
 
08.06.21
09:42
Доброго утра. Нужно выбрать максимальное значение из списка номеров запросом, сейчас их 100. Номер выглядит 100/А, 99/А .... Я думаю, что "100/А">"99/А",тк в первой строке больше символов, а 1с думает иначе. Кто из нас тупит?
1 brainguard
 
08.06.21
09:44
(0) Вы словарь когда-нибудь открывали?
2 ДенисЧ
 
08.06.21
09:44
"1" < "9"
Это же первое правило сравнения строк во всех языках. Слева направо посимвольно.
3 brainguard
 
08.06.21
09:48
(0) Если список меньше 10 000, тогда делайте цикл. Если больше, меняйте способ хранения номеров. Например 00098/А, 00099/А, 00100/А
4 ArturDoo
 
08.06.21
09:56
(2) Выходит, что туплю я. И вы хотите сказать, что короткая строка может быть больше длиной?
5 fisher
 
08.06.21
09:58
(4) Да. Строки сравниваются посимвольно. Результаты сравнения следующих символов лишь уточняют порядок, установленный сравнением предыдущих.
6 ДенисЧ
 
08.06.21
09:58
(4) Строки добиваются пробелами до равной длины и дальше - читай выше

http://pics.rsh.ru/img/usl_jskuw3g6.png
7 Kesim
 
08.06.21
10:00
(4) "абвгдеёж" или "я"   вот в чем вопрос
8 fisher
 
08.06.21
10:00
Одинэсники чаще всего с этим сталкиваются в нумерациях документов ибо там работают те же правила. Если бух вбил руками для дока номер "9" - все, кирдык созданию новых документов.
9 ArturDoo
 
08.06.21
10:00
(6) Так 111<22 == 111<22_
10 fisher
 
08.06.21
10:03
(9) Ведущими нулями обычно добивают.
11 fisher
 
08.06.21
10:07
Есть куча готовых обработок перенумерации. Проще всего перенумеровать все к виду 0099/А
12 ArturDoo
 
08.06.21
10:07
(10) И я так думал, но тогда: 0111>0022 и идет посимвольное сравнение:
0 = 0
1 > 0 Лидирующее неравенство с-но 111 должно быть больше
1 < 2
1 < 2
13 ArturDoo
 
08.06.21
10:08
1с добивает строки лидирующими нулями?
14 ДенисЧ
 
08.06.21
10:09
15 ArturDoo
 
08.06.21
10:10
(14) Выходит, что 1с добивает равенство не лидирующими нулями?
16 fisher
 
08.06.21
10:10
(12) Так и есть. 111 > 22, "0111" > "0022". Не понял вопроса.
(13) Сама - нет. С чего бы? Откуда она знает, что ты от строки хочешь? Но в функции Формат есть готовая опция для такого преобразования.
17 fisher
 
08.06.21
10:12
Соврал. Формат не умеет строку добивать лидирующими нулями. Она может число преобразовать в строку с лидирующими нулями.
18 fisher
 
08.06.21
10:14
Я обычно делал что-то типа такого:
Строка10 = Прав("0000000000" + СтрокаЧисло, 10);
19 ArturDoo
 
08.06.21
10:14
В итоге. В запросе строки никак не добить. И самое просто добавить номерам пару-тройку нулей, чтоб не городить циклы?
20 ArturDoo
 
08.06.21
10:15
(18) В запросе такого не напишешь
21 fisher
 
08.06.21
10:16
(19) Именно так. Гораздо проще и правильнее унифицировать нумерацию под правильную "сортируемость".
22 fisher
 
08.06.21
10:17
Только заложи ведущих нулей с учетом будущего роста.
23 Said_We
 
08.06.21
11:41
(20) Запросом такое напишешь, даже на SQL языке от 1С, только это изврат. Перенумеруй сами документы и не занимайся глупостями.
24 lodger
 
08.06.21
11:53
откуда у бухов такой фетиш на перенумерацию объектов? на вот эти всякие странные префиксы, суфиксы, постфиксы?
25 Said_We
 
08.06.21
11:59
(24) Ну документооборот они так ведут. Что бы по номеру документа было видно какого вида это документ.
Зачем? Их так учат.
Зачем их так учат? Их учат, те кто так учился ране. А их тоже так учили т.д.
Когда не было электронного документооборота был поиск по каталогам и т.д как в библиотеке.

Обычный рудимент.
26 fisher
 
08.06.21
12:05
Я еще успел попасть на курсы бухгалтеров, где учили бумажному бухучету.
Хотя не удивлюсь, если и до сих пор учат.
27 Said_We
 
08.06.21
12:07
(24) Второе объяснение - это независимая нумерация разных видов документов одновременно. Пропуски в нумерации не допускаются, но разные виды документов вводят и отвечают за них разные люди. При этом все кадровые документы не должны повторять номер и быть пропуски. Поэтому и ввели префиксы, суфиксы и т.д.
28 brainguard
 
08.06.21
12:20
(24) Скоросшиватель сшивает быстро, а расшивает еще быстрее. Вот отсюда ноги и растут
29 VladZ
 
08.06.21
12:23
(0) Ты конечно. :)

Тут не нужно думать. Нужно знать, как будет сравнивать программа.
30 Said_We
 
08.06.21
12:28
(28) Есть ещё одна причина.
Процедура нумерации подразумевает разделение бумаг с различными сроками хранения:
- Длительный: 50 или 75 лет.
- Краткосрочный: 1 или 5 лет.

Хранить весь этот хлам в архивах и дорогое и муторное занятие... Поэтому краткосрочные хранят отдельно и первой возможности утилизируют.
Но опять же это всё из библиотечного дела и хранения по каталогам.
31 arsik
 
гуру
08.06.21
12:43
32 Said_We
 
08.06.21
12:44
+ к (30) В остальных документах остается нумерация без пропусков, так как изначально и не было в них документо другого вида с другим сроком хранения.

т.е. основная проблема в том что требуют некую единую уникальную нумерацию по всем кадровым документам. А по факту её нет.

(31) НЕТ и в текущей версии напишешь.
33 arsik
 
гуру
08.06.21
12:48
(32) Длина изначальной строки неизвестна.
34 Said_We
 
08.06.21
13:12
(33) Главное что бы был известен формат строки на выходе.
(31) Пусть необходимо привести номер к виду: 99999999999999/ХХ, т.е. 14 цифр номера + разделитель "/" и один символ суффикса. А по факту дополнить нулями номер, так как разделитель и один символ суффикса уже есть. Если разделитель бывает разный, то дополнить разные разделители. Если суффикс бывает длинной более одного символа, то учесть и это.

Например есть следующие номера как в (0):  100/А, 99/А, 00251200/А, 3/А,... , где суффикс это всегда один символ.

Если кратко, то один алгоритм следующий.
1. Так как 14 + 1 + 1 = 16, то подготовить таблицу с цифрами от 1 до 16. Порождающий запрос на 16 - назовем это так.
2. Разбиваем строки с номерами на строки вида ниже. т.е. декартово перемножение на таблицу из 16-ти строк и беря только строку с 1 одну, с 2 одну и т.д.
Изначальный номер | НПП | символ
100/А | 1 | А
100/А | 2 | /
100/А | 3 | 0
100/А | 4 | 0
100/А | 5 | 1
100/А | 6 | 0
100/А | 7 | 0
100/А | 8 | 0
100/А | 9 | 0
100/А |10 | 0
100/А |11 | 0
100/А |12 | 0
100/А |13 | 0
100/А |14 | 0
100/А |15 | 0
100/А |16 | 0
99/А  | 1 | А
99/А  | 2 | /
99/А  | 3 | 9
99/А  | 4 | 9
99/А  | 6 | 0
99/А  | 5 | 0
99/А  | 7 | 0
99/А  | 8 | 0
99/А  | 9 | 0
99/А  |10 | 0
99/А  |11 | 0
99/А  |12 | 0
99/А  |13 | 0
99/А  |14 | 0
99/А  |15 | 0
99/А  |16 | 0
...

3. Собственно собираем обратно. Получаем на выходе для каждого номера его новый номер. Как собрать обратно у меня сразу два алгоритма в голове возникло. Так как всего 16-ть символов, то использовал бы первый:
Выбрать
    т.Номер
   ,МАКС(Выбор когда т.НПП = 1 Тогда т.Символ иначе " " конец) + МАКС(Выбор когда т.НПП = 2 Тогда т.Символ иначе " " конец)+...+МАКС(Выбор когда т.НПП = 16 Тогда т.Символ иначе " " конец) КАК НовыйНомер
ИЗ
...
Сгруппировать по т.Номер

Если много было бы, то использовал бы сложение соседних: 1+2; 3+4; 5+6; .... далее перенумерация и опять сложение соседних. Десять итераций позволяет сложить 2 в десятой = строка длиной 1024 символа.
35 Said_We
 
08.06.21
13:13
А ну сложение в обратном порядке:
,МАКС(Выбор когда т.НПП = 16 Тогда т.Символ иначе " " конец) + МАКС(Выбор когда т.НПП = 15 Тогда т.Символ иначе " " конец)+...+МАКС(Выбор когда т.НПП = 1 Тогда т.Символ иначе " " конец) КАК НовыйНомер
36 Said_We
 
08.06.21
13:42
(0) В общем вывод простой. Не занимайся ерундой и просто перенумеруй заранее документы. Не хочется в живых документах номер менять, создай доп реквизит, сделай его заполнение при записи и заполни у всех документов, у которых его нет. Далее ищи максимальный минимальный и т.д. Если будут префиксы - храни составляющие номера отдельно, т.е хранить отдельно префикс (включая разделитель), отдельно номер и отдельно суффикс (включай разделитель). Что бы не складывать каждый раз можно и весь номер целиком тоже хранить.
В общем - что хочешь....
37 Said_We
 
09.06.21
12:20
(0) Ну что решил?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой