1с проверить помещается ли область на страницу

Обновлено: 07.07.2024

Постраничный вывод в табличный документ

Для некоторых отчетов необходимо, чтобы в конце страницы содержалась некоторая область, которая бы сообщала информацию о содержимом страницы. Это может быть, например, информация о сумме по странице, количестве строк на странице и т.п. Во встроенном языке 1С:Предприятия предусмотрены специальные средства для разбиения табличного документа на страницы. В данном разделе рассказывается, каким образом можно организовать постраничный вывод при выводе информации в табличный документ.

Метод табличного документа ПроверитьВывод()

Объект ТабличныйДокумент имеет метод ПроверитьВывод() , предназначенный для того, чтобы проверить, поместится ли список областей на текущую страницу. В случае если метод вернет значение Истина , вывод областей, переданных в метод, не приведет к созданию новой страницы, иначе, для того, чтобы вывести области, в табличном документе будет создана новая страница. Данный метод работает с учетом настроек печати документа, у которого вызывается метод.

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

Для того чтобы реализовать подобный отчет нам потребуется использовать метод ПроверитьВывод() . Пример алгоритма отчета будет выглядеть так:

1. выводим в результирующий табличный документ область - заголовок первой страницы;
2. для каждой строки из ведомости:

2.1. проверяем, вмещается ли на текущую страницу область со строкой ведомости и область итога по странице;
2.2. если области помещаются на странице - выводим строку области;
2.3. иначе - выводим подвал страницы, выводим горизонтальный разделитель страницы, выводим шапку страницы, выводим строку ведомости;

3. выводим подвал отчета.

Ниже приведен пример того, как подобный алгоритм может быть реализован на встроенном языке 1С:Предприятия 8.0:

Метод табличного документа ПроверитьПрисоединение()

Метод табличного документа ПроверитьПрисоединение() работает аналогично методу ПроверитьВывод() , с тем отличием, что данный метод проверяет, изменится ли количество страниц по горизонтали при выводе в отчет областей при помощи метода Присоединить() .

что-то вы вообще не так делеает. Прочиайие проПроверитьВывод, там и примеры есть.

Вы же два раза одно и то же кидаете на страницу

получается одну и ту же область два раза выводите.

Два раза ничего не выводится, вывод осуществляется 1 раз в строке
ТабДок.Вывести(Детали);
А далее область добавляется в массив
МассивВыводимыхОбластей.Добавить(Детали);

При проверке в метод ПроверитьВывод() передается массив областей.
Пробовал делать без массива и передавать сам табличный документ, но в этом случае вообще ерунда получается, так как сначала ПроверитьВывод() срабатывает на 15 строке, потом через пять, далее через две строки и потом через каждую строчку дробя документ на целую кучу страниц.

(3) Кто нибудь может подсказать, проблема все таже в типовой КА 1.1
при печати УПД первый лист режет по средине, получается шапка, заголовок таблицы и 2 строки таблицы, потом следующая с повторяющимся заголовком таблицы (норм)
В УчетНДС.ВывестиСчетФактуруВТабличныйДокумент()
Как раз построчно используется ПроверитьВывод() но толку мало, все уезжает, избился но не хочет по нормальному печатать и все тут.

Кусок кода внутри цикла ОбластьМакета вывод строки таблицы

(38) Помогло в моем сеансе удалить из хранилища настроек "ПАРАМЕТРЫ_ПЕЧАТИ_УниверсальныйПередаточныйДокумент", непонятно как они слетают и как часто придется мочить :)

Ну первое, что в голову приходит - это что у самого табличного документа сделаны настройки (колонтитулы там, или автомасштаб), а у массива областей - нет. Может быть есть смысл скопировать документ после настроек, использовать копию вместо массива и очищать как раз табличный документ.


