Имя: Пароль:
1C
1C 7.7
v7: Перенос счет-фактуры на новую страницу.
0 kobzon
 
23.06.14
08:43
Подскажите кто в курсе.
Есть переписанный ПУБ. Переносил базу на новый сервак, слетели пользовательские настройки по печатным формам документов.
Оператор начал жаловаться что печатная форма счет-фактуры режет лист когда захочет. Думал проблема в моей базе, скачал последний ПУБ демо а там так же режется. То есть может получиться что будет шапка с заголовками, потом строка, а на другой странице только повтор заголовков и подвал. А то и только часть подвала перенесется.
Почему так? Или нет особых требований к разрыва в счет-фактурах?
1 Ясный перец
 
23.06.14
08:47
Параметры страницы (под каждым юзером) настроить надо и всё.
А принудительный разрыв страницы установлен, видимо, в модуле печати (по крайней мере так в обычной бухгалтерии)
2 kobzon
 
23.06.14
08:52
(1) В смысле в процедуре печати?
Я вот хоть убей не вижу условий по переносу, ни от ширины таблицы/секции ни от количества строк.
3 Ясный перец
 
23.06.14
08:53
(2) Ну, значит, нету... (я же про обычную бухгалтерию говорил)
4 Джордж1
 
23.06.14
08:54
сч/ф вроде в коде на страницы не режется
С полями поиграйтесь
5 Ясный перец
 
23.06.14
08:57
(4) Вот и я о том же. А в коде процедуры ПечатьВстроенная() принудительно выставляются только ландшафт и автомасштаб.
6 kobzon
 
23.06.14
09:04
(4) Ну поиграюсь с полями, входило 20 строк, будет входить 21 и снова отрежет. Мне важно знать можно ли чтобы резалось, а то потом клиенты будут требовать замены.
7 Ясный перец
 
23.06.14
09:09
(6) Чтобы резалось - можно. Шапка выводится на обеих страницах и нумерация строк не прерывается.
А клиенты - они такие клиенты иногда... )))
8 kobzon
 
23.06.14
09:14
(7) Да если б резалось нормально а то половина подвала на первой странице, половина на второй.
9 Ясный перец
 
23.06.14
09:23
(8) Посмотри код процедуры ПечатьВстроенная() в документе РеализацияПродукции.
Там есть переменная СтрокНаСтранице. Попробуй обыграть так же в СчетФактуре.
Лучше, конечно, внешней печатной формой реализовать. Хотя, тут уже на ваше усмотрение.
10 kobzon
 
23.06.14
09:27
(9) Хотел, даже начал но забил на это. Строк обычно то пусто, то густо поэтому замучишься условия создавать, а если строк столько то шапка тут, а если столько то там.. Пусть тогда пока так будет)
11 Ясный перец
 
23.06.14
09:28
(10) Вот и правильно ))
12 Масянька
 
23.06.14
09:35
(9) Я резала принудительно:
//********************************************************************************
Функция РасчетОднойСтрокиТЧ(МнЧ, ТекСтрока)

    МнЧ.ПолучитьСтрокуПоНомеру(ТекСтрока);
    
    // наименование товара
    мНаименование         = СокрЛП(МнЧ.Номенклатура.ПолнНаименование);
    мДлинаНаименования     = СтрДлина(мНаименование);
    мСтрокиТовар        = Цел(Окр((мДлинаНаименования / 48) + 0.5));

    // высота ячейки "В том числе акциз" = 2
    мСтрокиАкциз = 2;
    
    // название страны
    мСтрана            = СокрЛП(МнЧ.СтранаН);
    мДлинаСтраны    = СтрДлина(мСтрана);
    мСтрокиСтрана    = Цел(Окр((мДлинаСтраны / 12) + 0.5));

    // выбираем наибольшую высоту строки - АКЦИЗ, СТРАНА, НАИМЕНОВАНИЕ
    мСтроки = Макс(мСтрокиТовар, мСтрокиАкциз, мСтрокиСтрана);

    Если мСтроки = 1 Тогда
        Строки = 4;
    ИначеЕсли мСтроки = 2 Тогда
        Строки = 6.5;
    Иначе
        Строки = мСтроки * 3;
    КонецЕсли;

    Возврат Строки;
    
