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