powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Макет отчета: как разбить строку произвольного текста на фрагменты?
16 сообщений из 16, страница 1 из 1
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #37999586
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Снова приветствую!

Есть макет отчета, в который выводится, например, получатель документов.
Если наименование получателя шибко длинное - тут есть свойство ячейки "Переносить по словам" (вроде, так). Тогда в ячейку влезет всё, а сама она подрастет в высоту.

А вот как быть со случаями, когда надо это наименование разбить на несколько фрагментов, которые поместились бы по ширине в фиксированной ширины ячейку? Т.е. надо как-то длинное наименование разместить в несколько строк, представленных на картинке-примере. Видно, что минимальное количество строк - 4, но возможно увеличение этого количества, в зависимости от длины строки, которую надо в них разместить.

Как быть? Сталкивался кто?

Ваяю: MS Access 2003, mdb | VB.NET + mdb/SQL Express | 1С 8.2.14, тонкий клиент, управляемое приложение
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #37999617
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пиши функцию которая бы разбила строку и возвратила бы массив строк. Можно написать как рекурсией, так и с помощью типовых функций работы со строкой. Функции split в 1С нет.
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #37999806
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте моноширинный шрифт и подстроки.
ЗЫ Многие правилами и знаками переноса не заморачиваются.
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000052
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMПиши функцию которая бы разбила строку и возвратила бы массив строк
От этого и хотел уйти...

AHDPИспользуйте моноширинный шрифт и подстроки.
ЗЫ Многие правилами и знаками переноса не заморачиваются.
Моноширинка навряд ли пойдет... Документ будет смотреться немонолитно. Я сторонник эстетики. =)
А что такое "подстроки"?
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000078
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лев(), Сред(), Прав().
А иначе вы ширину не угадаете и не отследите.
ЗЫ Меня устраивали напечатанные на машинке документы, да и форум вполне прилично выглядит. ;)
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000084
Kreontsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что тут делать, у тебя ж шаблон всегда на 4-ре строки:
Перем ДлиннаяСтрока;

кусок1 = Сред(ДлиннаяСтрока,1,50);
кусок2 = Сред(ДлиннаяСтрока,51,50);
кусок3 = Сред(ДлиннаяСтрока,101,50);
кусок4 = Сред(ДлиннаяСтрока,151);// а вот если еще больше, тогда не влезет :)

Вместо 50-только подобрать надо сколько для строки надо
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000172
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KreontsaДа что тут делать, у тебя ж шаблон всегда на 4-ре строки:
Перем ДлиннаяСтрока;

кусок1 = Сред(ДлиннаяСтрока,1,50);
кусок2 = Сред(ДлиннаяСтрока,51,50);
кусок3 = Сред(ДлиннаяСтрока,101,50);
кусок4 = Сред(ДлиннаяСтрока,151);// а вот если еще больше, тогда не влезет :)

Вместо 50-только подобрать надо сколько для строки надо

Дык я так и сделал. А запостился во имя поиска более оптимальных решений.
Единственное, я не тупо режу строку по длине, а беру макс.символов, влезающих в строку, и иду посимвольно назад в поисках пробела, чтобы по словам переносить. =)
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000179
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя, если честно, смысла не вижу в этих межстрочных подсказках мелким шрифтом... Ну почему я в настроенном макете, заполняющемся программно, должен реализовывать подсказки, предназначенные для ручного заполнения?! Но - заказчик хочет. Блинский!
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000196
Kreontsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ети подсказки скорей всего "кемто" утвержд.бланк :)
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38000220
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kreontsaети подсказки скорей всего "кемто" утвержд.бланк :)
В том-то и беда, что Вы правы. =) Я, конечно, никто - для того чтобы судить подобные изыски, - но ИМХО это мусор, который а) "ломает" читабельность документа, б) занимает место на бумаге да и в) просто не нужен в условиях автозаполнения документа.

Если я получаю Свидетельство на право собственности, к примеру, мне ведь (да и прочим "органам") важны те сведения, которые написаны крупным шрифтом:
Документ...земельный участок, категория земель - земли населенных пунктов, вид разрешенного использования - для индивидуального жилищного строительства, площадь - 2500 кв.м ... внесена регистрационная запись № 55/55-5555-555555 от 11.11.1111 г. ...

ВСЁ! И до банана всем, что Управление Росреестра по Ленинградской области - это (судя по подсказке) "орган, уполномоченный на регистрацию прав на недвижимое имущество и сделок с ним" (как-то так). А программа сама разберется, куда ей какие сведения впихуять.

