Почему после изменения расширения все документы в журналах отображаются жирным шрифтом и появляется условное оформление?

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

При работе с конфигурацией 1С:Зарплата и Управление Персоналом (ЗУП) 3.1 на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с необходимостью доработки функционала с помощью расширений. Одна из нетривиальных проблем, которая может возникнуть после внесения изменений в код расширения, это неожиданное изменение визуального оформления элементов интерфейса. В частности, после сохранения модификаций в расширении, связанных, например, с формированием печатных форм, все документы в журналах могут начать отображаться жирным шрифтом, при этом в настройках списка формы автоматически появляется новое правило условного оформления. На первый взгляд это может показаться глюком платформы, однако, как правило, причина кроется в специфике взаимодействия расширения с механизмом условного оформления 1С.

Понимание механизма условного оформления в 1С:Предприятие

Прежде чем углубляться в поиск причин, давайте разберем, как работает механизм условного оформления в платформе 1С. В конфигурациях, таких как ЗУП 3.1, существует мощный инструмент, позволяющий динамически изменять внешний вид строк, ячеек или отдельных полей в списках, таблицах и отчетах. Это может быть изменение цвета фона, цвета текста, шрифта (в том числе начертания — жирный, курсив), видимости элементов и т.д.

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

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

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

Как расширения влияют на условное оформление: возможные причины

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

1. Прямое изменение или добавление правил условного оформления

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

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


// Пример добавления условного оформления в расширении
// Допустим, мы заимствовали форму списка документа и добавили в ее модуль
// процедуру ПриСозданииНаСервере или ПередОткрытием

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

Если в таком коде отсутствует условие применения, или условие всегда выполняется (например, Истина), то все строки списка будут отображаться жирным шрифтом. Мы часто забываем про детали при быстром тестировании или модификации чужого кода.

2. Косвенное срабатывание существующих условий

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

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

Например, если в ходе модификации вы изменяете какую-либо переменную, которая затем сохраняется в реквизит документа или влияет на его состояние, а по этому реквизиту уже настроено условное оформление:


// В модуле объекта или менеджера документа, заимствованном в расширении
// или в обработке, которая вызывается из расширения
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // ...
    // Ваш новый код в расширении
    Если МоеНовоеУсловие Тогда
        ЭтотОбъект.СостояниеДокумента = Перечисления.СостоянияДокументов.ТребуетВнимания;
    Иначе
        ЭтотОбъект.СостояниеДокумента = Перечисления.СостоянияДокументов.Обработан;
    КонецЕсли;
    // ...
КонецПроцедуры

Если по СостояниеДокумента = Перечисления.СостоянийДокументов.ТребуетВнимания уже настроено правило условного оформления на жирный шрифт, то мы увидим изменение оформления.

3. Особенности работы с заимствованными элементами

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

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

Возможные причины, помимо ошибки платформы

Как показывает практика, платформа 1С редко проявляет "глюки" такого рода. Чаще всего, причина кроется в нашей логике.

1. Некорректная модификация формы списка

Если расширение затрагивает модули или элементы форм списков документов, возможно, там был внесен код, который добавляет условное оформление без явного условия, либо с условием, которое всегда истинно после ваших изменений. Мы могли:

  1. Изменить стандартные обработчики событий формы, такие как ПриСозданииНаСервере, ПриОткрытии, ПриОбновленииОтображения.
  2. Добавить новый реквизит формы и использовать его в условном оформлении, но при этом не обеспечить его корректное заполнение или очистку.
  3. Использовать заимствованные элементы управления, у которых есть свои особенности поведения с условным оформлением.

2. Ошибки при отладке или тестировании

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

3. Влияние на стандартные механизмы

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

Рекомендации по поиску причины: пошаговый алгоритм

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

  1. Программная отладка:

    Начнем с самого мощного инструмента — отладчика 1С. Мы должны использовать его для пошагового выполнения кода расширения и основной конфигурации. Особое внимание уделим местам, где происходит инициализация форм списков и устанавливается условное оформление.

    • Поставьте точки останова в процедурах, отвечающих за формирование списка и применение оформления. Это могут быть:
      • ПриСозданииНаСервере формы списка документа.
      • ПриЧтенииНаСервере (для объектов, если изменения касаются данных).
      • Процедуры и функции, которые отвечают за получение данных для динамического списка (например, в запросах или обработчиках).
      • Процедуры, которые явно модифицируют коллекцию УсловноеОформление элемента формы (например, Элементы.Список.УсловноеОформление.Элементы.Добавить()).
    • Проанализируйте значения переменных и свойств объектов, связанных с оформлением, на каждом шаге.
    • Отследите, в какой момент и каким кодом добавляется или изменяется правило условного оформления, делающее текст жирным.
  2. Изолированное тестирование:

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

    Подключите это новое расширение к базе и посмотрите, воспроизводится ли проблема. Если нет, постепенно добавляйте другие части кода из оригинального расширения, пока проблема не проявится. Это позволит максимально сузить круг поиска ошибки и точно определить проблемный участок кода.

    Совет из форума: "Сделайте свое расширение, новое, добавьте туда только вашу функцию и подключите к базе, посмотрите. Тут надо экспериментировать."

  3. Анализ условного оформления формы в конфигураторе:

    Мы должны внимательно изучить настройки условного оформления на формах журналов документов, которые выделяются жирным шрифтом. Откройте соответствующую форму списка документа в конфигураторе, перейдите на закладку "Условное оформление".

    • Ищите правила, которые могли быть добавлены или модифицированы расширением. Расширения могут добавлять свои правила, и они будут видны в конфигураторе при просмотре заимствованной формы.
    • Внимательно изучите условия каждого правила. Возможно, после ваших изменений какое-то из существующих условий начало выполняться для всех документов.
    • Проверьте, есть ли правила без условий или с условием Истина.
  4. Проверка взаимодействия с пользовательскими настройками:

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

  5. Режим совместимости платформы:

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

Таким образом, проблема с внезапным появлением жирного шрифта в журналах документов после изменения расширения в 1С:ЗУП 3.1, скорее всего, не является "глюком платформы", а связана с логикой нашего кода в расширении. Методичный подход к диагностике, включающий программную отладку, изолированное тестирование и анализ настроек условного оформления, позволит нам быстро выявить и устранить первопричину.

← На главную