Как использовать реквизиты, добавленные расширением, во внешних отчетах 1С?

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

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

Суть проблемы: Невидимые реквизиты расширения

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

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

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

Почему это происходит? Идеология расширений и режимы работы

Разберем, почему возникает такая ситуация.

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

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

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

Эффективные обходные пути и решения

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

  1. Разработка отчета непосредственно в расширении

    Самый надежный и прямолинейный способ – это добавить сам отчет (или обработку) непосредственно в то же расширение, которое добавляет необходимые реквизиты. Если отчет является частью расширения, он будет иметь полный доступ ко всем объектам, добавленным этим расширением, а также ко всем заимствованным объектам основной конфигурации. В этом случае конструктор запросов СКД будет корректно отображать и позволять выбирать реквизиты из расширения.

    Преимущества:

    • Полная видимость всех реквизитов расширения в конфигураторе.
    • Работа конструктора запросов и СКД без ошибок.
    • Соответствие идеологии расширений.

    Недостатки:

    • Отчет становится частью расширения, что может быть не всегда удобно, если отчет является универсальным или должен существовать вне конкретного расширения.
    • Усложняется переиспользование отчета в других расширениях или конфигурациях.
  2. Построение запроса или СКД в пользовательском режиме с последующим импортом

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

    Шаги по реализации:

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

      Важный момент: Конфигуратор при этом может выдавать предупреждения или даже ошибки о "непонятном реквизите" или "поле не найдено", когда вы импортируете схему или вставляете текст запроса. Не обращайте внимания на эти предупреждения на этапе сохранения объекта в конфигураторе. Главное, что схема или запрос были успешно построены и отлажены в пользовательском режиме. При исполнении внешнего отчета в режиме "1С:Предприятие" платформа корректно объединит все расширения, и запрос/СКД будет работать правильно.

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

    Пример кода для программного использования запроса во внешнем отчете:

    
    // В модуле объекта внешнего отчета
    Функция СформироватьОтчет(НачалоПериода, КонецПериода)
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Справочник.Ссылка КАК Ссылка,
            |    Справочник.Наименование КАК Наименование,
            |    Справочник.КодНов КАК КодНов // Здесь КодНов - реквизит из расширения
            |ИЗ
            |    Справочник.МойСправочник КАК Справочник
            |ГДЕ
            |    Справочник.ПометкаУдаления = ЛОЖЬ";
    
        // Можно добавить параметры запроса
        // Запрос.УстановитьПараметр("НачПериода", НачалоПериода);
        // Запрос.УстановитьПараметр("КонПериода", КонецПериода);
    
        Попытка
            РезультатЗапроса = Запрос.Выполнить().Выгрузить();
        Исключение
            Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
            Возврат Новый ТаблицаЗначений();
        КонецПопытки;
    
        Возврат РезультатЗапроса;
    КонецФункции
    

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

  3. Использование вычисляемых полей в СКД (требует проверки)

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

Ограничения и перспективы развития механизма расширений

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

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

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

Рекомендации

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

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

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

← На главную