Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Печать адреса на конверте. Разделение названия фирмы на 2 строки.

Печать адреса на конверте. Разделение названия фирмы на 2 строки.
Я
   Босечка
 
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) или макет просто подогнать, само перенесет правильно
   Fish
 
3 - 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) Распиши.
   Fish
 
8 - 30.11.17 - 09:26
(5) Можно сделать так, что не будет разъезжаться. С бухией давно дела не имею, но не вижу проблемы.
   Fish
 
9 - 30.11.17 - 09:28
(6) вроде на просторах инета полно всяких обработок для печати на конвертах.
   Йохохо
 
10 - 30.11.17 - 09:36
(5) достаточно отключить автовысота и настроить, ага
(6) рисуешь макет, тратишь десяток А4 чтоб попасть, сохраняешь макет, профит. Никакого кода
 
 Рекламное место пустует
   probably
 
11 - 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
спасибо.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует