Почему не отображаются параметры в макете печатной формы 1С и как это исправить

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

В практике разработчика 1С нередко возникает мистическая ситуация: в конфигураторе макет настроен правильно, в коде значения параметрам области присваиваются без ошибок, при отладке мы видим, что переменные заполнены, но в готовой печатной форме ячейки остаются пустыми. Иногда проблема решается сама собой через «тридцать минут и десять перезапусков», что наводит на мысли о «заговоре кэша». Однако у любого поведения платформы есть логическое объяснение. В этой статье мы подробно разберем, почему пропадают параметры макета и какой алгоритм действий поможет решить проблему максимально быстро.

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

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

Рассмотрим по шагам, на что обратить внимание в свойствах ячейки:

  1. Откроем макет (в нашем примере это ТОРГ13).
  2. Выделим проблемную ячейку (например, ту, где должен быть ОтправительПодразделение).
  3. Откроем палитру свойств (Alt + Enter).
  4. Найдем категорию Макет и свойство Заполнение.

Здесь возможны три варианта, и каждый требует своего подхода:

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

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


Макет = _Объект.ПолучитьМакет("ТОРГ13");
ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");

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

// Выводим область в результирующий документ
ТабДокумент.Вывести(ОбластьМакетаШапка);

Критически важно, чтобы метод Вывести() вызывался после того, как заполнены все параметры. Если вы сначала вывели область, а потом решили дозаполнить параметры в объекте ОбластьМакетаШапка, то в уже выведенном в ТабДокумент фрагменте ничего не изменится. Мы работаем с копией области, которая «застывает» в табличном документе в момент вызова метода Вывести() или Присоединить().

Проблема динамического обновления (Демоническое обновление)

В сообщении упоминается, что конфигурация «самопроизвольно» заработала через некоторое время. Это классический признак последствий динамического обновления (нажатие F7, когда в базе есть активные пользователи). При таком обновлении кэш на сервере приложений или на стороне клиента может хранить старую версию макета.

Разберем, почему так происходит: когда вы меняете макет и обновляете базу динамически, 1С создает новую версию метаданных. Однако запущенные сеансы пользователей продолжают работать со «старым» макетом, который уже закэширован в их памяти (rphost или локальный кэш). В итоге код пытается обратиться к новому параметру, которого в их «старой версии» макета еще не существует.

Как правильно сбросить кэш в этом случае:

  1. Полностью завершить работу всех сеансов пользователей.
  2. Если база серверная — перезапустить службу 1C:Enterprise 8.3 Server Agent.
  3. Если перезапуск службы невозможен, используйте запуск 1С с ключом /ClearCache (хотя это очищает только клиентский кэш).
  4. В идеале — избегайте динамического обновления, если вы меняете структуру макетов или типов данных.

Использование инструментов отладки на сервере

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

Проанализируем процедуру печати:


&НаКлиенте
Процедура Печать_ТОРГ13_ПеремещениеТоваров(Команда)
    // ... проверка заполнения ссылки
    ТабДок = ТОРГ13_ПечатьНаСервере_ПеремещениеТоваров();
    // ... формирование коллекции печатных форм
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
КонецПроцедуры

Для качественной проверки выполним следующие действия:

  1. Убедимся, что на сервере 1С разрешена отладка (параметр -debug в строке запуска службы).
  2. Поставим точку останова внутри функции ТОРГ13_ПечатьНаСервере_ПеремещениеТоваров().
  3. Используем Вычислить выражение (Shift+F9) для объекта ОбластьМакетаШапка.Параметры.
  4. Проверим не только наличие значения, но и его тип. Если в параметр макета передается объект (например, ссылка на Склад), а макет ожидает строку, при определенных настройках формата ячейки значение может не отобразиться. Всегда надежнее передавать представление: Область.Параметры.Склад = Строка(СсылкаНаСклад);

Влияние пользовательских макетов (БСП)

Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), то существует еще одна «невидимая» причина. В системе есть механизм Пользовательских макетов печатных форм.

Проанализируем сценарий: бухгалтер или администратор зашел в режим «Предприятие», открыл список макетов печатных форм, нажал «Изменить» для формы ТОРГ-13 и сохранил её (даже ничего не меняя). С этого момента система создает в базе данных копию макета. Когда вы, как программист, вносите изменения в конфигураторе, они применяются к «основному» макету, но система при печати продолжает подтягивать «пользовательский» макет из базы данных, потому что он имеет приоритет.

Как проверить:

  1. Перейдите в раздел Администрирование — Печатные формы, отчеты и обработки.
  2. Откройте пункт Макеты печатных форм.
  3. Найдите макет ТОРГ-13 (Перемещение товаров).
  4. Если макет выделен жирным шрифтом или в колонке «Используется» стоит отметка о редактировании — значит, ваши изменения в конфигураторе игнорируются.
  5. Нужно нажать Использовать стандартный макет или удалить пользовательские изменения.

Итоги

Подводя итог, можно сказать, что «исчезновение» параметров — это почти всегда следствие либо кэширования старой версии метаданных, либо приоритета пользовательских макетов над программными. Если код заполнения написан верно, а отладчик подтверждает наличие данных в объекте ОбластьМакета непосредственно перед выводом, значит, проблема лежит в плоскости инфраструктуры (кэш, динамическое обновление) или настроек самой ячейки (Заполнение — Текст вместо Параметра).

← На главную