Имя: Пароль:
1C
1С v8
Печать адреса на конверте. Разделение названия фирмы на 2 строки.
0 Босечка
 
30.11.17
09:13
Надо сделать разделение название фирмы на 2 строки. И адрес на 2 строки для печати на конверте . Кто-нибудь имел с этим дело?
1 Масянька
 
30.11.17
09:16
(0)     Перем ПечАдресОтправителя[2];
    Перем ПечПолучатель[2];
    Перем ПечАдресПолучателя[4];

    СписокДанных = СоздатьОбъект("СписокЗначений");
    
    ПечТабл = СоздатьОбъект("Таблица");

    Если (ФорматКонверта = 1) Тогда
        ПечТабл.ИсходнаяТаблица("Е65");
    Иначе
        ПечТабл.ИсходнаяТаблица("С4");
    КонецЕсли;
    
    Результат = Проверка(Отправитель, Получатель);
    
    Если (Результат <> 0) Тогда Возврат; КонецЕсли;
    
    // оправитель
    // наименование
    ПечОтправитель = СокрЛП(Отправитель.ЮрЛицо.Наименование);
    
    // адрес - разбиваем на строки
    СписокДанных.УдалитьВсе();
    СписокДанных = Строковые.стрРазбитьТекстНаСтроки(СокрЛП(ПолучитьАдрес(Отправитель.ЮрЛицо.ФактАдрес)), 39, 1);    
    КоличествоПечатныхСтрок = СписокДанных.РазмерСписка();
    
    Для Счетчик = 1 По КоличествоПечатныхСтрок Цикл
        ПечАдресОтправителя[Счетчик] = СписокДанных.ПолучитьЗначение(Счетчик);
    КонецЦикла;

стрРазбитьТекстНаСтроки:
        СписокСтрок = СоздатьОбъект("СписокЗначений");    
        
        ДлинаСтроки     = СтрДлина(мСтрока);
        ТекстПострочно    = СтрЗаменить(мСтрока, " ", "" "");
        КоличествоСлов    = СтрКоличествоСтрок(ТекстПострочно);
        СтрокаНаПечать     = СтрПолучитьСтроку(ТекстПострочно, 1);
        СчетчикВывода    = 1;
        
        Для Счетчик = 2 По КоличествоСлов Цикл
            ДлинаСтроки = СтрДлина(СтрокаНаПечать);
            ДлинаСлова     = СтрДлина(СтрПолучитьСтроку(ТекстПострочно, Счетчик)) ;
            ОбщаяДлина     = ДлинаСлова + ДлинаСтроки;
            
            Если (ОбщаяДлина) >= мДлинаПечатнойСтроки Тогда
                СписокСтрок.ДобавитьЗначение(СтрокаНаПечать);
                СтрокаНаПечать     = СтрПолучитьСтроку(ТекстПострочно, Счетчик);
                СчетчикВывода     = СчетчикВывода + 1;
            Иначе
                СтрокаНаПечать    = СтрокаНаПечать + " " + СтрПолучитьСтроку(ТекстПострочно, Счетчик);
            КонецЕсли;
            
        КонецЦикла;
        
        СписокСтрок.ДобавитьЗначение(СтрокаНаПечать);
        
        Возврат СписокСтрок;
2 Йохохо
 
30.11.17
09:18
(1) ошибка, не учтен разделитель
ОбщаяДлина     = ДлинаСлова + ДлинаСтроки;
(0) или макет просто подогнать, само перенесет правильно
3 Fish
 
гуру
30.11.17
09:20
(0) А что, автоперенос не устраивает?
4 Масянька
 
30.11.17
09:20
(2) Какой разделитель?
5 Масянька
 
30.11.17
09:23
(2) (3) Например, доверенность на ТОРГ-12. В ней отводится три (по-моему) строки для данных доверенности. Но - слева идут подписи продавца. И если подгонять макет и использовать автоперенос - подвал (с подписями) разъезжается.
Попробуйте и убедитесь.
6 Босечка
 
30.11.17
09:23
(0) Нет к сожалению, надо на конверте напечатать попасть в конкретные строки
7 Масянька
 
