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