Разработка интерфейса в системе 1С:Предприятие 8.3 часто преподносит сюрпризы: вы вносите изменения в конфигураторе, проверяете их под своей учетной записью — все работает идеально. Однако после обновления конфигурации базы данных выясняется, что у части пользователей изменения не вступили в силу. Особенно часто это касается механизмов условного оформления в формах подбора или списках номенклатуры.
В этой статье мы подробно разберем, почему возникает такая ситуация, как работает механизм сохранения настроек в платформе и какими способами можно гарантированно «доставить» новое оформление до каждого рабочего места.
Для начала проанализируем, как платформа 1С принимает решение о том, каким цветом раскрасить строку или какую колонку показать пользователю. В системе существует строгий приоритет настроек:
ПриСозданииНаСервере или ПриОткрытии может переопределять визуальное представление.Когда мы меняем оформление в конфигураторе, мы меняем только третий уровень. Если у пользователя в базе данных уже сохранен «снимок» (snapshot) формы первого уровня, система просто игнорирует ваши новые настройки из конфигуратора, так как считает, что пользователь уже настроил интерфейс под себя «навсегда».
Как показала практика обсуждения на форуме, наиболее быстрым и эффективным способом является сброс текущих настроек формы до состояния, определенного в конфигурации. Рассмотрим, как это сделать правильно:
После выполнения этих действий персональный «снимок» формы в базе данных будет удален, и система обратится к актуальным настройкам из конфигуратора. Условное оформление должно заработать немедленно.
Если пользователей в базе десятки или сотни, заходить под каждым и сбрасывать настройки вручную — невыполнимая задача. В этом случае мы можем воспользоваться программными инструментами. Для этого проанализируем возможности объекта ХранилищеОбщихНастроек.
Рассмотрим пример кода, который можно запустить в обработке, чтобы очистить настройки конкретной формы для всех сотрудников:
Процедура ОчиститьНастройкиФормыДляВсех(ИмяФормы) Экспорт
// ИмяФормы должно быть полным, например: "Справочник.Номенклатура.Форма.ФормаСписка"
ВыборкаПользователей = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого ПользовательИБ Из ВыборкаПользователей Цикл
ХранилищеОбщихНастроек.Удалить("Общее/НастройкиФорм", ИмяФормы, ПользовательИБ.Имя);
КонецЦикла;
Сообщить("Настройки формы очищены для всех пользователей.");
КонецПроцедуры
Этот метод позволяет централизованно «обновить» интерфейс у всех сотрудников. Важно помнить, что при этом сбросятся и другие персональные настройки этой формы (ширина колонок, их порядок и видимость), которые пользователи могли настраивать под себя.
Выясним, почему старый метод через процедуру ПриПолученииДанныхНаСервере (или ПриВыводеСтроки в обычных формах) работал всегда. Ответ прост: программный код выполняется после загрузки всех настроек и имеет безусловный приоритет.
Если вам критично, чтобы оформление работало всегда и у всех, независимо от действий пользователя, рассмотрим вариант программного добавления элемента условного оформления в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавим условное оформление программно, чтобы его нельзя было "перекрыть" простым сохранением формы
НовыйЭлемент = УсловноеОформление.Элементы.Добавить();
// Устанавливаем цвет текста
НовыйЭлемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийТекст);
// Условие: Остаток > 0
ЭлементУсловия = НовыйЭлемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Остаток");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементУсловия.ПравоеЗначение = 0;
// Указываем, какие поля оформлять
ОформляемоеПоле = НовыйЭлемент.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаТовары");
КонецПроцедуры
Использование этого метода гарантирует, что оформление будет добавлено в коллекцию при каждом открытии формы, дополняя или переопределяя существующие настройки.
/ClearCache не помогает?Многие системные администраторы пытаются решить проблему через очистку локального кэша на RDP-сервере или запуск с ключом /ClearCache. Посмотрим на ситуацию глубже: локальный кэш хранит структуру метаданных (какие реквизиты есть у справочника, какие типы данных используются). А настройки формы хранятся внутри базы данных (в системных таблицах). Кэш на диске и настройки в базе — это разные вещи. Именно поэтому удаление временных папок в %AppData% часто не приносит результата в вопросах оформления.
Проанализируем еще один нюанс: если ваш подбор реализован через динамический список, у него есть собственное условное оформление внутри настроек компоновки данных. Если пользователь зашел в меню «Настроить список», он мог создать свои правила оформления, которые будут конфликтовать с вашими. В этом случае сброс настроек формы может не помочь — нужно сбрасывать именно настройки списка.
Для полной уверенности в результате, рекомендуем использовать метод УстановитьСтандартныеНастройки() объекта ДинамическийСписок, если управление оформлением идет через него.
Подведем итоги нашего разбора. Если условное оформление работает выборочно:
Остаток), доступны пользователю по правам доступа (ролям). Если у пользователя нет прав на чтение поля, условие всегда будет ложным.ХранилищаОбщихНастроек.ПриСозданииНаСервере.