При формировании интерактивных отчетов или сервисных обработок в платформе 1С:Предприятие 7.7 часто требуется реализовать расшифровку ячейки таблицы: по двойному клику открыть форму общего журнала документов, предварительно отобрав нужный вид документов и ограничив видимый период датами отчета. Если с передачей параметров для отбора по виду документов обычно сложностей не возникает, то установка границ периода журнала из внешнего модуля вызывает вопросы. Разберем по шагам, как правильно решить эту задачу штатным механизмом контекста формы.
Главный секрет управления открываемым журналом заключается в особенностях работы функции ОткрытьФорму. Проанализируем ее синтаксис:
ОткрытьФорму(<Объект>, <КонтекстФормы>)
Второй параметр в этой функции является двунаправленным:
СписокЗначений). В открываемой форме переданные данные станут доступны через системную переменную Форма.Параметр.ГрупповойКонтекст).Таким образом, передавая переменную во второй параметр, после выполнения строки кода мы получаем прямой доступ ко всем элементам управления, реквизитам и методам открытого журнала через эту же самую переменную.
Получив контекст формы журнала, мы можем вызывать его штатные методы, в частности УстановитьИнтервал. Метод имеет следующее описание:
КонтекстФормы.УстановитьИнтервал(<ДатаНач>, <ДатаКон>, <ФлагИзменения>)
Разберем назначение его параметров:
<ДатаНач> — выражение типа «Дата», определяющее начальную дату отображаемого периода.<ДатаКон> — выражение типа «Дата», определяющее конечную дату периода.<ФлагИзменения> (необязательный параметр) — числовой флаг прав пользователя:
1 — разрешает пользователю вручную менять интервал с помощью кнопки на командной панели журнала (значение используется по умолчанию).0 — запрещает интерактивное изменение интервала (кнопка выбора периода становится неактивной).Посмотрим на практический пример. Предположим, что в отчете пользователь дважды кликает по ячейке с расшифровкой, и нам необходимо подавить стандартное поведение ячейки, открыть общий журнал с нужным видом документа и задать интервал дат отчета.
Реализуем процедуру следующим образом:
Процедура ОбработкаЯчейкиТаблицы(Значение, ФлагСтандартнойОбработки)
// Отключаем стандартную обработку клика ячейки
ФлагСтандартнойОбработки = 0;
// Формируем параметры отбора для журнала
ПараметрыЖурнала = СоздатьОбъект("СписокЗначений");
ПараметрыЖурнала.ДобавитьЗначение("РасходнаяНакладная", "ВидДокумента");
// Открываем форму журнала. Переменная ПараметрыЖурнала будет перезаписана контекстом
Если ОткрытьФорму("Журнал.ЖурналОбщий.ФормаСписка", ПараметрыЖурнала) = 1 Тогда
// Убеждаемся, что контекст успешно получен
Если ПустоеЗначение(ПараметрыЖурнала) = 0 Тогда
// Устанавливаем требуемый интервал видимости документов
ПараметрыЖурнала.УстановитьИнтервал(ВыбНачПериода, ВыбКонПериода, 1);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При использовании данного подхода обратим внимание на несколько ключевых моментов:
ОткрытьФорму возвращает 1 при успешном открытии и 0 при неудаче (например, если в модуле самого журнала в событии ПриОткрытии сработал СтатусВозврата(0)). Проверка условия Если ОткрытьФорму(...) = 1 защищает код от попытки вызова метода УстановитьИнтервал у пустого значения, что предотвращает появление ошибки времени выполнения.УстановитьИнтервал вызывается из обработки уже после того, как в журнале отработало внутреннее событие ПриОткрытии(). Это гарантирует, что заданный из отчета интервал не будет сброшен системными настройками платформы по умолчанию (настройками пользователя из пункта меню «Сервис — Параметры — Журналы»).ОткрытьФорму не откроет дублирующее окно. Платформа активизирует имеющееся окно и вернет его контекст, после чего период журнала динамически обновится без перезапуска формы.КонтекстФормы.НачалоИнтервала() и КонтекстФормы.КонецИнтервала().Такой подход позволяет полностью управлять отображением общего журнала документов из внешних модулей, отчетов и обработок без необходимости вносить правки в типовую конфигурацию 1С 7.7.