Переход на новые релизы платформы 1С:Предприятие часто приносит не только новые возможности, но и неожиданные изменения в привычном поведении Конфигуратора. Одной из таких проблем, с которой мы столкнулись в релизе 8.3.23, стала невозможность привычным движением мыши перетащить реквизит объекта на форму, находящуюся в расширении. Ситуация выглядит так: дерево реквизитов объекта доступно, но перенести их в дерево элементов формы не удается — курсор превращается в знак запрета, либо действие просто игнорируется.
Давайте разберемся, почему так происходит, является ли это ошибкой, и рассмотрим несколько проверенных способов решения этой задачи. Мы проанализируем как настройки интерфейса, так и альтернативные методы разработки.
Согласно информации из обсуждений и официальных багрепортов, данное поведение в релизе 8.3.23 связано с изменением механизмов отрисовки интерфейса самого Конфигуратора (переход на новые технологии UI). Это привело к тому, что механизм Drag-and-Drop (перетаскивания) стал работать с задержкой или конфликтовать с контекстом расширения.
В некоторых случаях платформа "забывает", что форма уже находится в расширении и доступна для редактирования, воспринимая её как форму основной конфигурации в режиме просмотра. Давайте последовательно разберем все способы, как мы можем обойти это ограничение.
Это самое простое и действенное решение, которое часто упускается из виду. Когда мы открываем форму заимствованного объекта, визуально она может выглядеть доступной, но контекст редактирования не активирован полностью.
Давайте выполним следующие действия:
После нажатия этой "волшебной кнопки" платформа принудительно захватывает контекст формы в расширение, и возможность перетаскивания реквизитов (Drag-and-Drop) восстанавливается. Это действие явно сообщает платформе: "Я хочу редактировать состав элементов этой формы именно здесь".
Если перетаскивание по-прежнему не работает или интерфейс "глючит", мы можем пойти путем ручного конструирования. Этот метод работает безотказно, так как не зависит от механизма Drag-and-Drop. Для добавления полей и реквизитов без визуального редактора Конфигуратора также подойдёт инструмент для добавления реквизитов и элементов на управляемые формы.
Давайте сделаем это пошагово:
Поле.ПутьКДанным.Объект.НашНовыйРеквизит или Объект.Контрагент.Платформа автоматически распознает тип данных по введенному пути и настроит вид поля (строка, ссылка, число и т.д.). Даже если интерфейс визуально блокирует выбор, текстовый ввод работает корректно.
В релизе 8.3.23 была замечена особенность обработки событий мыши. Интерфейс теперь требует подтверждения намерения перетащить объект, чтобы отличить его от простого клика или выделения.
Попробуем изменить нашу привычку работы с мышью:
Эта небольшая задержка позволяет платформе корректно обработать начало события Drag-and-Drop. Многим разработчикам это помогло вернуть привычный стиль работы без отката платформы.
Еще один метод, позволяющий обойти сломанное перетаскивание — использование буфера обмена. Платформа 1С поддерживает копирование реквизитов как элементов формы.
Рассмотрим алгоритм:
Ctrl+C.Ctrl+V.ПутьКДанным на нужный нам реквизит (как в Способе 2).В самых крайних случаях, или если мы хотим сделать наше расширение максимально универсальным и независимым от причуд редактора форм, мы можем добавить элементы программно. Это делается в модуле формы расширения.
Нам потребуется использовать аннотацию &НаСервере и событие ПриСозданииНаСервере. Мы будем использовать расширение метода (аннотация &После или &Вместо, в зависимости от задачи, но безопаснее использовать &После).
Разберем пример кода, который добавляет поле ввода для реквизита "Комментарий" на форму:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверяем, не добавлен ли элемент уже (для избежания дублей при повторных вызовах)
Если Элементы.Найти("Расш1_Комментарий") <> Неопределено Тогда
Возврат;
КонецЕсли;
// Добавляем новый элемент в коллекцию элементов формы
// Параметры: Имя элемента, Тип элемента, Родитель (куда добавляем)
НовыйЭлемент = Элементы.Добавить("Расш1_Комментарий", Тип("ПолеФормы"), Элементы.ГруппаКомментарий);
// Настраиваем связь с данными
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.Комментарий";
НовыйЭлемент.Заголовок = "Комментарий (из расширения)";
// Можно настроить положение
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
КонецПроцедуры
Этот метод является самым надежным с точки зрения архитектуры, так как он будет работать вне зависимости от глюков визуального редактора конфигуратора. Однако он требует написания кода и понимания структуры формы (названий групп-родителей). Для стандартизации и ускорения этой разработки можно использовать готовый модуль для программного изменения форм.
Проблема с добавлением реквизитов в расширении на платформе 8.3.23 — это известная неудобность, с которой столкнулось сообщество. Мы выяснили, что это не тупиковая ситуация.
В большинстве случаев помогает:
ПутьКДанным.Выбирайте способ, который кажется вам наиболее удобным в текущей ситуации. Если вы разрабатываете тиражное решение, программное добавление элементов может стать хорошей альтернативой, страхующей от подобных проблем в будущем.