При работе в современных конфигурациях на платформе 1С:Предприятие 8.3 пользователи часто сталкиваются с досадным поведением интерфейса: после тщательной ручной настройки ширины колонок в табличной части документа все настройки сбрасываются к значениям по умолчанию. Особенно остро эта проблема проявилась в 1С:Управление торговлей версии 11.5 (начиная с релизов 11.5.8 и выше). Рассмотрим детально, почему это происходит и как программно стабилизировать интерфейс.
Проанализируем типичную ситуацию. Пользователь открывает документ Заказ клиента, заходит в табличную часть Товары и с помощью мышки настраивает удобную для себя ширину полей: Номенклатура, Количество, Цена. После этого он может открывать существующие документы, и настройки сохраняются. Однако, как только создается новый документ и в нем заполняется поле Клиент (или Контрагент), все настроенные колонки моментально «прыгают», возвращаясь к дефолтному состоянию или непредсказуемо растягиваясь.
Выясним причину такого поведения. В платформе 8.3.21 и 8.3.22 механизмы отрисовки управляемых форм стали более чувствительны к программному изменению свойств элементов. Когда в коде формы происходит изменение свойства Видимость для какой-либо колонки или группы, платформа инициирует полный пересчет макета таблицы. Если у колонок установлено свойство Автоопределение ширины, клиентское приложение может «забыть» пользовательские правки и применить настройки из метаданных.
Для того чтобы понять, какой именно код провоцирует сброс интерфейса, разберем по шагам процесс отладки. Воспользуемся инструментом Замер производительности:
Заказ клиента.Клиент.Проанализировав ситуацию, мы увидим, что при изменении партнера срабатывает обработчик ПартнерПриИзмененииСервер(). Внутри него вызывается множество процедур, отвечающих за заполнение цен, условий оплаты и налогообложения. Но наиболее критичным для интерфейса оказывается блок, связанный с подсистемой Государственных контрактов и Электронного актирования (ЕИС).
Выясняется, что в типовом решении при каждом изменении партнера вызывается процедура из общего модуля: ЭлектронноеАктированиеЕИСУТ.ДоговорПриИзмененииЭлектронноеАктированиеЕИС. Внутри этой процедуры безусловно вызывается метод УстановкаВидимостиГруппыГосконтракта.
Проблема заключается в том, что 1С пытается управлять видимостью колонок Госконтракт и Этап госконтракта даже в тех случаях, когда выбран обычный коммерческий контрагент, не имеющий отношения к бюджетной сфере. Постоянное «передергивание» свойства Видимость заставляет форму пересчитывать ширину всех колонок в таблице.
Чтобы побороть это поведение, нам необходимо изменить логику вызова управления видимостью. Рассмотрим пример кода, который нужно внедрить в расширение. Основная идея — вызывать установку видимости только тогда, когда это действительно необходимо (например, если договор действительно связан с госконтрактом).
Посмотрим на пример модифицированной процедуры в общем модуле ЭлектронноеАктированиеЕИСУТ:
Процедура ДоговорПриИзмененииЭлектронноеАктированиеЕИС(Форма, Объект, НаименованиеТЧТовары = "Товары") Экспорт
// Вместо безусловного вызова установки видимости, проверяем наличие контракта
ГосконтрактДоговора = ЭлектронноеАктированиеЕИС.ГосударственныйКонтрактДоговора(Объект.Договор);
Если ЗначениеЗаполнено(ГосконтрактДоговора) И ЗначениеЗаполнено(ГосконтрактДоговора.ВнутреннийИдентификаторЕИС) Тогда
// Только если это реально госконтракт, управляем видимостью
УстановкаВидимостиГруппыГосконтракта(Форма, , НаименованиеТЧТовары);
Форма.ЭтоГосконтрактЕИС = Истина;
ГосКонтракт = ГосконтрактДоговора;
ЭтапГосконтрактаЕИС = Неопределено;
ПолучитьЭтапГосконтракта(Объект.Договор, ЭтапГосконтрактаЕИС);
Если ЗначениеЗаполнено(ЭтапГосконтрактаЕИС) Тогда
Объект.ЭтапГосконтрактаЕИС = ЭтапГосконтрактаЕИС;
Иначе
Объект.ЭтапГосконтрактаЕИС = "";
КонецЕсли;
Иначе
// Если это обычный договор, просто ставим флаг, не трогая структуру колонок без нужды
Форма.ЭтоГосконтрактЕИС = Ложь;
Объект.ЭтапГосконтрактаЕИС = "";
КонецЕсли;
КонецПроцедуры
Таким образом, для 99% обычных отгрузок процедура перестанет менять свойства элементов формы при каждом выборе клиента, и пользовательские настройки ширины колонок останутся неизменными.
Если вы не хотите вносить изменения в программный код, можно рассмотреть административные методы настройки интерфейса. Разберем их подробнее:
Для наиболее важных полей табличной части (таких как Номенклатура или Количество) рекомендуется принудительно отключить автоматические механизмы растяжения:
Когда у колонки жестко задана ширина и отключено авто-растяжение, платформа гораздо реже сбрасывает её параметры при обновлении макета формы.
Иногда «слетание» настроек связано с накопленными ошибками в кэше пользователя. Выполним следующие действия:
Администрирование — Настройки пользователей и прав.Настройки пользователей.Внешний вид.Заказ клиента и удалим её настройки.После этого пользователю нужно будет один раз настроить колонки заново, и, с учетом исправленного кода в расширении, они больше не будут сбрасываться.
Проанализируем ситуацию шире: не только ЕИС влияет на видимость. В современных версиях УТ 11 аналогичное поведение могут вызывать подсистемы Честный знак (маркировка) и Прослеживаемость товаров. При выборе номенклатуры система проверяет, является ли товар маркированным, и динамически выводит колонки с кодами маркировки или номерами ГТД.
Если вы заметили, что колонки «прыгают» не при выборе клиента, а при добавлении товара, значит, причина кроется в вызове процедур управления видимостью в обработчике НоменклатураПриИзменении. Логика исправления будет аналогичной: минимизировать количество вызовов, изменяющих свойство Видимость, через проверку условий необходимости показа этих полей.
Важный совет: Старайтесь избегать использования сложных иерархических групп колонок в табличных частях. Платформа 1С:Предприятие 8.3 при программном скрытии одного элемента внутри группы часто сбрасывает настройки всей родительской группы, что визуально выглядит как хаотичное изменение размеров всей таблицы.