В практике разработчика 1С нередко возникает мистическая ситуация: в конфигураторе макет настроен правильно, в коде значения параметрам области присваиваются без ошибок, при отладке мы видим, что переменные заполнены, но в готовой печатной форме ячейки остаются пустыми. Иногда проблема решается сама собой через «тридцать минут и десять перезапусков», что наводит на мысли о «заговоре кэша». Однако у любого поведения платформы есть логическое объяснение. В этой статье мы подробно разберем, почему пропадают параметры макета и какой алгоритм действий поможет решить проблему максимально быстро.
Первое, с чего мы должны начать наш анализ — это проверка свойств конкретных ячеек в самом макете в конфигураторе. Это самая распространенная «тихая» ошибка. Если мы программно обращаемся к параметру, которого нет в макете, система не всегда выдает ошибку, она может просто проигнорировать присваивание.
Рассмотрим по шагам, на что обратить внимание в свойствах ячейки:
ТОРГ13).ОтправительПодразделение).Здесь возможны три варианта, и каждый требует своего подхода:
[ДатаДокумента], программа не подставит туда значение. Для вывода данных это свойство не подходит.ДатаДокумента). В коде мы обращаемся к нему через Область.Параметры.ДатаДокумента. Если имя в макете и в коде не совпадает хотя бы в одном символе — данные не выведутся.Накладная № [НомерДокумента] от [ДатаДокумента]. Если вы забудете скобки, текст останется статичным.Давайте проанализируем фрагмент кода, представленный в обсуждении, и выясним, где может крыться логическая ловушка. Рассмотрим стандартный механизм работы с табличным документом:
Макет = _Объект.ПолучитьМакет("ТОРГ13");
ОбластьМакетаШапка = Макет.ПолучитьОбласть("Шапка");
// Присваиваем значения параметрам
ОбластьМакетаШапка.Параметры.ПредставлениеОрганизации = НашаОрганизация.НаименованиеПолное;
ОбластьМакетаШапка.Параметры.ДатаДокумента = ТекущаяДата();
// ... заполнение остальных параметров
// Выводим область в результирующий документ
ТабДокумент.Вывести(ОбластьМакетаШапка);
Критически важно, чтобы метод Вывести() вызывался после того, как заполнены все параметры. Если вы сначала вывели область, а потом решили дозаполнить параметры в объекте ОбластьМакетаШапка, то в уже выведенном в ТабДокумент фрагменте ничего не изменится. Мы работаем с копией области, которая «застывает» в табличном документе в момент вызова метода Вывести() или Присоединить().
В сообщении упоминается, что конфигурация «самопроизвольно» заработала через некоторое время. Это классический признак последствий динамического обновления (нажатие F7, когда в базе есть активные пользователи). При таком обновлении кэш на сервере приложений или на стороне клиента может хранить старую версию макета.
Разберем, почему так происходит: когда вы меняете макет и обновляете базу динамически, 1С создает новую версию метаданных. Однако запущенные сеансы пользователей продолжают работать со «старым» макетом, который уже закэширован в их памяти (rphost или локальный кэш). В итоге код пытается обратиться к новому параметру, которого в их «старой версии» макета еще не существует.
Как правильно сбросить кэш в этом случае:
1C:Enterprise 8.3 Server Agent./ClearCache (хотя это очищает только клиентский кэш).Посмотрим на ситуацию, когда отладчик показывает, что значения есть, но их нет в печатной форме. Нужно убедиться, что отладка настроена правильно. Поскольку формирование печатных форм в современных конфигурациях (на базе БСП) почти всегда происходит на сервере, обычная точка останова в модуле может не сработать или показывать неактуальные данные.
Проанализируем процедуру печати:
&НаКлиенте
Процедура Печать_ТОРГ13_ПеремещениеТоваров(Команда)
// ... проверка заполнения ссылки
ТабДок = ТОРГ13_ПечатьНаСервере_ПеремещениеТоваров();
// ... формирование коллекции печатных форм
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
КонецПроцедуры
Для качественной проверки выполним следующие действия:
-debug в строке запуска службы).ТОРГ13_ПечатьНаСервере_ПеремещениеТоваров().ОбластьМакетаШапка.Параметры.Область.Параметры.Склад = Строка(СсылкаНаСклад);Если ваша конфигурация использует Библиотеку стандартных подсистем (БСП), то существует еще одна «невидимая» причина. В системе есть механизм Пользовательских макетов печатных форм.
Проанализируем сценарий: бухгалтер или администратор зашел в режим «Предприятие», открыл список макетов печатных форм, нажал «Изменить» для формы ТОРГ-13 и сохранил её (даже ничего не меняя). С этого момента система создает в базе данных копию макета. Когда вы, как программист, вносите изменения в конфигураторе, они применяются к «основному» макету, но система при печати продолжает подтягивать «пользовательский» макет из базы данных, потому что он имеет приоритет.
Как проверить:
ТОРГ-13 (Перемещение товаров).Подводя итог, можно сказать, что «исчезновение» параметров — это почти всегда следствие либо кэширования старой версии метаданных, либо приоритета пользовательских макетов над программными. Если код заполнения написан верно, а отладчик подтверждает наличие данных в объекте ОбластьМакета непосредственно перед выводом, значит, проблема лежит в плоскости инфраструктуры (кэш, динамическое обновление) или настроек самой ячейки (Заполнение — Текст вместо Параметра).