При работе с конфигурацией 1С:Зарплата и Управление Персоналом (ЗУП) 3.1 на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью доработки функционала с помощью расширений. Одна из нетривиальных проблем, которая может возникнуть после внесения изменений в код расширения, это неожиданное изменение визуального оформления элементов интерфейса. В частности, после сохранения модификаций в расширении, связанных, например, с формированием печатных форм, все документы в журналах могут начать отображаться жирным шрифтом, при этом в настройках списка формы автоматически появляется новое правило условного оформления. На первый взгляд это может показаться глюком платформы, однако, как правило, причина кроется в специфике взаимодействия расширения с механизмом условного оформления 1С.
Прежде чем углубляться в поиск причин, давайте разберем, как работает механизм условного оформления в платформе 1С. В конфигурациях, таких как ЗУП 3.1, существует мощный инструмент, позволяющий динамически изменять внешний вид строк, ячеек или отдельных полей в списках, таблицах и отчетах. Это может быть изменение цвета фона, цвета текста, шрифта (в том числе начертания — жирный, курсив), видимости элементов и т.д.
Настройки условного оформления могут быть заданы несколькими способами:
Таким образом, когда мы видим, что документы выделяются жирным шрифтом и в настройках списка появляется условное оформление, это означает, что какое-то правило было активировано или создано. Задача состоит в том, чтобы понять, почему именно после наших изменений в расширении это произошло.
Расширения являются мощным, но при этом достаточно тонким инструментом модификации типового функционала. Изменения, внесенные в расширение, могут косвенно или напрямую влиять на механизм условного оформления.
Если ваше расширение заимствует форму списка документа или ее модуль, и там программно добавляются элементы условного оформления, это может привести к наблюдаемому эффекту. Например, вы могли случайно или намеренно добавить код, который создает правило условного оформления без явного условия или с условием, которое всегда истинно.
Мы часто модифицируем формы, добавляем реквизиты или подписываемся на события. В процессе этих изменений в модуле формы или в модуле расширения мог быть добавлен следующий код:
// Пример добавления условного оформления в расширении
// Допустим, мы заимствовали форму списка документа и добавили в ее модуль
// процедуру ПриСозданииНаСервере или ПередОткрытием
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// ... ваш код
// Получаем текущие настройки условного оформления формы
УсловноеОформлениеФормы = Элементы.Список.УсловноеОформление;
// Создаем новый элемент условного оформления
НовыйЭлемент = УсловноеОформлениеФормы.Элементы.Добавить();
// Устанавливаем оформление: жирный шрифт
НовыйЭлемент.Оформление.Шрифт.Жирный = Истина;
// Внимание: если не указать условие, оформление применится ко всем строкам!
// Пример установки условия (если нужно):
// НовоеПолеУсловия = НовыйЭлемент.Условия.Элементы.Добавить(Тип("ПолеКомпоновкиДанных"));
// НовоеПолеУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.ПометкаУдаления"); // Пример условия
// НовоеПолеУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
// НовоеПолеУсловия.ПравоеЗначение = Истина;
// Применяем оформление к полям
НовоеПолеПоля = НовыйЭлемент.Поля.Элементы.Добавить();
НовоеПолеПоля.Поле = Новый ПолеКомпоновкиДанных("Список"); // Применяем ко всей строке
// ... остальной ваш код
КонецПроцедуры
Если в таком коде отсутствует условие применения, или условие всегда выполняется (например, Истина), то все строки списка будут отображаться жирным шрифтом. Мы часто забываем про детали при быстром тестировании или модификации чужого кода.
Изменения, внесенные в расширение, могли повлиять на данные или реквизиты документов, которые используются как условия для уже существующих правил условного оформления. Это могут быть как типовые правила конфигурации, так и пользовательские настройки.
Предположим, в конфигурации уже есть правило условного оформления, которое делает документ жирным, если, например, его статус "Не проведен" или "Требует согласования". Если ваше расширение изменяет логику формирования отчета, но при этом косвенно влияет на статус проведения документа или на значение какого-либо флага, по которому настроено условное оформление, то это может объяснить наблюдаемое поведение.
Например, если в ходе модификации вы изменяете какую-либо переменную, которая затем сохраняется в реквизит документа или влияет на его состояние, а по этому реквизиту уже настроено условное оформление:
// В модуле объекта или менеджера документа, заимствованном в расширении
// или в обработке, которая вызывается из расширения
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ...
// Ваш новый код в расширении
Если МоеНовоеУсловие Тогда
ЭтотОбъект.СостояниеДокумента = Перечисления.СостоянияДокументов.ТребуетВнимания;
Иначе
ЭтотОбъект.СостояниеДокумента = Перечисления.СостоянияДокументов.Обработан;
КонецЕсли;
// ...
КонецПроцедуры
Если по СостояниеДокумента = Перечисления.СостоянийДокументов.ТребуетВнимания уже настроено правило условного оформления на жирный шрифт, то мы увидим изменение оформления.
При работе с расширениями важно учитывать, что заимствованные объекты могут вести себя иначе, чем в основной конфигурации. Иногда условное оформление, заданное в расширении, может срабатывать не по условию, например, для новых строк оно работает, а для старых — нет, или наоборот. Это может быть связано с тем, как данные перезаполняются или пересчитываются после записи документа или обновления формы, особенно при использовании динамических списков.
Мы должны помнить, что расширение — это как "накладка" на основную конфигурацию. Если мы заимствуем форму, то все изменения, которые мы вносим в эту форму или ее модуль, будут применяться поверх оригинальной логики. Иногда порядок применения или инициализации может отличаться от ожидаемого.
Как показывает практика, платформа 1С редко проявляет "глюки" такого рода. Чаще всего, причина кроется в нашей логике.
Если расширение затрагивает модули или элементы форм списков документов, возможно, там был внесен код, который добавляет условное оформление без явного условия, либо с условием, которое всегда истинно после ваших изменений. Мы могли:
ПриСозданииНаСервере, ПриОткрытии, ПриОбновленииОтображения.Отладка расширений имеет свои нюансы. Возможно, при тестировании не были учтены все аспекты взаимодействия измененного кода с другими частями системы. Мы могли тестировать на ограниченном наборе данных, или не заметить изменение настроек оформления, которое произошло на этапе инициализации формы. Иногда в процессе разработки мы можем временно добавлять отладочный код, который влияет на оформление, и забываем его удалить.
Иногда изменения в расширении могут непреднамеренно затрагивать стандартные процедуры платформы или конфигурации, отвечающие за инициализацию форм и применение настроек отображения. Например, если мы переопределяем стандартные процедуры получения данных для списка или обработки событий динамического списка, это может повлиять на то, как платформа интерпретирует и применяет правила условного оформления.
Чтобы найти истинную причину проблемы, мы рекомендуем действовать методично, исключая возможные варианты.
Начнем с самого мощного инструмента — отладчика 1С. Мы должны использовать его для пошагового выполнения кода расширения и основной конфигурации. Особое внимание уделим местам, где происходит инициализация форм списков и устанавливается условное оформление.
ПриСозданииНаСервере формы списка документа.ПриЧтенииНаСервере (для объектов, если изменения касаются данных).УсловноеОформление элемента формы (например, Элементы.Список.УсловноеОформление.Элементы.Добавить()).Это одна из самых эффективных стратегий. Мы должны создать новое, минимальное расширение. Включите в него только те изменения, которые, по нашему мнению, вызывают проблему. Например, если мы изменили только одну функцию в модуле объекта отчета, заимствуйте только этот модуль и эту функцию в новом расширении.
Подключите это новое расширение к базе и посмотрите, воспроизводится ли проблема. Если нет, постепенно добавляйте другие части кода из оригинального расширения, пока проблема не проявится. Это позволит максимально сузить круг поиска ошибки и точно определить проблемный участок кода.
Совет из форума: "Сделайте свое расширение, новое, добавьте туда только вашу функцию и подключите к базе, посмотрите. Тут надо экспериментировать."
Мы должны внимательно изучить настройки условного оформления на формах журналов документов, которые выделяются жирным шрифтом. Откройте соответствующую форму списка документа в конфигураторе, перейдите на закладку "Условное оформление".
Истина.Учтите, что пользователи также могут сохранять свои настройки условного оформления. Ваши программные изменения могут конфликтовать или накладываться на пользовательские настройки. Мы можем проверить это, открыв форму списка в режиме "Предприятия", зайдя в "Еще" -> "Настроить список" -> вкладка "Условное оформление" и проанализировав, какие правила там отображаются и какие из них активны. Попробуйте временно отключить или удалить пользовательские настройки, чтобы убедиться, что проблема не в них.
В некоторых случаях проблемы с расширениями могут быть связаны с режимом совместимости платформы и особенностями работы с определенными версиями. Мы должны убедиться, что наша конфигурация, расширение и сама платформа работают в согласованных режимах совместимости. Несоответствие режимов может приводить к непредсказуемому поведению некоторых механизмов, включая условное оформление.
Таким образом, проблема с внезапным появлением жирного шрифта в журналах документов после изменения расширения в 1С:ЗУП 3.1, скорее всего, не является "глюком платформы", а связана с логикой нашего кода в расширении. Методичный подход к диагностике, включающий программную отладку, изолированное тестирование и анализ настроек условного оформления, позволит нам быстро выявить и устранить первопричину.