На форме есть две СТРОКИ больше равно и меньше равно.
В запросе Наименование типа СТРОКА но выглядит как число например 0000001
| И ИзменениеПараметров.Пл.Наименование >= &НомерНачало
| И ИзменениеПараметров.Пл.Наименование <= &НомерКонец
Как сделать чтобы Интервал отображался нормально как с числом????
если я ставлю НомерНачало 1 а Номер конец 2 , то результат такой см.файл
"ВЫБРАТЬ
| ИзменениеПараметров.Пл.Наименование КАК Наименование,
| ИзменениеПараметров.Пл.Вид КАК Вид,
| ИзменениеПараметров.Пл.ЧисловойНомер КАК ЧисловойНомер,
| ИзменениеПараметров.Пл.Ссылка КАК ПлСсылка,
| ИзменениеПараметров.ДатаИзменения КАК ДатаИзменения,
| ИзменениеПараметров.Аб КАК Абонент,
| ИзменениеПараметров.Исп.Ссылка КАК ИспСсылка
|ИЗ
| Документ.ИзменениеПараметров.Пл КАК ИзменениеПараметровПл
| ПОЛНОЕ СОЕДИНЕНИЕ Документ.ИзменениеПараметров КАК ИзменениеПараметров
| ПО ИзменениеПараметровПл.Ссылка = ИзменениеПараметров.Ссылка
|ГДЕ
| НЕ ИзменениеПараметров.ПометкаУдаления
| И НЕ ИзменениеПараметров.Пл.ПометкаУдаления
| И ИзменениеПараметров.Действует = ЛОЖЬ
| И ИзменениеПараметров.Пл.Наименование >= &НомерНачало
| И ИзменениеПараметров.Пл.Наименование <= &НомерКонец
|
|УПОРЯДОЧИТЬ ПО
| ДатаИзменения";
Запрос.УстановитьПараметр("НомерНачало", НомерНачало);
Запрос.УстановитьПараметр("НомерКонец", НомерКонец);
"ВЫБРАТЬ
| ИзменениеПараметровПл.Наименование КАК Наименование,
| ИзменениеПараметровПл.Вид КАК Вид,
| ИзменениеПараметровПл.Ссылка КАК ПлСсылка,
| ИзменениеПараметров.ДатаИзменения КАК ДатаИзменения,
| ИзменениеПараметровПл.Аб КАК Абонент,
| ИзменениеПараметров.Исп КАК ИспСсылка
|ИЗ
| Документ.ИзменениеПараметров КАК ИзменениеПараметров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИзменениеПараметров.Пл КАК ИзменениеПараметровПл
| ПО ИзменениеПараметровПл.Ссылка = ИзменениеПараметров.Ссылка
|ГДЕ
| НЕ ИзменениеПараметров.ПометкаУдаления
| И НЕ ИзменениеПараметров.Действует
| И ИзменениеПараметровПл.ЧисловойНомер МЕЖДУ &НомерНачало И &НомерКонец
|
|УПОРЯДОЧИТЬ ПО
| ДатаИзменения";
ТипЧисло = Новый ОписаниеТипов("Число");
Запрос.УстановитьПараметр("НомерНачало", ТипЧисло.ПривестиЗначение(НомерНачало));
Запрос.УстановитьПараметр("НомерКонец", ТипЧисло.ПривестиЗначение(НомерКонец));
(1) запросом задача не решается. В запросе нет преобразование типов из строки в число.
По хорошему, нужно изменить структуру хранения данных. К примеру, добавить новый реквизит типа Число, в котором и сохранять нужные значения при сохранении элемента справочника, и уже по нему строить отчет.
(1) запросом задача не решается. В запросе нет преобразование типов из строки в число.
По хорошему, нужно изменить структуру хранения данных. К примеру, добавить новый реквизит типа Число, в котором и сохранять нужные значения при сохранении элемента справочника, и уже по нему строить отчет.
(25) я правильно понимаю... пользователь ввел 000123123, я преобразую в 123123, делаю запрос, получаю 123123 ,но в отчет то я должен вернуть 000123123 а не 123123
такую постановку задачи догнать мало кто осилит.
Посмотри со стороны. Представь, что ты не знаешь ничего, кроме буквально и только того, что написано в сообщении. Что ты поймешь оттуда? Ничего. Вот поэтому задача и не решается. Начинать надо с внятной и понятной любому постановки задачи. Какие-то строки, какой-то интервал, наименование, запрос, к чему это все, зачем, как связано друг с другом, что нужно получить - не понятно ровным счетом ничего.
(2)Нужно чтобы в отчет выводился диапазон между Номер начало и Номер конец тут больше и написать нечего. Номер в запросе это Наименование типа строка вида 0000001 или 000055555
(3) А в чем проблема? Я, например, сделал простой запрос:
ВЫБРАТЬ
"001" КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"002"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"003"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"004"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВременнаяТаблица.Поле1 КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
ВременнаяТаблица.Поле1 > "001"
И ВременнаяТаблица.Поле1 < "004"
(3) если ты хочешь сортировать строки как числа, то это в принципе можно, надо после запроса прогнать весь результат через преобразование строки в число и потом сортировать. Если хочешь делать отбор по строкам как по числам, то соответственно надо до запроса проделать такое преобразование и потом уже отбор.
но почему не сказать внятно, что нужно, я все равно не понимаю
(24) Тебе уже все ответили - никак. Строки не работают как числа. Используй числа. Особенно обрати внимание на (15)
И даже дважды ответили что можно в (13) и (16). :-)
Извращение, но можно.
(33) Если сравнивать строки, то ещё надо привести к единому формату количества цифр и убрать все не цифры - пробелы и т.д.
Далее по сути Прав("000000000000000000000"+ т.Наиманование, 15)", но всё в запросе.
Либо более простое решение добавить таки числовой реквизит, прописать его автоматическое заполнение при записи и перезаписать у всех уже существующих.
И это всё только из-за того что в 1С нет простых функций преобразования типов и стандартных для всех СУБД, используемых 1С. :-)
С учетом (49) Чья очередь теперь ржать?
Запрос-то рабочий.
Запрос простой и достаточно стандартный для 1С.
Понятно что в SQL никто таким извращением не занимается. Там со строками всё на много луче. В Постгри регулярные выражения даже есть (В MS SQL пока вроде нет).
Почему в 1C запросы такие длинные в тысячи строк и работает всё как-то не быстро?
Потому что язык запросов в 1С очень скудный и простые и быстрые алгоритмы приходится переводить по факту в стандарт до SQL-92, использовать кучу джоинов, заниматься созданием кучи временных таблиц и прочими извращениями.
Заниматься извращениями - это не выбор самих программистов 1С, а это директива сверху :-)
"ВЫБРАТЬ
| ИзменениеПараметровПл.Наименование КАК Наименование,
| ИзменениеПараметровПл.Вид КАК Вид,
| ИзменениеПараметровПл.Ссылка КАК ПлСсылка,
| ИзменениеПараметров.ДатаИзменения КАК ДатаИзменения,
| ИзменениеПараметровПл.Аб КАК Абонент,
| ИзменениеПараметров.Исп КАК ИспСсылка
|ИЗ
| Документ.ИзменениеПараметров КАК ИзменениеПараметров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИзменениеПараметров.Пл КАК ИзменениеПараметровПл
| ПО ИзменениеПараметровПл.Ссылка = ИзменениеПараметров.Ссылка
|ГДЕ
| НЕ ИзменениеПараметров.ПометкаУдаления
| И НЕ ИзменениеПараметров.Действует
| И ИзменениеПараметровПл.ЧисловойНомер МЕЖДУ &НомерНачало И &НомерКонец
|
|УПОРЯДОЧИТЬ ПО
| ДатаИзменения";
ТипЧисло = Новый ОписаниеТипов("Число");
Запрос.УстановитьПараметр("НомерНачало", ТипЧисло.ПривестиЗначение(НомерНачало));
Запрос.УстановитьПараметр("НомерКонец", ТипЧисло.ПривестиЗначение(НомерКонец));
1. Нет. Строки могут быть разной длины в исходной таблице, поэтому гадать с лидирующими нулями - бесперспективно.
Внимательно картинку посмотри. Там тоже разной длины на входе.
Гадать не нужно - есть размерность наименования. И если оно 25 - это не много.
2. Нет. Запрос сам не добавляет лидирующих нулей к передаваемым параметрам.
Смотрим картинку - долго удивляемся результату. Не верим глазам. :-)
Если появляется желание "поржать" - ржем конечно, но потом надо будет определится над чем.
Можно сколько угодно добавлять лидирующих нулей к параметрам запроса, но если длина параметра не соответствует длинам данным - то это профанация.
Параметров необходимо задавать правильные и правильной длины.
В любой запрос если передавать параметры не те, которые нужны, то получишь не то, что ожидаешь.
Какой ПРАВИЛЬНОЙ длины надо передать параметр в запрос, если ты не знаешь длины исходных данных?
Не нужно раздувать из мухи слона. Параметры тоже можно привести к правильной длины и даже дополнить нулями прямо в запросе по образу и подобию. Если все к длине 15 приводим, то и параметры тоже.
А вот тут смешно. Это может быть запрос к внешнему источнику (или в качестве источника используется ТЗ). Какой ПРАВИЛЬНОЙ длины надо передать параметр в запрос, если ты не знаешь длины исходных данных?
Что значит не знаю? Я что не могу посмотреть откуда всё это приходит? С какого перепуга работая с конфигурацией я бы не знал максимальную размерность поля?
Какая максимальная, такая и используется.
И ещё раз повторюсь, я бы добавил реквизит с числом, если он уже не имеется конечно.
Я про:
ИзменениеПараметров.Пл.ЧисловойНомер КАК ЧисловойНомер
(46) Про типовую конфигурацию в вопросе (1) ты сам придумал?
Опять же без функций RIGHT() можно решить эту задачу. Тоже извращение, но можно.
По факту разобрать наименование на символы дополнив до условных 15 нулями и собрать обратно с конца.
Примерно такое же извращение как перевод строки в число, но по другому в 1С будет возможно наверное уже в 1С 9.0, если она когда либо вообще выйдет.
Поэтому использовать всякие плюшки, о которых кто-то начитался
Сейчас же как-то без плюшек обходятся.
Ниже пример запроса который не в число переводит, а дополняет строку впереди нулями ниже с длиной строки 5.
Для большей размерности чуть добавить и чуть подправить. Либо в параметры к запросу эту длину перенести, но в этом случае тоже переписать.
Максимум(т.а) с условием т.симв<>"" - это фактически вычисление длины строки.
Необходимо только в этот запрос добавить проверки, на то, что вообще необходимо добавлять нули. Стока может быть изначально даже с лишними нулями. Что бы не была с лишними можно заранее посчитать максимальную длину строки, которая есть в БД. Если это не разовая операция, то плясать от размерности поля. Печаль если Наименование длина 150. :-) Запрос разрастется.
Пустые наименования в запрос не попадут. Тут уж тоже надо либо хоть что-то заполнить, либо брать не наименование, а например "0"+Наименование.
можете уже перестать спорить по поводу использования реквизита Наименование в отборе.
Достаточно посмотреть скрин в (0). 5 элемент (символично). Там не числовое значение.
(63) А кто говорил что там не строка?
Не помню ни одного поста в котором, кто-то говорил бы про то что в наименовании не строка.
Суть спора в том что, user1881120 постоянно пытается придумать не существующие барьеры для возможности решить задачу переводя строку в число или не переводя, но дополняя нулями.
А кто говорил что там не строка?
Не помню ни одного поста в котором, кто-то говорил бы про то что в наименовании не строка.
серьезно? Даже с конкретным указанием элемента?
Посмотрите скрин еще раз. Там 5 элемент заканчивается * (звездочкой). Так что никакие ухищрения, добить начальные нули, никак не помогут.
Посмотрите скрин еще раз. Там 5 элемент заканчивается * (звездочкой). Так что никакие ухищрения, добить начальные нули, никак не помогут.
Я об этом писал. Если автор согласен игнорировать все символы не относящиеся к [0-9], то это в запросе тоже можно сделать. Это не сложно.
Вопрос же не в том, что это НУЖНО реализовывать в запросе, а в том, что теоретически это можно решить запросом.
Я уже раза три наверное написал, начиная со своего первого поста в (37), что задачу необходимо решать путем структурных изменений. Так она проще и эффективнее решается.
И опять же ждали долго от автора, что это за реквизит такой "ЧисловойНомер" и что содержит. Возможно всё что нужно.
|ИЗ
| Документ.ИзменениеПараметров КАК ИзменениеПараметров
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИзменениеПараметров.Пл КАК ИзменениеПараметровПл
| ПО ИзменениеПараметровПл.Ссылка = ИзменениеПараметров.Ссылка
Не нужно тут никакое соединение. Сразу табличную часть брать.
|ИЗ
| Документ.ИзменениеПараметров.Пл КАК ИзменениеПараметровПл
Я уже раза три наверное написал, начиная со своего первого поста в (37), что задачу необходимо решать путем структурных изменений. Так она проще и эффективнее решается.
И опять же ждали долго от автора, что это за реквизит такой "ЧисловойНомер" и что содержит. Возможно всё что нужно.
Плохо читали ветку. Это было озвучено в 7 и 17 сообщениях.
Не нужно тут никакое соединение. Сразу табличную часть брать.
Что значит не нужно никакого соединения? То что можно написать без соединения, не означает, что такого соединения не будет. Оно будет создано в любом случае.
А так да, можно писать используя через Ссылка доступ к реквизитам документа, только довольно много где. Через соединение проще и нагляднее.
То что можно написать без соединения, не означает, что такого соединения не будет. Оно будет создано в любом случае.
Это понятно что оно будет, так как обращение к шапке и табличной части это разные таблицы.
1С строит такие соединения через ТЧ.Ссылка.Реквизит. Вопрос зачем усложнять наглядность кода в среде 1С лишними соединениями, которые и так будут построены.
Плохо читали ветку. Это было озвучено в 7 и 17 сообщениях.
Нормально я читал ветку.
Мой пост был вызван не столько самой задаче в (1) сколько утверждением того, что запросом 1С нельзя это решить, при этом даже после того как дважды дали ссылку на алгоритм перевода строки в число запросом 1С.
Никто не говорит, что использовать этот алгоритм плохо или хорошо. Вопрос лишь в возможности реализации.
(79) это просто предпочтения написания. Мне нагляднее использовать соединение, так как еще на этапе написания запроса вижу, как будет отрабатывать оптимизатор. В простом запросе это не так важно, но при сложном запросе это может помочь.
Так что говорить, что использовать соединение не нужно, это просто предпочтение написания запроса, а не ошибка.
В общем случае, написание запроса без соединения и используя соединение может привести к разным результатам.
Так что не следует слепо использовать доступ через Ссылка.
(79)
1С строит такие соединения через ТЧ.Ссылка.Реквизит.
- редкое предпочтение, но почему многие делают иначе я написал. Ещё одна причина в том, что в типовых конфигурациях тоже обращаются через ссылку. Скажем так - так повелось.