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