Как исправить баг со схлопыванием ширины колонок в 1С версии 8.3.16?

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

В процессе работы с управляемыми формами в платформе 1С:Предприятие 8.3.16 пользователи часто сталкиваются с крайне неприятным поведением интерфейса. При попытке интерактивно (с помощью мыши) изменить ширину колонки в табличной части или справочнике, колонка мгновенно сжимается, «схлопываясь» до ширины в один пиксель или один символ. Попытки растянуть её обратно мышкой ни к чему не приводят — фокус перетаскивания сбрасывается, а колонка остаётся невидимой.

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

Выясним причину возникновения проблемы

Данная неполадка является зарегистрированной ошибкой технологической платформы «1С:Предприятие» под номером 10216226 (публичный код ошибки 000061105). Сбой возникает из-за внутреннего конфликта платформы при обработке события изменения размеров элементов интерфейса.

Когда пользователь пытается изменить ширину колонки вручную, платформа инициализирует алгоритм перерисовки таблицы. Если для этой таблицы или её колонок настроено динамическое условное оформление (особенно правила, которые динамически управляют видимостью или доступностью элементов), то расчеты геометрического расположения колонок дают сбой. Алгоритм платформы сбрасывает ширину элемента до минимального значения, блокируя дальнейшее интерактивное изменение размеров.

Официально заявлено, что баг исправлен в версии 8.3.16.1148, однако практический опыт практикующих специалистов и отзывы на форумах показывают, что в этой версии проблема всё ещё воспроизводилась. Полное и окончательное устранение бага произошло только начиная с релиза платформы 8.3.16.1296.

Ниже мы рассмотрим подробные варианты решения этой проблемы, если у вас нет возможности оперативно обновить платформу на сервере.

Способ 1. Восстановление стандартных настроек формы (Решение для пользователей)

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

Выполним следующие шаги:

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

После выполнения этой процедуры таблица вернется к исходному состоянию, и колонки примут стандартную ширину. Важно помнить: этот способ является временным спасением. Если пользователь снова попытается потянуть колонку мышкой, она может схлопнуться повторно.

Способ 2. Программный обход через расширение конфигурации

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

Суть метода заключается в переопределении свойства РастягиватьПоГоризонтали для всех подчиненных элементов целевой табличной части формы. Проанализируем пример кода, который перехватывает процедуру создания формы на сервере и принудительно выставляет растягивание в значение Истина для колонок таблицы товаров.

Создадим расширение и добавим в него следующий код в качестве после-обработчика общего модуля СобытияФорм:


&После("ПриСозданииНаСервере")
Процедура БАГ_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка, ДополнительныеПараметры)
    Попытка
        // Проверяем наличие целевого объекта и табличной части "Товары"
        Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Форма.Объект, "Товары") Тогда
            ЭлементыТЧ = Форма.Элементы.Товары.ПодчиненныеЭлементы;
            Для Каждого Элемент Из ЭлементыТЧ Цикл
                // Принудительно заставляем элементы растягиваться по горизонтали
                Элемент.РастягиватьПоГоризонтали = Истина;
            КонецЦикла;
        КонецЕсли;
    Исключение
        // Исключение обрабатывается молча, чтобы не прерывать штатную работу системы при непредвиденных ошибках
    КонецПопытки;
КонецПроцедуры

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

Способ 3. Изменение свойства «Растягивать по горизонтали» на значение «Нет»

В некоторых типовых решениях (например, в конфигурациях «Управление торговлей» или «Зарплата и управление персоналом») может сработать прямо противоположный метод. Если предыдущий способ не дал результатов, попробуйте жестко зафиксировать ширину колонок.

Для этого в конфигураторе или через расширение установите для свойства РастягиватьПоГоризонтали значение Ложь (Нет) для проблемных полей. В сочетании с явно заданной шириной колонки в символах это жестко зафиксирует ее размеры. Платформа перестанет пытаться динамически пересчитывать свободное пространство формы при изменении размеров окна или других элементов, что заблокирует баг авторазметки.

Способ 4. Перенос управления видимостью колонок в код

Поскольку первопричиной бага является конфликт с условным оформлением (когда правила динамически скрывают или показывают колонки), мы можем обойти эту проблему, отказавшись от условного оформления для управления видимостью колонок.

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

Рассмотрим пример реализации:


&НаСервере
Процедура УправлениеВидимостьюКолонокНаСервере()
    // Вместо условного оформления управляем видимостью колонки "Скидка" напрямую
    Если Объект.ПрименятьСкидки Тогда
        Форма.Элементы.ТоварыСкидка.Видимость = Истина;
    Иначе
        Форма.Элементы.ТоварыСкидка.Видимость = Ложь;
    КонецЕсли;
КонецПроцедуры

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

Способ 5. Очистка кэша метаданных пользователей

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

Это происходит потому, что «испорченные» настройки отображения форм закэшировались локально на компьютерах пользователей или в их профилях настроек внутри самой базы данных. В таких случаях выполните следующие действия:

  1. Удалите базу данных из списка запуска программы 1С:Предприятие.
  2. Добавьте базу данных обратно в список. Это приведет к автоматическому пересозданию папки локального кэша для этой информационной базы.
  3. Если это не помогло, очистите папки %userprofile%\AppData\Local\1C\1Cv8 и %userprofile%\AppData\Roaming\1C\1Cv8 вручную на проблемном рабочем месте.

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

← На главную