1с ограничить длину строки в запросе

Обновлено: 07.07.2024

Разрядность результатов выражений и агрегатных функций в языке запросов

При использовании в запросах операций и функций над данными, в определение которых входят спецификации длины ( Строка , Число ) и точности ( Число ), бывает необходимо учитывать правила вычисления длины и точности результатов. Этот раздел содержит описание соответствующих правил.

Операции над строками

Описание данных типа Строка может включать следующие дополнительные спецификации: длина (максимальное количество символов), допустимая длина (фиксированная или переменная), неограниченная длина ( Истина или Ложь ). В таблице приведены правила вычисления дополнительных спецификаций результатов функций в зависимости от дополнительных спецификаций их строковых операндов.

ПОДСТРОКА(Строка, m, k) Неограниченная длина Длина k, переменная Длина k, переменнаяМИНИМУМ(Строка) Неограниченная длина Длина n, фиксированная Длина n, переменнаяМАКСИМУМ(Строка) Неограниченная длина Длина n, фиксированная Длина n, переменная

В следующей таблице приведены правила определения дополнительных спецификаций результата операции "+" (конкатенация строк), имеющей 2 строковых операнда.

Неограниченная длина Неограниченная длина Неограниченная длина Неограниченная длинаДлина n Фиксированная Неограниченная длина Длина n + m фиксированная Длина n + m переменнаяПеременная Неограниченная длина Длина n + m переменная Длина n + m переменная

Операции над числами

Выполняя различные преобразования числовых данных, необходимо учитывать, что максимальное количество цифр, которое может содержать число (его целая и дробная часть вместе), равно 38 цифр. 1С:Предприятие использует десятичные числа с фиксированной точкой. Это значит, например, что число 34.28 содержит 4 цифры, число 0.00000001 содержит 8 цифр (незначащий 0 перед точкой за цифру не считается), а число 3200000000 содержит 10 цифр. Разрядность результатов различных операций вычисляется так, чтобы по возможности исключить арифметические переполнения, и в то же время максимально сохранить точность значений. При разработке конфигураций выбор разрядности полей объектов метаданных должен определяться возможной разрядностью хранимых в них данных и не должен учитывать возможное увеличение разрядности после выполнения арифметических операций и функций.

"+" (сложение), "-" (вычитание)

Операции сложения и вычитания в языке запросов всегда выполняются точно. Для этого длина дробной части результата определяется как максимальная из длин дробных частей операндов. Длина целой части результата как максимальная из длин целых частей операндов, увеличенная на 1. Если при этом общее количество цифр целой и дробной части превысит 38, то оно будет приведено к 38 за счет уменьшения числа цифр дробной части, но не менее, чем до 8.

"*" (умножение)

Операции умножения выполняется точно в том случае, если хотя бы один ее операнд является целым числом. Длина дробной части результата определяется как наибольшая из длин дробных частей операндов, но не менее 8 цифр. Длина целой части результата вычисляется как сумма длин целых частей операндов. Если при этом общее количество цифр целой и дробной части превысит 38, то оно будет приведено к 38.

При умножении двух чисел разрядность результата вычисляется следующим образом: количество разрядов целой части содержит сумму количеств разрядов целых частей операндов; количество разрядов дробной части содержит сумму количеств разрядов дробных частей операндов. Если суммарное количество разрядов (целой и дробной части) результата превышает максимально допустимое (38 - для всех СУБД кроме DB2, для DB2 - 31), то происходит балансировка точности. В этом случае операнды приводятся к разрядности, позволяющей сохранить необходимую точность операции. Например, при умножении полей (не констант) ЧИСЛО(17,4) и ЧИСЛО(27,4) платформа приведет операнды к типу ЧИСЛО(15,4) и ЧИСЛО(22,4), что в результате даст тип ЧИСЛО(37,8), не превышающий максимальное количество разрядов в СУБД. Однако, если какой-либо из операндов не поместится в соответствующую разрядность, то будет ошибка СУБД во время исполнения запроса

"/" (деление)

Операция деления выполняется точно только если оба операнда являются целыми числами, и первый операнд делится на второй без остатка. Длина дробной части результата определяется как максимальная из длин дробных частей операндов, но не менее 8 цифр. Длина целой части результата равна сумме длин целой части делимого и дробной части делителя. Если при этом общее количество цифр целой и дробной части превысит 38, то оно будет приведено к 38 за счет уменьшения числа цифр дробной части, но не менее, чем до 8.

СУММА

Агрегатная функция СУММА вычисляется по возможности точно. Количество цифр дробной части результата равно количеству цифр дробной части операнда. Количество цифр целой части увеличивается на 7 цифр. Если при этом общее количество цифр целой и дробной части превысит 38, то оно будет приведено к 38 за счет уменьшения числа цифр дробной части, но не менее, чем до 8.

МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ

Результат функций МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ имеет такое же количество цифр в целой и дробной частях, как и их операнд.

