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