Как быть с номером

1. Gala 22.02.17 10:12 Сейчас в теме
Здравствуйте. Имеем номер документа - текстовый, сложный - типа 123/j002/hhh/098. Причем сам номер - это первые цифры до первого слеша. В данном случае - 123. Для того, чтобы выбрать максимальный номер - делаю запрос - и она мне выдает макс - 99. Да, он есть такой -99/j002/hhh/098. Как выбрать правильный максимальный запросом?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Arax 22.02.17 10:19 Сейчас в теме
(1) текст запроса в студию.
4. SP17081992 5 22.02.17 10:23 Сейчас в теме
(1) Поскольку в запросе не можем искать строку, то можно использовать функции "ПОДСТРОКА" и "ПОДОБНО" для однозначных, двухзначных и трехзначных... номеров
24. SP17081992 5 22.02.17 10:44 Сейчас в теме
(1) Сначала взять номеру у которого длина максимальная:
РеализацияУслуг.Номер ПОДОБНО "_____/префикс%"
а потом
РеализацияУслуг.Номер ПОДОБНО "____/префикс%"
,
РеализацияУслуг.Номер ПОДОБНО "___/префикс%"
,
РеализацияУслуг.Номер ПОДОБНО "__/префикс%"
,
РеализацияУслуг.Номер ПОДОБНО "_/префикс%"
.
2. Jen1978 19 22.02.17 10:18 Сейчас в теме
Обычно если уж так вышло что номер документа такой ..... нестандартный, то меняется цифра справа, т.к. слева чаще всего располагается префикс
5. Jen1978 19 22.02.17 10:23 Сейчас в теме
Сначала навертеть номер а потом пытаться его сравнивать :) это по нашему.
Заведите числовое поле и записывайте туда номер документа ту часть которую Вы хотите сравнивать и все.

Или первым запросом получить номера документов и ссылки, перебрать в цикле результат так, чтобы остались только нужные цифры, и вторым запросом уже сделать нужные операции срастив две таблицы
8. alex-l19041 8 22.02.17 10:28 Сейчас в теме
(5)
Заведите числовое поле и записывайте туда номер документа ту часть которую Вы хотите сравнивать и вс
- поддерживаю такой вариант
9. Gala 22.02.17 10:28 Сейчас в теме
(5)Вот я тоже уже к тому склоняюсь - дополнительное числовое поле номера. По другому - никак. Ситуация вообще такая - с начала года я этот номер записывала в документ - с лидирующими нулями 000123/j002/hhh/098. Т.е. номер бал всегда 6 цифр. Но , при печати - требуют убрать лидирующие нули. Я убрала эти лидирующие нули при выводе самих документов. Но есть куча других печатных форм - где выводится этот номер документа - и мне лень их переделывать. Я убрала в документах эти лидирующие нули, но теперь - тогда не правильно определяется максимальный номер для создания нового документа.
12. japopov 68 22.02.17 10:33 Сейчас в теме
(9) Думается, тут Вы зря не воспользовались возможностями БСП. У Вас ведь конфигурация в основе типовая?
Определение номера на печать делается всего ОДНОЙ функцией в общем модуле, и эта функция вызывается ВЕЗДЕ, где необходимо. Поправьте её, и Вам не надо будет заморачиваться - всё будет работать и в стандартных документах!
19. japopov 68 22.02.17 10:39 Сейчас в теме
(9) А а Вашей ситуёвине я бы сделал следующее:
1) Передавал в запрос и суффикс, и длину суффикса.
2) В запросе сравнивал бы окончание номера. Если он равен суффиксу - вырезать его.
3) Получившуюся строку с номером скормить какому-нибудь алгоритму по преобразованию строки в число (тут несколько пробегали. Они все извратные, но хоть что-то...)
4) Выбирал максимальное из получившихся чисел...

