Имя: Пароль:
1C
1С v8
Преобразование строки в число в запросе
0 CaIIIka
 
25.05.16
11:07
Здравствуйте! Не появилась ли данная возможность в свежих версиях 1С? Работаю на 8.2. Перейти на 8.3 возможности нет пока, острой необходимости тоже. Спрашиваю, чтоб велосипед не изобретать. В инете готовых решений, чтоб прям запросом из строки в число, не видел пока что.
1 Cyberhawk
 
25.05.16
11:07
выбор когда "1" тогда 1
когда "2" тогда 2
...
конец
2 Александр Б
 
25.05.16
11:08
ВЫРАЗИТЬ (Таблица.Строка КАК Число(15,2))
3 ДенисЧ
 
25.05.16
11:08
В явном виде нельзя.
Если только извращаться как в (1)
4 ДенисЧ
 
25.05.16
11:08
(2) Размечтался...
5 Александр Б
 
25.05.16
11:08
Такая возможность была давно, если не всегда.
6 Господин ПЖ
 
25.05.16
11:08
(2) ага ага
7 Господин ПЖ
 
25.05.16
11:09
(5) ловите наркомана
8 Александр Б
 
25.05.16
11:10
(4)(6) :)
(0) не слушай их. Всю жизнь использовал как в (2). Прекрасно работает.
9 rs_trade
 
25.05.16
11:10
(2) сам то пробовал так делать?
10 Александр Б
 
25.05.16
11:10
(9) десятки раз.
11 CaIIIka
 
25.05.16
11:11
(1) )) А если справочник с 70 тыс строками и реквизит из строки в число?
(2) Так низя. Не работает.
12 Александр Б
 
25.05.16
11:11
Пля. Или я туплю, сейчас проверю...
13 rs_trade
 
25.05.16
11:11
(12) ты тупишь. можешь не проверять.
14 CaIIIka
 
25.05.16
11:11
(10) Ругнется она на разные типы данных
15 Fragster
 
гуру
25.05.16
11:12
не, ну если тип реквизита "строка" - число - то (2) работает.
а вообще надо сделать так, чтобы в исходных данных было число
16 DrZombi
 
гуру
25.05.16
11:12
(8) Не работает оно как надо. Может у Скуля робит, но не у 1С :)
17 CaIIIka
 
25.05.16
11:14
Готовых решений не было не у кого? Я вчера задался идеей победить. Несколько раз в ступор восмёрошными ограничениями (по сравнению со скулем) вставал.
18 PR
 
25.05.16
11:14
(0) Нет
19 GROOVY
 
25.05.16
11:14
(12)  Не тупишь, в результате запроса будет то что в выразить, но в самом запросе будет строка. Преобразование, по сути, происходит после выполнения всего запроса.
20 Fragster
 
гуру
25.05.16
11:15
(17) сделай так, чтобы в исходных данных было число
21 CaIIIka
 
25.05.16
11:15
(19) Ругается парсер на енто
22 Timon1405
 
25.05.16
11:16
(0) http://catalog.mista.ru/public/170336/ рвет шаблоны и взрывает мозг, как и все статьи автора
23 Александр Б
 
25.05.16
11:17
(19) и всё-таки я тупанул :)
Пишет "Несовместимые типы"
24 ДенисЧ
 
25.05.16
11:17
выбрать ВЫРАЗИТЬ (&парам как число(10, 0))
где парам задан как строка "15"

Текст запроса: Строка 1: {(1,9)}: Несовместимые типы "ВЫРАЗИТЬ"
выбрать <<?>>ВЫРАЗИТЬ (&парам как число(10, 0))
25 Fragster
 
гуру
25.05.16
11:17
(22) страшно далек он от реальности
26 PR
 
25.05.16
11:18
Господа, вы меня пугаете.

(19) ВЫРАЗИТЬ не работает в конце запроса, в конце работает ПРЕДСТАВЛЕНИЕ.

(14) Думаю, что не ругнется, просто в значении типа строка значения типа число не будет обнаружено, а поэтому вернется какая-нить пустая кака, может неопределено.
27 ДенисЧ
 
25.05.16
11:18
(26) читай (24) до просветления
28 PR
 
25.05.16
11:19
(22) Кому рвет? Мне не рвет.
29 Fragster
 
