Почему при использовании расширения для печатной формы УПД пропадают параметры макета и возникает ошибка?

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

Мы сталкиваемся с распространенной проблемой, когда при формировании печатной формы Универсального Передаточного Документа (УПД) в конфигурации 1С:Бухгалтерия предприятия 3.0 (релиз 3.0.70.33) на платформе 8.3.16.1224 возникает ошибка "Поле объекта не обнаружено". Эта ошибка проявляется после того, как мы заимствуем типовой макет "ПФ_MXL_УниверсальныйПередаточныйДокумент981" из обработки "Печать УПД" в расширение конфигурации. В частности, проблема возникает в строке кода ОбластьМакета.Параметры.Дата = Формат(ДанныеШапки.Дата, "ДЛФ='ДД'");, находящейся в процедуре ВывестиСчетФактуруВТабличныйДокумент общего модуля "УчетНДС". При этом в коллекции ОбластьМакета.Параметры почему-то отсутствует параметр "Дата", хотя значение даты в переменной ДанныеШапки.Дата присутствует, а в самом макете в конфигураторе (в расширении) параметр "Дата" в области "Шапка" вроде бы отображается. Мы видим, что после заимствования в расширение из области макета "Шапка" пропадают два параметра: "Дата" и "ДатаИсправления". Попытки заимствовать в расширение связанные документы ("Реализация" и "Счет-фактура выданный") не устраняют проблему. Давайте разберемся, почему так происходит и как это исправить.

Глубокий анализ механизма макетов в 1С и расширениях

Для начала, давайте рассмотрим, как функционируют макеты в системе 1С:Предприятие и каким образом механизм расширений взаимодействует с ними. Это поможет нам лучше понять корень проблемы.

Как работают макеты в 1С:Предприятии

В системе 1С макеты печатных форм представляют собой шаблоны табличных документов, которые используются для генерации отчетов и печатных форм. Типовые макеты поставляются вместе с конфигурацией и могут быть изменены как в режиме Конфигуратора (разработчиком), так и в режиме 1С:Предприятие (пользователем). Платформа 1С:Предприятие 8.3, особенно в конфигурациях, таких как "Бухгалтерия предприятия 3.0", предоставляет пользователям возможность вносить изменения в макеты печатных форм непосредственно через интерфейс "1С:Предприятие". Это очень удобно, поскольку позволяет адаптировать формы под свои нужды, сохраняя при этом конфигурацию на поддержке поставщика.

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

Механизм расширений и макеты

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

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

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

  1. Неявное искажение макета в пользовательском режиме: Это самая частая причина. После обновлений конфигурации может произойти ситуация, когда типовой макет изменяется, но ранее измененный пользовательский макет не обновляется или обновляется некорректно. При этом в справочнике "Макеты печатных форм" может не отображаться явный признак изменения макета (например, пиктограмма карандашика), что вводит в заблуждение. В таком "испорченном" макете, при визуальном просмотре в режиме 1С:Предприятие, мы можем обнаружить "бардак" — сбитые ячейки, отсутствующие или некорректно расположенные параметры, что и подтверждается в одном из сообщений форума.
  2. Проблемы в расширении после обновления: Даже если пользовательские макеты не изменены, некорректное слияние конфигурации после обновления может "сломать" макет, заимствованный в расширение. Это может произойти из-за несовместимости версий, особенностей платформы или ошибок в процессе объединения. В таких случаях макет в расширении может стать невалидным, хотя в Конфигураторе он может выглядеть правильно, его внутренняя структура может быть нарушена.

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

Шаги по диагностике проблемы

Давайте пошагово разберем процесс диагностики, чтобы выявить истинную причину отсутствия параметров.

Шаг 1: Проверяем макеты в пользовательском режиме

Наш первый и самый критически важный шаг — это проверка состояния макета непосредственно в режиме 1С:Предприятие. Как показала практика, именно здесь часто скрывается корень проблемы, даже если нет явных признаков изменения.

  1. Открываем справочник макетов: Перейдите в раздел Администрирование, затем выберите Печатные формы, отчеты и обработки, а далее — Макеты печатных форм.
  2. Находим нужный макет: В открывшемся списке макетов найдите макет, соответствующий нашей печатной форме УПД. Его полное наименование, как правило, выглядит как "Универсальный передаточный документ (в редакции Постановления № 981)".
  3. Важность детального осмотра: Даже если рядом с названием макета нет "пиктограммы-карандашика", указывающей на его изменение пользователем, обязательно откройте макет для редактирования. Для этого выделите его и нажмите кнопку "Открыть" или воспользуйтесь соответствующим пунктом контекстного меню.
  4. Что искать в макете: В режиме редактирования макета внимательно осмотрите область "Шапка". Что мы должны искать:
    • "Бардак" в области: Это может быть неровное расположение ячеек, смещение текста, некорректное форматирование.
    • Отсутствие ожидаемых параметров: Проверьте, есть ли в области "Шапка" ячейки, которые должны быть параметрами ("Дата", "ДатаИсправления"). Параметры обычно обозначаются квадратными скобками (например, [Дата]). Если вы не видите этих параметров или видите их в странном виде, это явный признак искажения.

    Например, если в типовом макете ячейка должна содержать [Дата], но в пользовательском макете она пуста или содержит произвольный текст, то программно параметр "Дата" будет недоступен.

    Эта ситуация часто возникает при обновлениях. Платформа пытается обновить пользовательский макет, но если изменения в типовом макете и пользовательские изменения слишком сильно отличаются, или произошла какая-то внутренняя ошибка, макет может быть сохранен в некорректном состоянии, но без явного флага "изменено пользователем".

Шаг 2: Анализируем макет в конфигураторе (в расширении)

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

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

Шаг 3: Детализируем ошибку "Поле объекта не обнаружено"

Давайте подробнее разберем техническую сторону ошибки "Поле объекта не обнаружено: 'Дата'" при обращении к ОбластьМакета.Параметры.Дата.

В 1С:Предприятии объект ОбластьМакета представляет собой часть табличного документа (например, область "Шапка", "Таблица" и т.д.). У этого объекта есть свойство Параметры, которое является коллекцией всех параметров, определенных в данной области макета. Когда мы пишем код:


ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Дата = Формат(ДанныеШапки.Дата, "ДЛФ='ДД'");

Система пытается найти в коллекции ОбластьМакета.Параметры элемент с именем "Дата". Если такого элемента (параметра) нет, генерируется ошибка "Поле объекта не обнаружено". Это означает, что проблема не в том, что в переменной ДанныеШапки.Дата нет значения (мы знаем, что оно есть), а в том, что сам макет в области "Шапка" не содержит параметр с именем "Дата". То есть, отсутствует "место" в макете, куда можно было бы подставить это значение. Это прямое следствие некорректной структуры макета, будь то в пользовательском режиме или в расширении.

Варианты устранения проблемы

Теперь, когда мы продиагностировали проблему, давайте рассмотрим конкретные шаги по ее устранению.

Вариант 1: Восстановление стандартного макета в пользовательском режиме

Этот вариант является наиболее вероятным решением, если проблема возникла из-за неявного искажения макета в пользовательском режиме, как это было в исходной ситуации на форуме.

Когда применять: Этот подход следует применять, если в ходе диагностики (Шаг 1) мы обнаружили, что макет в режиме 1С:Предприятие имеет "бардак" или в нем отсутствуют нужные параметры, при этом, возможно, нет явного признака его изменения пользователем. Это часто происходит после обновлений конфигурации, когда типовой макет меняется, а пользовательский не может корректно обновиться или слиться с новыми изменениями.

Пошаговая инструкция:

  1. Открываем справочник макетов:

    Запустите 1С:Предприятие в режиме пользователя. Перейдите в раздел Администрирование, затем выберите пункт Печатные формы, отчеты и обработки. В открывшемся окне найдите ссылку Макеты печатных форм и перейдите по ней.

  2. Находим и выделяем нужный макет:

    В списке макетов найдите макет "Универсальный передаточный документ (в редакции Постановления № 981)". Выделите его одинарным щелчком мыши.

  3. Используем стандартный макет:

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

  4. Подтверждаем действие:

    Система запросит подтверждение. Подтвердите действие, чтобы заменить текущий (возможно, испорченный) пользовательский макет на стандартный.

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

Вариант 2: Передобавление макета в расширение

Этот вариант актуален, если проблема не в пользовательском макете (мы убедились, что он стандартный), или если первый вариант не помог. Это указывает на то, что проблема может быть связана с самим заимствованным макетом в расширении.

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

Пошаговая инструкция (в Конфигураторе):

  1. Открываем Конфигуратор:

    Запустите 1С:Предприятие в режиме Конфигуратора.

  2. Переходим в дерево объектов расширения:

    В окне "Конфигурация" (F11) найдите и откройте ваше расширение (обычно это раздел "Расширения конфигурации"). Перейдите в дерево объектов именно вашего расширения.

  3. Удаляем проблемный макет из расширения:

    В дереве объектов расширения найдите ветку Макеты. В ней должен находиться заимствованный макет ПФ_MXL_УниверсальныйПередаточныйДокумент981. Выделите его, нажмите клавишу Delete или выберите пункт "Удалить" в контекстном меню. Подтвердите удаление.

  4. Сохраняем расширение:

    После удаления макета обязательно сохраните расширение (Файл -> Сохранить или кнопка с дискетой на панели инструментов).

  5. Снова заимствуем макет:

    Теперь нам нужно заново добавить (заимствовать) макет в расширение, чтобы получить его свежую, корректную копию из основной конфигурации.

    1. В дереве объектов основной конфигурации (не расширения!) найдите обработку "Печать УПД".
    2. Раскройте ветку этой обработки и найдите в ней макет ПФ_MXL_УниверсальныйПередаточныйДокумент981.
    3. Вызовите контекстное меню (правой кнопкой мыши) на этом макете и выберите пункт "Добавить в расширение". Выберите ваше расширение из списка, если у вас их несколько.
  6. Сохраняем расширение и обновляем его:

    Еще раз сохраните расширение. Если ваше расширение уже опубликовано в режиме 1С:Предприятие, убедитесь, что оно корректно обновилось. Возможно, потребуется перезапуск клиентского приложения 1С.

Объяснение эффекта: Этот метод гарантирует, что в вашем расширении будет находиться актуальная и неповрежденная копия типового макета. Часто после глобальных обновлений конфигурации, когда происходит слияние множества объектов, макеты в расширениях могут быть внутренне повреждены. Передобавление очищает эту ситуацию и предоставляет расширению "чистую" версию макета, которая содержит все необходимые параметры в правильной структуре.

Вариант 3: Анализ программного кода

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

Когда применять: Этот шаг необходим, если вы убедились в корректности макетов (и в пользовательском режиме, и в расширении), но ошибка продолжает возникать.

Что проверять:

  1. Условное обращение к параметрам: Возможно, в вашем коде или в типовом коде есть условия, при которых параметр "Дата" должен быть или не должен быть в макете. Проанализируйте логику в процедуре ВывестиСчетФактуруВТабличныйДокумент.
  2. Проверка существования параметра: Для отладки и предотвращения ошибок "Поле объекта не обнаружено" в будущем, особенно если макеты могут меняться, полезно использовать проверку наличия параметра перед обращением к нему. Например:
    
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    Если ОбластьМакета.Параметры.Свойство("Дата") Тогда
        ОбластьМакета.Параметры.Дата = Формат(ДанныеШапки.Дата, "ДЛФ='ДД'");
    Иначе
        // Обработка отсутствия параметра - например, вывод сообщения или запись в журнал
        Сообщить("Внимание: Параметр 'Дата' отсутствует в области макета 'Шапка'!");
        ЗаписатьВЖурналРегистрации("Отсутствует параметр 'Дата' в мапке УПД", УровеньЖурналаРегистрации.Ошибка);
    КонецЕсли;
    

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

  3. Использование отладчика: Запустите 1С:Предприятие в режиме отладчика и установите точку останова непосредственно перед строкой, где возникает ошибка (ОбластьМакета.Параметры.Дата = ...). В процессе отладки исследуйте коллекцию ОбластьМакета.Параметры, чтобы точно увидеть, какие параметры присутствуют и с какими именами. Это поможет подтвердить, что параметр действительно отсутствует или имеет другое имя.

Превентивные меры и лучшие практики

Чтобы избежать подобных проблем в будущем, мы рекомендуем придерживаться следующих практик:

  1. Регулярная проверка после обновлений: После каждого крупного обновления конфигурации уделяйте особое внимание критически важным печатным формам и отчетам, которые были изменены или заимствованы в расширения. Проверяйте их работоспособность и визуальное представление.
  2. Версионирование расширений: Используйте системы контроля версий (например, Git) для хранения исходного кода ваших расширений. Это позволит отслеживать изменения, откатываться к предыдущим версиям и анализировать различия, если возникнут проблемы после обновлений или модификаций.
  3. Тщательное тестирование: Всегда проводите комплексное тестирование печатных форм после внесения любых изменений в расширения или после обновлений конфигурации. Тестирование должно включать проверку формирования пеформ, корректности отображения данных и отсутствия ошибок.
  4. Документирование изменений: Ведите подробную документацию по всем изменениям, внесенным в типовые макеты или программный код, который влияет на их работу. Это значительно упростит диагностику и устранение проблем в будущем.
  5. Осторожность с пользовательскими макетами: Если пользователи изменяют макеты в режиме 1С:Предприятие, контролируйте эти изменения. Объясните им риски, связанные с неавтоматическим обновлением таких макетов после выхода новых версий конфигурации. При возникновении проблем, первое, что стоит проверить, это именно пользовательские макеты.

Следуя этим рекомендациям, мы значительно снизим вероятность возникновения подобных ошибок и сделаем процесс работы с расширениями и макетами в 1С более стабильным и предсказуемым.

← На главную