Кстати, тут на форуме был алгоритм, который преобразовывал в запросе строку в число, "отсекая" не числовую часть. Тогда этап с "отрезанием" суффикса можно бы и опустить.
23. Gala 22.02.17 10:42 Сейчас в теме
(19) А если длина суффикса - тоже разная? Он тоже составной.
25. Gala 22.02.17 10:45 Сейчас в теме
(19) Дайте мне этот алгоритм. ПОжалуйста.
64. japopov 68 22.02.17 14:55 Сейчас в теме
(25) Понимаю, что поздновато, но работаю, простите, поискать времени не было...
Вот алгоритм, который я имел в виду:
http://infostart.ru/public/170336/

Только, IMHO, Вам он всё равно не нужен, лучше с лидирующими нулями всё сделать.
10. Gala 22.02.17 10:31 Сейчас в теме
(5)
Или первым запросом получить номера документов и ссылки, перебрать в цикле результат так, чтобы остались только нужные цифры, и вторым запросом уже сделать нужные операции срастив две таблицы


Как это сделать?
6. Gala 22.02.17 10:23 Сейчас в теме
Запрос стандартный -

Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	РеализацияУслуг.Номер КАК Номер
	|ИЗ
	|	Документ.РеализацияУслуг КАК РеализацияУслуг
	|ГДЕ
	|	РеализацияУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
	|	И РеализацияУслуг.Номер ПОДОБНО &Номер
	|
	|УПОРЯДОЧИТЬ ПО
	|	Номер УБЫВ";
	Запрос.УстановитьПараметр("ДатаНач", НачалоГода(Период)); 
	Запрос.УстановитьПараметр("ДатаКон", КонецГода(Период));
	Запрос.УстановитьПараметр("Номер", "%/префикс%");
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат СокрЛП(Выборка.Номер);
	Иначе
		Возврат "";
	КонецЕсли;
Показать
11. minarenko 22.02.17 10:31 Сейчас в теме
(6)правильно все, 9>1, вот запрос и возвращает максимальный номер 99
у вас это не число, а строка, таким образом не найдете максимальный
если знаете количество символов номера, то подстрока(), если нет то найти()
и потом все это хозяйство перебирать в цикле
13. Gala 22.02.17 10:33 Сейчас в теме
(11)
(11)
если нет то найти()
- Что найти?
14. minarenko 22.02.17 10:35 Сейчас в теме
(13)Лев(строка, Найти(строка, "/") + 1)
65. ditp 91 22.02.17 15:18 Сейчас в теме
ВЫБРАТЬ
	"99/ваваыв" КАК номер
ПОМЕСТИТЬ номера_исх

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	"199/паыва"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	"22/XXX"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	1 КАК инд
ПОМЕСТИТЬ индексы

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	9

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	10
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	номера_исх.номер,
	МИНИМУМ(ВЫБОР
			КОГДА ПОДСТРОКА(номера_исх.номер, индексы.инд, 1) = "/"
				ТОГДА индексы.инд
			ИНАЧЕ 100
		КОНЕЦ) КАК Поле1
ПОМЕСТИТЬ т
ИЗ
	номера_исх КАК номера_исх,
	индексы КАК индексы

СГРУППИРОВАТЬ ПО
	номера_исх.номер
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	т.номер,
	т.Поле1,
	ПОДСТРОКА("00000" + (ВЫРАЗИТЬ(ПОДСТРОКА(т.номер, 1, т.Поле1 - 1) КАК СТРОКА(6))), т.Поле1, 6) КАК номер1
ИЗ
	т КАК т

УПОРЯДОЧИТЬ ПО
	номер1
Показать


корум; riko-81; japopov; +3 Ответить
66. japopov 68 27.02.17 11:00 Сейчас в теме
(65)
Вот это - молодец!

Конечно, судя по обсуждению, автору всё равно стоило бы переделать всё так, чтобы эта беда и не возникала... Но ответ всё равно хорош!

Только одно: у Вас суффикс номера должен обязательно начинаться с "/", другой разделитель не сработает.
67. ditp 91 27.02.17 11:50 Сейчас в теме
(66) дык
Имеем номер документа - текстовый, сложный - типа 123/j002/hhh/098.