КонецФункции    // РасчетСтрокТЧ

//********************************************************************************
Функция РасчетСтрокТЧ(МнЧ)

    Строки = 0;
    МнЧ.ВыбратьСтроки();
    
    Пока МнЧ.ПолучитьСтроку() = 1 Цикл
        мСтроки = РасчетОднойСтрокиТЧ(МнЧ, МнЧ.НомерСтроки);
        Строки = Строки + мСтроки;
    КонецЦикла;

    Возврат Строки;
    
КонецФункции    // РасчетСтрокТЧ

//********************************************************************************
Функция РазбитьТекстНаСтроки(мСтрока, мДлинаПечатнойСтроки) Экспорт

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

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

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

//********************************************************************************
Процедура ВывестиСтроки(ПечТабл, МнЧ, НачСтрока, КонСтрока)
    
    ТекСтрока = НачСтрока;
    
    Пока ТекСтрока <= КонСтрока Цикл
        
        Ном    = ТекСтрока;
        
        МнЧ.ПолучитьСтрокуПоНомеру(ТекСтрока);

        ПечНомерПП        = МнЧ.НомерСтроки;
        Номенклатура    = МнЧ.Номенклатура.ПолнНаименование;
        Единица         = МнЧ.Единица;
        Количество         = МнЧ.Количество;
        Цена             = МнЧ.Цена;
        СуммаБезНДС        = МнЧ.СуммаБезНДС;
        Акциз            = МнЧ.Акциз;
        СуммаНДС         = МнЧ.СуммаНДС;
        СуммаНП         = МнЧ.СуммаНП;
        СтавкаНДС         = МнЧ.СтавкаНДС;
        Сумма            = МнЧ.Сумма;
        СтранаК            = МнЧ.СтранаК;
        СтранаН            = МнЧ.СтранаН;
        НомерГТД        = МнЧ.НомерГТД;
        
        // тупо разбиваем наименование на строки по 48 символа
        ПечНоменклатура    = РазбитьТекстНаСтроки(Номенклатура, 48);
        
        Если ПустоеЗначение(МнЧ.Единица) = 0 Тогда
            ПечЕдиница        = СокрЛП(Единица.ОКЕИ.Наименование);
            ПечЕдиницаКод    = СокрЛП(Единица.ОКЕИ.Код);
        Иначе
            ПечЕдиница        = КороткийПрочерк;
            ПечЕдиницаКод    = КороткийПрочерк;
        КонецЕсли;
        
        ПечКоличество    = Количество;
        ПечСумма        = СуммаБезНДС;
        ПечЦена            = МнЧ.Цена;
        ПечАкциз        = МнЧ.Акциз;

        Если (УчитыватьНДС = 1) Тогда
            ПечСтавкаНДС    = МнЧ.СтавкаНДС;
            ПечСуммаНДС     = МнЧ.СуммаНДС;
        Иначе
            ПечСтавкаНДС    = "Без НДС";
            ПечСуммаНДС        = 0;
        КонецЕсли;
        
        ПечВсегоСНДС     = Сумма;
        
        Если (МнЧ.СтранаК = "0") или (ПустоеЗначение(МнЧ.СтранаК) = 1) Тогда
            ПечСтранаК    = КороткийПрочерк;
            ПечСтранаН    = Прочерк;
        Иначе
            ПечСтранаК    = МнЧ.СтранаК;
            ПечСтранаН    = МнЧ.СтранаН;
        КонецЕсли;

        Если (СтрДлина(МнЧ.НомерГТД) = 4)  или (ПустоеЗначение(МнЧ.СтранаК) = 1) Тогда
            ПечНомерГТД    = Прочерк;
        Иначе
            ПечНомерГТД    = МнЧ.НомерГТД;
        КонецЕсли;

        ПечТабл.ВывестиСекцию("Строка");
        
        // итоги по странице
        ИтогоСуммаБезНДСНаСтранице    = ИтогоСуммаБезНДСНаСтранице + ПечСумма;
        ИтогоСуммаНДСНаСтранице        = ИтогоСуммаНДСНаСтранице + ПечСуммаНДС;
        ИтогоСуммаСНДСНаСтранице    = ИтогоСуммаСНДСНаСтранице + ПечВсегоСНДС;
        
        ТекСтрока = ТекСтрока + 1;

        // итоги по документу
        ИтогоСуммаБезНДС    = ИтогоСуммаБезНДС + ПечСумма;
        ИтогоСуммаНДС        = ИтогоСуммаНДС + ПечСуммаНДС;
        ИтогоСуммаСНДС        = ИтогоСуммаСНДС + ПечВсегоСНДС;

    КонецЦикла;
    
