1с ограничить длину строки в запросе
Если реквизит составного типа, то проверка реквизита на заполненность значением выполняем только с помощью функции ЗначениеЗаполнено() .
Ответ таков: когда у составного реквизита тип не выбран, то он имеет значение Неопределено , поэтому проверки типа ПустаяСтрока(Реквизит) Или Реквизит.Пустая() могут сгенерировать исключительную ошибку.
2) Построение запроса
Если в запросе реквизит составного типа участвует в отборах или в соединениях, то следует использовать функцию ВЫРАЗИТЬ (), что уменьшит время выполнения запроса.
Ответ таков: в таких условия система производит левое соединение реквизита с таблицами, которые указаны в его типе, а потом уже отсекает лишние записи. Добавив функцию ВЫРАЗИТЬ в запрос, мы явно указываем с какой таблицей выполнять левое соединение. Умно выражаясь, данная функция выполняет приведение значения к определенному типу.
Синтаксис функции: ВЫРАЗИТЬ ( КАК ) .
Пример.
У справочника ТочкиКартыМаршуртаБизнесПроцесса имеется реквизит ВладелецТочки , который имеет составной тип: СправочникСсылка.ШаблоныБизнесПроцессов , БизнесПроцессСылка.БизнесПроцессУниверсальный . Требуется получить выборку, содержащая информацию о всех точках маршрута, которые относятся к шаблонам бизнес-процессов, а так же наименования этих шаблонов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса).Наименование КАК ШаблонБизнесПроцесса,
| ТочкиКартыМаршрутаБизнесПроцесса.Наименование КАК НаименованиеТочкиМаршрута,
| ТочкиКартыМаршрутаБизнесПроцесса.ВидТочки КАК ВидТочкиМаршрута
|ИЗ
| Справочник.ТочкиКартыМаршрутаБизнесПроцесса КАК ТочкиКартыМаршрутаБизнесПроцесса
|ГДЕ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса) ЕСТЬ НЕ NULL
| И НЕ ТочкиКартыМаршрутаБизнесПроцесса.ПометкаУдаления";
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
3) Проявление отрицательной стороны
При задании составного типа реквизиту старайтесь избегать включения в составной тип примитивных типов (число, булево, строка). Смешивая ссылочные типы с примитивными, увеличивается размер базы данных (создаются дополнительные колонки в таблице реляционной БД), может пострадать индексация реквизита (включение с составной тип неограниченной длины строку). Все это повлияет на производительность.
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
Ещё оператор ВЫРАЗИТЬ используется для приведения числа к определённому виду. Например: Код 1C v 8.х даст результат 3,33 вместо 3,33333333333333.
Или ещё для выделения значений определённого типа значения из переменной с составным типом значения . Например такой запрос Код 1C v 8.х результат запроса будет содержать значения типа СправочникСсылка.Контрагенты и NULL когда значения будут встречаться другого типа
К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.
Только ленивый, по-моему, не писал еще о вариантах вырезания гланд через анус автогеном запросами. Ну и я поделюсь.
К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.
Во всех примерах я буду использовать следующие временные таблицы:
ВЫБРАТЬ
"_" КАК Симв ,
1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"__" ,
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"___" ,
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"____" ,
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_____" ,
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"______" ,
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_______" ,
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"________" ,
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"_________" ,
9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"" ,
0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Прав . Симв КАК Симв ,
тзКоличествоСимволов9_Лев . КолСимв * 10 + тзКоличествоСимволов9_Прав . КолСимв КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов100
ИЗ
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев ,
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав
;
////////////////////////////////////////////////////////////////////////////////
Для приведенных примеров их вполне хватит, смысл, думаю, понятен, так что не будем заострять внимание на оптимальности их построения.
Так же рекомендую экспериментировать с приведенными запросами в файловых базах – серверные более нежные и работать автогеном в таком грязном месте не любят. :)
Тут всё очень просто
ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )
Всё. Теперь можно отрезать последний пробел, например:
ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв ,
ВЫБОР
КОГДА Наименование подобно "% "
ТОГДА ПОДСТРОКА ( Номенклатура . Наименование , 1 , КоличествоСимволов . КолСимв - 1 )
ИНАЧЕ Номенклатура . Наименование
КОНЕЦ КАК НаименованиеБезПробела
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )
2. Разбить строку
Здесь чуть сложнее. Но теми же граблями.
Задача: в некоторой номенклатуре в наименовании записан некоторый текст в скобках. Надо вытащить этот текст в отдельное поле.
Для простоты договоримся, что скобочки в наименовании у нас один раз открываются и один раз закрываются.
ВЫБРАТЬ Различные
Номенклатура . Ссылка ,
Выразить ( ПОДСТРОКА ( Номенклатура . Наименование , КоличествоСимволовДоОткрытия . КолСимв + 2 , КоличествоСимволовДоЗакрытия . КолСимв - КоличествоСимволовДоОткрытия . КолСимв - 1 ) как строка ( 100 )) КАК ТекстВСкобках
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоОткрытия . Симв + &СимволОткрытия + "%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоЗакрытия . Симв + &СимволЗакрытия + "%" )
ГДЕ
Номенклатура . Наименование ПОДОБНО "%" + &СимволОткрытия + "%" + &СимволЗакрытия + "%"
Тут &СимволОткрытия, понятно «(»,&СимволЗакрытия соответственно «)». Находим позицию символов и вытаскиваем подстроку. Помним, что запросы тошнит от строк неограниченной длины, поэтому используем ВЫРАЗИТЬ.
3. Сложное соединение по строке.
Ну и совсем извращение, но пример взят из реальной темы.
Существуют две таблицы:
В одной номера договоров в формате: «Номер-постфикс»
В другой номера тех же договоров, но дополненные неким доп-индексом в формате: «Номер/Индекс-постфикс».
Необходимо связать. Номер, индекс и постфикс могут быть разной длины, ориентироваться можно только на «/» и «-».
И начнем выпендриваться.
//Выделим из номеров те части, по которым сможем связывать
Выбрать
тз1сРазбиением . ВнутреннийНомер ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоТире . КолСимв ) как ДоСлэша ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз1сРазбиением
из тз1 как тз1сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
Выбрать
тз2сРазбиением . ВнутреннийНомер ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоСлэша . КолСимв ) как ДоСлэша ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз2сРазбиением
из тз2 как тз2сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоСлэша
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоСлэша . Симв + "/%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + "-%" )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
ВЫБРАТЬ Различные
тз11 . ВнутреннийНомер ,
тз22 . ВнутреннийНомер
ИЗ
тз1сРазбиением КАК тз11
Левое СОЕДИНЕНИЕ тз2сРазбиением КАК тз22
ПО тз11 . ДоСлэша Подобно тз22 . ДоСлэша
и тз11 . ПослеТире Подобно тз22 . ПослеТире
Для любителей возмущающаться напомню, что целью было отвлечься от работы J Если кому-то пригодится в практических целях, буду рада.
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)
Автор уроков и преподаватель школы: Владимир Милькин
Давайте вспомним, что каждый реквизит (свойство, поле) справочника, документа или любого другого прикладного объекта имеет свой тип . И этот тип мы можем посмотреть в конфигураторе:
В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.
Функция ТИПЗНАЧЕНИЯ
Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:
Если мы запросим тип поля Наименование, то, как и ожидается, получим Строка:
А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:
Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ .
Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:
И только после нашего выбора позволит ввести значение выбранного типа.
Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).
Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Здесь значение отличительного признака является элементом справочника Вкусы:
А здесь вообще элементом справочника Цвета:
Вот какие возможности открывает перед нами составной тип данных!
Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйПризнак, имеющий составной тип данных:
Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.
Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.
Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.
Тип значения отличительного признака для Перми равен Вкусы. Так и есть, ведь значение отличительного признака забитое в базе для города Пермь является ссылкой на элемент справочника Вкусы.
Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.
Для Воронежа тип признака равен Строка, потому что значение введенное в базе является обычной строкой.
Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.
Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?
А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО .
С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.
Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.
А тип для значения, которое не принадлежит ни к одному из типов, как вы уже наверное догадались отсутствует.
Функция ТИП
Она принимает всего один параметр - имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.
Результатом данной конструкции будет значение типа Тип для указанного типа.
Звучит туманно, не правда ли?
Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.
Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:
Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):
Отступление
Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.
Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Вот пример его использования:
Но есть и такие элементы (Сан-Паулу), у которых реквизит ОтличительныйПризнак (составного типа) просто не заполнен и равен специальному значению НЕОПРЕДЕЛЕНО.
Чтобы отобрать такие записи следует использовать другую конструкцию:
Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.
Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:
Логический оператор ССЫЛКА
Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу , указанную справа.
К примеру, давайте выберем из справочника Города только те записи, у которых значение составного реквизита ОтличительныйПризнак являются ссылкой на элемент справочника Вкусы:
Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:
Функция ЕСТЬNULL
Функция предназначена для замены значения NULL на другое значение.
Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.
Как например, реквизит ОтличительныйПризнак для групп справочника Города:
Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка "Такого реквизита нет!":
Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.
Функция ВЫРАЗИТЬ
Эта функция предназначена только для полей , имеющих составной тип . Отличным примером такого поля является свойство ОтличительныйПризнак у элементов справочника Города.
Как мы помним, составные поля могут быть одного из нескольких типов, указанных в конфигураторе.
Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.
Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.
Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:
В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.
Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.
Пройдите тест
Не все реквизиты справочников или документов имеют свой тип, но те что имеют можно посмотреть в конфигураторе
Не все реквизиты справочников или документов имеют свой тип, но те что имеют можно посмотреть в режиме 1С:Предприятие
Каждый реквизит справочника или документа имеет свой тип, который можно посмотреть в режиме 1С:Предприятие
К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.
Только ленивый, по-моему, не писал еще о вариантах вырезания гланд через анус автогеном запросами. Ну и я поделюсь.
К сожалению, возможности запросов 1С в отношении строковых переменных крайне малы. Практически они исчерпываются одной функцией и одним оператором. Тем не менее, постоянно всплывают темы в духе «а как мне сделать это прямо в запросе?». Конечно, большинство задач решаются в СКД, оставшаяся часть решается пост-обработкой результата, но чисто в качестве разминки для ума, кое-что в запросе сделать можно.
Во всех примерах я буду использовать следующие временные таблицы:
ВЫБРАТЬ
«_» КАК Симв ,
1 КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«__» ,
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«___» ,
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«____» ,
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«_____» ,
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«______» ,
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«_______» ,
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«________» ,
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«_________» ,
9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
«» ,
0
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Лев . Симв + тзКоличествоСимволов9_Прав . Симв КАК Симв ,
тзКоличествоСимволов9_Лев . КолСимв * 10 + тзКоличествоСимволов9_Прав . КолСимв КАК КолСимв
ПОМЕСТИТЬ тзКоличествоСимволов100
ИЗ
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Лев ,
тзКоличествоСимволов9 КАК тзКоличествоСимволов9_Прав
;
////////////////////////////////////////////////////////////////////////////////
Для приведенных примеров их вполне хватит, смысл, думаю, понятен, так что не будем заострять внимание на оптимальности их построения.
Так же рекомендую экспериментировать с приведенными запросами в файловых базах – серверные более нежные и работать автогеном в таком грязном месте не любят. 🙂
Тут всё очень просто
ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )
Всё. Теперь можно отрезать последний пробел, например:
ВЫБРАТЬ
Номенклатура . Наименование ,
КоличествоСимволов . КолСимв ,
ВЫБОР
КОГДА Наименование подобно «% «
ТОГДА ПОДСТРОКА ( Номенклатура . Наименование , 1 , КоличествоСимволов . КолСимв — 1 )
ИНАЧЕ Номенклатура . Наименование
КОНЕЦ КАК НаименованиеБезПробела
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволов
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволов . Симв )
2. Разбить строку
Здесь чуть сложнее. Но теми же граблями.
Задача: в некоторой номенклатуре в наименовании записан некоторый текст в скобках. Надо вытащить этот текст в отдельное поле.
Для простоты договоримся, что скобочки в наименовании у нас один раз открываются и один раз закрываются.
ВЫБРАТЬ Различные
Номенклатура . Ссылка ,
Выразить ( ПОДСТРОКА ( Номенклатура . Наименование , КоличествоСимволовДоОткрытия . КолСимв + 2 , КоличествоСимволовДоЗакрытия . КолСимв — КоличествоСимволовДоОткрытия . КолСимв — 1 ) как строка ( 100 )) КАК ТекстВСкобках
ИЗ
Справочник . Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоОткрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоОткрытия . Симв + &СимволОткрытия + «%» )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоЗакрытия
ПО ( Номенклатура . Наименование ПОДОБНО КоличествоСимволовДоЗакрытия . Симв + &СимволЗакрытия + «%» )
ГДЕ
Номенклатура . Наименование ПОДОБНО «%» + &СимволОткрытия + «%» + &СимволЗакрытия + «%»
Тут &СимволОткрытия, понятно «(»,&СимволЗакрытия соответственно «)». Находим позицию символов и вытаскиваем подстроку. Помним, что запросы тошнит от строк неограниченной длины, поэтому используем ВЫРАЗИТЬ.
3. Сложное соединение по строке.
Ну и совсем извращение, но пример взят из реальной темы.
Существуют две таблицы:
В одной номера договоров в формате: «Номер-постфикс»
В другой номера тех же договоров, но дополненные неким доп-индексом в формате: «Номер/Индекс-постфикс».
Необходимо связать. Номер, индекс и постфикс могут быть разной длины, ориентироваться можно только на «/» и «-».
И начнем выпендриваться.
//Выделим из номеров те части, по которым сможем связывать
Выбрать
тз1сРазбиением . ВнутреннийНомер ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоТире . КолСимв ) как ДоСлэша ,
Подстрока ( тз1сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз1сРазбиением
из тз1 как тз1сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + «-%» )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз1сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
Выбрать
тз2сРазбиением . ВнутреннийНомер ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , 1 , КоличествоСимволовДоСлэша . КолСимв ) как ДоСлэша ,
Подстрока ( тз2сРазбиением . ВнутреннийНомер , КоличествоСимволовДоТире . КолСимв + 2 , СтрДлина . КолСимв ) как ПослеТире
поместить тз2сРазбиением
из тз2 как тз2сРазбиением
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоСлэша
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоСлэша . Симв + «/%» )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК КоличествоСимволовДоТире
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО КоличествоСимволовДоТире . Симв + «-%» )
ЛЕВОЕ СОЕДИНЕНИЕ тзКоличествоСимволов100 КАК СтрДлина
ПО ( тз2сРазбиением . ВнутреннийНомер ПОДОБНО СтрДлина . Симв )
;
ВЫБРАТЬ Различные
тз11 . ВнутреннийНомер ,
тз22 . ВнутреннийНомер
ИЗ
тз1сРазбиением КАК тз11
Левое СОЕДИНЕНИЕ тз2сРазбиением КАК тз22
ПО тз11 . ДоСлэша Подобно тз22 . ДоСлэша
и тз11 . ПослеТире Подобно тз22 . ПослеТире
Для любителей возмущающаться напомню, что целью было отвлечься от работы J Если кому-то пригодится в практических целях, буду рада.
Читайте также: