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