Каждый администратор и разработчик 1С рано или поздно сталкивается с ситуацией, когда пользователи начинают жаловаться на «сломавшийся» интерфейс. Один из самых раздражающих визуальных глюков в управляемых формах 1С:Предприятие 8.3 — это самопроизвольное сужение колонок табличной части (например, колонки Номенклатура, Количество или Действие в документе ЗаказКлиента). Колонки сжимаются буквально до нескольких пикселей, превращаясь в узкие полоски, а ручное растягивание границ мышью не дает абсолютно никакого эффекта: как только пользователь отпускает левую кнопку мыши, граница мгновенно возвращается в исходное «схлопнутое» состояние.
В этой статье мы подробно проанализируем, почему возникает этот неприятный сбой, разберем его техническую суть и рассмотрим по шагам все доступные способы решения — от простых административных манипуляций до низкоуровневых настроек в конфигураторе.
Для начала давайте разберемся в механике работы платформы. Многие ошибочно полагают, что любые проблемы с отображением элементов интерфейса решаются банальной очисткой локального кэша на клиентском компьютере (путем удаления папок из каталогов %localappdata%\1C и %appdata%\1C). Однако в случае с шириной колонок это не помогает. Почему?
Дело в том, что управляемая платформа 1С сохраняет индивидуальные настройки внешнего вида форм (положение окон, видимость кнопок, порядок и ширину колонок таблиц) непосредственно в базе данных. Для этого используются системные таблицы хранения настроек (ХранилищеСистемныхНастроек и ХранилищеНастроекДанныхФорм). Это сделано для того, чтобы пользователь, зайдя в систему под своей учетной записью с любого другого компьютера, увидел привычный и настроенный под себя интерфейс.
Описанный дефект связан с зарегистрированной ошибкой самой платформы 1С:Предприятие 8.3 (в частности, проблема массово проявлялась в релизах ветки 8.3.15 и 8.3.16, например, в 8.3.16.1148). Баг активируется при определенном стечении обстоятельств: наличии зафиксированных колонок, использовании горизонтальной прокрутки до упора вправо, изменении масштаба экрана Windows или несовместимости свойств авторасчета ширины. В результате в базу данных записываются некорректные («битые») геометрические параметры элементов формы. Платформа считывает эти искаженные данные при каждом открытии формы и блокирует любые стандартные попытки пользователя изменить размеры элементов вручную.
Рассмотрим детально четыре практических способа борьбы с этой проблемой.
Поскольку корень проблемы кроется в ошибке программного кода самой платформы, наиболее правильным и надежным решением является обновление платформы 1С:Предприятие 8.3 до стабильного релиза.
Данный баг расчетов размеров элементов в управляемых формах был официально зафиксирован вендором и исправлен, начиная с релиза платформы 8.3.16.1296. Если ваша информационная база работает на более ранней версии (например, на 8.3.15.ХХХХ или младших сборках 8.3.16), спланируйте обновление технологической платформы сервера и клиентов до актуальных версий (например, последних релизов веток 8.3.21, 8.3.22 или выше).
Если же оперативно обновить платформу не представляется возможным (например, из-за жестких требований к инфраструктуре или в период сдачи отчетности), переходим к обходным путям решения проблемы.
Обычный сброс настроек из самой формы («Еще» -> «Изменить форму» -> «Еще» -> «Установить стандартные настройки») часто не срабатывает, так как платформа из-за внутренней ошибки не может перезаписать некорректно сохраненный в БД файл параметров. Нам необходимо принудительно удалить эти записи из хранилища настроек средствами Библиотеки Стандартных Подсистем (БСП).
Давайте выполним очистку настроек по шагам:
Заказ клиента и отметить галочкой его основную форму (ФормаДокумента).После проведения данной процедуры поврежденная запись в базе данных будет полностью удалена. Попросите пользователя перезапустить сеанс 1С и открыть форму заказа — она инициализируется с первоначальными, чистыми заводскими настройками внешнего вида, а колонки примут нормальный размер.
Если очистка настроек по какой-то причине нежелательна (например, пользователь долго настраивал под себя другие элементы формы, скрывал ненужные вкладки, и не хочет потерять эту конфигурацию), можно перезаписать только настройки проблемной таблицы, скопировав их от сотрудника, у которого отображение колонок работает корректно.
Важное предупреждение: перед началом процедуры копирования настроек проблемный пользователь обязательно должен полностью закрыть свой сеанс работы в 1С. Если он останется в системе, то при последующем выходе из программы его клиентское приложение автоматически запишет текущие («поломанные») настройки из своей локальной памяти обратно в базу данных, затерев результат копирования.
Проанализируем порядок действий при копировании:
ЗаказКлиента и нажмите кнопку Скопировать и закрыть.После этого пострадавший пользователь может запустить 1С — его форма примет точно такой же вид, как и у коллеги-донора, а баг с шириной колонок исчезнет.
Если вы являетесь разработчиком и баг регулярно воспроизводится у различных пользователей системы, можно решить эту проблему превентивно на уровне конфигурации (или через расширение конфигурации), чтобы платформа вообще не пыталась динамически рассчитывать ширину проблемных реквизитов.
Проанализируем технические приемы, которые помогают обойти ограничение платформы:
Прием 1. Жесткое программное ограничение ширины
Мы можем принудительно инициализировать ширину колонок при открытии формы на сервере, игнорируя настройки пользователя. Для этого в модуле формы документа в обработчике события ПриСозданииНаСервере пропишем явные размеры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Задаем фиксированную и минимальную ширину для колонки Номенклатура
Элементы.ТоварыНоменклатура.Ширина = 35;
Элементы.ТоварыНоменклатура.МинимальнаяШирина = 20;
// Задаем параметры для колонки Действие
Элементы.ТоварыВариантОбеспечения.Ширина = 15;
Элементы.ТоварыВариантОбеспечения.МинимальнаяШирина = 10;
КонецПроцедуры
Установка свойства МинимальнаяШирина гарантирует, что даже при попытке сжатия формы платформа не сможет уменьшить колонку ниже заданного лимита символов.
Прием 2. Использование колонки-заглушки (Layout Hack)
Известный лайфхак среди разработчиков 1С для борьбы с «залипанием» колонок в управляемых формах заключается в добавлении пустой буферной колонки в самый конец табличной части.
Для этого выполните следующие шаги в Конфигураторе:
ПолеДекорации или обычное текстовое поле без привязки к пути к данным). Назовем его, например, ТоварыКолонкаЗаглушка.Номенклатура, Количество, Цена, Сумма) установите свойство РастягиватьПоГоризонтали в значение Ложь. Задайте им фиксированную ширину.ТоварыКолонкаЗаглушка установите свойство РастягиватьПоГоризонтали в значение Истина, а саму ширину сделайте минимальной (например, 1 или 2).При такой конфигурации алгоритм отрисовки интерфейса платформы 1С будет отдавать все свободное («лишнее») пространство экрана последней колонке-заглушке, растягивая ее до правого края формы. При этом основные информационные колонки всегда будут сохранять свою фиксированную ширину и больше никогда не сожмутся в нечитаемые полосы.
Мы подробно разобрали природу бага со слетающей шириной колонок и изучили комплекс методов его устранения. Рекомендуется начать с очистки настроек конкретного пользователя (Способ 2) как самого быстрого локального решения, а в долгосрочной перспективе — обновить платформу 1С:Предприятие до актуального стабильного релиза.