Помогло, как мертвецу припарка. Попробовал установить другой принтер, подумал, что может поймал глюк для конкретного принтера, но это тоже не помогло. С автомасштабом тоже экспериментировал, думал может при масштабировании документ сжимаясь по горизонтали пропорционально уменьшается и по вертикали, причем делается это уже после проверки, т.е. проверка была без учета масштабирования, но нет, отключение автомасштабирования приводит к тому, что часть столбцов переносится на новые страницы, а по вертикали документ не увеличивается.

Может быть есть смысл скопировать документ после настроек, использовать копию вместо массива и очищать как раз табличный документ.

С массивом на через каждую строчку не дробит, это как раз происходит без применения массива. А так массив очищается вполне корректно.

До меня тоже теперь наконец то дошло, спасибо YNik и spacecraft .
Так как это метод самого табличного документа, то мы при при проверке уже имеем данные самого табличного документа, к этому прибавляется то, что передали в качестве аргумента и таким образом проверяется следующее условие ТабличныйДокумент + МассивОбластей > Площадь листа и делается вывод поместится или нет.

Кстати код приведенный YNik , можно и нужно сократить, вообще исключив массив из употребления и передавать саму область для проверки и все будет прекрасно работать! Ура все получилось в лучшем виде :)

(10) ger_kar, сократить можно если вы проверку делаете одной строки.

А вот у меня такая штука не прокатила!


Проблема в том что у документа есть автомасштаб и что с ним делать? Выводит пол страницы пустой! (13) spacecraft, этот параметр я уже установил в начале при создании: (14) Xershi, тогда ой. Этот признак используется при печати. Вполне может не обрабатываться при проверке вывода. (15) spacecraft, так что выходит, мне нужно вручную написать алгоритм проверки количество умещаемых строк на странице?
Проблема в том что в одной строке может быть большой текст, как этот нюанс вычислять? В чем особенность проверки этого метода кто в курсе? Он что без автомасштаба проверку в "мТабДок" делает?

Новый формат строк улучшил ситуацию. Стало на странице чуть больше элементов. Похоже все дело в формате.

(17) Xershi, У меня вот так выполняется проверка. Все красиво работает.

Смысл в следующем:
Есть ТЗ. Есть подвал. Нельзя что бы подвал выводился сам на отдельной странице. Последнюю строку ТЗ добавляю в массив. Потом добавляю туда подвал. Если не выводится тогда добавляю разделитель и вывожу то что есть в массиве (последняя строка + подвал).

(17) Xershi, проверил у себя. АвтоМасштаб достаточно только в мТабДок.
А вот с МассивТаблицОбластей и правда не понятно зачем вообще его использовать?

(23) spacecraft, я его делал, для того чтобы исключить не попадание последней строки. Т.к. строка добавляется по кускам и вот 3 кусок строки может быть на 5 строк и по итогу не поместится на страницу.

Поэтому вот этот нюанс так думал обыграть.

Сейчас внимательно ваш код проверю.

Когда я сделал как вы у меня страница заполнилась полностью ну или почти до конца, но нюанс с добавлением строки остался. Т.к. проверку, то я делаю в начале вывода. Мне наверно нужно заменить вывод на добавление в новый табличный документ и в конце проверять вывод, а потом только выводить строку или нет?

(24) Xershi, не совсем понял. Есть "строка", которая может занимать несколько строк вывода? И что нужно? Совсем ее не выводить в текущей странице, если полностью не помещается? Или выводить частично, с переносом на другую страницу? (25) spacecraft, спасибо помогли понять, что там происходит. Убрал массив и переписал код, чтобы проверка шла в конце(когда строка полностью сформирована) со строкой дублером и тогда вся страница заполнилась полностью. Но я убрал оглавление для вывода чтобы проверить результат. Сейчас попробую с оглавлением вывод сделать. Если попрет, то вопрос решен. (18) 6есик, чтобы дублировать шапку на каждой странице. У меня табличный документ из 2 макетов для прайс-листа с оглавлением.

(19) Xershi, ну это я понимаю добавляете шапку на каждую новую страницу :

