Каждый практикующий разработчик и администратор систем на платформе «1С:Предприятие 8.3» рано или поздно сталкивается с неприятной ситуацией: после очередного штатного обновления конфигурации пользователи начинают массово жаловаться на то, что в списках документов или справочников «разъехались» колонки. Таблицы принимают неудобочитаемый вид, столбцы становятся либо слишком широкими, либо сжимаются до нечитаемого состояния. При этом у самого разработчика, выполнявшего обновление, интерфейс зачастую отображается корректно.
В рамках этой статьи мы подробно разберем, почему возникает данная проблема в управляемом приложении, исследуем внутренние механизмы платформы 1С и рассмотрим три эффективных способа решения этой задачи — от простых пользовательских манипуляций до надежного программного закрепления структуры интерфейса.
Для того чтобы эффективно бороться с проблемой, проанализируем внутреннее устройство платформы. В обычных формах (на старых версиях платформ) настройки интерфейса сохранялись локально на компьютере пользователя в файлах кэша. В управляемом же приложении на платформе 8.3 логика работы кардинально изменилась. Настройки управляемых форм, включая ширину колонок, их видимость и порядок, сохраняются непосредственно в самой базе данных в системной таблице настроек (хранилище системных настроек SystemSettings).
Основными причинами сброса настроек отображения колонок являются следующие факторы:
ДинамическийСписок, жестко завязан на текст SQL-запроса, который получает данные из базы. Платформа 1С сохраняет настройки колонок конкретного пользователя, привязывая их к уникальному идентификатору (хэшу) этого запроса. Если в процессе обновления конфигурации разработчик внес даже минимальное изменение в запрос динамического списка (добавил новое поле, изменил условие связи, переименовал псевдоним или даже просто изменил форматирование текста запроса), платформа сгенерирует новый хэш-код структуры. Старые настройки пользователей, сохраненные в базе данных для прежнего хэша, становятся несовместимыми, и система автоматически сбрасывает оформление таблицы к значениям по умолчанию.SystemSettings, вызывая хаотичное изменение размеров элементов интерфейса.РастягиватьПоГоризонтали.Рассмотрим по шагам, как исправить эту проблему и не допустить ее повторения в будущем.
Если проблема носит единичный характер или затрагивает небольшое количество пользователей, самым быстрым способом вернуть таблице нормальный вид будет сброс формы к исходным настройкам конфигуратора. Обычная очистка локального кэша на диске в папках AppData\Local\1C здесь не поможет, так как настройки сохранены в базе данных.
Выполним сброс настроек формы по следующему алгоритму:
Если требуется сбросить настройки сразу у группы пользователей, администратор системы может сделать это централизованно. Для этого перейдем в раздел «Администрирование» — «Настройки пользователей и прав» — «Очистка настроек». Здесь можно точечно выбрать пользователя и удалить его индивидуальные настройки для конкретного справочника или документа, не затрагивая остальные персональные настройки интерфейса.
Для того чтобы колонки динамического списка не меняли свои размеры произвольным образом при изменении структуры запроса, нам необходимо правильно настроить поведение элементов формы в Конфигураторе.
Проанализируем ключевые свойства элементов и настроим их:
РастягиватьПоГоризонтали и установим его в значение Ложь. Это предотвратит неконтролируемое растяжение таблицы на весь экран с хаотичным распределением ширины между колонками.АвтоМаксимальнаяШирина.Ширина и МаксимальнаяШирина фиксированные числовые значения. Например, для номера документа оптимально установить значение 12, для даты — 15, для контрагента — 30.КлючСохраненияПоложенияОкна и КлючСохраненияНастроек. Наличие уникальных строковых ключей позволяет платформе более стабильно сопоставлять пользовательские настройки с формой.Если база данных часто дорабатывается, а запросы динамических списков регулярно изменяются, самым надежным и долговечным решением будет принудительное программное назначение ширины колонок при инициализации формы. Этот метод полностью перекрывает любые сбойные настройки, загружаемые из базы данных.
Посмотрим на пример реализации этого метода. Нам потребуется внедрить программный код в модуль управляемой формы. Откроем модуль формы и найдем (или создадим) предопределенную серверную процедуру ПриСозданииНаСервере. Пропишем в ней жесткую установку ширины для необходимых элементов:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Принудительно фиксируем ширину колонок динамического списка
// для предотвращения сбоев интерфейса после обновлений конфигурации
Попытка
// Задаем ширину для стандартных реквизитов списка
Элементы.СписокНомер.Ширина = 12;
Элементы.СписокДата.Ширина = 16;
// Настраиваем ширину для пользовательских полей и контрагентов
Элементы.СписокКонтрагент.Ширина = 35;
Элементы.СписокСуммаДокумента.Ширина = 15;
Элементы.СписокОтветственный.Ширина = 20;
// Отключаем автоматическое растяжение колонок по ширине экрана
Элементы.Список.РастягиватьПоГоризонтали = Ложь;
Исключение
// Фиксируем возможные ошибки в журнале регистрации,
// если состав колонок будет изменен в будущем
ЗаписьЖурналаРегистрации("НастройкаИнтерфейса.Ошибка",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Не удалось установить размеры колонок: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Данный код срабатывает на сервере непосредственно в момент генерации формы для конкретного пользователя. Он принудительно переопределяет ширину указанных элементов интерфейса, гарантируя, что при каждом открытии формы колонки будут иметь строго заданный разработчиком размер, независимо от того, какие настройки сохранены в системных таблицах базы данных.
Для того чтобы минимизировать риск возникновения подобных проблем с интерфейсом у пользователей, рекомендуем придерживаться следующих правил администрирования:
/ClearCache.ВЫБРАТЬ и сохраняйте прежние псевдонимы полей, чтобы платформа могла корректно сопоставить старые настройки пользователей с новой структурой данных.Применение описанных методов позволит вам быстро восстановить работоспособность интерфейса и обеспечить стабильное и прогнозируемое поведение управляемых форм 1С у всех пользователей системы.