Переход с платформы 1С 7.7 на 8.3 часто вызывает вопросы у разработчиков, так как механизмы работы с печатными формами претерпели значительные изменения. Одной из базовых задач является вывод значения реквизита документа (например, перечисления или ссылки на справочник) в ячейку табличного документа. Разберем по шагам, как правильно настроить макет и написать программный код для заполнения параметров.
Проанализируем типичную ситуацию: в документе есть реквизит НомерДень с типом ПеречислениеСсылка.КалендарьДень. В макете печатной формы создана ячейка, для которой в свойстве "Заполнение" выбрано значение Параметр, а сам параметр назван КалендарьДень. Однако при выводе на печать поле остается пустым.
Выясним причину: в отличие от версии 7.7, где связь между переменными макета и данными могла быть более жесткой, в 8.3 табличный документ — это объект, который нужно наполнять данными программно. Просто создать параметр в макете недостаточно, необходимо передать в него значение из кода перед тем, как область будет выведена в итоговый документ.
Прежде чем переходить к коду, проверим настройки в самом макете. Рассмотрим основные моменты:
Параметр.КалендарьДень.Важно помнить: если вы хотите вывести текст вместе с параметром (например, "День № 3"), следует выбрать тип заполнения Шаблон и использовать квадратные скобки: День № [КалендарьДень].
Теперь рассмотрим, как передать данные в макет. Процесс состоит из получения области макета, установки значений параметров и вывода области. Посмотрим на пример кода, который должен располагаться в процедуре печати:
// 1. Получаем макет из метаданных документа
Макет = ПолучитьМакет("Печать");
// 2. Получаем конкретную область (например, Шапка)
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
// 3. Заполняем параметр конкретным значением из реквизита документа
// Предположим, что ТекущийОбъект — это ссылка на наш документ
ОбластьМакета.Параметры.КалендарьДень = Ссылка.НомерДень;
// 4. Выводим заполненную область в итоговый табличный документ
ТабДок.Вывести(ОбластьМакета);
Обратите внимание на объект Параметры. Это коллекция, которая содержит все именованные параметры, созданные вами в данной области макета. Если вы пропустите шаг присвоения значения ОбластьМакета.Параметры.ИмяПараметра = Значение, 1С не "догадается" сама подставить данные, даже если имена совпадают.
Если реквизит имеет тип ПеречислениеСсылка, то при простой передаче ссылки в параметр (как в примере выше), 1С автоматически выведет Синоним этого значения. Рассмотрим ситуацию, когда вам нужно вывести не синоним, а внутреннее имя значения перечисления. Для этого проанализируем следующий метод:
ЗначениеПеречисления = Ссылка.НомерДень;
ИмяПеречисления = ЗначениеПеречисления.Метаданные().Имя;
ИндексЗначения = Перечисления[ИмяПеречисления].Индекс(ЗначениеПеречисления);
ИмяЗначения = Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[ИндексЗначения].Имя;
ОбластьМакета.Параметры.КалендарьДень = ИмяЗначения;
Однако в большинстве бизнес-задач достаточно стандартного вывода через ОбластьМакета.Параметры.Заполнить(Ссылка). Этот метод автоматически сопоставляет имена реквизитов документа и имена параметров в макете, значительно сокращая объем кода.
Современным стандартом разработки в 1С 8.3 является вынос логики печати в Модуль менеджера. Это позволяет формировать печатные формы без необходимости открытия формы документа. В этом случае данные чаще всего извлекаются с помощью запроса. Рассмотрим этот эффективный метод:
Процедура Печать(ТабДок, Ссылка) Экспорт
Макет = Документы.Меню.ПолучитьМакет("Печать");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Меню.Организация,
| Меню.НомерДень КАК КалендарьДень
|ИЗ
| Документ.Меню КАК Меню
|ГДЕ
| Меню.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
Пока Выборка.Следующий() Цикл
// Метод Заполнить() автоматически подставит КалендарьДень из выборки в параметр макета
ОбластьШапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьШапка);
КонецЦикла;
КонецПроцедуры
Использование запроса позволяет избежать лишних обращений к базе данных "через точку" (например, Ссылка.Организация.Наименование) и обеспечивает высокую производительность системы.
Если после выполнения всех инструкций ячейка всё еще пуста, проанализируем следующие моменты:
ПолучитьМакет() ищет его в текущем объекте.Вывести(). Изменения в параметрах области после вывода в ТабДок не отобразятся в итоговой форме.Область.Параметры.КалендарьДень = "Тест".Таким образом, мы выяснили, что ключ к успеху в 8.3 — это явное управление параметрами области макета через коллекцию Параметры и понимание жизненного цикла формирования табличного документа.