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

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

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

Как на самом деле работает условное оформление с перечислениями

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

  1. Когда вы в конфигураторе настраиваете условие, например, СтатусЗаказа Равно "В работе", вы видите синоним "В работе" на своем текущем языке.
  2. Однако платформа сохраняет в настройку не строку "В работе", а прямую ссылку на объект метаданных, например, Перечисления.СтатусыЗаказов.ВРаботе. Эта ссылка является уникальной и не зависит от языка.
  3. Когда пользователь запускает программу под другим языком интерфейса (например, английским), он видит в поле формы синоним "In progress".
  4. При этом в базе данных хранится все то же значение — Перечисления.СтатусыЗаказов.ВРаботе. Механизм условного оформления сравнивает это значение со ссылкой, сохраненной в настройке. Поскольку они совпадают, оформление корректно применяется.

Таким образом, утверждение, что интерактивное условное оформление "перестает работать" при смене языка, в общем случае неверно. Платформа спроектирована так, чтобы корректно обрабатывать такие ситуации. Если же проблема все-таки наблюдается, ее причины могут быть иными.

Почему же оформление может не работать? Разбираем возможные причины

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

1. Ошибка в конкретном релизе платформы

Это одна из самых частых причин необъяснимого поведения системы. Как показала практика автора вопроса на форуме, проблема исчезла после обновления платформы ("При смене — всё заработало"). Это прямо указывает на наличие ошибки (бага) в определённой версии, которая была исправлена в последующих релизах.

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

2. Конфликт с пользовательскими настройками

Условное оформление может настраиваться не только глобально в конфигураторе, но и каждым пользователем индивидуально в режиме "Предприятие" (через "Ещё" -> "Настроить список..."). Эти пользовательские настройки имеют более высокий приоритет и могут переопределять или конфликтовать с общими настройками, заданными разработчиком.

Решение: Попросите пользователя, у которого не работает оформление, сбросить настройки формы. Это можно сделать через меню "Ещё" -> "Изменить форму" -> "Ещё" -> "Установить стандартные настройки". Если после этого оформление заработает, значит, причина была в его личных настройках.

3. Проблемы с кэшем

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

Решение: Удалите информационную базу из списка и добавьте ее заново, указав тот же путь. Либо вручную очистите папки с кэшем в профиле пользователя (обычно в %AppData%\1C\1cv8).

Надежный способ: Программная настройка условного оформления

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

Преимущества программной настройки:

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

Посмотрим на пример:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Получаем коллекцию условного оформления формы
    УсловноеОформление = ЭтаФорма.УсловноеОформление;

    // 1. Настройка для статуса "Черновик"
    // Создаем новый элемент условного оформления
    ЭлементОформления_Черновик = УсловноеОформление.Элементы.Добавить();

    // Задаем само оформление (например, серый цвет текста)
    ЭлементОформления_Черновик.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Серый);
    
    // Задаем условие (отбор)
    ЭлементОтбора_Черновик = ЭлементОформления_Черновик.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора_Черновик.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Объект.Статус"); // Поле, по которому проверяем условие
    ЭлементОтбора_Черновик.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора_Черновик.ПравоеЗначение = Перечисления.СтатусыДокументов.Черновик; // Прямое указание на значение!
    ЭлементОтбора_Черновик.Использование  = Истина;

    // Указываем, какие поля нужно оформить (если не указать, оформится вся строка)
    // ЭлементОформления_Черновик.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("Номер");
    
    // 2. Настройка для статуса "К выполнению"
    ЭлементОформления_КВыполнению = УсловноеОформление.Элементы.Добавить();
    
    // Задаем оформление (например, синий цвет фона)
    ЭлементОформления_КВыполнению.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоГолубой);

    // Задаем условие
    ЭлементОтбора_КВыполнению = ЭлементОформления_КВыполнению.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора_КВыполнению.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Объект.Статус");
    ЭлементОтбора_КВыполнению.ВидСравнения  = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора_КВыполнению.ПравоеЗначение = Перечисления.СтатусыДокументов.КВыполнению;
    ЭлементОтбора_КВыполнению.Использование  = Истина;

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

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

← На главную