КонецПроцедуры    // ВывестиСтроки

//********************************************************************************
Функция ДобавитьСтраницу(МнЧ, Страницы, ТипСтраницы, ТекСтрока, ПространствоДляСтрок)
    
    ЗанятоеПространство = 0;

    Для Ч = ТекСтрока По КоличествоСтрок Цикл
        ВысотаТекущейСтроки = РасчетОднойСтрокиТЧ(МнЧ, Ч);

        Если ВысотаТекущейСтроки > ПространствоДляСтрок Тогда
            ВысотаТекущейСтроки = ПространствоДляСтрок;
        КонецЕсли;
        
        Если (ЗанятоеПространство + ВысотаТекущейСтроки) > ПространствоДляСтрок Тогда
            Прервать;
        КонецЕсли;
        
        ЗанятоеПространство = ЗанятоеПространство + ВысотаТекущейСтроки;
    КонецЦикла;

    Если Ч = КоличествоСтрок + 1 Тогда

        ОстатокПространства = ПространствоДляСтрок - ЗанятоеПространство;

        // на страницу влез остаток строк - необходимо одну строку перенести на страницу с подвалом
        Если (ОстатокПространства <= ВысотаПодвала) Тогда
            Страницы.НоваяСтрока();
            Страницы.Тип         = ТипСтраницы;
            Страницы.НачСтрока     = ТекСтрока;
            Страницы.КонСтрока     = КоличествоСтрок - 1;
            
            Страницы.НоваяСтрока();
            Страницы.Тип         = "СтрокиПодвал";
            Страницы.НачСтрока     = КоличествоСтрок;
            Страницы.КонСтрока     = КоличествоСтрок;
        Иначе
            Если ТипСтраницы = "ШапкаСтроки" Тогда
                Тип = "ШапкаСтрокиПодвал";
            Иначе
                Тип = "СтрокиПодвал";
            КонецЕсли;
            Страницы.НоваяСтрока();
            Страницы.Тип         = Тип;
            Страницы.НачСтрока     = ТекСтрока;
            Страницы.КонСтрока     = КоличествоСтрок;
        КонецЕсли;
        
        Возврат 0;
        
    КонецЕсли;

    Страницы.НоваяСтрока();
    Страницы.Тип         = ТипСтраницы;
    Страницы.НачСтрока     = ТекСтрока;
    Страницы.КонСтрока     = Ч - 1;
    
    ТекСтрока = Ч;
    
    Возврат 1;
    
КонецФункции    // ДобавитьСтраницу

//********************************************************************************
Функция РазбитьНаСтраницы(МнЧ)
    
    Перем ПарамШапки;

    Страницы = СоздатьОбъект("ТаблицаЗначений");
    
    Страницы.НоваяКолонка("Тип",         "Строка");
    Страницы.НоваяКолонка("НачСтрока",     "Число", 10, 0);
    Страницы.НоваяКолонка("КонСтрока",     "Число", 10, 0);
    
    ПечТабл = СоздатьОбъект("Таблица");
    ПечТабл.ИсходнаяТаблица("Таблица");
    
    Инициализация();
    ИнициализацияСтраницы();
    
    // шапка: секции Шапка (17 строк) и ЗаголовокТаблицы (10 строк)
    
    // высота шапки зависит от наименований контрагента и наших
    мГрузополучатель    = Цел(Окр((СтрДлина(Грузополучатель) / 150) + 0.5));
    мПокупатель         = Цел(Окр((СтрДлина(Покупатель) / 150) + 0.5));
    
    ВысотаШапкиВСтроках = 15 + 10 + мГрузополучатель + мПокупатель;

    ВысотаШапки = ВысотаШапкиВСтроках * ВысотаОднойСтроки;

    ВысотаСтраницы     = 201;    //300;    //205; //201;    
    
    // секции: ШапкаТаблицы (10 строк) - зададим жестко
    ВысотаЗаголовкаТаблицы     = 42;

    // секции: ИтогоПоСтранице занимает 1 строку
    ВысотаИтоговПоСтранице     = 4;
    
    // подвал занимает 11 строк, из которых 2 строки уменьшенные, поэтому зададим жестко в цифрах
    ВысотаПодвала     = 45;    //50;    //55;    //60;

    // высота всех строк - а вдруг на 1 лист влезет
    ОбщаяВысотаСтрок = РасчетСтрокТЧ(МнЧ);

    // проверяем - можно ли все уместить на одной странице.
    // Для этого зададим жестко высоту первой страницы
    ВысотаПервойСтраницы = 270;    //270;    //280;    //266;    //264; //258;    //261
    // Посчитаем все строки (шапка + заголвок + таб. часть + подвал) + поправка
    НаСтраницу = ВысотаШапки + ВысотаЗаголовкаТаблицы + ВысотаИтоговПоСтранице + ВысотаПодвала + ОбщаяВысотаСтрок;
    