гуру
25.05.16
11:19
(26) не будет ругани и будет пусто, если реквизит составного типа, один из которых - число, но в момент запроса там находится значение другого типа. в остальных случаях заругается.
30 PR
 
25.05.16
11:20
(27) Ну значит так. Че ты как ребенок :))
В любом случае главное, что никакого преобразования ни в начале запроса ни в конце не будет.
31 PR
 
25.05.16
11:20
(29) Думаю, что так, да.
32 CaIIIka
 
25.05.16
11:26
(20) Можно и так, но победить оч захотелось.
(22) )) Хорошая статья, надо проверить как механизм с пробелами борется. По идее должен. Мимолетом на сколько смог код вкурить: там вроде сравнение на вхождение в 0123456789 проверяется, так что пробелы в сад вроде..

Я про то, когда Код в справочнике строковый, то в конце пробелы до длины строки добавляются. Они и костыли в колеса добавляют. А ни ltrim-rtrim ни right 1c не умеет.
33 Тролль главный
 
25.05.16
11:28
когда уже народ будет требовать в запросах операторы ISERT/UPDATE/DELETE?
34 CaIIIka
 
25.05.16
11:29
(33) видимо за последствия боятся
35 aleks_default
 
25.05.16
11:33
(33) а зачем тогда язык 1с нужен будет?
36 CaIIIka
 
25.05.16
11:44
(22) Все работает. Статья в точку, спасибо огромнищее за ссылку!

