Как восстановить контекстные подсказки при программном создании элементов формы

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка интерфейсов в 1С «на лету» — задача частая, особенно когда мы работаем с расширениями или создаем универсальные механизмы в общих модулях. Однако любой разработчик сталкивается с досадной проблемой: при передаче объекта Форма в процедуру общего модуля контекстная подсказка (Intellisense) перестает работать. Мы вынуждены постоянно заглядывать в синтакс-помощник, чтобы вспомнить правильное написание свойств или методов. В этой статье мы разберем проверенные способы, как «заставить» конфигуратор выдавать подсказки даже в самых сложных условиях.

Почему пропадают подсказки в общих модулях?

Прежде всего, проанализируем причину ситуации. В модуле формы переменная ЭтаФорма или ЭтотОбъект жестко типизирована самой платформой. Конфигуратор заранее знает, какие реквизиты и элементы есть на этой форме. Но как только мы выносим логику в общий модуль, например, в процедуру ПриСозданииНаСервере(Форма, ПараметрыРазмещения), тип переменной Форма становится неопределенным для парсера IDE. Для системы это просто произвольный параметр, и она не может предугадать, что именно вы туда передадите.

Решение 1: Фиктивная типизация через блок препроцессора

Самый популярный и эффективный метод заключается в использовании инструкций препроцессора. Мы создаем условие, которое никогда не выполнится при работе программы, но которое будет проанализировано конфигуратором при построении индекса подсказок. Рассмотрим пример кода, который часто используют опытные разработчики:


#Если НЕ Клиент И НЕ Сервер И НЕ ВнешнееСоединение Тогда
    Форма = Новый УправляемаяФорма;
#КонецЕсли

Разберем, что здесь происходит. Инструкция #Если НЕ Клиент И НЕ Сервер И НЕ ВнешнееСоединение Тогда гарантирует, что код внутри этого блока никогда не будет исполнен в реальности. Однако конфигуратор «видит» это присваивание и сопоставляет переменную Форма с типом УправляемаяФорма. С этого момента, как только вы поставите точку после Форма., вы увидите выпадающий список со всеми методами и свойствами: Элементы, Команды, Реквизиты и так далее.

Решение 2: Типизация через системные функции получения формы

Как показала практика обсуждений на форумах, прямое создание объекта Новый УправляемаяФорма не всегда срабатывает идеально, так как у этого объекта нет публичного конструктора в явном виде. Более надежный способ — использовать системные функции, которые гарантированно возвращают объект нужного типа. Рассмотрим использование функции ОткрытьФорму или ПолучитьФорму внутри аналогичного блока:


// В начале процедуры для включения подсказок
#Если Сервер И Не Сервер Тогда
    // Мы указываем любую существующую форму из метаданных
    Форма = ПолучитьФорму("ОбщаяФорма.МояСлужебнаяФорма"); 
#КонецЕсли

// Теперь подсказки будут работать
НовыйЭлемент = Форма.Элементы.Вставить("ИмяПоля", Тип("ПолеФормы"), ...);

Важный нюанс: если вы используете ПолучитьФорму, IDE не только поймет, что это УправляемаяФорма, но и подгрузит контекст конкретной формы, если вы укажете её полное имя. Это поможет, если вам нужны подсказки по конкретным реквизитам этой формы.

Решение 3: Как получить подсказки для созданных элементов?

Проблема часто не ограничивается самой формой. Когда мы вызываем Форма.Элементы.Добавить() или Форма.Элементы.Вставить(), возвращаемое значение метода имеет тип ЭлементФормы, который является базовым и не содержит специфических свойств, таких как ВидПоля или ПутьКДанным. Чтобы решить и эту проблему, применим каскадную типизацию:


НовыйЭлемент = Форма.Элементы.Вставить("Администратор", Тип("ПолеФормы"), Группа);

#Если Сервер И Не Сервер Тогда
    // Явно подсказываем тип для переменной НовыйЭлемент
    НовыйЭлемент = Форма.Элементы.Добавить("ФиктивныйЭлемент", Тип("ПолеФормы"));
#КонецЕсли

// Теперь здесь будут работать подсказки для Поля Формы
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Администратор";

Решение 4: Особенности работы в 1C:EDT

Если ваша команда перешла на использование 1C:Enterprise Development Tools (EDT), то описанные выше «костыли» с препроцессором больше не нужны. EDT поддерживает современные стандарты документирования кода. Чтобы включить подсказки, достаточно добавить описание типа в комментариях перед процедурой в формате JSDoc:


// @param {УправляемаяФорма} Форма - Объект формы, куда добавляем элементы
// @param {Структура} ПараметрыРазмещения
Процедура ст_ПриСозданииНаСервере(Форма, ПараметрыРазмещения) Экспорт
    // В EDT здесь подсказки будут работать автоматически
    Форма.Элементы...
КонецПроцедуры

Это наиболее чистый и правильный способ с точки зрения архитектуры кода, так как он не содержит фиктивных условий и понятен другим разработчикам.

Важные рекомендации

Проанализируем еще несколько моментов, которые помогут вам в работе:

  1. Использование в расширениях: Если вы пишете код в аннотации &После или &Вместо, убедитесь, что блок типизации находится внутри вашей процедуры. Конфигуратор в расширениях иногда ведет себя капризно, и «проброс» типа может работать нестабильно без явного указания.
  2. Типизация через "пустышки": Вы можете создать в общем модуле одну служебную процедуру _Типизация(), которая никогда не вызывается, и прописать в ней все связи типов. Иногда IDE кэширует эти связи для всего модуля.
  3. Выбор правильного типа: Помните, что для разных элементов нужны разные типы: ПолеФормы, ГруппаФормы, КнопкаФормы или ТаблицаФормы. Используйте их в фиктивном присваивании для получения корректных свойств.

Таким образом, использование блока препроцессора в сочетании с функциями ПолучитьФорму или ОткрытьФорму является «золотым стандартом» для работы в обычном конфигураторе 1С. Это значительно ускоряет разработку и минимизирует количество опечаток при программном управлении интерфейсом.

← На главную