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

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

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

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

Разбираемся в причинах: иерархия настроек формы

Для начала проанализируем, как платформа 1С принимает решение о том, каким цветом раскрасить строку или какую колонку показать пользователю. В системе существует строгий приоритет настроек:

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

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

Решение №1: Сброс к стандартным настройкам (ручной способ)

Как показала практика обсуждения на форуме, наиболее быстрым и эффективным способом является сброс текущих настроек формы до состояния, определенного в конфигурации. Рассмотрим, как это сделать правильно:

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

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

Решение №2: Программная очистка настроек для всех пользователей

Если пользователей в базе десятки или сотни, заходить под каждым и сбрасывать настройки вручную — невыполнимая задача. В этом случае мы можем воспользоваться программными инструментами. Для этого проанализируем возможности объекта ХранилищеОбщихНастроек.

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


Процедура ОчиститьНастройкиФормыДляВсех(ИмяФормы) Экспорт
    // ИмяФормы должно быть полным, например: "Справочник.Номенклатура.Форма.ФормаСписка"
    ВыборкаПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
    
    Для Каждого ПользовательИБ Из ВыборкаПользователей Цикл
        ХранилищеОбщихНастроек.Удалить("Общее/НастройкиФорм", ИмяФормы, ПользовательИБ.Имя);
    КонецЦикла;
    
    Сообщить("Настройки формы очищены для всех пользователей.");
КонецПроцедуры

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

Решение №3: Программное управление оформлением

Выясним, почему старый метод через процедуру ПриПолученииДанныхНаСервере (или ПриВыводеСтроки в обычных формах) работал всегда. Ответ прост: программный код выполняется после загрузки всех настроек и имеет безусловный приоритет.

Если вам критично, чтобы оформление работало всегда и у всех, независимо от действий пользователя, рассмотрим вариант программного добавления элемента условного оформления в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавим условное оформление программно, чтобы его нельзя было "перекрыть" простым сохранением формы
    НовыйЭлемент = УсловноеОформление.Элементы.Добавить();
    
    // Устанавливаем цвет текста
    НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст);
    
    // Условие: Остаток > 0
    ЭлементУсловия = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Остаток");
    ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    ЭлементУсловия.ПравоеЗначение = 0;
    
    // Указываем, какие поля оформлять
    ОформляемоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаТовары");
КонецПроцедуры

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

Почему /ClearCache не помогает?

Многие системные администраторы пытаются решить проблему через очистку локального кэша на RDP-сервере или запуск с ключом /ClearCache. Посмотрим на ситуацию глубже: локальный кэш хранит структуру метаданных (какие реквизиты есть у справочника, какие типы данных используются). А настройки формы хранятся внутри базы данных (в системных таблицах). Кэш на диске и настройки в базе — это разные вещи. Именно поэтому удаление временных папок в %AppData% часто не приносит результата в вопросах оформления.

Особенности динамических списков

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

Для полной уверенности в результате, рекомендуем использовать метод УстановитьСтандартныеНастройки() объекта ДинамическийСписок, если управление оформлением идет через него.

Резюме

Подведем итоги нашего разбора. Если условное оформление работает выборочно:

← На главную