(1),(2) ПОДСТРОКА тут не поможет - данная функция просто получает подстроку заданной длины. Чтобы отобрать 9-символьные артикулы можно использовать конструкцию
// Между подчеркиваниями и % пробел
|ГДЕ
| ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.Номенклатура.Артикул ПОДОБНО ""_________ %""
+(3) Хотя в таком случае артикулы с меньшим количеством символов тоже попадут - вместо каждого подчеркивания лучше использовать [^ ] (то есть любой символ кроме пробела)... Подчеркивание катит, когда нужно отобрать строку с числом символов <= заданному. Ну и от длины реквизита еще зависит: если длина всего 9 символов то пробел и % в конце не нужны. Короче говоря, играйтесь с ПОДОБНО.
ВЫБРАТЬ
ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.Номенклатура,
ПОДСТРОКА(ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.Номенклатура.Артикул, 1, 9) КАК Артикул
ИЗ
РегистрНакопления.ПартииМатериаловВЭксплуатацииБухгалтерскийУчет.Остатки(&Дата, СчетУчета В ИЕРАРХИИ (&СчетУчета)) КАК ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки
ГДЕ
ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.КоличествоОстаток <> 0
И ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.Номенклатура.Родитель В ИЕРАРХИИ(&группа)
АВТОУПОРЯДОЧИВАНИЕ
Показать
Делаю вот так, а он выбирает все артиклы, меньше 9-ти тоже.
Пробую сделать как вы писали, но
| ПартииМатериаловВЭксплуатацииБухгалтерскийУчетОстатки.Номенклатура.Артикул ПОДОБНО ""_________ %""
при этом ничего не отбирает.
Если убрать пробел между "_ %" тогда отбирает 9-ти значные, но и 19 строк 7-ми значных попадает туда же.
С символом [^ ] таблица остается пустой.
забыла уточнить, 19 строк 7-ми значных артикулов - это 9-ти значные символы, у них на конце два пробела.
Возможно я не правильно работаю с символом [^ ].
(6) Наверное неправильно, а что вы пишете...надо вместо _ писать [^_](или [^ ]) В справке наберите кажется "спецсимвол" или "логические выражения в запросах" И эти артикулы в этом случае не попадут, если они тоже нужны концовку надо сделать как обычно "__"
(9) В данном случае именно так - судя по всему длина реквизита 9 символов...
(11) Согласен. Это лишь обходной маневр и конструкция работает для каждого конкретного случая... Если, например, артикул будет состоять из 2-х частей разделенных пробелом, то такие строки у нас выпадут из выборки. :(
:D В порядке моего бреда интересна работоспособность конструкции
ГДЕ ВЫРАЗИТЬ(Номенклатура.Артикул КАК Строка(9)) <> ВЫРАЗИТЬ(Номенклатура.Артикул КАК Строка(8)) И
ВЫРАЗИТЬ(Номенклатура.Артикул КАК Строка(9)) = Номенклатура.Артикул ,
у меня она дает другие результаты нежели ПОДОБНО
Но вообще не советую злоупотреблять этим, нет в 1С реализации подсчета символов как ...(ну например mysql или mssql) или возможности такой реализации...так,что...иногда боком может выйти, или пробелы или количество символов или еще чего будет не то...
Вот так можно сдлеать отдельную функцию с запросом со 155 подстроками, передавать в неё текст и получать нужную цифру. Порядок убывания подсрок в запросе обязателен.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Номенклатура.Код) КАК Код,
ВЫБОР
КОГДА ПОДСТРОКА(Номенклатура.Код, 11, 11) <> ""
ТОГДА 11
КОГДА ПОДСТРОКА(Номенклатура.Код, 10, 10) <> ""
ТОГДА 10
КОГДА ПОДСТРОКА(Номенклатура.Код, 9, 9) <> ""
ТОГДА 9
КОГДА ПОДСТРОКА(Номенклатура.Код, 8, 8) <> ""
ТОГДА 8
КОГДА ПОДСТРОКА(Номенклатура.Код, 7, 7) <> ""
ТОГДА 7
КОГДА ПОДСТРОКА(Номенклатура.Код, 6, 6) <> ""
ТОГДА 6
КОГДА ПОДСТРОКА(Номенклатура.Код, 5, 5) <> ""
ТОГДА 5
КОГДА ПОДСТРОКА(Номенклатура.Код, 4, 4) <> ""
ТОГДА 4
КОГДА ПОДСТРОКА(Номенклатура.Код, 3, 3) <> ""
ТОГДА 3
КОГДА ПОДСТРОКА(Номенклатура.Код, 2, 2) <> ""
ТОГДА 2
КОГДА ПОДСТРОКА(Номенклатура.Код, 1, 1) <> ""
ТОГДА 1
КОНЕЦ КАК КоличествоСимволов
ИЗ
Справочник.Номенклатура КАК Номенклатура
В статье Агрегатное суммирование строк в запросе – сложно, но не невозможно приведен пакетный запрос, в середине которого есть нужный запрос. Суть там в том, чтобы декартово соединить исходную таблицу с таблицей чисел и определить максимальное число, при котором подстрока, вырезающая символ с номером этого числа, не будет равна пустышке.
Вот код. Начало запроса посвящено вводу данных в запрос и формированию таблицы чисел 1-64 для вырезания по одному символа из анализируемых строк.
"ВЫБРАТЬ Дано.НомерСтроки, Дано.Строка ПОМЕСТИТЬ Дано ИЗ &Дано КАК Дано
|;
|ВЫБРАТЬ 0 КАК ё ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1
|;
|ВЫБРАТЬ 2 * Р1.ё + Р0.ё КАК ё ПОМЕСТИТЬ Р10 ИЗ Р0 КАК Р1, Р0 КАК Р0
|;
|ВЫБРАТЬ 4 * Р32.ё + Р10.ё КАК ё ПОМЕСТИТЬ Р3210 ИЗ Р10 КАК Р32, Р10 КАК Р10
|;
|ВЫБРАТЬ 16 * Р54.ё + Р3210.ё + 1 КАК ё ПОМЕСТИТЬ Р543210 ИЗ Р10 КАК Р54, Р3210 КАК Р3210
|;
|ВЫБРАТЬ
| НомерСтроки,
| Строка,
| МАКСИМУМ(ё) КАК ДлинаСтроки
|ИЗ
| Дано,
| Р543210
|ГДЕ
| ПОДСТРОКА(Строка, ё, 1) + ""!"" <> ""!""
|
|СГРУППИРОВАТЬ ПО
| НомерСтроки,
| Строка"
Возникла сходная задача. Нужно было отобрать Артикул = 10 знакам.
Использовал ПОДОБНО.
Строка: ПродажиОбороты.Номенклатура.Артикул ПОДОБНО "__________ %" отбирает 10знаков и меньше.
А строка: ПродажиОбороты.Номенклатура.Артикул ПОДОБНО "_________ %" отбирает 9 и меньше.
Создал такое условие:
ГДЕ
ПродажиОбороты.Номенклатура.Артикул ПОДОБНО "__________ %"
И ПродажиОбороты.Номенклатура.Артикул НЕ ПОДОБНО "_________ %"
В результате в запрос попали только 10-значные артикулы.
Если у вас длина превышает 64 символа то перед последним "выбрать" надо добавить под запрос
ВЫБРАТЬ
64 * Р3210.ЧислоЦо + Р543210.ЧислоЦо + 1 КАК ЧислоЦо
ПОМЕСТИТЬ Р76543210
ИЗ
Р3210 КАК Р3210,
Р543210 КАК Р543210
;
И потом в последнем выбрать соединение уже делать не к Р543210 а к Р76543210
ВЫБРАТЬ
Дано.НомерСтроки,
Дано.Строка
ПОМЕСТИТЬ Дано
ИЗ
&Дано КАК Дано
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
0 КАК ё
ПОМЕСТИТЬ Р0
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
2 * Р1.ё + Р0.ё КАК ё
ПОМЕСТИТЬ Р10
ИЗ
Р0 КАК Р1,
Р0 КАК Р0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
4 * Р32.ё + Р10.ё КАК ё
ПОМЕСТИТЬ Р3210
ИЗ
Р10 КАК Р32,
Р10 КАК Р10
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
16 * Р54.ё + Р3210.ё + 1 КАК ё
ПОМЕСТИТЬ Р543210
ИЗ
Р10 КАК Р54,
Р3210 КАК Р3210
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Дано.НомерСтроки,
Дано.Строка,
МАКСИМУМ(Р543210.ё) КАК ДлинаСтроки
ИЗ
Дано КАК Дано,
Р543210 КАК Р543210
ГДЕ
ПОДСТРОКА(Дано.Строка, Р543210.ё, 1) + «!» <> «!»
СГРУППИРОВАТЬ ПО
Дано.НомерСтроки,
Дано.Строка
Доброго времени суток. Подскажите как в запросе отобрать из Номенклатура.Наименование в виде первые символы (произвольное количество) до определенной метки
Альтернативный запрос, менее производительный, чем у ildarovich, зато более понятный для новичков и с определением до 1000 символов.
ВЫБРАТЬ
"ОуХмКакаяЖеДлинаУЭтойСтроки" КАК Строка
ПОМЕСТИТЬ Т0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
0 КАК Поле1
ПОМЕСТИТЬ Т1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Т1.Поле1 * 10 + Т11.Поле1 КАК Поле11
ПОМЕСТИТЬ Т2
ИЗ
Т1 КАК Т1,
Т1 КАК Т11
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Т2.Поле11 * 10 + Т1.Поле1 КАК Поле1
ПОМЕСТИТЬ Т3
ИЗ
Т2 КАК Т2,
Т1 КАК Т1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т0.Строка) КАК Строка,
МАКСИМУМ(Т3.Поле1) КАК ДлинаСтроки
ИЗ
Т0 КАК Т0,
Т3 КАК Т3
ГДЕ
ПОДСТРОКА(Т0.Строка, Т3.Поле1, 1) <> ""