|
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) не ходите в инет, он учит плохому, там мусора много
;-) (просто злобствую) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |