Определение длины текстового реквизита

Программирование - Практика программирования

Допустим, есть справочник, который содержит записи, и нужно узнать, какая максимальная длина у текстового реквизита (будь то Код, Наименование или другой реквизит).

Можно сделать разными способами, а можно запросом

ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код > ПОДСТРОКА(Код, 1, ” + Сч +”)
где Сч – число символов, которое перебирается в цикле. Если при очередной смене Сч вернется пустой запрос – значит число символов равно Сч.

Функция ОпределитьДлину(ИмяСправочника, ИмяРеквизита)
	
	Запрос = Новый Запрос;
	ЗапросТекст = "ВЫБРАТЬ Ссылка ИЗ Справочник." + ИмяСправочника; 
	
	Сч = 0;
	Пока Истина Цикл
		
		Запрос.Текст = ЗапросТекст + " ГДЕ " + ИмяРеквизита + " > ПОДСТРОКА(" + ИмяРеквизита + ", 1, " + Сч +")";
		Если Запрос.Выполнить().Пустой() Тогда
			Прервать;
		КонецЕсли;
				
		Сч = Сч + 1;
		
	КонецЦикла;
	
	Возврат Сч;
		
КонецФункции

Скачать файлы

Наименование Файл Версия Размер
ПроверкаДлиныКодаИНаименования
.epf 6,73Kb
06.01.17
0
.epf 6,73Kb Скачать

См. также

Комментарии
1. Олег Медведев (olgerd666) 28 09.01.17 09:04 Сейчас в теме


(0)
Допустим есть справочник, который содержит записи, и нужно узнать какая максимальная длина у текстового реквизита(будь то Код, Наименование или другой реквизит).


ДлинаРеквизита = Документы.РеализацияТоваровУслуг.ПустаяСсылка().Метаданные().Реквизиты.ДоверенностьНомер.Тип.КвалификаторыСтроки.Длина;
2. Андрей Скрылев (SkrAn) 09.01.17 09:06 Сейчас в теме
Еще и 10SM неужели так цены в 17ом году выросли?)
3. Сергей (sstar90) 09.01.17 09:17 Сейчас в теме
Забыл указать, что твоя функция не работает для реквизита неограниченной длины
4. Konstantin Konstantin (KonstB) 162 11.01.17 10:36 Сейчас в теме
(0) Как же это развидеть...

Автор Вы не против если я скину твой код на сами знаете какой ресурс? :)
5. Алексей Смирнов (sm2701) 27 11.01.17 12:11 Сейчас в теме
(1) Вы не поняли задачу. Необходимо определить не длину реквизита, а необходимо определить фактическую максимальную длину значения записанную в этом реквизите.
Например в реквизите задана длина 100 символов. Но по факту максимальная длина значений 50 символов.
6. Алексей Смирнов (sm2701) 27 11.01.17 12:12 Сейчас в теме
(2) Код обработки в открытом виде в этом посте. Скачивать обработку нет никакой необходимости.
7. Oleg Space (spacecraft) 11.01.17 12:18 Сейчас в теме
(5) просто интересно, где это может пригодиться?
8. Алексей Ермилов (Alex_E) 1548 11.01.17 12:25 Сейчас в теме
Интересно, а тупо написать
ДлинаСтрокиРеквизита = СтрДлина(СокрЛП(Справочники[ИмяСправочника][ИмяРеквизита]));
не хай фай?
9. Алексей Смирнов (sm2701) 27 11.01.17 12:28 Сейчас в теме
(7) Перезиливали данные из других источников, и реквизиты создавали длиной на запас, когда все перенесли решили в том числе упорядочить и это.
10. Евгений Кузнецов (kuzev) 40 11.01.17 12:33 Сейчас в теме
11. Евгений Кузнецов (kuzev) 40 11.01.17 12:49 Сейчас в теме
(0) попробуйте подставлять значение Сч, вычисляя методом деления пополам, а не простым инкрементом. И временная таблица тоже может помочь. Хоть какая-то оптимизация =)
12. Петр Самчук (Frogger1971) 11.01.17 13:04 Сейчас в теме
(9) через метаданные получаешь все реквизиты, по каждому реквизиту выбираешь максимальное значение СтрДлина() и будет тебе счастье
13. Андрей Акулов (DrAku1a) 1201 12.01.17 03:35 Сейчас в теме
Запрос "Выбрать <ИмяРеквизита> из <Источник>", выполнить, выбрать и пройти циклом по результату делая СтрДлина(СокрЛП()).
Один запрос - один результат.
14. Сергей Рыбаков (Knych) 9 13.01.17 16:04 Сейчас в теме
(11)
Если говорить про оптимизацию, то можно еще не выбирать ссылку, а скажем "1" (все равно проверяется пустой/не пустой результат) ну и все такие ПЕРВЫЕ 1 тоже бы не помешали.


(13) Соглашусь, что запрос в цикле обычно не самая лучшая идея. Однако вариант выбрать все, скажем при количестве элементов в пару миллионов будет по моему гораздо хуже.
15. Sergey Andreev (starik-2005) 980 13.01.17 16:33 Сейчас в теме
ВЫБРАТЬ
МАКСИМУМ(
ВЫБОР
...
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(9)) ТОГДА 9
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(8)) ТОГДА 8
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(7)) ТОГДА 7
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(6)) ТОГДА 6
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(5)) ТОГДА 5
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(4)) ТОГДА 4
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(3)) ТОГДА 3
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(2)) ТОГДА 2
КОГДА Реквизит > ВЫРАЗИТЬ(Реквизит КАК Строка(1)) ТОГДА 1
КОНЕЦ) КАК МасксДлина
ИЗ Таблица
...Показать Скрыть
16. Sergey Andreev (starik-2005) 980 13.01.17 16:55 Сейчас в теме
До 1000 символов можно так одним запросом:
ВЫБРАТЬ
	0 КАК Чис
ПОМЕСТИТЬ ВТ1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	9
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ1.Чис + ВТ2.Чис * 10 + ВТ3.Чис * 100 КАК Чис
ПОМЕСТИТЬ ВТ2
ИЗ
	ВТ1 КАК ВТ1,
	ВТ1 КАК ВТ2,
	ВТ1 КАК ВТ3
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(ВЫБОР
			КОГДА НЕ ПОДСТРОКА(Контрагенты.Наименование, 1, ВТ2.Чис) ПОДОБНО ПОДСТРОКА(Контрагенты.Наименование, 1, ВТ2.Чис - 1)
				ТОГДА ВТ2.Чис
			ИНАЧЕ 0
		КОНЕЦ) КАК МаксимальнаяДлинаСтроки
ИЗ
	Справочник.Контрагенты КАК Контрагенты,
	ВТ2 КАК ВТ2
...Показать Скрыть
Оставьте свое сообщение