Как программно выбрать макет для печати и управлять выводом областей в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Идентификация и выбор макета для печати

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

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


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

Здесь НекоеУсловиеВыполняется – это ваша логика, которая определяет, какой макет требуется. Например, это может быть флажок в форме, значение реквизита документа или проверка на тип выводимых данных.

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


ТабДок = Новый ТабличныйДокумент;
Если УсловиеДляАльбомнойОриентации Тогда
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Иначе
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
КонецЕсли;
// Далее получаем макет и выводим его области
Макет = ПолучитьМакет("ИмяЕдиногоМакета");
// ...

Важно: Порядок установки свойств имеет значение. Если вы используете ТабДокумент.ИмяПараметровПечати, оно может загрузить ранее сохраненные настройки, включая ориентацию, и перезаписать ваше программно установленное значение. Рекомендуется устанавливать ОриентацияСтраницы после ИмяПараметровПечати или убедиться, что все необходимые параметры заданы явно.

Условный вывод областей макета при изменении структуры

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

Представим ситуацию: у нас есть два макета. Макет 1 содержит области "Заголовок", "Таблица" и "Подвал". Макет 2 содержит "Заголовок" и "Таблица", но без "Подвала". Если мы выбрали Макет 1, мы хотим вывести все три области. Если выбрали Макет 2, то только "Заголовок" и "Таблица".

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

Рассмотрим по шагам, как это реализовать:

  1. Определяем условие: У нас есть некое условие (например, ИспользоватьМакетСПолнойСтруктурой), которое определяет, какой макет мы хотим использовать и, соответственно, какие области должны быть выведены.
  2. Выбираем макет: Сначала мы выбираем сам макет, как мы уже рассматривали выше.
  3. Условно выводим области: Затем, используя то же условие, мы принимаем решение о выводе конкретных областей.

// Исходное условие, по которому мы определяем, какой макет использовать
ПеременнаяУсловие = Истина; // Допустим, это условие определяет, что нужен "Макет1"

Макет = Неопределено;
Если ПеременнаяУсловие Тогда
    // Выбираем Макет1 (допустим, это макет с полной структурой, включая Подвал)
    Макет = ПолучитьМакет("Макет_Полный");
Иначе
    // Выбираем Макет2 (допустим, это макет без области Подвал)
    Макет = ПолучитьМакет("Макет_Упрощенный");
КонецЕсли;

ТабДок = Новый ТабличныйДокумент;

// Получаем и выводим общие области, которые есть в обоих макетах
// Область Заголовок
ОбластьЗаголовок = Макет.ПолучитьОбласть("ОбластьЗаголовок");
// Здесь заполняем параметры области Заголовок...
// Например: ОбластьЗаголовок.Параметры.ТекстЗаголовка = "Отчет о чем-либо";
ТабДок.Вывести(ОбластьЗаголовок);

// Область Таблица
ОбластьТаблица = Макет.ПолучитьОбласть("ОбластьТаблица");
// Здесь заполняем параметры или выводим данные в ОбластьТаблица
// Например: ОбластьТаблица.Параметры.ДанныеТаблицы = МоиДанные;
ТабДок.Вывести(ОбластьТаблица);

// Условный вывод области, которая присутствует не во всех макетах
// Например, область "Подвал" есть только в "Макет_Полный"
Если ПеременнаяУсловие Тогда
    ОбластьПодвал = Макет.ПолучитьОбласть("ОбластьПодвал");
    // Здесь заполняем параметры области Подвал...
    // Например: ОбластьПодвал.Параметры.Итог = СуммаИтого;
    ТабДок.Вывести(ОбластьПодвал);
КонецЕсли;

// Показываем сформированный документ
ТабДок.Показать();

В этом примере мы используем одно и то же условие (ПеременнаяУсловие) для выбора макета и для условного вывода области ОбластьПодвал. Таким образом, если выбран Макет_Упрощенный, который не имеет области ОбластьПодвал, попытки обратиться к ней не будет, поскольку соответствующий блок кода не будет выполнен. Это является ключевым моментом в гибком управлении печатными формами.

Мы также можем применить обратную логику, если нам нужно что-то не выводить при выполнении условия. Например:


// Если НекоеУсловиеВыполняется, то НЕ выводим эту область
Если НЕ НекоеУсловиеВыполняется Тогда
    // выводим нужные имеющиеся области в макете
    ОбластьДляВывода = Макет.ПолучитьОбласть("ИмяОбласти");
    // Заполняем параметры области
    ТабДок.Вывести(ОбластьДляВывода);
КонецЕсли;

Общие принципы работы с макетами и областями в 1С

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

  1. Получение макета: Всегда начинаем с получения объекта макета с помощью функции ПолучитьМакет(). Это может быть макет формы, отчета или внешней обработки.
  2. 
    Макет = ПолучитьМакет("ИмяВашегоМакета");
    
  3. Получение областей: Макеты строятся из именованных областей. Для работы с конкретной частью макета (строка, колонка, ячейка или группа ячеек) используем метод ПолучитьОбласть(), указывая имя области.
  4. 
    ОбластьЗаголовок = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
    ОбластьДетальныеСтроки = Макет.ПолучитьОбласть("СтрокаДанных");
    
  5. Заполнение параметров: В ячейках макета можно использовать параметры, обозначенные угловыми скобками (например, <НазваниеПараметра>). Их значения заполняются программно через свойство Параметры объекта области.
  6. 
    ОбластьЗаголовок.Параметры.ДатаПечати = ТекущаяДата();
    ОбластьЗаголовок.Параметры.НазваниеДокумента = "Отчет о продажах";
    
  7. Вывод областей: После заполнения параметров область выводится в табличный документ с помощью методов Вывести() или Присоединить(). Метод Вывести() добавляет область как новую строку или строки, а Присоединить() – пристыковывает к последней выведенной области, что полезно для формирования сложных таблиц.
  8. 
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Присоединить(ОбластьИтогов); // Присоединит итоги к последней выведенной области
    
  9. Очистка табличного документа: Перед формированием новой печатной формы или вывода новых секций полезно использовать метод ТабДок.Очистить() для избежания влияния предыдущих настроек или содержимого, которые могли остаться от предыдущих операций.
  10. 
    ТабДок.Очистить();
    
  11. Управление ориентацией страницы: Как уже упоминалось, ТабДокумент.ОриентацияСтраницы позволяет динамически задавать книжную (ОриентацияСтраницы.Портрет) или альбомную (ОриентацияСтраницы.Ландшафт) ориентацию. Это свойство применяется ко всему табличному документу.
  12. 
    ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
    
  13. Пользовательское редактирование макетов: В 1С существует возможность изменять макеты непосредственно в режиме "Предприятие" без необходимости модификации конфигурации. Это создает "измененные" макеты, которые хранятся отдельно. Система позволяет пользователю выбирать, какой макет использовать — стандартный или модифицированный.
  14. Ограничения: В отличие от старых версий 1С (например, 7.7), в 1С 8.х нельзя вписывать выражения непосредственно в ячейки макета. Вся логика заполнения данных и условного вывода должна быть реализована в программном модуле, что обеспечивает большую безопасность и структурированность кода.
  15. Обновление выведенных областей: Если область уже выведена в табличный документ, изменить ее содержимое или структуру напрямую достаточно сложно. Предпочтительнее строить логику формирования таким образом, чтобы не требовалось обновлять уже выведенные данные, а сразу выводить их в окончательном виде.

Мы выяснили, что "идентифицировать" макеты напрямую по внутреннему свойству для принятия решения о выводе областей — не всегда самый эффективный путь. Вместо этого, мы управляем процессом формирования печатной формы, программно выбирая макет и условно выводя нужные области на основе наших условий. Это обеспечивает максимальную гибкость и контроль над тем, что будет выведено на печать, позволяя создавать сложные и динамические печатные формы в 1С.

← На главную