Не? =)
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38001259
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Намутил функцию для универсальности:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//Функция нарезает передаваемую в нее строку произвольной длины на массив строк, длина
//каждой из которых не превышает заданную длину. Перенос осуществляется по словам.
Функция НарезатьТекстНаСтрокиОпределеннойДлины(ИсходныйТекст,МаксДлинаСтроки) Экспорт
	Результат = Новый Массив;
	Конец = Ложь;
	НачалоСтроки = 1;
	Пока НЕ Конец Цикл
		Строка = Сред(ИсходныйТекст,НачалоСтроки,МаксДлинаСтроки);
		Если НЕ СтрДлина(Строка) < МаксДлинаСтроки Тогда
			ПроверяемаяПозиция = МаксДлинаСтроки;
			Пока НЕ Сред(Строка,ПроверяемаяПозиция,1) = " " И НЕ Сред(Строка,ПроверяемаяПозиция,1) = "-" Цикл
				ПроверяемаяПозиция = ПроверяемаяПозиция - 1;
			КонецЦикла;
			Строка = Лев(Строка,ПроверяемаяПозиция);
		Иначе 
			Конец = Истина;
		КонецЕсли; 
		Результат.Добавить(Строка);
		НачалоСтроки = НачалоСтроки + ПроверяемаяПозиция;
	КонецЦикла; 
	Возврат Результат;
КонецФункции



Из известных косяков: не учел случаи, когда макс.длина строки меньше длины одного слова. Например, если максимальная длина строки равна 10 символам, а попалось слово длиной >=10 символов, то вылетит с ошибкой. Но мне таких случаев не видать.
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38001320
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, для наглядности закинул на Яндекс.Диск 5-метровую видяшку на полторы минуты для демонстрации того, как все настроено и как выглядит описываемая ошибка.

Слезно прошу помочь...
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38001328
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КириллНВот, для наглядности закинул на Яндекс.Диск 5-метровую видяшку на полторы минуты для демонстрации того, как все настроено и как выглядит описываемая ошибка.

Слезно прошу помочь...

Блин, не в тот топик...
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38001574
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллННамутил функцию для универсальности:
Это не намутил... более мутная функция это моя... она учитывает что слово может не влазить в максимальную длину и берет слово целиком.

PS: Функция написана с помощью рекурсии и не является оптимальной как с точки зрения ресурсов так и скорости.
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38001876
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшая оптимизация кода:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Функция РазбитьСтроку( Знач РазбиваемаяСтрока, Знач ДлиннаСтроки, МассивСтрок = Неопределено, НачальнаяДлинна = Неопределено )

	Если МассивСтрок = Неопределено Тогда
		МассивСтрок = Новый Массив;
		НачальнаяДлинна = ДлиннаСтроки;
	КонецЕсли;

	Если СтрДлина( РазбиваемаяСтрока ) > ДлиннаСтроки Тогда

		Если Сред( РазбиваемаяСтрока, ДлиннаСтроки, 1 ) = " " Тогда
			МассивСтрок.Добавить( Лев( РазбиваемаяСтрока, ДлиннаСтроки ) );
			ПоискПробела = СокрЛ( Сред( РазбиваемаяСтрока, ДлиннаСтроки ) );
			ДлиннаСтроки = НачальнаяДлинна;
			РазбитьСтроку( ПоискПробела, ДлиннаСтроки, МассивСтрок, НачальнаяДлинна );
		Иначе
			ПоискПробела = Лев( РазбиваемаяСтрока, ДлиннаСтроки );
			ДлинаСловаБольшеОграничения = Истина;

			Для Индекс = ?( ДлиннаСтроки = НачальнаяДлинна, 1, ДлиннаСтроки ) По ДлиннаСтроки Цикл
				Если Сред( ПоискПробела, ДлиннаСтроки - Индекс, 1 ) = " " Тогда
					МассивСтрок.Добавить(  СокрЛП( Лев( РазбиваемаяСтрока, ДлиннаСтроки - Индекс ) ) );
					РазбитьСтроку( СокрЛ( Сред( РазбиваемаяСтрока, ДлиннаСтроки - Индекс ) ), ДлиннаСтроки, МассивСтрок, НачальнаяДлинна );
					ДлинаСловаБольшеОграничения = Ложь;
					Прервать;
				КонецЕсли;

			КонецЦикла;

			Если ДлинаСловаБольшеОграничения Тогда
				РазбитьСтроку( РазбиваемаяСтрока, ДлиннаСтроки + 1, МассивСтрок, НачальнаяДлинна );
			КонецЕсли;

		КонецЕсли;

	Иначе
		МассивСтрок.Добавить( СокрЛП( РазбиваемаяСтрока ) );
		ДлиннаСтроки = НачальнаяДлинна;

	КонецЕсли;

	Возврат МассивСтрок;

КонецФункции
...
Рейтинг: 0 / 0
Макет отчета: как разбить строку произвольного текста на фрагменты?
    #38002957
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaM,

Крутяк. =) Только сложновато для восприятия.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Макет отчета: как разбить строку произвольного текста на фрагменты?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]