А так то конечно, тут всю систему менять надо.
68. japopov 68 27.02.17 12:05 Сейчас в теме
(67) но ответ и правда, хорош! И на граничных значениях не ломается (например, если нет номера или суффикс цифровой)... Я на заметку взял!
7. Jen1978 19 22.02.17 10:27 Сейчас в теме
думаю в результате получите одну строку
15. Gala 22.02.17 10:36 Сейчас в теме
В запросе - это не работает же
16. minarenko 22.02.17 10:37 Сейчас в теме
(15)конечно, в цикле перебор только
придумают нумерацию, потом с ней мучаются
17. Gala 22.02.17 10:39 Сейчас в теме
18. minarenko 22.02.17 10:39 Сейчас в теме
(17)можно поинтересоваться зачем вам максимальный номер?
22. Gala 22.02.17 10:41 Сейчас в теме
(18)При установке нового номера
27. minarenko 22.02.17 10:46 Сейчас в теме
(22) тогда вижу самый безболезненный вариант, это
1. добавить новый реквизит на документ с нормальным номером
2. обработкой пройтись по всем существующим документам, чтобы из текущего номера заполнить новый
3. и при записи записывать оба реквизита, ориентируясь на новый
29. Gala 22.02.17 10:48 Сейчас в теме
(27) Склоняюсь к этому тоже. Наиболее безболезненно. Тем более - все равно обработкой - убираю лидирующие нули, тут же и запишу номер числовой.
20. Gala 22.02.17 10:40 Сейчас в теме
Не долго ли цикл будет работать - предположим на 4000 записей например?
21. japopov 68 22.02.17 10:41 Сейчас в теме
(20) Лучше всё равно в запросе.
26. herfis 500 22.02.17 10:45 Сейчас в теме
Зря убрали лидирующие нули. Нужно было отчеты дорабатывать.
Строковые номера сортируются по правилам сортировки строк (неожиданно, правда?)
Следовательно, "99" ожидаемо считается больше, чем "123" (сравнение идет посимвольно).
Такая "проблема" со всеми строковыми номерами, родными и неродными, в семерке и восьмерке.
Темам "слетела нумерация" (когда "потеряли" лидирующие нули и очередной номер стал определяться "неправильно") несть числа.
ЗЫ. Предложение также очевидно - вернуть лидирующие нули и доработать отчетность.
config; alex-l19041; +2 Ответить
28. Gala 22.02.17 10:46 Сейчас в теме
(26) Пока на тестовой отрабатываю - думаю, как лучше.
30. minarenko 22.02.17 10:50 Сейчас в теме
(28)тогда не городите огород, доработайте лучше отчеты, не трогайте лидирующие нули
31. Gala 22.02.17 10:51 Сейчас в теме
33. Gala 22.02.17 10:59 Сейчас в теме
(30)Тогда - отчеты с СКД - тоже надо переделывать по другому.
32. herfis 500 22.02.17 10:56 Сейчас в теме
Хозяин - барин. Но вводить доп-реквизит только для того, чтобы не подправлять отчетность - это как-то оверкилл. При этом по-хорошему по нему еще и индекс создавать придется.
34. Gala 22.02.17 10:59 Сейчас в теме
(32)Тоже согласна. Голова - нараскоряку.
35. Gala 22.02.17 11:00 Сейчас в теме
36. herfis 500 22.02.17 11:03 Сейчас в теме
Хотя, если подумать... Суффиксы в номере тоже определяют уникальность документа? Или уникальность документа определяется номером до первого слэша?
38. Gala 22.02.17 11:04 Сейчас в теме
(36)Да - номер до первого слеша
37. Gala 22.02.17 11:04 Сейчас в теме
С другой стороны тогда в отчетах - упорядочивание по номеру документа - тоже неправильное будет. Нет - суффиксы не определяют уникальность документа

