Как исправить ошибку ПолучитьОбласть при формировании внешней инвентарной карточки 52н после обновления 1С?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Причины возникновения ошибки

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

Однако при выходе новых релизов типовых конфигураций разработчики 1С актуализируют бланки регламентированных регистров и справочников. В результате таких доработок происходят следующие изменения:

  1. Переименование или удаление именованных областей: разработчики конфигурации меняют имена строк, колонок или отдельных ячеек (например, имя области Стоимость заменяется на СтоимостьВВалюте).
  2. Изменение параметров макета: изменяются имена параметров заполнения внутри существующих областей.
  3. Изменение структуры учетных регистров: при переходе на новые требования учета основных средств меняются состав регистров сведений и логика типовых процедур печати в общих модулях.

Когда внешняя обработка выполняет вызов метода Макет.ПолучитьОбласть("ИмяОбласти"), а область с таким именем в общем макете обновленной конфигурации уже отсутствует, платформа 1С генерирует исключение.

Способ 1. Синхронизация имен областей и параметров в коде обработки

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

  1. Откроем внешнюю обработку в режиме Конфигуратор.
  2. Найдем в модуле объекта (или модуле формы) процедуру формирования печатной формы (обычно это функция Печать() или процедура СформироватьПечатнуюФорму()).
  3. Посмотрим на вызовы метода ПолучитьОбласть.
  4. Откроем общий макет инвентарной карточки в дереве метаданных конфигурации и проверим имена строк и таблиц.
  5. Заменим устаревшие имена областей на актуальные. Например, если в коде обработки выполняется обращение к области со старым именем, скорректируем строку вызова:

// Старый вариант обращения, вызывающий ошибку:
// ОбластьСтрока = Макет.ПолучитьОбласть("Стоимость");

// Скорректированный вариант под обновленный макет:
ОбластьСтрока = Макет.ПолучитьОбласть("СтоимостьВВалюте");

Аналогичным образом проверим имена всех заполняемых параметров через структуру ОбластьСтрока.Параметры, чтобы избежать ошибок заполнения данных.

Способ 2. Изоляция макета внутри внешней обработки (рекомендуемый вариант)

Чтобы исключить повторение подобных сбоев при последующих обновлениях программы, сделаем внешнюю печатную форму полностью автономной. Для этого перенесем макет непосредственно в саму обработку.

Разберем порядок действий:

  1. В конфигураторе откроем внешнюю печатную форму.
  2. В ветке Макеты обработки добавим новый макет табличного документа с именем, например, МакетКарточки.
  3. Скопируем содержимое типового макета (из конфигурации до обновления или из текущей базы с необходимой разметкой) и вставим его в созданный макет обработки.
  4. В коде модуля обработки заменим обращение к общему макету конфигурации на получение собственного локального макета:

// Заменяем получение общего макета конфигурации:
// Макет = ПолучитьОбщийМакет("ИнвентарнаяКарточка52н");

// На получение внутреннего макета обработки:
Макет = ЭтотОбъект.ПолучитьМакет("МакетКарточки");
ТабличныйДокумент = Новый ТабличныйДокумент;

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабличныйДокумент.Вывести(ОбластьШапка);

При таком подходе любые изменения в общих макетах и релизах типовой конфигурации больше не повлияют на вывод именованных областей внешней обработки.

Способ 3. Переход на актуальную типовую процедуру печати

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

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

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

← На главную