|
Выбрать Максимум (Строка) в запросе | ☑ | ||
---|---|---|---|---|
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
|
(20) Напишешь. Только с версии 8.3.20 https://wonderland.v8.1c.ru/blog/novye-funktsii-yazyka-zaprosov-i-sistemy-komponovki-dannykh/
|
|||
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) Ну что решил?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |