Имя: Пароль:
1C
1C 7.7
v7: Перенос подвала печатной формы на следующую страницу
0 Kol Pecivanovich
 
07.09.17
17:07
Добрый день, коллеги!

Есть печать счета, в таблице счета строки переменной высоты (в зависимости от длины наименований),

есть ли для 7ки решения, как можно проверить, влазит подвал на текущую страницу или его нужно перенести на следующую страницу - по аналогии с методом ПроверитьВывод() в 8ке,

сделать строку фиксированной длины не вариант,

может есть внешняя компонента, делающая такую проверку, или кто-то реализовал такое в 7ке?
1 vova1122
 
07.09.17
17:16
Если нужно чтобы "подвал" не разрывался на разных страницах, Ть веделить весь подвал (кроме последней строки) ы в верхнем меню выбрать "печать со следующим"
2 Масянька
 
07.09.17
17:37
(0) "строки переменной высоты" - руками считаете или автомат стоит?
3 Смотрящий
 
07.09.17
17:48
(0) Выводить в 2 таблицы, проверять вывод по первой, модифицировать вторую. ее и показывать юзеру.
4 Злопчинский
 
07.09.17
17:51
(1) немножко не так
Для вывода строк сделать две идентичные секции. Первая как обычно. Она выводится для всех строк кроме последней строки.
Длямпоследней строки выводится вторая секция, которая имеет настройку "вместе со следующим"
5 Злопчинский
 
07.09.17
17:53
Все строки подвала кроме последней строки установить настройку *вместе со следующим*
6 Злопчинский
 
07.09.17
17:56
(0) в 77 есть метод КоличествоСтраниц()
Но как и в 8 - надо понимать к чему его применять. Некоторые долбодятлы считают что раз они считают что вывод будет на А4 - значит вывод будет на А4. На что я отвечаю - а вот вам МПХ
7 vova1122
 
08.09.17
08:51
(4) это для того чтобы на отдельной странице (если такова будет) остался не только подвал но и хотя-бы одна строка табличной части?
8 Масянька
 
08.09.17
08:58
У меня реализовано в печ. формах док-ов:
1. строка номенклатуры делится на заданное кол-во символов.
2. считаются строки шапки, заголовка таблицы, подвала.
3. в зависимости от строк на странице производится деление на страницы.
9 aka AMIGO
 
08.09.17
09:11
Вопрос давний.. И больной.
Конечно, считать строки можно, если на ячейках не установлено свойство "Перенос", и печатаемое вмешается в ячейку
Вопросы сыпались типа "Как тогда узнать высоту строки?"
Лет 8-9 назад было решение, но.. время утекло.

ЗЫ. Будет-ли перенос строки внутри ячейки таблицы - можно узнать программно. Типа СтрДлина()
Короче, это гемор..
Но можно, если потрудиться
И применить (8), да..
10 Смотрящий
 
08.09.17
09:13
(9) Решение было от avb, геморройное в плане предварительных телодвижений и не совсем корректное.
Парой таблиц и методом КоличествоСтраниц() все решается быстро и красиво
11 Масянька
 
08.09.17
09:14
(9) В стандарте 7.7 - высота строки 4.1 мм. (метод научного тыка).
Строки (номенклатуры) тупо режу на кол-во символов (например, 40). То есть при получении номенклатуры (наименования) есть кол-во строк данной строки в печ. форме.
12 2S
 
08.09.17
09:16
(11) а если строка с переносом?
(4)+100500
13 Масянька
 
08.09.17
09:17
(12) С каким переносом?
Ты не внимателен. Повторяю: строка режется на заданной кол-во символом.
14 aka AMIGO
 
08.09.17
09:20
(11)
Стандарт-стандартом, а если поменяли шрифт - вся настройка летит "вверх кармашками".. :)
Вот что-то осталось от avb: http://avb1c.narod.ru/?=a22
Есть-ли там нужное - не знаю
16 Масянька
 
08.09.17
09:21
(14) Если да кабы...
Пользователи предупреждены.
17 Масянька
 
08.09.17
09:21
(14) (15) У меня - пустые страницы.
18 aka AMIGO
 
08.09.17
09:23
(16) Ну, да.. геморройчик уменьшается :)
(17) в 15 - ошибка
А так - загадка..
У меня - в закладках, и открывается запросто, в FF
19 Масянька
 
08.09.17
09:25
(18) Если форматированном док-те Word'а изменить шрифт - полетит все форматирование. Демократия, блин...
20 aka AMIGO
 
08.09.17
09:27
21 aka AMIGO
 
08.09.17
09:28
И - сама статья:
Как вычислить высоту строки таблицы.


У ячеек таблиц в 1С есть свойство контроль, там можно выбрать "Переносить" и тогда не помещающийся по ширине текст будет автоматически переноситься на следующие строки в ячейке. Если высоту строки установить в "Авто", высота строки будет автоматически изменяться в зависимости от высоты введенного текста. Т.е. строки в отчёте получатся самопереносящимися и самораздвигающимися.

Всё бы хорошо, но как известно, метод ВысотаСтроки() возвращает 0, если высота строки установлена "Авто". Т.е. программно получить высоту такой строки нельзя, поэтому нельзя также получить и высоту всей таблицы в пунктах. А это бывает необходимо, например, для вставки переносов на следующую страницу, своевременной вставки "подвалов" страниц и т.п.

Идея вычисления высоты строки таблицы основана на том, что имея возможность узнать длину строки в пунктах ширины столбца, можно, достаточно точно, посчитать сколько раз она перенесётся. Кое-кто использует для этого моноширинный шрифт, но это не везде красиво. Чтобы иметь возможность такого подсчёта для немоноширинного шрифта, необходимо сперва составить массив ширин символов этого шрифта. Сделал я это примерно следующим образом:

Таб = СоздатьОбъект("Таблица");
Для Х = 1 По 255 Цикл
  Таб.Область(Х, 1).Текст = СтрЗаменить(Формат("", "С500"), " ", Симв(Х))
КонецЦикла;
Таб.Область(1, 1, 255, 1).Контроль(4);
Таб.Область(1, 1).ШиринаСтолбца(100);
Таб.Показать();

Затем вручную сократил текст во всех 255 строках до той длины, при которой текст помещается в одной строке. Сохранил таблицу в файл.

Таб = СоздатьОбъект("Таблица");
Таб.Открыть("МояТаблица.mxl");
Сп = СоздатьОбъект("СписокЗначений");
Для Х=1 По 255 Цикл
  Ч = СтрДлина(Таб.Область(Х, 1).Текст);
  Сп.ДобавитьЗначение(?(Ч = 0, 0, Окр(100/(Ч + 0.5), 3)));
КонецЦикла;
ЗначениеВФайл("Arial8.txt", Сп);

Вопрос "Что это за 0.5?" возникает? А это те пол-символа, которые среднестатистически ещё могли бы влезть в заданную ширину. Имя файла выбрано таким не случайно, оно содержит название и размер шрифта в "раздвижных" ячейках таблицы. Т.е. при использовании другого шрифта или размера вам придётся проделать всю эту работу ещё раз.

Чтобы избежать возможных ошибок, строки желательно раздвигать программно, т.е. высоту строки не устанавливать в "Авто". Поэтому необходимо также узнать высоту "однострочной" строки для текущего шрифта и приращение этой высоты, когда текст разбивается на две строки. Это я сделал просто, сначала посмотрел высоту "однострочной" строки (11.25), потом "двухстрочной" (21.75), приращение получилось - 10.5. Значения 11.25 и 10.5 имеет смысл добавить в наш список соответственно 256 и 257 значениями.

Теперь у нас есть всё необходимое для вычисления высоты строки.

Функция ПолучитьВысотуСтроки(Стр, ШиринаСтолбца, Шрифт)
  Длина = 0;
  Пробел = 0;
  Количество = 1;
  Для Х = 1 По СтрДлина(Стр) Цикл
    Код=КодСимв(Сред(Стр, Х, 1));
    Если Код = 32 Тогда Пробел = Длина КонецЕсли;
    Длина = Длина + Шрифт.ПолучитьЗначение(Код);
    Если Длина > ШиринаСтолбца Тогда
      Длина = ?(Пробел = 0, 0, Длина - Пробел);
      Количество = Количество + 1;
      Пробел = 0;
    КонецЕсли;
  КонецЦикла;
  Возврат Шрифт.ПолучитьЗначение(256) + (Количество - 1) * Шрифт.ПолучитьЗначение(257);
КонецФункции

Для проверки сделайте таблицу, в первой колонке которой, заполните текстом произвольной длины 10 строк. Установите контроль у заполненных ячеек в "Переносить". Сохраните с именем "ТестоваяТаблица.mxl".

Процедура Тест()
  Таб = СоздатьОбъект("Таблица");
  Таб.Открыть("ТестоваяТаблица.mxl");
  ШиринаСтолбца = Таб.Область(1, 1).ШиринаСтолбца();
  Шрифт = ЗначениеИзФайла("arial8.txt");
  Для Х = 1 По 10 Цикл
    ВысотаСтроки = ПолучитьВысотуСтроки(Таб.Область(Х, 1).Текст, ШиринаСтолбца, Шрифт);
    Таб.Область(Х, 1).ВысотаСтроки(ВысотаСтроки);
  КонецЦикла;
  Таб.Показать();
КонецПроцедуры

Такое вычисление оказывается весьма точным, наткнуться на "лишнюю" или "невлезшую" строку оказывается почти нереальным.

В заключении, хочу предложить всем, взявшим методику на вооружение, организовать обмен файликами ширин символов. Присылайте мне, буду выкладывать здесь. А для затравки выложу свой тестовый Arial8.txt :))

Arial 8pt normal by avb

Arial 9pt normal by wert
Arial 9pt bold by wert
Код функции, учитывающий разделители строк, by wert

Times New Roman 8pt normal by avb
Times New Roman 9pt normal by avb
Times New Roman 10pt normal by avb

Arial 10pt normal by Козлов Виктор
22 Масянька
 
08.09.17
09:29
(20) У меня была мысль - считать ширину каждого символа (тогда  строки красивее получаются), но начальство сказало - "Оно тебе надо?"
Поэтому тупо задано кол-во символов для строки.
23 aka AMIGO
 
08.09.17
09:30
(22) Ну, право начальство :)
24 Масянька
 
08.09.17
09:32
(23) Я тоже согласилась, когда попыталась... Вот это - геморройно.
25 aka AMIGO
 
08.09.17
09:43
(24) Какой у тебя браузер?
Странно это, что ссылка открывается в виде пустой страницы..
Там много интересного есть
А вот еще старый ресурс: http://my1c-archive.narod.ru/knowhow.html#EXCEL
26 aka AMIGO
 
08.09.17
09:45
27 Масянька
 
08.09.17
09:46
(25) Это работает. Лисичка.
28 aka AMIGO
 
08.09.17
09:47
(27) Может, прокси? Правда, у меня тоже через прокси пробивается.
29 Масянька
 
08.09.17
09:53
(28) Нет, прокси нет.
Хрен его знает - чего он моргает :)
30 aka AMIGO
 
08.09.17
09:56
(29) Жаль.
Вот такой вид главной страницы:
https://i.paste.pics/3b1e78866ef56a72bf2608c72430bfae.png
31 Масянька
 
08.09.17
10:46
(30) У меня в закладках есть :)
http://pastenow.ru/81f7b839979560505c8aaf5a946af7a6
32 Злопчинский
 
08.09.17
13:02
(7)  ты умный, шо капец! ;-)
33 Злопчинский
 
08.09.17
13:04
но жту хрень в общем мне когда то давно Епрст подсказал
Дальше я уже сам причесал
Пользуясь методом количествостраниц например можно делать адаптируемость ценники, которые гарантируют что название независимо от длины (в разумных пределах конечно) влезет в ячейку наименования.
34 Злопчинский
 
08.09.17
13:06
(8)  геморное решение и очень частное
Например поставить шрифт курьер или ареал народу - результаты будут совершенно разные
Решение в (4) является намного более универсальным
35 Злопчинский
 
08.09.17
13:09
36 Kol Pecivanovich
 
08.09.17
17:03
Спасибо, коллеги!

Буду делать как в (3) или (4) - гениально! Не догадался бы)
37 Злопчинский
 
08.09.17
18:46
(36) это тебе не снеговик
Клюшки неисчерпаемы как электрон