При работе с типовыми конфигурациями «1С:Предприятие 8.3» на базе Библиотеки стандартных подсистем (БСП), такими как «1С:Бухгалтерия предприятия 3.0», «1С:ЗУП 3» или «1С:ERP», пользователи и администраторы часто сталкиваются с необходимостью связать один и тот же дополнительный реквизит сразу с несколькими типами документов. Например, нам может потребоваться общий признак «Проверено аудитором» (тип Булево) для документов «Больничный лист» и «Отпуск».
В процессе настройки этого механизма возникает ряд неочевидных вопросов: куда исчезла привычная галочка общих реквизитов в настройках программы, почему в заголовках колонок на форме появляется название чужого документа и как справиться с тем, что для булевых реквизитов в списках отображается пустота вместо привычных «Да» или «Нет»? В этой статье мы подробно разберем, как устроен современный механизм совместного использования свойств в БСП, и решим все сопутствующие проблемы отображения данных на форме.
В старых редакциях БСП в разделе административных настроек присутствовал глобальный флажок «Общие реквизиты и сведения». В современных версиях систем (начиная с БСП 3.x) разработчики отказались от этой настройки как от избыточной. Возможность совместного использования реквизитов теперь является стандартным поведением системы и включена по умолчанию.
Вместо активации общего флажка система предлагает интеллектуальный выбор непосредственно в момент добавления нового свойства к объекту. Когда мы хотим связать уже существующий реквизит с новым типом документа, нам нужно воспользоваться специальной командой добавления свойства из другого набора.
Рассмотрим процесс создания сквозного свойства на примере конфигурации «1С:Бухгалтерия предприятия 3.0».
Булево). Сохраним изменения.На этом этапе нам будет предложено три варианта архитектурного решения. Нам важно выбрать правильный вариант:
ДополнительныеРеквизитыИСведения. Он будет связан с наборами свойств обоих документов. Это идеальный вариант, если мы планируем строить сквозные отчеты и делать общие отборы в списках по разным видам документов.Дополнительное значение) останется общим.Выбираем первый вариант: Сделать реквизит общим и добавить в набор.
После добавления общего реквизита в форму списка документа «Отпуск», мы можем столкнуться с неприятным визуальным эффектом. На форме настройки списка колонка будет отображаться под именем Проверено (Больничный лист). Это сбивает с толку пользователей, которые работают с отпусками.
Выясним техническую причину этого поведения. Дополнительные реквизиты физически хранятся в подчиненных табличных частях документов. Чтобы платформа «1С:Предприятие 8.3» могла автоматически вытаскивать эти данные в динамический список без изменения текста запроса вручную, она использует штатный механизм характеристик. Поля динамического списка для дополнительных реквизитов формируются платформой по строгому шаблону: Ссылка.[ИмяСвойства (ИмяПервичногоНабора)].
Поскольку свойство изначально было создано в наборе для документа «Больничный лист», метаданные этого свойства ссылаются на его «первичного» владельца. При добавлении этого же свойства в документ «Отпуск» платформа продолжает обращаться к тому же объекту ПВХ, из-за чего в окне настройки формы выводится приписка в скобках.
Решить эту проблему в пользовательском режиме очень просто. Выполним следующие действия:
Ссылка.Проверено (Больничный лист)).Теперь для конечного пользователя колонка в списке документов «Отпуска» будет отображаться корректно и аккуратно.
Еще одна частая техническая проблема, с которой сталкиваются при выводе общих реквизитов типа Булево в динамический список, заключается в том, что для документов со значением Ложь колонка в списке остается абсолютно пустой. Значение Да (Истина) при этом отображается корректно.
Проанализируем техническую причину этого поведения:
ДополнительныеРеквизиты конкретного документа только тогда, когда значение заполнено (то есть не равно значению по умолчанию).Булево значением по умолчанию является Ложь. Поэтому, когда у нас создается новый документ или признак сбрасывается в значение Ложь, физически строка в табличной части документа отсутствует.LEFT JOIN) основной таблицы документов с табличной частью дополнительных реквизитов. Для строк со значением Ложь запрос возвращает значение базы данных NULL.NULL в колонках динамического списка как пустое поле, игнорируя стандартное представление лжи.Чтобы исправить это поведение и сделать так, чтобы в списке выводилось «Нет» вместо пустоты, нам нужно настроить формат отображения данных для этой колонки.
Способ 1. Настройка формата в пользовательском режиме (через «Изменить форму»):
БЛ=Нет; БИ=Да.Способ 2. Программное решение через Конфигуратор (для разработчиков):
Если мы являемся разработчиками конфигурации или пишем расширение, мы можем переопределить вывод значения непосредственно в свойствах колонки динамического списка на форме. Для этого в свойствах пути к данным или в самой колонке формы списка в конфигураторе зададим строковое выражение формата в поле Формат:
// Форматная строка для корректного представления Булево с учетом NULL
БЛ='Нет'; БИ='Да'
Это заставит платформу принудительно преобразовывать отсутствующие строки (значения NULL) к визуальному представлению «Нет».
Иногда пользователи замечают, что при изменении значения общего дополнительного реквизита внутри формы документа (например, при установке флажка «Проверено» и записи документа) значение в самой форме списка не обновляется мгновенно. Приходится нажимать кнопку «Обновить» (или клавишу F5).
Это связано с особенностями кэширования динамических списков платформы. Списки считывают данные порциями напрямую из основных таблиц. Когда данные меняются в подчиненной табличной части, платформа не всегда оперативно получает сигнал о необходимости перестроить кэш для конкретной строки списка.
Для гарантированного обновления данных в списке при изменении свойств в форме документа разработчику необходимо использовать вызов платформенного метода ОповеститьОбИзменении(). Рассмотрим пример реализации этого метода в модуле формы документа при его записи:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
// Оповещаем систему об изменении объекта, чтобы динамические списки обновили данные
ОповеститьОбИзменении(Объект.Ссылка);
КонецПроцедуры
Этот код заставляет платформу принудительно перечитать измененную строку в открытых динамических списках на клиенте, и новое значение общего дополнительного реквизита сразу же отобразится на экране без ручного обновления списка.