А зачем после этого ее добавлять в массив для проверки на вывод ? Ведь шапку вы уже вывели в табличный документ и проверка на вывод уже будет сопоставлять ваш массив и то свободное место в таб доке которое осталось после вывода шапки.


Понял в чем мои косяки и тогда проверка корректно все обработала!
Всем спс! (27) Xershi, я бы оптимизировал этот код. Как и в приведенном мной выше.
(28) spacecraft, это уже не критично я считаю. Кстати на практике такая оптимизация дает, хоть какой-то профит? (29) Xershi, как минимум избегает дублирование кода.
Честно говоря, просто бьет по глазам. Щас столкнулся с проблемой проверить вывод в ут 11.2 печатает тор12 с 1 номенклатурой в 2 листа
1 лист - путстая строка номенклатуры а на 2-м единственная номенклатура
дело должно быть в начтройках принтера по умолчанию но там вроде все нормально
что за чудеса непонятно (31) piffoff, я добавлял проверку на 1-ю строку, чтобы не выполнялся ПроверитьВывод:
Еще замечание в копилку. Сначала надо определить размер страницы, поля, автомасштаб и т.д. И уже после этого - проверять вывод. (33) Спасибо!! Пока не прописал вручную все (! слева/справа обязательно) поля - ПроверитьВывод() выполнялось некорректно

Добрый день. вывожу на печать доработанный табель.
На каждой странице должна быть шапочка ФИО, ТабНомер, Должность, Дни с 1 - 15, Итого15, 16 -Последний день, Итого за месяц. У сотрудника количество строк заранее не известно, т.к. зависит от КолВВ(количество видов времени, которые у него были за месяц. Каждый вид времени печатается на новой строке).

2 раза перенос на след. страницу делает и все. Больше разделитель не ставится.

Пока ВыборкаСотрудник.Следующий() Цикл

ОблСтрокаНомСтроки = Макет.ПолучитьОбласть("R" + СТРОКА(16 + КолСтрокВывели) + "C1:R" + СТРОКА(16 + КолВВ - 1 + КолСтрокВывели) + "C1");
МассивВыводимыхОбластей.Очистить();
МассивВыводимыхОбластей.Добавить(ОблСтрокаНомСтроки);

Если Не ПроверитьВыводТабличногоДокумента(ТабДок, МассивВыводимыхОбластей) Тогда

КолонтитулВсегда = Макет.ПолучитьОбласть("Колонтитул|КолонкиВсегда");
ТабДок.Вывести(КолонтитулВсегда);

Колонтитул29 = Макет.ПолучитьОбласть("Колонтитул|Колонка29");
Колонтитул30 = Макет.ПолучитьОбласть("Колонтитул|Колонка30");
Колонтитул31 = Макет.ПолучитьОбласть("Колонтитул|Колонка31");
КолонтитулВсегоОтработаноЗаМесяц = Макет.ПолучитьОбласть("Колонтитул|ВсегоОтработаноЗаМесяц");


Если ПоследнийДень > 28 Тогда
ТабДок.Присоединить(Колонтитул29);
КонецЕсли;
Если ПоследнийДень > 29 Тогда
ТабДок.Присоединить(Колонтитул30);
КонецЕсли;
Если ПоследнийДень > 30 Тогда
ТабДок.Присоединить(Колонтитул31);
КонецЕсли;
ТабДок.Присоединить(КолонтитулВсегоОтработаноЗаМесяц);
КолСтрокВывели = КолСтрокВывели + 3;

КонецЕсли;
ТабДок.Вывести(ОблСтрокаНомСтроки);
КонецЦикла

Подскажите, пожалуйста, где искать ошибку?

(34) Только что с похожей проблемой столкнулся, выводились несколько разделителей в Т-13, и все, пол отчета без них.
Дело оказалось в ширине колонок 5,6,7 и 20, они в стандартном почему то уже остальных, остальные по 3, а эти 2.63-2.88, и вот кто-то с коллег видно расширил, но не у всей колонки, а у диапазона, шапка осталась уже с подвалом.
Уменьшил ширину колонки с табельным на 1.1, пунктир справа выровнялся, и ПроверитьВывод заработал как задумывалось.

Добавлю в копилку свои 5 копеек.
Была задача выводить на каждом листе внизу логотип организации (печать договоров и приложений к ним).
Естественно пользовался методом ПроверитьВывод(), для того чтобы определять помещается ли выводимая область на лист вместе в логотипом, и если нет, то вывожу пустые строки пока есть место, потом логотип и горизонтальный разделитель страниц. Пустые строки не очень большой размера, чтобы логотип практически на одном и том же месте был.

И всё хорошо выводится, кроме первой страницы. Видимо на тот момент как то по другому определяется выводимые размеры таблицы.

Решение нашлось очень странное: если метод говорит, что не умещается, то получаем количество страниц Табличного документа, а потом снова проверяем, помещается или нет. И вот тут происходит чудо)), 1С вдруг неожиданно начинает считать, что теперь помещается и продолжает выводить до самого низа (а раньше было заметно, что несколько строк еще может поместиться в конце). Код ниже.

Если НЕ ТабДокумент.ПроверитьВывод(МассивОбластейВывода) Тогда
//вот тут уже выводится и пустые строки, и логотип, и разделитель и др. нужные области шапки нового документа
КонецЕсли;

В этой статье вы узнаете, по какому принципу осуществляется работа со страницами в табличном документе 1С 8.3. Будет показано, как определить помещается ли область (или области) в страницу, а также как принудительно осуществить разделение страниц.

Для демонстрации принципов работы страниц в табличном документе реализуем простой учебный пример: в табличном документе выведем строки со случайными числами и их текстовое представление, количество строк с числами, которые нужно вывести будем вводить в поле на управляемой форме обработки.

Управляемая форма обработки 1С

Создадим макет табличного документа с горизонтальными областями.

Макет табличного документа 1С

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

Этот код комментировать не будем, если у вас он вызывает затруднения, то ознакомьтесь с моими предыдущими статьями и видео-уроками.

Сейчас, когда мы выполним команду и выведем, например, 80 строк, то у нас все будет показано на одной странице, а при попытке распечатать (или выполнить предварительный просмотр) платформа самостоятельно разобьет табличный документ на страницы.

Согласитесь, что такой вариант формирования печатной формы не лицеприятно выглядит.

Для более приятного формирования печатной формы, сделаем так, чтобы каждый раз в конце страницы выводился подвал таблицы, а в начале новой страницы (кроме первой) выводилась шапка таблицы. Для этого доработаем код в методе СформироватьТабличныйДокумент.

Поясним этот код.

Используя метод табличного документа ПроверитьВывод можно проверить, войдет ли вывод области или нескольких областей на страницу табличного документа. Этот метод возвращает Истина, если область вмещается на страницу, и ложь – если нет. Параметром этого метода может быть как область, так и массив областей.

В функции мы создали массив, который состоит из области строки и из области подавала таблицы.

В каждой итерации цикла, в котором осуществляется вывод строк табличного документа, при помощи метода ПроверитьВывод выполняется проверка: вмещается ли область строки и область подвала таблицы в страницу табличного документа.

Если области не вмещаются на страницу табличного документа, то выводится подвал таблицы, потом выводится горизонтальный разделитель таблицы, который, по сути, создает новую страницу таблицы, и осуществляется вывод шапки таблицы уже на новой странице.

В результате, вывод табличного документа осуществится в более удобном виде.

Другие статьи про табличные документы в 1С:

Это изображение имеет пустой атрибут alt; его имя файла - 1C-в-желтом-цвете-3D-221x300.jpg

Это изображение имеет пустой атрибут alt; его имя файла - 1_в-желтом-цвете-3D-маленькая-221x300.jpg

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

В этой статье я рассмотрю основные механизмы платформы 1С 8.3, которые обеспечивают проверку заполнения реквизитов.

Проверка заполнения реквизита объекта 1С

У любого реквизита объекта 1С можно настроить проверку заполнения, когда нельзя сохранить новый элемент объекта, не заполнив этот реквизит. Выйдет ошибка.

Для того, чтобы у реквизита объекта осуществлялась проверка заполнения, достаточно в свойстве реквизита «Проверка заполнения» указать значение «Выдавать ошибку».

Проверка заполнения реквизита объекта 1С

При таком конфигурировании реквизита, если это реквизит не заполнен, то при попытке записи элемента, выйдет соответствующая ошибка, и запись элемента не будет осуществлена.

Проверка заполнения реквизита объекта 1С

Данная проверка будет осуществляться независимо от того, сгенерирована эта форма платформой 1С 8.3 автоматически, или используется форма созданная разработчиком.

Проверка заполнения табличной части в 1С

Помимо реквизитов у объектов можно проверять заполнение табличной части. Для этого у табличных частей объектов имеется свойство «Проверка заполнения», в которое также необходимо установить значение «Выдавать ошибку».

Проверка заполнения табличной части в 1С

Если в этом случае мы попытаемся записать элемент, в котором будет табличная часть без строк, то выйдет ошибка, и записать элемент не получится.

Проверка заполнения табличной части в 1С

В тоже время, мы спокойно сможем записать элемент, у которого имеется строка табличной части с пустыми полями.

Проверка заполнения табличной части в 1С

Если мы хотим проверять реквизиты табличной части, то у них нужно заполнить аналогичное свойство.

Проверка заполнения программно в 1С

Иногда возникает необходимость проверить программно заполнение объекта в 1С. Для этих целей предназначен метод ПроверитьЗаполнение(), который имеется у большинства объектов 1С (справочники, документы и т.д.).

Например, во время программного создания элемента справочника, мы можем проверить заполнение реквизитов этого справочника, перед его записью.

В этом случае, элемент справочника не будет записан, если у него имеются реквизиты, у которых в свойстве ПроверкаЗаполнения установлено значение «Выдавать ошибку».

Иногда, нужно проверить заполнение реквизита, у которого в свойстве «Проверка заполнения» установлено значение «Не проверять». Например, у реквизита Артикул справочника Номенклатура.

Проверка заполнения программно в 1С

Если нам нужно осуществлять проверку этого реквизита (например, по какой-то определенной логике), то необходимо в модуле объекта создать метод ОбработкаПроверкиЗаполнения.

ОбработкаПроверкиЗаполнения в 1С

ОбработкаПроверкиЗаполнения в 1С

У этого метода, который является процедурой, имеется параметр ПроверяемыеРеквизиты. Этот параметр массив, в котором содержится список имен реквизитов, которые нужно проверять. Если в этот список мы добавим название реквизита, то при сохранении элемента будет осуществляться проверка на то, заполнен этот реквизит или нет.

Проверка заполнения программно в 1С

Также, мы можем удалить реквизит из проверяемых, если по какой-то причине нет необходимости в проверке заполнения этого реквизита.

Например, удалим из проверяемых реквизит ПолноеНаименование.

Тогда мы сможем спокойно записать элемент с незаполненным реквизитом ПолноеНаименование.

Проверка заполнения программно в 1С

Если мы хотим проверить программно, что заполнен реквизит табличной части объекта, то необходимо добавить этот реквизит в массив ПроверяемыеРеквизиты по такому формату: [НазваниеТабличнойЧасти].[НазваниеРеквизита] .

В этом случае, будет осуществляться проверка заполнения реквизита табличной части.

Проверка заполнения программно в 1С

Проверка заполнения формы 1С

Проверка заполнения реквизита объекта 1С

При выполнении команды Посчитать, произведем расчет только в том случае, если реквизиты заполнены. Проверку заполнения будем выполнять при помощи метода ПроверитьЗаполнение.

Теперь мы не сможем посчитать сумму, если один из множителей не заполнен.

Проверка заполнения реквизита объекта 1С

Программировать в 1С за 11 шагов

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Читайте также: