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