Разработка интерфейсов в 1С «на лету» — задача частая, особенно когда мы работаем с расширениями или создаем универсальные механизмы в общих модулях. Однако любой разработчик сталкивается с досадной проблемой: при передаче объекта Форма в процедуру общего модуля контекстная подсказка (Intellisense) перестает работать. Мы вынуждены постоянно заглядывать в синтакс-помощник, чтобы вспомнить правильное написание свойств или методов. В этой статье мы разберем проверенные способы, как «заставить» конфигуратор выдавать подсказки даже в самых сложных условиях.
Прежде всего, проанализируем причину ситуации. В модуле формы переменная ЭтаФорма или ЭтотОбъект жестко типизирована самой платформой. Конфигуратор заранее знает, какие реквизиты и элементы есть на этой форме. Но как только мы выносим логику в общий модуль, например, в процедуру ПриСозданииНаСервере(Форма, ПараметрыРазмещения), тип переменной Форма становится неопределенным для парсера IDE. Для системы это просто произвольный параметр, и она не может предугадать, что именно вы туда передадите.
Самый популярный и эффективный метод заключается в использовании инструкций препроцессора. Мы создаем условие, которое никогда не выполнится при работе программы, но которое будет проанализировано конфигуратором при построении индекса подсказок. Рассмотрим пример кода, который часто используют опытные разработчики:
#Если НЕ Клиент И НЕ Сервер И НЕ ВнешнееСоединение Тогда
Форма = Новый УправляемаяФорма;
#КонецЕсли
Разберем, что здесь происходит. Инструкция #Если НЕ Клиент И НЕ Сервер И НЕ ВнешнееСоединение Тогда гарантирует, что код внутри этого блока никогда не будет исполнен в реальности. Однако конфигуратор «видит» это присваивание и сопоставляет переменную Форма с типом УправляемаяФорма. С этого момента, как только вы поставите точку после Форма., вы увидите выпадающий список со всеми методами и свойствами: Элементы, Команды, Реквизиты и так далее.
Как показала практика обсуждений на форумах, прямое создание объекта Новый УправляемаяФорма не всегда срабатывает идеально, так как у этого объекта нет публичного конструктора в явном виде. Более надежный способ — использовать системные функции, которые гарантированно возвращают объект нужного типа. Рассмотрим использование функции ОткрытьФорму или ПолучитьФорму внутри аналогичного блока:
// В начале процедуры для включения подсказок
#Если Сервер И Не Сервер Тогда
// Мы указываем любую существующую форму из метаданных
Форма = ПолучитьФорму("ОбщаяФорма.МояСлужебнаяФорма");
#КонецЕсли
// Теперь подсказки будут работать
НовыйЭлемент = Форма.Элементы.Вставить("ИмяПоля", Тип("ПолеФормы"), ...);
Важный нюанс: если вы используете ПолучитьФорму, IDE не только поймет, что это УправляемаяФорма, но и подгрузит контекст конкретной формы, если вы укажете её полное имя. Это поможет, если вам нужны подсказки по конкретным реквизитам этой формы.
Проблема часто не ограничивается самой формой. Когда мы вызываем Форма.Элементы.Добавить() или Форма.Элементы.Вставить(), возвращаемое значение метода имеет тип ЭлементФормы, который является базовым и не содержит специфических свойств, таких как ВидПоля или ПутьКДанным. Чтобы решить и эту проблему, применим каскадную типизацию:
НовыйЭлемент = Форма.Элементы.Вставить("Администратор", Тип("ПолеФормы"), Группа);
#Если Сервер И Не Сервер Тогда
// Явно подсказываем тип для переменной НовыйЭлемент
НовыйЭлемент = Форма.Элементы.Добавить("ФиктивныйЭлемент", Тип("ПолеФормы"));
#КонецЕсли
// Теперь здесь будут работать подсказки для Поля Формы
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Администратор";
Если ваша команда перешла на использование 1C:Enterprise Development Tools (EDT), то описанные выше «костыли» с препроцессором больше не нужны. EDT поддерживает современные стандарты документирования кода. Чтобы включить подсказки, достаточно добавить описание типа в комментариях перед процедурой в формате JSDoc:
// @param {УправляемаяФорма} Форма - Объект формы, куда добавляем элементы
// @param {Структура} ПараметрыРазмещения
Процедура ст_ПриСозданииНаСервере(Форма, ПараметрыРазмещения) Экспорт
// В EDT здесь подсказки будут работать автоматически
Форма.Элементы...
КонецПроцедуры
Это наиболее чистый и правильный способ с точки зрения архитектуры кода, так как он не содержит фиктивных условий и понятен другим разработчикам.
Проанализируем еще несколько моментов, которые помогут вам в работе:
&После или &Вместо, убедитесь, что блок типизации находится внутри вашей процедуры. Конфигуратор в расширениях иногда ведет себя капризно, и «проброс» типа может работать нестабильно без явного указания._Типизация(), которая никогда не вызывается, и прописать в ней все связи типов. Иногда IDE кэширует эти связи для всего модуля.ПолеФормы, ГруппаФормы, КнопкаФормы или ТаблицаФормы. Используйте их в фиктивном присваивании для получения корректных свойств.Таким образом, использование блока препроцессора в сочетании с функциями ПолучитьФорму или ОткрытьФорму является «золотым стандартом» для работы в обычном конфигураторе 1С. Это значительно ускоряет разработку и минимизирует количество опечаток при программном управлении интерфейсом.