Найти в запросе 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 Если кому-то пригодится в практических целях, буду рада.
В данной статье я расскажу вам как быстро найти в справочнике элементы у которых в наименовании присутствует вхождение искомой нами строки:
Текст запроса будет выглядеть так:
где оператор запроса ПОДРОБНО как раз и будет искать вхождения ПараметрСтрокаПоиска по всем элементам справочника Номенклатура.
Установить значение параметра ПараметрСтрокаПоиска можно командой:
Подобным образом можно организовать поиск по точному вхождению строки. Такой способ подходит для поиска элемента справочника например по коду. Строка запроса изменится и будет выглядеть так:
|Номенклатура.Наименование ПОДОБНОПараметрСтрокаПоиска
Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.
Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:
- % (процент): последовательность, содержащая любое количество произвольных символов
- _ (подчеркивание): один произвольный символ
- […] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
- [^…] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания
Похожие FAQ
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 23
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 19
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Требуется выбрать номенклатуру, в названии которой присутствует заглавная русская буква С
Однако следующий запрос выдает результат и с заглавными, и со строчными буквами.
Я правильно понял, что с помощью одного только запроса проблему не решить и нужно перебирать результат в цикле, чтобы найти нужные буквы?
(1) roman77, смотря сколько номенклатуры. Если миллиард - да, 1С это будет делать долго и упорно. А если сотня тысяч, то тут и запрос не нужен:
Что все так к запросам-то льнут. Тут кода меньше, чем в запросе строк )))
(17) starik-2005, это понятно, я так и сделал. Вопрос-то чисто академический был. Ну может вдруг я что-то упустил и всё-таки как-то можно уговорить 1С в запросах различать регистр букв.
Изменила запрос данным образом: в УТ 10 работает. Последняя "%"- метка нет необходимости. Выражение [С] - в данном случае будет как символ "С", так и "с". Если убрать скобки, то ищет по жесткому соответствию.
(6) alljoke, А подробнее как то можно? в какой конфе и тд? я использовала консоль в Ут.10 у меня отобрало без проблем, только с заглавными буквами.
(8) SurmachAU, и у вас не отработало )) у вас просто в наименовании на конце стоит "с". Вот и попало в результат. Чистое совпадение.
А по делу - разбираться надо. Может и нет такого в Запросе, может надо будет обрабатывать.
(8) SurmachAU, ничего не отработало и не отработает, второй % был не лишним, убрав его вы ищите С только в конце слова. Вы подогнали под нужный ответ.
А у меня УТ 11, платформа 8.3.6.2390
сервер
MS SQL
"%С%"выдает всё подряд, и "колесо" и "Серия".
А если убрать % на конце, то будет выдавать только то, что заканчивается на с/С
(9) запрос не увидит разницы между "с" и "С". А зачем именно заглавную нужно искать? может поискать все слова начинающиеся с "с"?
запрос не увидит разницы между "с" и "С". А зачем именно заглавную нужно искать? может поискать все слова начинающиеся с "с"?
потому что такая задача, так надо.
В данном конкретном случае, заглавные буквы C должны быть только латинские, но кое где перепутаны на русские. А маленькие буквы c - могут быть русскими.
Миллион раз уже обсасывался этот вопрос. Запрос не учитывает регистр букв, т.к. скулевский LIKE его тоже не различает. Только постобработкой результата запроса.
Если я правильно помню, то регистрозависимость при сравнении строк через запрос зависит от значения свойства COLLATION в MS SQL.
1С вроде рекомендует настройку _CI_AS (Case-insensitive, accent-sensitive, kana-insensitive, width-insensitive), т.е. регистронезависимую.
ИМХО, проще всего выбрать запросом и с большими и с маленькими буквами, а затем обойти результат и взять только с большими буквами.
Коллеги, 1С не зря ведь рекомендуют Cyrillic_General_CI_AS и при создании базы мастер 1С сам ставит такую сортировку. Где гарантия, что после смены COLLATE данная конкретная конфигурация 1С не начнёт глючить из-за того, что где-то в запросах используется прописанные к коде не в том регистре значения строк?
Да и поможет ли это вообще?
Я не поленился и поверил на файловой базе - 1С все равно не различает регистр букв в запросах. И SQL в этом случае не причем.
Часто бывает, что в результате обмена данных в 1С 8.3 и 8.2 случаются ошибки, и вместо значения ссылочных данных в полях встречается «Объект не найден», то есть «битые ссылки».
Поиск битых ссылок в 1С запросом
Очень часто встает вопрос: как отобрать элементы с битыми ссылками запросом 1С?
Вопрос решается достаточно легко, рассмотрим его на примере:
необходимо отобрать документы Счет на оплату покупателю, где вместо организации установлена «битая ссылка».
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Первым отбором «НЕ СчетНаОплатуПокупателю.Организация ЕСТЬ NULL» мы определили, что ссылка установлена.
Вторым отбором СчетНаОплатуПокупателю.Организация.Код ЕСТЬ NULL, обращаясь к коду организации по точке, система строит левое соединение, но не находит в таблице организаций такой элемент — возвращает NULL.
Всё получается достаточно просто.
Определение битой ссылки в объектной модели
Если у Вас нет возможности сделать проверку запросом, рекомендую использовать два разных метода. Рассмотрим их на примере, который давали ранее:
Используя ПолучитьОбъект()
При использовании метода «ПолучитьОбъект()» битая ссылка вернет «Неопределено».
Поиск в строке
Этот метод самый простой — поиск строки «Объект не найден» в представлении элемента.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Добрый день. Запросом получаю нужные данные из РегистраСведений. Нужно получить последнюю запись из этого запроса(не из регистра сведений), либо в самом же запросе указать такое условие, если это возможно. Пока единый рабочий вариант это просто пробежать по всем элементам до последнего. Запрос.Получить(Индекс) всё время возвращает выход за пределы массива
Получить последнее значение параметра цикла
Всем привет, Новичок в программирование и питоне. Допустим есть код: for i in range(6): .
Получить первое и последнее значение с учетом DateTime
Здравствуйте! Необходимо обратиться с запросом к базе данных: SELECT A1, A1 FROM Runtime .
Получить последнее(текущее) значение из столбца таблицы MS SQL
Добрый вечер. Возник вопрос, подскажите, как получить последнее значение из столбца таблицы MS SQL.
Phpmyadmin - получить последнее значение поля автоинкремента таблицы
Заливаю ссылку на картинку, которая основывается на id записи. Например, картинка записи с >
Решение
Александр321321, Первый вариант. Упорядочить запрос, чтобы ваша последняя строка стала первой
ВЫБРАТЬ ПЕРВЫЕ 1
УПОРЯДОЧИТЬ ПО (здесь ваше поле) убыв
Или второй вариант
ну да, то что можно упорядочить логично, я почему-то по возрастанию сделал. Спасибо. Но всё же интересно, можно ли в самом запросе как-нибудь указать, чтобы не получать тысячи ненужных записей. Например, чтобы запрос начал искать с конца записей РегСв и остановился как нашел первую запись
Вылазит ошибка "Недопустимое значение параметра", если в структуре убрать "Курс", то всё срабатывает, но мне нужно искать именно по нему(причём то что он заполнен и не равен 0, как передать это в структуре не знаю)
Добрый. Нет, в измерениях валюта, а курс в ресурсах. По Валюте отбор идёт, а если начинаю по курсу, то выдаёт ошибку
Тогда сделать отбор по ресурсам не представляется возможным, только по измерениям. А значит валюта проходит, а вот по курсу уже невозможно сделать.
Выдержка из помощи:
Содержит объект Отбор, по которому осуществляется текущая фильтрация записей при считывании или записи набора. Список свойств объекта зависит от свойств регистра: для регистров сведений, для которых в Конфигураторе установлен режим записи "Подчинение регистратору", отбор возможен только по регистратору, для периодических регистров сведений отбор возможен по периоду и значениям измерений, для непериодических - только по значению измерений.
Здесь не указывается возможность установки отборов по ресурсам.
В таком случае всем спасибо. В принципе получить список в запросе и взять первый элемент довольно быстро срабатывает, значит так и оставлю
Как получить значение запроса?
Пономаю что вопрос очень тупой, но плиз откройте мне глаза. Как получить значение для.
Получить значение из post запроса
Вот есть сайт, вводятся данные есть одно поле, где можно ввести разные ответы ну допустим ввёл.
Получить в VBA значение из запроса
Здравствуйте! Подскажите пожалуйста, как получить значение из запроса в VB
Читайте также: