Почему форма внешнего отчета отображается как «Только чтение» и как ее изменять?

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

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

Выясняем причину: почему форма заблокирована?

Проанализируем архитектуру современных типовых конфигураций (таких как ЕРП, УТ 11, КА или БП 3.0). В большинстве этих программ используется Библиотека стандартных подсистем (БСП). Одной из особенностей БСП является унификация интерфейса. Вместо того чтобы создавать в каждом отчете индивидуальную форму, разработчики используют так называемую Общую форму.

Если мы заглянем в свойства отчета, то увидим, что в поле Основная форма отчета указана не локальная форма самого объекта, а ссылка на ОбщаяФорма.ФормаОтчета. Именно поэтому при сохранении отчета как внешнего (.erf) вы видите форму, но не можете ее редактировать: она физически не принадлежит вашему файлу, она находится в основной конфигурации. Платформа просто отображает ссылку на нее.

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

Решение 1: Программная подмена схемы СКД в модуле объекта

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

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

  1. Откройте модуль объекта вашего внешнего отчета.
  2. Создайте процедуру-обработчик события ПриКомпоновкеРезультата.
  3. Внутри процедуры определите логику выбора макета.

Посмотрим на пример кода, который реализует эту логику:


Процедура ПриКомпоновкеРезультата(РезультатХод, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Отключаем стандартный вывод, так как будем выводить отчет программно
    СтандартнаяОбработка = Ложь;
    
    // Определяем, какую схему использовать (логика может быть любой)
    НужнаяСхема = ПолучитьМакет("МояАльтернативнаяСхема"); 
    
    // Инициализируем компоновщик настроек на основании новой схемы
    // Это критически важно, чтобы поля и настройки соответствовали новой схеме
    ДанныеДляКомпоновки = НужнаяСхема;
    
    // Создаем процесс компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(ДанныеДляКомпоновки, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    // Выполняем саму компоновку
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(РезультатХод);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

С помощью этого метода вы можете хранить внутри одного внешнего отчета несколько макетов СКД и переключаться между ними «на лету» без изменения визуальной формы.

Решение 2: Использование механизмов БСП через «ОпределитьНастройкиФормы»

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

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


// Процедура в модуле объекта
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    // Пример: автоматическое формирование отчета при открытии
    Настройки.События.ПриСозданииНаСервере = Истина;
    Настройки.РазрешитьФормированиеПриОткрытии = Истина;
    
    // Можно указать обработчики, которые будут вызваны в контексте формы
    // Например, для изменения параметров компоновки перед загрузкой
    Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
    
КонецПроцедуры

Использование этого механизма позволяет вам оставаться в рамках «типовой» логики, сохраняя при этом гибкость управления интерфейсом.

Решение 3: Варианты отчетов вместо множества СКД

Часто программисты пытаются создать несколько разных схем (СКД) там, где достаточно одного макета, но разных Вариантов настроек. Система компоновки данных позволяет внутри одной схемы создать неограниченное количество вариантов: в одном будут группировки по партнерам, в другом — по соглашениям, в третьем — только детальные записи.

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


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("КлючВарианта", "ВариантДляПартнера");
ОткрытьФорму("ВнешнийОтчет.МойОтчет.Форма.ФормаОтчета", ПараметрыФормы);

Стандартная форма БСП сама считает этот параметр и применит настройки, соответствующие указанному ключу из вашей СКД. Это наиболее «чистый» способ решения задачи, требующий минимум кода.

Решение 4: Создание собственной формы

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

Рассмотрим алгоритм действий:

  1. В окне редактирования внешнего отчета нажмите на лупу рядом с полем Основная форма.
  2. Выберите создание новой формы (она будет создана внутри вашего файла .erf).
  3. Внимание: после создания формы отчет перестанет использовать механизмы БСП автоматически. Вам придется вручную прописывать вызовы функций библиотек, если вы хотите сохранить функционал печати, рассылки отчетов и сохранения настроек.
  4. Чтобы форма «ожила», используйте конструктор или скопируйте необходимые элементы. Однако помните, что копирование кода из типовой общей формы — задача сложная из-за огромного количества зависимостей от глобальных модулей конфигурации.

Рекомендации по передаче контекста (Партнер, Соглашение)

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

Подведем итог: блокировка формы на чтение — это не ограничение, а подсказка платформы о том, что отчет использует стандартизированный интерфейс. В 90% случаев для решения задач изменения логики достаточно работы с модулем объекта, событием ПриКомпоновкеРезультата или использования механизмов настройки вариантов БСП. Создание собственной формы — это крайняя мера, оправданная только при необходимости радикального изменения интерфейса.

← На главную