Разбор примера правильной разработки расширения с отчетом.
Немножко ссылок:
- Библиотека Стандартных Подсистем: Варианты отчетов
- Система стандартов и методик разработки конфигураций: Разработка конфигураций с повторным использованием общего кода и объектов метаданных
- Система стандартов и методик разработки конфигураций: Обеспечение обратной совместимости библиотек
С появлением расширений конфигурации разрабатывать отчеты стало значительно проще и понятнее, и самое главное, возможно отследить будет ли применен отчет к новой версии конфигурации.
В этом, наверное, принципиальное преимущество расширений. Если просто взять и написать отчет как внешний и добавить через дополнительные отчеты и обработки, то после обновления он может развалиться в непредсказуемом месте, потому что основная конфигурация изменена. И, несмотря на то, что БСП после обновления в текущих делах предлагает просмотреть убедиться в работоспособности всех дополнительных отчетов и доработок, расширения могут уже на этапе обновления сказать, что они не применимы к новой конфигурации.
В чем основная идея и как добиться такого контроля, чтобы обезопасить себя, как разработчика расширения от непредсказуемых падений в продуктиве после обновления информационной базы? Все очень просто:
- Для решения одной задачи создавайте одно расширение. Конкретно с монитором - одна задача, один отчет, одно расширение. Это позволит после обновления конфигурации сохранить активными все расширения, которые остались совместимыми, и, сразу увидеть те расширения, над которыми надо поработать.
- Всегда добавляйте зависимости. Отмечайте все свойства, которые используются в вашем коде расширения. Например, в мониторе, для получения состояния закрытия месяца используется программный интерфейс общего модуля ЗакрытиеМесяцаСервер, это значит, что этот модуль должен быть в зависимостях. Открывается форма по умолчанию обработки ОперацииЗакрытияМесяца - значит и обработку в зависимости. Выполняется запрос к перечислению ОперацииЗакрытияМесяца (для получения всех доступных операций закрытия месяца) - перечисление тоже в зависимости.
- Не надо в зависимости добавлять все, что только можно. Все что не используется в вашем коде расширения должно быть исключено из зависимостей, например в мониторе добавлены в зависимости конкретные значения перечисления СостоянияОперацийЗакрытияМесяца вместо всех значений, потому что для логики расчета состояний другие состояния не нужны. Такой подход позволит не отламывать расширение понапрасну при обновлении конфигурации.
- Старайтесь описывать какой именно программный интерфейс вы используете. Никогда не используйте то, что не является программным интерфейсом. Это позволит обновляться на исправительные версии конфигураций (изменена только 4ая цифра) и на минорные версии конфигураций (изменена 3я цифра) без нарушения обратной совместимости. Все конфигурации сохраняют обратную совместимость в рамках первых двух цифр версии, но только для программного интерфейса. В рамках изменения третьей цифры версии используемый вами программный интерфейс может быть признан устаревшим, но удален он будет только при обновлении на версию с изменением 2ой цифры. Например вы в версии 1.0.1.1 используете какой-то метод, можете свободно обновить на версию 1.0.1.235, почти безболезненно на версию 1.0.45.24 (лучше всего проверить а не стало ли что-то устаревшим), но при обновлении на версию 1.1.1.1 надо срочно проверять все ли работает. Для того, чтобы быстро находить что надо проверить на устаревание я всегда добавляю комментарий // @Импорт и далее описываю что я использовал. Смотрите пример в расширенном модуле ОтчетыКлиентПереопределяемый.
Отчет, который требуется собрать, не может быть получен выборкой из базы данных. Программного интерфейса, дающего выборку по всему времени ведения учета в программе тоже нет. Потому надо использовать режим работы СКД загрузки данных из табличной части, которую требуется собрать некоторым придуманным алгоритмом на встроенном языке. Для этого достаточно общий фрагмент почти для всех отчетов такого типа можно посмотреть в примере обработки события ПриКомпоновкеРезультата.
Для отладки отчета следует помнить, что компоновка выполняется в фоновом задании, потому надо иметь сервер с включенным ключом debug или отлаживаться в файловой версии, и в предметах отладки выбрать отладку фоновых заданий.
В отчете требуется иметь некоторые настройки, которые хочется видеть в стандартной форме настроек варианта отчета БСП. Для этого сами настройки следует задавать в параметрах СКД, а получение их при компоновке результата выполнить с помощью простой функции:
Функция ЗначениеПараметраСКД(ИмяПараметра)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ПараметрКомпоновки = Настройки.ПараметрыДанных.Элементы.Найти(
Новый ПараметрКомпоновкиДанных(ИмяПараметра));
Возврат ПараметрКомпоновки.Значение;
КонецФункции
Если ЗначениеПараметраСКД("СкрытьУспешноЗакрытыеМесяцы") = Истина Тогда // Если параметра нет - Неопределено.
Для того, чтобы подсистема БСП вариантов отчета увидела отчет из расширения надо расширить подсистему ПодключаемыеОтчетыИОбработки конфигурации и включить в нее отчет.
Чтобы отчет правильно отобразился в панели отчетов надо реализовать в менеджере отчета интерфейс БСП, в котором описать что это за отчет и как он должен отобразиться, и главное - где он должен отображаться. Пример можно посмотреть в модуле менеджера отчета:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
// СтандартныеПодсистемы.ПодключаемыеОтчетыИОбработки
// (См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов)
Процедура ПриОпределенииНастроек(Настройки) Экспорт
Настройки.НастроитьВариантыОтчета = Истина;
Настройки.ДобавитьКомандыОтчетов = Истина;
Настройки.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеОтчетыИОбработки
// СтандартныеПодсистемы.ВариантыОтчетов
// (См. ВариантыОтчетовПереопределяемый.ОпределитьОбъектыСКомандамиОтчетов)
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
Команда = КомандыОтчетов.Добавить();
Команда.Представление = НСтр("ru = 'Монитор операций закрытия месяца'");
Команда.КлючВарианта = "Основной";
КонецПроцедуры
// (См. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов)
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
НастройкиОтчета.Размещение.Вставить(Метаданные.Подсистемы.ФинансовыйРезультатИКонтроллинг.Подсистемы.ЗакрытиеМесяца);
НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "Основной");
НастройкиВарианта.Описание =
НСтр("ru = 'Контроль операций закрытия месяца по разным этапам с начала ведения учета в программе.
|Позволяет найти проблемный месяц и проблемный этап закрытия и перейти к закрытию месяца.'");
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВариантыОтчетов
#КонецОбласти
#КонецОбласти
#КонецЕсли
Для того чтобы переопределить поведение расшифровки в отчете, следует пользоваться переопределением модуля ОтчетыКлиентПереопределяемый, в котором можно задать правила расшифровки. В СКД расшифровка вообще для многих работает не очевидно, особенно часто начинающие разработчики пугаются, когда видят значением расшифровки какое-то число, на самом деле все просто, данные расшифровки содержат соответствие того, какие были группировки у значения, и зная ключ расшифровки и имея данные расшифровки (сохраняются в реквизите формы) можно просто восстановить какие были группировки. А это значит можно точно определить координаты в пространстве группировок, по которым пользователь выполняет расшифровку. Для восстановления состава группировок по ключу и данным расшифровки есть метод программного интерфейса КомпоновкаДанныхВызовСервера.ПараметрыФормыРасшифровки. На примере монитора, при нажатии на одно из полей, в колонке определяется месяц закрытия и открывается форма обработки закрытия месяца.
Старайтесь изолировать работу с базой данных от работы с логикой расчета. Для разработки расширений это наиболее актуально, ведь чем меньше будет точек соприкосновения с конфигурацией, тем проще будет адаптироваться к новой версии. Например, модель данных ИБ в мониторе:
#Область МодельДанныхИБ
Функция ВсеОперацииЗакрытияМесяца()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОперацииЗакрытияМесяца.Ссылка КАК Ссылка
|ИЗ
| Перечисление.ОперацииЗакрытияМесяца КАК ОперацииЗакрытияМесяца";
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
Функция СостояниеЭтаповЗакрытияМесяца(ОперацииЗакрытияМесяца, Период)
Возврат ЗакрытиеМесяцаСервер.ОпределитьСостояниеЭтаповРасчета(ОперацииЗакрытияМесяца, Период);
КонецФункции
Функция СостояниеИспользуется(Значение)
Возврат Значение <> Перечисления.СостоянияОперацийЗакрытияМесяца.НеТребуется;
КонецФункции
Функция СостояниеУспешно(Значение)
Возврат Значение <> Перечисления.СостоянияОперацийЗакрытияМесяца.НеТребуется
И Значение <> Перечисления.СостоянияОперацийЗакрытияМесяца.ВыполненоУспешно
КонецФункции
Функция ОперацияЗакрытияЗависитОтМесяца(Значение)
Возврат Значение <> Перечисления.ОперацииЗакрытияМесяца.ИсправлениеДублейВидовЗапасов;
КонецФункции
#КонецОбласти
Внимание, расширение работает с конфигурациями УТ/КА/УП поколения *.4.5.* или выше.
Проверено на демобазах УТ 11.4.5 и УП 2.4.5.
MIT License https://github.com/axioma-project/MonthEndClosingMonitor