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