30.11.17
09:23
(6) Распиши.
8 Fish
 
гуру
30.11.17
09:26
(5) Можно сделать так, что не будет разъезжаться. С бухией давно дела не имею, но не вижу проблемы.
9 Fish
 
гуру
30.11.17
09:28
(6) вроде на просторах инета полно всяких обработок для печати на конвертах.
10 Йохохо
 
30.11.17
09:36
(5) достаточно отключить автовысота и настроить, ага
(6) рисуешь макет, тратишь десяток А4 чтоб попасть, сохраняешь макет, профит. Никакого кода
11 probably
 
30.11.17
09:42
(6) в унф заполняется кодом - проверяют, уместится ли на строке слово и если нет, то заполняют следующую.
Предположу, что в бп так же и надо разобраться почему не переносит
12 Босечка
 
30.11.17
10:49
(1) стрРазбитьТекстНаСтроки( это в какой конфе?
13 Масянька
 
30.11.17
11:16
(12) Там ниже код. Это самописка. И, это, забыла сказать - код семерочный.
У меня в семерке реализовано 2 конверта С4 и Е65, внешняя обработка. Конверты чисто белые (закуплены), печатается лицо (отправитель/получатель), на почте клеят марки.
14 Босечка
 
30.11.17
11:16
(1) Если можно скиньте мне эту функцию, а то у меня такой нет. Мне надо разбить текст на строки фиксированной длины.
15 Злопчинский
 
30.11.17
11:19
(14) это только если курьером
16 Масянька
 
30.11.17
11:22
(14) Функция стрРазбитьТекстНаСтрокиГлавная(мСтрока, мДлинаПечатнойСтроки, мРежим = 0) Экспорт

    // мРежим: 0 - возвращаем одну строку с разделителями, 1 - возвращаем массив строк

    Если (мРежим = 1) Тогда
        СписокСтрок = СоздатьОбъект("СписокЗначений");    
        
        ДлинаСтроки     = СтрДлина(мСтрока);
        ТекстПострочно    = СтрЗаменить(мСтрока, " ", "" "");
        КоличествоСлов    = СтрКоличествоСтрок(ТекстПострочно);
        СтрокаНаПечать     = СтрПолучитьСтроку(ТекстПострочно, 1);
        СчетчикВывода    = 1;
        
        Для Счетчик = 2 По КоличествоСлов Цикл
            ДлинаСтроки = СтрДлина(СтрокаНаПечать);
            ДлинаСлова     = СтрДлина(СтрПолучитьСтроку(ТекстПострочно, Счетчик)) ;
            ОбщаяДлина     = ДлинаСлова + ДлинаСтроки;
            
            Если (ОбщаяДлина) >= мДлинаПечатнойСтроки Тогда
                СписокСтрок.ДобавитьЗначение(СтрокаНаПечать);
                СтрокаНаПечать     = СтрПолучитьСтроку(ТекстПострочно, Счетчик);
                СчетчикВывода     = СчетчикВывода + 1;
            Иначе
                СтрокаНаПечать    = СтрокаНаПечать + " " + СтрПолучитьСтроку(ТекстПострочно, Счетчик);
            КонецЕсли;
            
        КонецЦикла;
        
        СписокСтрок.ДобавитьЗначение(СтрокаНаПечать);
        
        Возврат СписокСтрок;
    Иначе
        ОдинСимволВОстатке = 0;
        
        Список = СоздатьОбъект("СписокЗначений");
        
        СтрокаПеч     = "";
        Разделитель = "";
        ДлинаСтроки = СтрДлина(мСтрока);
        ПолныхСтрок = Цел(ДлинаСтроки / мДлинаПечатнойСтроки);
        
        СчетчикПолныхСтрок = 0;
        
        Если (ДлинаСтроки > мДлинаПечатнойСтроки) Тогда
            Для СчетчикСтроки = 1 По ДлинаСтроки Цикл
                СтрокаПеч     = СтрокаПеч + Сред(мСтрока, СчетчикСтроки, 1);
                ДлинаПечати = СтрДлина(СтрокаПеч);
                Если (ДлинаСтроки - СчетчикСтроки) = 2 Тогда
                    ПоследнийСимвол = Прав(мСтрока, 1);
                    Если (КодСимв(ПоследнийСимвол) = 41) Тогда
                        ОдинСимволВОстатке     = 1;
                        СтрокаПеч             = СтрокаПеч + Сред(мСтрока, СчетчикСтроки + 1, 2);
                        СчетчикСтроки         = СчетчикСтроки + 2;
                        ДлинаПечати         = ДлинаПечати + 2;
                    КонецЕсли;
                КонецЕсли;
                Если (ДлинаСтроки - СчетчикСтроки) = 1 Тогда
                    ОдинСимволВОстатке     = 1;
                    СтрокаПеч                = СтрокаПеч + Сред(мСтрока, СчетчикСтроки + 1, 1);
                    СчетчикСтроки         = СчетчикСтроки + 1;
                    ДлинаПечати         = ДлинаПечати + 1;
                КонецЕсли;
                Если ДлинаПечати >= мДлинаПечатнойСтроки Тогда
                    Список.ДобавитьЗначение(СтрокаПеч);
                    СтрокаПеч             = "";
                    СчетчикПолныхСтрок     = СчетчикПолныхСтрок + 1;
                КонецЕсли;
                Если СчетчикПолныхСтрок = ПолныхСтрок Тогда
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            
            Если (ОдинСимволВОстатке = 0) Тогда
                ОстатокСимволов = ДлинаСтроки - СчетчикСтроки;
                Остаток         = Сред(мСтрока, СчетчикСтроки + 1, ОстатокСимволов);
                Список.ДобавитьЗначение(Остаток);
            КонецЕсли;
            
            КолВоСтрок     = Список.РазмерСписка();
            НоваяСтрока = Список.ПолучитьЗначение(1);
            
            Если КолВоСтрок > 1 Тогда
                Для Врем = 2 По КолВоСтрок Цикл
                    ТекСтрока     = Список.ПолучитьЗначение(Врем);
                    НоваяСтрока = НоваяСтрока + РазделительСтрок + ТекСтрока;
                КонецЦикла;
            КонецЕсли;
            
        Иначе
            НоваяСтрока = мСтрока;
        КонецЕсли;
        
        Возврат НоваяСтрока;
        
    КонецЕсли;
    
КонецФункции    // стрРазбитьТекстНаСтрокистрРазбитьТекстНаСтрокиГлавная()

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

    // мРежим: 0 - возвращаем одну строку с разделителями, 1 - возвращаем массив строк

    НоваяСтрока = "";
    
    // сама строка может быть с переносом строк
    мСтрКолВоСтрок = СтрКоличествоСтрок(мИсхСтрока);

    // для режима 1 (массив строк) в самой строке не должно быть переносов
    Если ((мРежим = 1) И (мСтрКолВоСтрок > 1)) Тогда
        Предупреждение("Нельзя использовать перенос строк. " + РазделительСтрок +
                       "Исправьте строку:" + РазделительСтрок + мИсхСтрока);
        Возврат "";
    КонецЕсли;
    
    Если (мСтрКолВоСтрок = 1) Тогда        // если в самой строке нет переносов строки - просто разбиваем
        НоваяСтрока = стрРазбитьТекстНаСтрокиГлавная(мИсхСтрока, мДлинаПечатнойСтроки, мРежим);
    Иначе        // если в самой строке переносы строк есть - разбиваем в цикле для каждой строки
        Для Счетчик = 1 По мСтрКолВоСтрок Цикл
            мСтрока = СтрПолучитьСтроку(мИсхСтрока, Счетчик);
            НоваяСтрока = СокрЛП(НоваяСтрока) + РазделительСтрок + стрРазбитьТекстНаСтрокиГлавная(мСтрока, мДлинаПечатнойСтроки, мРежим);
        КонецЦикла;
    КонецЕсли;

    Возврат НоваяСтрока;
    
КонецФункции    // стрРазбитьТекстНаСтроки()

Только там через вспомогательную функцию (так надо).
17 Босечка
 
30.11.17
11:47
спасибо.
AdBlock убивает бесплатный контент. 1Сергей