А я, не видя (22), вчера вот такой код наваял. Теперь не актуально, но мож на мысли хорошие натолкнет кого...


    Запрос.Текст =
        "ВЫБРАТЬ
        |    ВЫБОР
        |        КОГДА ПОДСТРОКА(Товары.Код, 6, 1) <> "" ""
        |            ТОГДА Товары.Код
        |        КОГДА ПОДСТРОКА(Товары.Код, 5, 1) <> "" ""
        |            ТОГДА "" "" + ПОДСТРОКА(Товары.Код, 1, 5)
        |        КОГДА ПОДСТРОКА(Товары.Код, 4, 1) <> "" ""
        |            ТОГДА ""  "" + ПОДСТРОКА(Товары.Код, 1, 4)
        |        КОГДА ПОДСТРОКА(Товары.Код, 3, 1) <> "" ""
        |            ТОГДА ""   "" + ПОДСТРОКА(Товары.Код, 1, 3)
        |        КОГДА ПОДСТРОКА(Товары.Код, 2, 1) <> "" ""
        |            ТОГДА ""    "" + ПОДСТРОКА(Товары.Код, 1, 2)
        |        КОГДА ПОДСТРОКА(Товары.Код, 1, 1) <> "" ""
        |            ТОГДА ""     "" + ПОДСТРОКА(Товары.Код, 1, 1)
        |        ИНАЧЕ """"
        |    КОНЕЦ КАК Код
        |ПОМЕСТИТЬ Коды
        |ИЗ
        |    Справочник.Товары КАК Товары
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ 0 КАК n, ""0"" КАК nstr
        |ПОМЕСТИТЬ conv
        |ОБЪЕДИНИТЬ ВЫБРАТЬ    1, ""1"" ОБЪЕДИНИТЬ ВЫБРАТЬ 2, ""2"" ОБЪЕДИНИТЬ ВЫБРАТЬ 3, ""3"" ОБЪЕДИНИТЬ ВЫБРАТЬ 4, ""4"" ОБЪЕДИНИТЬ ВЫБРАТЬ 5, ""5""
        |ОБЪЕДИНИТЬ ВЫБРАТЬ 6, ""6"" ОБЪЕДИНИТЬ ВЫБРАТЬ 7, ""7"" ОБЪЕДИНИТЬ ВЫБРАТЬ 8, ""8"" ОБЪЕДИНИТЬ ВЫБРАТЬ 9, ""9""
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ЕСТЬNULL(f.n, 0) * 1 + ЕСТЬNULL(e.n, 0) * 10 + ЕСТЬNULL(d.n, 0) * 100 + ЕСТЬNULL(c.n, 0) * 1000 + ЕСТЬNULL(b.n, 0) * 10000 + ЕСТЬNULL(a.n, 0) * 100000 КАК КодЧисло
        |ИЗ
        |    Коды КАК Коды
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК a
        |        ПО (a.nstr = ПОДСТРОКА(Коды.Код, 1, 1))
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК b
        |        ПО (b.nstr = ПОДСТРОКА(Коды.Код, 2, 1))
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК c
        |        ПО (c.nstr = ПОДСТРОКА(Коды.Код, 3, 1))
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК d
        |        ПО (d.nstr = ПОДСТРОКА(Коды.Код, 4, 1))
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК e
        |        ПО (e.nstr = ПОДСТРОКА(Коды.Код, 5, 1))
        |        ЛЕВОЕ СОЕДИНЕНИЕ conv КАК f
        |        ПО (f.nstr = ПОДСТРОКА(Коды.Код, 6, 1))
        |ГДЕ ЕСТЬNULL(f.n, 0) * 1 + ЕСТЬNULL(e.n, 0) * 10 + ЕСТЬNULL(d.n, 0) * 100 + ЕСТЬNULL(c.n, 0) * 1000 + ЕСТЬNULL(b.n, 0) * 10000 + ЕСТЬNULL(a.n, 0) * 100000 МЕЖДУ 65422 И 69287";


Есть справочник Товары со строковым кодом. Нужно обобрать все коды в числовом интервале (для поиска дырки для нового кода). Длина кода 6 символов.

Если вопросы появятся по данной реализации, что где и зачем, спрашивайте. Потому как одна идея порождает другую :)
37 CaIIIka
 
25.05.16
11:45
+36 обобрать = отобрать ))
38 hhhh
 
25.05.16
12:18
(37) вроде поиск дырок в числовом интервале и в таком же строковом одинаково будет. Зачем тебе понадобилось в число преобразовывать?
39 rs_trade
 
25.05.16
13:22
(33) Никогда. Этого не надо.
40 rs_trade
 
25.05.16
13:24
(36) Загнать в ТЗ с кодами как число и выбрать в запросе.
41 CaIIIka
 
25.05.16
13:26
(38) Потому что такой запрос

выбрать первые 20
код
из справочник.товары
упорядочить по код

выдает

Код
0
1
10
100004
10023
1010
10100
10101
10102
10103
10104
10105
101051
10106
10107
10108
10109
10110
10111
10112
42 hhhh
 
25.05.16
13:33
(41) дык напиши небольшую обработку, добавь к коду спереди нули, чтобы все были шестизначные. Ведь это и для многих других целей будет полезно, не только для поиска дырок.
43 CaIIIka
 
25.05.16
13:35
(40)
1. Создать запрос с выборкой всего справочника и одной колонки
2. Выборкой обойти весь результат и в ранее созданную ТЗ при каждой итерации добавлять строки со значением Число(Выборка.Код)
3. Сортировать ТЗ
4. Выбрать строки ТЗ, проверяя на дырки

2-й пункт плохой тут. Ресурсы СУБД на получение результата запроса и передачу его на сторону 1С, обход результата в 1С с преобразованием значения, заполнение объекта на стороне 1С.... Да и подход к решению задачи так себе получается
44 CaIIIka
 
25.05.16
13:36
(42) Так нельзя у нас
45 CaIIIka
 
25.05.16
13:40
(42) Тогда уж новый реквизит КодЧисло числовой и туда при записи гнать число. И обработкой по всем один раз. Но это новый реквизит в базе, дополнительный объем, его обработка при каждой записи. Справочник под 100 тыщ элементов. А у меня только запрос
46 Ildarovich
 
25.05.16
13:55
Вот еще одна статья http://catalog.mista.ru/public/439218/ . Называется "Поиск пропусков в нумерации документов запросом". Там приложена обработка, которую можно и на справочник(и) переделать. Расчет был на 11-ти значные номера. С 6-ти значными еще проще.
Пропуски в нумерации показываются в виде интервалов ... - ... .
47 Cyberhawk
 
25.05.16
13:59
(46) Ildarovich, напиши как-нибудь статью, как ты пришел к этому (с двух глобальных ракурсов: что сподвигло к написанию таких статей и что сподвигло заниматься вычислением этих штук в запросах)
48 CaIIIka
 
25.05.16
14:14
(46) Спасибо большое, поизучаю, интересно! Уважуха за труды! :)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс