При работе с печатными формами в 1С часто возникает необходимость использовать разные макеты в зависимости от условий, например, для альбомной или книжной ориентации, или когда структура макетов немного отличается. Рассмотрим, как эффективно управлять выбором макетов и условным выводом их областей, чтобы печатная форма всегда соответствовала нашим требованиям.
Изначально вопрос может звучать как "по какому свойству разделить макеты?". На самом деле, мы не столько "разделяем" их по свойству, сколько программно выбираем нужный макет из доступных по его имени, основываясь на определенном условии.
Если вы используете два совершенно разных макета, например, один для книжной, другой для альбомной ориентации, то каждый макет имеет уникальное имя в конфигурации. В этом случае, мы можем получить нужный макет, используя его имя.
Если НекоеУсловиеВыполняется Тогда
// Выбираем макет, например, для альбомной ориентации
Макет = ПолучитьМакет("ИмяМакетаДляАльбомнойОриентации");
Иначе
// Выбираем макет, например, для книжной ориентации
Макет = ПолучитьМакет("ИмяМакетаДляКнижнойОриентации");
КонецЕсли;
Здесь НекоеУсловиеВыполняется – это ваша логика, которая определяет, какой макет требуется. Например, это может быть флажок в форме, значение реквизита документа или проверка на тип выводимых данных.
Если же речь идет об одном макете, но его нужно вывести с разной ориентацией страницы, то для табличного документа можно использовать свойство ТабДокумент.ОриентацияСтраницы.
ТабДок = Новый ТабличныйДокумент;
Если УсловиеДляАльбомнойОриентации Тогда
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Иначе
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
КонецЕсли;
// Далее получаем макет и выводим его области
Макет = ПолучитьМакет("ИмяЕдиногоМакета");
// ...
Важно: Порядок установки свойств имеет значение. Если вы используете ТабДокумент.ИмяПараметровПечати, оно может загрузить ранее сохраненные настройки, включая ориентацию, и перезаписать ваше программно установленное значение. Рекомендуется устанавливать ОриентацияСтраницы после ИмяПараметровПечати или убедиться, что все необходимые параметры заданы явно.
Часто случается, что, выбрав один из макетов, мы обнаруживаем, что он отличается от другого не только ориентацией, но и наличием или отсутствием определенных областей. Например, во втором макете могла быть удалена одна область, которая присутствует в первом. Вместо того чтобы создавать полностью новую логику для каждого макета, мы можем использовать то же условие, по которому выбирали макет, для управления выводом его областей.
Представим ситуацию: у нас есть два макета. Макет 1 содержит области "Заголовок", "Таблица" и "Подвал". Макет 2 содержит "Заголовок" и "Таблица", но без "Подвала". Если мы выбрали Макет 1, мы хотим вывести все три области. Если выбрали Макет 2, то только "Заголовок" и "Таблица".
Этот подход позволяет нам избежать дублирования кода и сделать логику формирования печатной формы более гибкой. Мы будем использовать тот же флаг или условие, которое определило выбор макета, для принятия решения о выводе конкретных областей.
Рассмотрим по шагам, как это реализовать:
ИспользоватьМакетСПолнойСтруктурой), которое определяет, какой макет мы хотим использовать и, соответственно, какие области должны быть выведены.
// Исходное условие, по которому мы определяем, какой макет использовать
ПеременнаяУсловие = Истина; // Допустим, это условие определяет, что нужен "Макет1"
Макет = Неопределено;
Если ПеременнаяУсловие Тогда
// Выбираем Макет1 (допустим, это макет с полной структурой, включая Подвал)
Макет = ПолучитьМакет("Макет_Полный");
Иначе
// Выбираем Макет2 (допустим, это макет без области Подвал)
Макет = ПолучитьМакет("Макет_Упрощенный");
КонецЕсли;
ТабДок = Новый ТабличныйДокумент;
// Получаем и выводим общие области, которые есть в обоих макетах
// Область Заголовок
ОбластьЗаголовок = Макет.ПолучитьОбласть("ОбластьЗаголовок");
// Здесь заполняем параметры области Заголовок...
// Например: ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Отчет о чем-либо";
ТабДок.Вывести(ОбластьЗаголовок);
// Область Таблица
ОбластьТаблица = Макет.ПолучитьОбласть("ОбластьТаблица");
// Здесь заполняем параметры или выводим данные в ОбластьТаблица
// Например: ОбластьТаблица.Параметры.ДанныеТаблицы = МоиДанные;
ТабДок.Вывести(ОбластьТаблица);
// Условный вывод области, которая присутствует не во всех макетах
// Например, область "Подвал" есть только в "Макет_Полный"
Если ПеременнаяУсловие Тогда
ОбластьПодвал = Макет.ПолучитьОбласть("ОбластьПодвал");
// Здесь заполняем параметры области Подвал...
// Например: ОбластьПодвал.Параметры.Итог = СуммаИтого;
ТабДок.Вывести(ОбластьПодвал);
КонецЕсли;
// Показываем сформированный документ
ТабДок.Показать();
В этом примере мы используем одно и то же условие (ПеременнаяУсловие) для выбора макета и для условного вывода области ОбластьПодвал. Таким образом, если выбран Макет_Упрощенный, который не имеет области ОбластьПодвал, попытки обратиться к ней не будет, поскольку соответствующий блок кода не будет выполнен. Это является ключевым моментом в гибком управлении печатными формами.
Мы также можем применить обратную логику, если нам нужно что-то не выводить при выполнении условия. Например:
// Если НекоеУсловиеВыполняется, то НЕ выводим эту область
Если НЕ НекоеУсловиеВыполняется Тогда
// выводим нужные имеющиеся области в макете
ОбластьДляВывода = Макет.ПолучитьОбласть("ИмяОбласти");
// Заполняем параметры области
ТабДок.Вывести(ОбластьДляВывода);
КонецЕсли;
Для более глубокого понимания рассмотрим основные принципы работы с макетами и областями в 1С:
ПолучитьМакет(). Это может быть макет формы, отчета или внешней обработки.
Макет = ПолучитьМакет("ИмяВашегоМакета");
ПолучитьОбласть(), указывая имя области.
ОбластьЗаголовок = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
ОбластьДетальныеСтроки = Макет.ПолучитьОбласть("СтрокаДанных");
<НазваниеПараметра>). Их значения заполняются программно через свойство Параметры объекта области.
ОбластьЗаголовок.Параметры.ДатаПечати = ТекущаяДата();
ОбластьЗаголовок.Параметры.НазваниеДокумента = "Отчет о продажах";
Вывести() или Присоединить(). Метод Вывести() добавляет область как новую строку или строки, а Присоединить() – пристыковывает к последней выведенной области, что полезно для формирования сложных таблиц.
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Присоединить(ОбластьИтогов); // Присоединит итоги к последней выведенной области
ТабДок.Очистить() для избежания влияния предыдущих настроек или содержимого, которые могли остаться от предыдущих операций.
ТабДок.Очистить();
ТабДокумент.ОриентацияСтраницы позволяет динамически задавать книжную (ОриентацияСтраницы.Портрет) или альбомную (ОриентацияСтраницы.Ландшафт) ориентацию. Это свойство применяется ко всему табличному документу.
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Мы выяснили, что "идентифицировать" макеты напрямую по внутреннему свойству для принятия решения о выводе областей — не всегда самый эффективный путь. Вместо этого, мы управляем процессом формирования печатной формы, программно выбирая макет и условно выводя нужные области на основе наших условий. Это обеспечивает максимальную гибкость и контроль над тем, что будет выведено на печать, позволяя создавать сложные и динамические печатные формы в 1С.