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