Особенность выполнения функции ПОДСТРОКА() языка запросов
Раздел содержит описание особенности выполнения функции ПОДСТРОКА() языка запросов в клиент-серверном варианте работы и вытекающие из нее рекомендации по построению запросов.
Функция ПОДСТРОКА()
В языке запросов 1С:Предприятия функция ПОДСТРОКА() в формате ПОДСТРОКА(, , ) может применяться к данным строкового типа и позволяет выделить фрагмент , начинающийся с символа номер (символы в строке нумеруются с 1) и длиной символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если имеет неограниченную длину и параметр не является константой или превышает 1024.
Вычисление функции ПОДСТРОКА() на SQL сервере
В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.
В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.
ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
завершается аварийно с сообщением:
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.
В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ() . В частности, приведенный пример можно переписать в виде:
ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1
Как обрезать строку в 1с
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
Как обрезать строку в 1с
Есть, например, характеристика номенклатуры с наименованием «46, чёрный». Как обрезать строку до запятой слева при том, что функция Лев не подойдёт — слева до запятой может быть сколько угодно символов?
это невозможно
Найти(строка,Символ(код символа))
(4) щас попробую, спасибо!
Сред(строка, Найти(строка,Символ(код символа)))
(0) в общих модулях есть строку в массив еще
(6) Единичку забыл 😉
Похоже на черезпопную работу с характеристиками.
(8) Дословно сказано «ДО запятой», т.е. запятую оставить ;P
(10) До это не По
(11) Сложно отрицать
(12) А, ну да, в данном случаи запятую оставить.
(0)Ну и вопросы. Вроде 87.
Лев(Строка, Найти(Строка,»,»)-1)
(15) Минус один?
(17) Ну проверку добавь. В (0)Сказано что «,» всегда есть.
(17) Лев(Строка, ?(Найти(Строка,»,»)-1)=0,1,Найти(Строка,»,»)-1)
(19) не хочу 😉
(19) во-первых, не сказано, во-вторых, это не аргумент
СтрПолучитьСтроку(СтрЗаменить(Строка,»,»,Символы.ПС),1)
ежели не многострочная
А что если.
ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанных,»,»)
Если Строка = «46, чёрный» Тогда
Строка = «, чёрный»;
КонецЕсли;
(24) тогда уж так:
Искомое = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаДанных,»,»)[0]
(25) Это же был перформанс! Аллегорическое олицетворение хтонического ужаса, экзистенциальное воплощение протеста против агрессивных тенденций глобальной автоматизации! Современное искусство программирования обязано шокировать и эпатировать!!
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
1С — обрезать строку после символа программно, пример
В функцию передаются параметры — текстовая строка и разделитель. Функция возвращает 2 значения: текст до разделителя и оставшуюся часть строки, после разделителя.
Функция ПолучитьСтрокуДоИПослеСимвола(Строка, СимволРазделитель) //строка - текстовая строка //в качестве символа разделителя могут быть символы "/", "." и т.д. ПозицияСимвола = Найти(Строка, СимволРазделитель); СтрокаДоСимволаРазделителя = Лев(Строка, ПозицияСимвола - 1); СтрокаПослеСимволаРазделителя = Сред(Строка, ПозицияСимвола + 1, СтрДлина(Строка)); //запишем результат в структуру Структура = Новый Структура("СтрокаДоРазделителя, СтрокаПослеРазделителя"); Структура.Вставить("СтрокаДоРазделителя", СтрокаДоСимволаРазделителя); Структура.Вставить("СтрокаПослеРазделителя", СтрокаПослеСимволаРазделителя); Сообщить(Структура.СтрокаДоРазделителя); Сообщить(Структура.СтрокаПослеРазделителя); //вернем результат разбиения Возврат Структура; КонецФункции
support 2019-07-13T09:57:18+03:00 Встроенный язык 1С, Программисту |