Почему слетает ширина колонок динамического списка в управляемых формах 1С при обновлении и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

Каждый практикующий разработчик и администратор систем на платформе «1С:Предприятие 8.3» рано или поздно сталкивается с неприятной ситуацией: после очередного штатного обновления конфигурации пользователи начинают массово жаловаться на то, что в списках документов или справочников «разъехались» колонки. Таблицы принимают неудобочитаемый вид, столбцы становятся либо слишком широкими, либо сжимаются до нечитаемого состояния. При этом у самого разработчика, выполнявшего обновление, интерфейс зачастую отображается корректно.

В рамках этой статьи мы подробно разберем, почему возникает данная проблема в управляемом приложении, исследуем внутренние механизмы платформы 1С и рассмотрим три эффективных способа решения этой задачи — от простых пользовательских манипуляций до надежного программного закрепления структуры интерфейса.

Выясняем причину: почему «ломается» ширина колонок?

Для того чтобы эффективно бороться с проблемой, проанализируем внутреннее устройство платформы. В обычных формах (на старых версиях платформ) настройки интерфейса сохранялись локально на компьютере пользователя в файлах кэша. В управляемом же приложении на платформе 8.3 логика работы кардинально изменилась. Настройки управляемых форм, включая ширину колонок, их видимость и порядок, сохраняются непосредственно в самой базе данных в системной таблице настроек (хранилище системных настроек SystemSettings).

Основными причинами сброса настроек отображения колонок являются следующие факторы:

  1. Изменение хэша структуры динамического списка. Элемент управляемой формы, представляющий собой таблицу с типом данных ДинамическийСписок, жестко завязан на текст SQL-запроса, который получает данные из базы. Платформа 1С сохраняет настройки колонок конкретного пользователя, привязывая их к уникальному идентификатору (хэшу) этого запроса. Если в процессе обновления конфигурации разработчик внес даже минимальное изменение в запрос динамического списка (добавил новое поле, изменил условие связи, переименовал псевдоним или даже просто изменил форматирование текста запроса), платформа сгенерирует новый хэш-код структуры. Старые настройки пользователей, сохраненные в базе данных для прежнего хэша, становятся несовместимыми, и система автоматически сбрасывает оформление таблицы к значениям по умолчанию.
  2. Использование динамического («демонического») обновления. При обновлении конфигурации базы данных без монопольного выгона пользователей (так называемое «динамическое обновление» по клавише F7) кэш метаданных на компьютерах активных пользователей обновляется некорректно. Это почти всегда приводит к рассогласованию локального кэша и настроек в базе данных SystemSettings, вызывая хаотичное изменение размеров элементов интерфейса.
  3. Несовместимость версий платформы. В некоторых релизах платформы «1С:Предприятие» (особенно ветки 8.3.13–8.3.16) присутствуют задокументированные баги, связанные с некорректным расчетом автоматической ширины ячеек при использовании свойства РастягиватьПоГоризонтали.

Рассмотрим по шагам, как исправить эту проблему и не допустить ее повторения в будущем.

Решение 1. Сброс настроек на стороне пользователя (без изменения конфигурации)

Если проблема носит единичный характер или затрагивает небольшое количество пользователей, самым быстрым способом вернуть таблице нормальный вид будет сброс формы к исходным настройкам конфигуратора. Обычная очистка локального кэша на диске в папках AppData\Local\1C здесь не поможет, так как настройки сохранены в базе данных.

Выполним сброс настроек формы по следующему алгоритму:

  1. В проблемном окне списка документов или справочника нажмем кнопку «Еще» в правом верхнем углу таблицы.
  2. В выпадающем меню выберем пункт «Изменить форму...».
  3. В открывшемся окне настройки формы нажмем кнопку «Еще» (расположенную внутри этого окна) и выберем команду «Установить стандартные настройки».
  4. Нажмем кнопку «ОК» для применения параметров. Форма вернется к первоначальному виду, заданному разработчиком.

Если требуется сбросить настройки сразу у группы пользователей, администратор системы может сделать это централизованно. Для этого перейдем в раздел «Администрирование» — «Настройки пользователей и прав» — «Очистка настроек». Здесь можно точечно выбрать пользователя и удалить его индивидуальные настройки для конкретного справочника или документа, не затрагивая остальные персональные настройки интерфейса.

Решение 2. Корректировка свойств элементов в Конфигураторе

Для того чтобы колонки динамического списка не меняли свои размеры произвольным образом при изменении структуры запроса, нам необходимо правильно настроить поведение элементов формы в Конфигураторе.

Проанализируем ключевые свойства элементов и настроим их:

  1. Откроем нужную управляемую форму в Конфигураторе и выделим элемент таблицы (динамического списка).
  2. В панели свойств найдем параметр РастягиватьПоГоризонтали и установим его в значение Ложь. Это предотвратит неконтролируемое растяжение таблицы на весь экран с хаотичным распределением ширины между колонками.
  3. Для каждой критически важной колонки (например, «Номер», «Дата», «ИНН», «Сумма») перейдем в ее свойства и снимем флаг АвтоМаксимальнаяШирина.
  4. Зададим свойствам Ширина и МаксимальнаяШирина фиксированные числовые значения. Например, для номера документа оптимально установить значение 12, для даты — 15, для контрагента — 30.
  5. Убедимся, что у самой управляемой формы заполнены свойства КлючСохраненияПоложенияОкна и КлючСохраненияНастроек. Наличие уникальных строковых ключей позволяет платформе более стабильно сопоставлять пользовательские настройки с формой.

Решение 3. Программная фиксация ширины колонок (наиболее надежный способ)

Если база данных часто дорабатывается, а запросы динамических списков регулярно изменяются, самым надежным и долговечным решением будет принудительное программное назначение ширины колонок при инициализации формы. Этот метод полностью перекрывает любые сбойные настройки, загружаемые из базы данных.

Посмотрим на пример реализации этого метода. Нам потребуется внедрить программный код в модуль управляемой формы. Откроем модуль формы и найдем (или создадим) предопределенную серверную процедуру ПриСозданииНаСервере. Пропишем в ней жесткую установку ширины для необходимых элементов:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Принудительно фиксируем ширину колонок динамического списка
    // для предотвращения сбоев интерфейса после обновлений конфигурации
    
    Попытка
        // Задаем ширину для стандартных реквизитов списка
        Элементы.СписокНомер.Ширина = 12;
        Элементы.СписокДата.Ширина = 16;
        
        // Настраиваем ширину для пользовательских полей и контрагентов
        Элементы.СписокКонтрагент.Ширина = 35;
        Элементы.СписокСуммаДокумента.Ширина = 15;
        Элементы.СписокОтветственный.Ширина = 20;
        
        // Отключаем автоматическое растяжение колонок по ширине экрана
        Элементы.Список.РастягиватьПоГоризонтали = Ложь;
    Исключение
        // Фиксируем возможные ошибки в журнале регистрации, 
        // если состав колонок будет изменен в будущем
        ЗаписьЖурналаРегистрации("НастройкаИнтерфейса.Ошибка",
            УровеньЖурналаРегистрации.Предупреждение,
            ,
            ,
            "Не удалось установить размеры колонок: " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Данный код срабатывает на сервере непосредственно в момент генерации формы для конкретного пользователя. Он принудительно переопределяет ширину указанных элементов интерфейса, гарантируя, что при каждом открытии формы колонки будут иметь строго заданный разработчиком размер, независимо от того, какие настройки сохранены в системных таблицах базы данных.

Рекомендации по выполнению обновлений

Для того чтобы минимизировать риск возникновения подобных проблем с интерфейсом у пользователей, рекомендуем придерживаться следующих правил администрирования:

Применение описанных методов позволит вам быстро восстановить работоспособность интерфейса и обеспечить стабильное и прогнозируемое поведение управляемых форм 1С у всех пользователей системы.

← На главную