39. herfis 500 22.02.17 11:07 Сейчас в теме
(37) Тогда родным номером документа должен быть именно значащий префикс. Тогда у документа спокойно будет работать автонумерация и не надо никаких запросов - это плохой костыль. Любая альтернативная нумерация заведомо хуже встроенной и по блокировкам и по производительности.
А номер с суффиксами уже строить в отдельном реквизите с использованием родного номера.
40. Gala 22.02.17 11:09 Сейчас в теме
(39)Т.е. простыми словами - это дополнительный номер в реквизитах
41. herfis 500 22.02.17 11:12 Сейчас в теме
(40) Да. Только суть в том, что дополнительный номер - именно с суффиксами. А родной - с автонумерацией.
Да и вообще надо избегать длинных строк в индексируемых полях (плохо и по месту на диске и по производительности).
43. Gala 22.02.17 11:14 Сейчас в теме
(41)Да я понимаю - суффикс меняется чуть ли не каждый год. И не удивлюсь, если еще поменяется.
44. Gala 22.02.17 11:16 Сейчас в теме
(43)Т.е. в обработке - надо перебросить существующий номер на новый реквизит, а номер - заполнить только числом.
45. Gala 22.02.17 11:20 Сейчас в теме
(44)Нет , так не пойдет . есть такие номера 176/02/0217р28/00 есть такие 26/В - в данном случае по В - отдельная нумерация а по таким /02/0217р28/00 (изменяемый суффикс) - отдельная. Т.е. может быть 26/02/0217р28/00 и 26/В
46. minarenko 22.02.17 11:21 Сейчас в теме
(45)и т.е. при печати двух документов 26/02/0217р28/00 и 26/В вы в печатной форме получаете два одинаковых номера 26?
48. Gala 22.02.17 11:46 Сейчас в теме
(46)Нет было - 000026/02/0217р28/00 и 000026/В . В документах при печати - 26/02/0217р28/00 и 26/В
47. herfis 500 22.02.17 11:24 Сейчас в теме
(45) Тогда не взлетит. Легаси не позволит :)
Что ж, тогда остается возврат просто к лидирующим нулям и доработке отчетности.
50. japopov 68 22.02.17 11:50 Сейчас в теме
(45)
Определитесь точно, где нужны номера полностью, где - без суффиксов, а где - с суффиксами, но с "отрезанными" лидирующими нулями.

herfis советует сделать суффикс отдельным реквизитом. По-моему, спорное решение (хотя по факту это будет зависеть от Вашей специфики, так что рассмотреть и это решение обязательно надо!).

Я советую не делать отдельный реквизит, а поменять одну функцию. Например, для УТ это
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать()

В оригинале, эта функция "отрезает" префиксы. Но ничего же не мешает нам "научить" её отрезать и суффиксы!

В любом случае, лидирующие нули - вернуть!

А ещё я бы на Вашем месте сделал обработку, которая бы "пробежала" по всем номерам и вернула лидирующие нули.
Тогда и выбор наибольшего номера с заданным префиксом/суффиксом становится тривиальной задачей.
51. Gala 22.02.17 11:52 Сейчас в теме
(50)Номера с суффиксами - нужны везде. При печати - не нужно печатать лидирующие нули. А суффиксы - печатать всегда. Проблема возникла почему - не хочется переделывать все печатные формы - убирать лидирующие нули.
54. japopov 68 22.02.17 11:57 Сейчас в теме
(51)
Тогда так:
1) НЕ ГОРОДИТЕ ОГОРОД!
2) Решение herfis имеет смысл, но не для этого случая.
3) Делаете обработку и возвращаете лидирующие нули.
4) Изменяете ОДИН РАЗ ВСЕГО ОДНУ процедуру ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать() и предусматриваете в ней всё, что требуется.

Всё!
1) стандартный механизм отработает и выполнит свою функцию
2) ВСЕ документы СРАЗУ получат новые номера на печать, БЕЗ переделки!

