Здравствуйте. Имеем номер документа - текстовый, сложный - типа 123/j002/hhh/098. Причем сам номер - это первые цифры до первого слеша. В данном случае - 123. Для того, чтобы выбрать максимальный номер - делаю запрос - и она мне выдает макс - 99. Да, он есть такой -99/j002/hhh/098. Как выбрать правильный максимальный запросом?
(1) Поскольку в запросе не можем искать строку, то можно использовать функции "ПОДСТРОКА" и "ПОДОБНО" для однозначных, двухзначных и трехзначных... номеров
Сначала навертеть номер а потом пытаться его сравнивать :) это по нашему.
Заведите числовое поле и записывайте туда номер документа ту часть которую Вы хотите сравнивать и все.
Или первым запросом получить номера документов и ссылки, перебрать в цикле результат так, чтобы остались только нужные цифры, и вторым запросом уже сделать нужные операции срастив две таблицы
(5)Вот я тоже уже к тому склоняюсь - дополнительное числовое поле номера. По другому - никак. Ситуация вообще такая - с начала года я этот номер записывала в документ - с лидирующими нулями 000123/j002/hhh/098. Т.е. номер бал всегда 6 цифр. Но , при печати - требуют убрать лидирующие нули. Я убрала эти лидирующие нули при выводе самих документов. Но есть куча других печатных форм - где выводится этот номер документа - и мне лень их переделывать. Я убрала в документах эти лидирующие нули, но теперь - тогда не правильно определяется максимальный номер для создания нового документа.
(9) Думается, тут Вы зря не воспользовались возможностями БСП. У Вас ведь конфигурация в основе типовая?
Определение номера на печать делается всего ОДНОЙ функцией в общем модуле, и эта функция вызывается ВЕЗДЕ, где необходимо. Поправьте её, и Вам не надо будет заморачиваться - всё будет работать и в стандартных документах!
(9) А а Вашей ситуёвине я бы сделал следующее:
1) Передавал в запрос и суффикс, и длину суффикса.
2) В запросе сравнивал бы окончание номера. Если он равен суффиксу - вырезать его.
3) Получившуюся строку с номером скормить какому-нибудь алгоритму по преобразованию строки в число (тут несколько пробегали. Они все извратные, но хоть что-то...)
4) Выбирал максимальное из получившихся чисел...
Кстати, тут на форуме был алгоритм, который преобразовывал в запросе строку в число, "отсекая" не числовую часть. Тогда этап с "отрезанием" суффикса можно бы и опустить.
(25) Понимаю, что поздновато, но работаю, простите, поискать времени не было...
Вот алгоритм, который я имел в виду:
http://infostart.ru/public/170336/
Только, IMHO, Вам он всё равно не нужен, лучше с лидирующими нулями всё сделать.
Или первым запросом получить номера документов и ссылки, перебрать в цикле результат так, чтобы остались только нужные цифры, и вторым запросом уже сделать нужные операции срастив две таблицы
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияУслуг.Номер КАК Номер
|ИЗ
| Документ.РеализацияУслуг КАК РеализацияУслуг
|ГДЕ
| РеализацияУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И РеализацияУслуг.Номер ПОДОБНО &Номер
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ";
Запрос.УстановитьПараметр("ДатаНач", НачалоГода(Период));
Запрос.УстановитьПараметр("ДатаКон", КонецГода(Период));
Запрос.УстановитьПараметр("Номер", "%/префикс%");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат СокрЛП(Выборка.Номер);
Иначе
Возврат "";
КонецЕсли;
(6)правильно все, 9>1, вот запрос и возвращает максимальный номер 99
у вас это не число, а строка, таким образом не найдете максимальный
если знаете количество символов номера, то подстрока(), если нет то найти()
и потом все это хозяйство перебирать в цикле
(22) тогда вижу самый безболезненный вариант, это
1. добавить новый реквизит на документ с нормальным номером
2. обработкой пройтись по всем существующим документам, чтобы из текущего номера заполнить новый
3. и при записи записывать оба реквизита, ориентируясь на новый
Зря убрали лидирующие нули. Нужно было отчеты дорабатывать.
Строковые номера сортируются по правилам сортировки строк (неожиданно, правда?)
Следовательно, "99" ожидаемо считается больше, чем "123" (сравнение идет посимвольно).
Такая "проблема" со всеми строковыми номерами, родными и неродными, в семерке и восьмерке.
Темам "слетела нумерация" (когда "потеряли" лидирующие нули и очередной номер стал определяться "неправильно") несть числа.
ЗЫ. Предложение также очевидно - вернуть лидирующие нули и доработать отчетность.
Хозяин - барин. Но вводить доп-реквизит только для того, чтобы не подправлять отчетность - это как-то оверкилл. При этом по-хорошему по нему еще и индекс создавать придется.
(37) Тогда родным номером документа должен быть именно значащий префикс. Тогда у документа спокойно будет работать автонумерация и не надо никаких запросов - это плохой костыль. Любая альтернативная нумерация заведомо хуже встроенной и по блокировкам и по производительности.
А номер с суффиксами уже строить в отдельном реквизите с использованием родного номера.
(40) Да. Только суть в том, что дополнительный номер - именно с суффиксами. А родной - с автонумерацией.
Да и вообще надо избегать длинных строк в индексируемых полях (плохо и по месту на диске и по производительности).
(44)Нет , так не пойдет . есть такие номера 176/02/0217р28/00 есть такие 26/В - в данном случае по В - отдельная нумерация а по таким /02/0217р28/00 (изменяемый суффикс) - отдельная. Т.е. может быть 26/02/0217р28/00 и 26/В
(45)
Определитесь точно, где нужны номера полностью, где - без суффиксов, а где - с суффиксами, но с "отрезанными" лидирующими нулями.
herfis советует сделать суффикс отдельным реквизитом. По-моему, спорное решение (хотя по факту это будет зависеть от Вашей специфики, так что рассмотреть и это решение обязательно надо!).
Я советую не делать отдельный реквизит, а поменять одну функцию. Например, для УТ это
В оригинале, эта функция "отрезает" префиксы. Но ничего же не мешает нам "научить" её отрезать и суффиксы!
В любом случае, лидирующие нули - вернуть!
А ещё я бы на Вашем месте сделал обработку, которая бы "пробежала" по всем номерам и вернула лидирующие нули.
Тогда и выбор наибольшего номера с заданным префиксом/суффиксом становится тривиальной задачей.
(50)Номера с суффиксами - нужны везде. При печати - не нужно печатать лидирующие нули. А суффиксы - печатать всегда. Проблема возникла почему - не хочется переделывать все печатные формы - убирать лидирующие нули.
(51)
Тогда так:
1) НЕ ГОРОДИТЕ ОГОРОД!
2) Решение herfis имеет смысл, но не для этого случая.
3) Делаете обработку и возвращаете лидирующие нули.
4) Изменяете ОДИН РАЗ ВСЕГО ОДНУ процедуру ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать() и предусматриваете в ней всё, что требуется.
Всё!
1) стандартный механизм отработает и выполнит свою функцию
2) ВСЕ документы СРАЗУ получат новые номера на печать, БЕЗ переделки!
Ну, можно ещё поизвращаться и сделать для конкретных случаев формирование суффиксов в номера... Но это - дргая задача и тут она никак не помешает!
Ну а почему доп. реквизит -НомерЧислом - не пойдет ?
Тогда запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| РеализацияУслуг.НомерЧислом КАК НомерЧислом
|ИЗ
| Документ.РеализацияУслуг КАК РеализацияУслуг
|ГДЕ
| РеализацияУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И РеализацияУслуг.Номер ПОДОБНО &Номер
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ";
Запрос.УстановитьПараметр("ДатаНач", НачалоГода(Период));
Запрос.УстановитьПараметр("ДатаКон", КонецГода(Период));
Запрос.УстановитьПараметр("Номер", "%/префикс%");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат СокрЛП(Выборка.НомерЧислом);
Иначе
Возврат "";
КонецЕсли;
(49)
то есть, Вы хотите:
а) испохабить встроенный механизм нумерации
б) добавить новый механизм, чтобы делать номер, который заменит встроенный механизм
А зачем? Не проще ли просто не трогать номера? Сделайте обработку, верните лидирующие нули и забудьте про проблему вообще!
Хочется по-своему обрабатывать номера на печать - так и делайте это в ПРЕДНАЗНАЧЕННОЙ для этого процедуре!
(53) Лидирующие нули - не случайно появились. Это решение простое, красивое и - главное - 1С на него рассчитана!
Так что Вам всё равно лучше делать, используя его. Тем более, что это на корню решит Вашу проблему с поиском максимального номера.
(56)
Плюс 100500! Сколько обсуждений, сколько проблем, когда решение было такое простое... Почему это решение не отработает у автора вопроса, объяснять, надеюсь, не надо?
(58) Ваше решение - тривиально. И правильно, но только в случае, если длина номера фиксирована. То есть, если автор вопроса сможет обеспечить наличие во всех номерах лидирующих нулей и одинаковую длину числовой части номера при разной длине суффиксов. А ещё решить вопрос с получением номера на печать уже БЕЗ лидирующих нулей.
Собственно, именно этому и было посвящено обсуждение выше. Вы немного опоздали. :-)
(59) Согласен, что опоздал, просто предполагаю, что запросом все-таки можно решить данную задачу...
Проверить поочередно первые 6 символов на числовое значение ), или до первого вхождения "/"