//Сообщить("1 - " + ВысотаПервойСтраницы + " - " + НаСтраницу);

    Если (НаСтраницу <= ВысотаПервойСтраницы) Тогда
        // можно все уместить на одной странице
        Страницы.НоваяСтрока();
        Страницы.Тип = "ШапкаСтрокиПодвал";
        Страницы.НачСтрока = 1;
        Страницы.КонСтрока = КоличествоСтрок;
        Возврат Страницы;
    Иначе
        // нужно разбивать на страницы
        
        // 1 страница
        ТекСтрока = 1;
        // высота первой страницы (если все не поместилось на 1 страницу)
        ПространствоДляСтрок = ВысотаПервойСтраницы - ВысотаШапки - ВысотаЗаголовкаТаблицы - ВысотаИтоговПоСтранице - 19;

        // возможно, что все уместилось на 2 страницах
        Если ДобавитьСтраницу(МнЧ, Страницы, "ШапкаСтроки", ТекСтрока, ПространствоДляСтрок) = 0 Тогда
            Возврат Страницы;
        КонецЕсли;

        // остальные страницы
        ПространствоДляСтрок = ВысотаСтраницы - ВысотаЗаголовкаТаблицы - ВысотаИтоговПоСтранице;

        Пока ДобавитьСтраницу(МнЧ, Страницы, "Строки", ТекСтрока, ПространствоДляСтрок) = 1 Цикл
        КонецЦикла;
    КонецЕсли;
    
    Возврат Страницы;
    
КонецФункции    // РазбитьНаСтраницы

В одной строке (к примеру) помещается (по-любому) 45 символов - значит остальное - на следующую строку.
Короче, поройся - может подойдет.
13 kobzon
 
23.06.14
09:39
(12) Нихренасебе) Да ты целую программу написал)
Посмотрю, спасибо)
14 Масянька
 
23.06.14
09:42
(13) Меня, лично, задолбало, как 1с разбивает на страницы.
Сама идею - не моя (в инете нашла).
Тоже самое реализовано и в ТОРГ-12, и в Акте.
Все - внешние формы.
15 kobzon
 
23.06.14
09:48
(14) Восьмерка в этом плане отлично работает. Там бы подсмотреть что да как) Только искать замучишься))
16 kobzon
 
23.06.14
16:54
Чето седня какие то заморочки. В ТТН В Грузополучатель и в Плательщик разве юридический адрес заносится???
17 Злопчинский
 
23.06.14
21:23
(8) это решается штатными установками печформы и незначительным кодом в самой печформе - такая подкрутка приводит к тому, что например подвал никогда не будет отдельно на странице.. или подвал не будет разовран...
18 Злопчинский
 
23.06.14
21:27
(14) хреновое решение, сильно длинное и замороченное. есть два более простых решения. там где не надо итогов по странице - вообще решается двумя/тремя строками кода.
.
там где надо итоги по странице - чуток подлинее, но гораздо проще и красивше чем туча кода в (13).
.
вариант года одна строка с шапкой и подвалом не влазит полностью на страницу - отметаем как экстремистский...
19 Злопчинский
 
23.06.14
21:27
(14) не ходите в инет, он учит плохому, там мусора много
;-) (просто злобствую)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший