Имя: Пароль:
1C
1C 7.7
v7: Перенос текстовой переменной по ячейкам
0 gorlanovmax
 
30.03.16
12:01
Доброго дня.

Столкнулся с задачкой:
Есть форма уведомления, в ней есть поле для ввода ФИО, в макете каждая буква этого поля - отдельная ячейка. При этом поле ФИО в макете занимает две строки.
В настоящее время реализован вывод ФИО по ячейкам. При этом не учитывается конец первой строки и бывают ситуации, когда ФИО длинное и ЧАСТь отчества переносится на следующую строку (не полностью, а недостающая часть).
Раньше где-то натыкался на функцию переноса на следующую строку с учетом длины строки.
Сейчас не могу найти.
Поле ФИО привел как пример, в макете есть еще аналогичные поля адреса в которых более чем три слова в переменной.
Поэтому хотелось бы изобразить универсальную функцию переноса.
При этом для корректного отображения в макете, необходимо дополнять первую строку до конца строки пробелами
1 Ёпрст
 
гуру
30.03.16
12:03
ДлинаСтр в помощь
2 Масянька
 
30.03.16
12:07
(0) Функция глРазбитьТекстНаСтрокиДляПечати(мСтрока, мДлинаПечатнойСтроки) Экспорт

    ОдинСимволВОстатке = 0;
    
    Список = СоздатьОбъект("СписокЗначений");

    СтрокаПеч     = "";
    Разделитель = "";
    ДлинаСтроки = СтрДлина(мСтрока);
    ПолныхСтрок = Цел(ДлинаСтроки / мДлинаПечатнойСтроки);
    
    СчетчикПолныхСтрок = 0;

    Если (ДлинаСтроки > мДлинаПечатнойСтроки) Тогда
        Для СчетчикСтроки = 1 По ДлинаСтроки Цикл
            СтрокаПеч = СтрокаПеч + Сред(мСтрока, СчетчикСтроки, 1);
            ДлинаПечати = СтрДлина(СтрокаПеч);
            Если (ДлинаСтроки - СчетчикСтроки) = 1 Тогда
                ОдинСимволВОстатке = 1;
                СтрокаПеч = СтрокаПеч + Сред(мСтрока, СчетчикСтроки + 1, 1);
            КонецЕсли;
            Если ДлинаПечати >= мДлинаПечатнойСтроки Тогда
                Список.ДобавитьЗначение(СтрокаПеч);
                СтрокаПеч = "";
                СчетчикПолныхСтрок = СчетчикПолныхСтрок + 1;
            КонецЕсли;
            Если СчетчикПолныхСтрок = ПолныхСтрок Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        Если (ОдинСимволВОстатке = 0) Тогда
            ОстатокСимволов = ДлинаСтроки - СчетчикСтроки;
            Остаток         = Сред(мСтрока, СчетчикСтроки + 1, ОстатокСимволов);
            Список.ДобавитьЗначение(Остаток);
        КонецЕсли;
        
        КолВоСтрок     = Список.РазмерСписка();
        НоваяСтрока = Список.ПолучитьЗначение(1);
        
        Если КолВоСтрок > 1 Тогда
            Для Врем = 2 По КолВоСтрок Цикл
                ТекСтрока     = Список.ПолучитьЗначение(Врем);
                НоваяСтрока = НоваяСтрока + РазделительСтрок + ТекСтрока;
            КонецЦикла;
        КонецЕсли;
    Иначе
        НоваяСтрока = мСтрока;
    КонецЕсли;
    
    Возврат НоваяСтрока;
    
КонецФункции    // глРазбитьТекстНаСтрокиДляПечати
3 Злопчинский
 
30.03.16
12:08
(0) "При этом для корректного отображения в макете, необходимо дополнять первую строку до конца строки пробелами"
- смысл? как пробелы обозначать будешь?
4 gorlanovmax
 
30.03.16
13:43
(2) Это вроде оно. Сейчас попробую
5 gorlanovmax
 
30.03.16
13:48
(3) Смысл таков
В макете
есть две строки по 50 клеток для вывода ФИО
функция вывода примерно такова:

[code]
Функция В(Параметр, Индекс)
    Если ПустоеЗначение(Параметр)=1 Тогда
        Возврат "";
    КонецЕсли;
    Пар=СокрЛП(""+Параметр);
    Если СтрДлина(Пар)<Индекс Тогда
        Возврат "";
    КонецЕсли;
    Возврат ВРег(Сред(Параметр,Индекс,1));
КонецФункции //В
[/code]

При этом в ячейках первой строки вызываю функцию от В(Пар1,1) до В(Пар1,50)
и во второй строчке от В(Пар1,51) до В(Пар1,100)

Т.е. изначально я не делю выводимые данные на две строки.
Соотвественно когда я начну делить, мне надо дополнять до длины первой строки пробелы, для корректного вывода
6 MishaD
 
30.03.16
13:50
(3) чтобы знака переноса не было. А то будет
Злопчинский И
Ван Андреевич
7 gorlanovmax
 
30.03.16
15:05
(2) Нет. Это не то.
Пишу сам, выложу чуть позже
8 gorlanovmax
 
30.03.16
15:40
Вот так получилось

//мСтрока                 - строковая переменная для разбиения на строки  
//мДлинаПечатнойСтроки     - список значений, содержащий длины строк макета печати (т.к. они могут быть разными)
Функция глРазбитьТекстНаСтрокиДляПечати(мСтрока, мДлинаПечатнойСтроки) Экспорт
    
    КолвоСтрок=мДлинаПечатнойСтроки.РазмерСписка();

    ДлинаСтроки = СтрДлина(мСтрока);
    
    НоваяСтрока="";
    
    ДлинаТекСтроки=мДлинаПечатнойСтроки.ПолучитьЗначение(1);
    Ном = 1;
    
    Если (ДлинаСтроки > ДлинаТекСтроки) Тогда
        ПромСтрока=СтрЗаменить(мСтрока," ",РазделительСтрок);
        КолвоСлов=СтрКоличествоСтрок(ПромСтрока);
        Для н=1 По КолвоСлов Цикл
            ТекСлово=СтрПолучитьСтроку(ПромСтрока,н);
            Если (СтрДлина(НоваяСтрока)+СтрДлина(ТекСлово)+1)<=ДлинаТекСтроки Тогда
                НоваяСтрока=НоваяСтрока+ТекСлово+" ";
            Иначе
                ДополнениеСтроки=ДлинаТекСтроки-СтрДлина(НоваяСтрока);
                Для к=1 По ДополнениеСтроки Цикл
                    НоваяСтрока=НоваяСтрока+" ";
                КонецЦикла;
                Ном=Ном+1;
                Если Ном>КолвоСтрок Тогда
                    Прервать;
                КонецЕсли;
                НоваяСтрока=НоваяСтрока+ТекСлово+" ";
                ДлинаТекСтроки=ДлинаТекСтроки+мДлинаПечатнойСтроки.ПолучитьЗначение(Ном);
            КонецЕсли;
        КонецЦикла;
    Иначе
        НоваяСтрока=мСтрока;
    КонецЕсли;

    Возврат НоваяСтрока;
    
КонецФункции    // глРазбитьТекстНаСтрокиДляПечати
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн