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