Ну, можно ещё поизвращаться и сделать для конкретных случаев формирование суффиксов в номера... Но это - дргая задача и тут она никак не помешает!
42. herfis 500 22.02.17 11:14 Сейчас в теме
В этом случае от доп-поля выгода очевидная - автонумерация плюс оптимизация индексов.
49. Gala 22.02.17 11:49 Сейчас в теме
Ну а почему доп. реквизит -НомерЧислом - не пойдет ?
Тогда запрос
Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    РеализацияУслуг.НомерЧислом КАК НомерЧислом
    |ИЗ
    |    Документ.РеализацияУслуг КАК РеализацияУслуг
    |ГДЕ
    |    РеализацияУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |    И РеализацияУслуг.Номер ПОДОБНО &Номер
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номер УБЫВ";
    Запрос.УстановитьПараметр("ДатаНач", НачалоГода(Период)); 
    Запрос.УстановитьПараметр("ДатаКон", КонецГода(Период));
    Запрос.УстановитьПараметр("Номер", "%/префикс%");
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат СокрЛП(Выборка.НомерЧислом);
    Иначе
        Возврат "";
    КонецЕсли;
Показать
52. japopov 68 22.02.17 11:55 Сейчас в теме
(49)
то есть, Вы хотите:
а) испохабить встроенный механизм нумерации
б) добавить новый механизм, чтобы делать номер, который заменит встроенный механизм

А зачем? Не проще ли просто не трогать номера? Сделайте обработку, верните лидирующие нули и забудьте про проблему вообще!
Хочется по-своему обрабатывать номера на печать - так и делайте это в ПРЕДНАЗНАЧЕННОЙ для этого процедуре!
53. Gala 22.02.17 11:56 Сейчас в теме
(52) а механизм нумерации - у нас - свой все равно. И предыдущий запрос - как раз и вычисляет последний номер при создании нового документа
55. japopov 68 22.02.17 12:01 Сейчас в теме
(53) Лидирующие нули - не случайно появились. Это решение простое, красивое и - главное - 1С на него рассчитана!
Так что Вам всё равно лучше делать, используя его. Тем более, что это на корню решит Вашу проблему с поиском максимального номера.
56. riko-81 22.02.17 13:34 Сейчас в теме
Если для запроса, то
ПОДСТРОКА(РеализацияУслуг.Номер, 0, 6) КАК НомерА
УПОРЯДОЧИТЬ ПО
НомерА

57. japopov 68 22.02.17 13:46 Сейчас в теме
(56)
Плюс 100500! Сколько обсуждений, сколько проблем, когда решение было такое простое... Почему это решение не отработает у автора вопроса, объяснять, надеюсь, не надо?
58. riko-81 22.02.17 13:54 Сейчас в теме
(57) Видимо только из-за длины самого номера...
59. japopov 68 22.02.17 14:00 Сейчас в теме
(58) Ваше решение - тривиально. И правильно, но только в случае, если длина номера фиксирована. То есть, если автор вопроса сможет обеспечить наличие во всех номерах лидирующих нулей и одинаковую длину числовой части номера при разной длине суффиксов. А ещё решить вопрос с получением номера на печать уже БЕЗ лидирующих нулей.
Собственно, именно этому и было посвящено обсуждение выше. Вы немного опоздали. :-)
60. minarenko 22.02.17 14:03 Сейчас в теме
(59)если будут лидирующие нули, то и никакой подстроки не понадобится. запрос автора будет работать, что еще выдумывать то
61. riko-81 22.02.17 14:06 Сейчас в теме
(59) Согласен, что опоздал, просто предполагаю, что запросом все-таки можно решить данную задачу...
Проверить поочередно первые 6 символов на числовое значение ), или до первого вхождения "/"

Хотя на самом деле это не выход
62. serq82 8 22.02.17 14:14 Сейчас в теме
разложи в массив да ищи что нужно
63. japopov 68 22.02.17 14:24 Сейчас в теме
(62) ...в запросе. да. Или для документов штук этак в 10 000 - поочерёдным перебором в цикле.

Читаем постановку задачи, не?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот