При обновлении конфигураций 1С пользователи и разработчики нередко сталкиваются с ситуацией, когда ранее стабильно работавшая внешняя печатная форма (например, инвентарная карточка по форме 52н) перестает формироваться и аварийно завершает работу с сообщением: «Не удалось формировать печатную форму. Ошибка при вызове метода контекста (ПолучитьОбласть)». Разберем причины возникновения этой ошибки и детально рассмотрим варианты восстановления работоспособности обработки.
Проанализируем механизм работы большинства внешних печатных форм. Внешняя обработка может не хранить собственный табличный макет внутри файла, а обращаться напрямую к общим макетам конфигурации с помощью метода ПолучитьОбщийМакет(). Это делается разработчиками для экономии места и использования типовой разметки.
Однако при выходе новых релизов типовых конфигураций разработчики 1С актуализируют бланки регламентированных регистров и справочников. В результате таких доработок происходят следующие изменения:
Стоимость заменяется на СтоимостьВВалюте).Когда внешняя обработка выполняет вызов метода Макет.ПолучитьОбласть("ИмяОбласти"), а область с таким именем в общем макете обновленной конфигурации уже отсутствует, платформа 1С генерирует исключение.
Если требуется максимально быстро вернуть работоспособность внешней печатной формы, выясним, к каким именно областям обращается код обработки, и сопоставим их с макетом нового релиза. Разберем процесс по шагам:
Печать() или процедура СформироватьПечатнуюФорму()).ПолучитьОбласть.
// Старый вариант обращения, вызывающий ошибку:
// ОбластьСтрока = Макет.ПолучитьОбласть("Стоимость");
// Скорректированный вариант под обновленный макет:
ОбластьСтрока = Макет.ПолучитьОбласть("СтоимостьВВалюте");
Аналогичным образом проверим имена всех заполняемых параметров через структуру ОбластьСтрока.Параметры, чтобы избежать ошибок заполнения данных.
Чтобы исключить повторение подобных сбоев при последующих обновлениях программы, сделаем внешнюю печатную форму полностью автономной. Для этого перенесем макет непосредственно в саму обработку.
Разберем порядок действий:
МакетКарточки.
// Заменяем получение общего макета конфигурации:
// Макет = ПолучитьОбщийМакет("ИнвентарнаяКарточка52н");
// На получение внутреннего макета обработки:
Макет = ЭтотОбъект.ПолучитьМакет("МакетКарточки");
ТабличныйДокумент = Новый ТабличныйДокумент;
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьШапка);
При таком подходе любые изменения в общих макетах и релизах типовой конфигурации больше не повлияют на вывод именованных областей внешней обработки.
Если требования законодательства или учетной политики изменились существенно, точечной замены имен областей может быть недостаточно. Рассмотрим алгоритм полного обновления логики формирования инвентарной карточки:
Важное предостережение: использование конструкций Попытка ... Исключение вокруг вызова ПолучитьОбласть для подавления ошибки не рекомендуется, так как это приведет к потере обязательных учетных реквизитов на бланке строгой отчетности.