КОЛИЧЕСТВО, ГОД, КВАРТАЛ, МЕСЯЦ, ДЕНЬГОДА, ДЕНЬ, НЕДЕЛЯ, ДЕНЬНЕДЕЛИ, ЧАС, МИНУТА, СЕКУНДА, РАЗНОСТЬДАТ

Перечисленные функции имеют числовой результат с 10 цифрами в целой части. Дробная часть отсутствует.

Проблемные ситуации

Если при работе запроса возникает ошибка СУБД, следует изменить запрос, приводящий к ошибке: с помощью операции ВЫРАЗИТЬ можно привести разрядность операндов к такому виду, чтобы в результате расчета разрядности умножения платформа 1С:Предприятие не проводила автоматическую балансировку точности.

Например: привести разрядность операндов к типам ЧИСЛО(17,4) и ЧИСЛО(20,4) - в этом случае результатом умножения будет разрядность ЧИСЛО(37,8), что не превышает максимально допустимую разрядность для используемой СУБД.

(24) Ну документооборот они так ведут. Что бы по номеру документа было видно какого вида это документ.
Зачем? Их так учат.
Зачем их так учат? Их учат, те кто так учился ране. А их тоже так учили т.д.
Когда не было электронного документооборота был поиск по каталогам и т.д как в библиотеке.

Я еще успел попасть на курсы бухгалтеров, где учили бумажному бухучету.
Хотя не удивлюсь, если и до сих пор учат.
(24) Второе объяснение - это независимая нумерация разных видов документов одновременно. Пропуски в нумерации не допускаются, но разные виды документов вводят и отвечают за них разные люди. При этом все кадровые документы не должны повторять номер и быть пропуски. Поэтому и ввели префиксы, суфиксы и т.д.
(24) Скоросшиватель сшивает быстро, а расшивает еще быстрее. Вот отсюда ноги и растут

Тут не нужно думать. Нужно знать, как будет сравнивать программа.

(28) Есть ещё одна причина.
Процедура нумерации подразумевает разделение бумаг с различными сроками хранения:
- Длительный: 50 или 75 лет.
- Краткосрочный: 1 или 5 лет.

Хранить весь этот хлам в архивах и дорогое и муторное занятие. Поэтому краткосрочные хранят отдельно и первой возможности утилизируют.
Но опять же это всё из библиотечного дела и хранения по каталогам.

+ к (30) В остальных документах остается нумерация без пропусков, так как изначально и не было в них документо другого вида с другим сроком хранения.

т.е. основная проблема в том что требуют некую единую уникальную нумерацию по всем кадровым документам. А по факту её нет.

(31) НЕТ и в текущей версии напишешь.

(33) Главное что бы был известен формат строки на выходе.
(31) Пусть необходимо привести номер к виду: 99999999999999/ХХ, т.е. 14 цифр номера + разделитель "/" и один символ суффикса. А по факту дополнить нулями номер, так как разделитель и один символ суффикса уже есть. Если разделитель бывает разный, то дополнить разные разделители. Если суффикс бывает длинной более одного символа, то учесть и это.

Например есть следующие номера как в (0): 100/А, 99/А, 00251200/А, 3/А. , где суффикс это всегда один символ.

Если кратко, то один алгоритм следующий.
1. Так как 14 + 1 + 1 = 16, то подготовить таблицу с цифрами от 1 до 16. Порождающий запрос на 16 - назовем это так.
2. Разбиваем строки с номерами на строки вида ниже. т.е. декартово перемножение на таблицу из 16-ти строк и беря только строку с 1 одну, с 2 одну и т.д.
Изначальный номер | НПП | символ
100/А | 1 | А
100/А | 2 | /
100/А | 3 | 0
100/А | 4 | 0
100/А | 5 | 1
100/А | 6 | 0
100/А | 7 | 0
100/А | 8 | 0
100/А | 9 | 0
100/А |10 | 0
100/А |11 | 0
100/А |12 | 0
100/А |13 | 0
100/А |14 | 0
100/А |15 | 0
100/А |16 | 0
99/А | 1 | А
99/А | 2 | /
99/А | 3 | 9
99/А | 4 | 9
99/А | 6 | 0
99/А | 5 | 0
99/А | 7 | 0
99/А | 8 | 0
99/А | 9 | 0
99/А |10 | 0
99/А |11 | 0
99/А |12 | 0
99/А |13 | 0
99/А |14 | 0
99/А |15 | 0
99/А |16 | 0
.

3. Собственно собираем обратно. Получаем на выходе для каждого номера его новый номер. Как собрать обратно у меня сразу два алгоритма в голове возникло. Так как всего 16-ть символов, то использовал бы первый:
Выбрать
.

Если много было бы, то использовал бы сложение соседних: 1+2; 3+4; 5+6; . далее перенумерация и опять сложение соседних. Десять итераций позволяет сложить 2 в десятой = строка длиной 1024 символа.

Читайте также: