При доработке конфигураций, разработанных на базе Библиотеки стандартных подсистем (БСП), разработчики часто сталкиваются с ситуацией: в справочник (например, Организации) добавлен новый реквизит (допустим, КодПоОКТМО), он выведен на форму, конфигурация базы данных успешно обновлена, однако при вызове процедур печати новый реквизит отсутствует в структуре данных и не виден в отладчике. Разберем причины такого поведения платформы и типовых механизмов БСП, а также пошагово устраним проблему.
Проанализируем архитектуру подсистемы печати БСП. В типовых конфигурациях алгоритмы формирования печатных форм практически никогда не обращаются к реквизитам объектов через точку от ссылки (например, СсылкаНаОрганизацию.КодПоОКТМО), так как это приводит к неоптимальным запросам к базе данных («чтение через точку»).
Вместо этого данные собираются централизованно специальными функциями, такими как СведенияОбОрганизации или Печать в модуле менеджера справочника. Внутри этих функций выполняется запрос с жестко заданным списком полей:
СправочникСсылка.Организации, а объект типа Структура, СтрокаТаблицыЗначений или ВыборкаИзРезультатаЗапроса.ИНН, КПП, ОКАТО).Разберем по шагам, как добавить новый реквизит в механизм печати:
Организации (или соответствующий общий модуль подсистемы печати).ОКАТО или КодПоОКПО.СведенияОбОрганизации или экспортная процедура печати документов).КодПоОКТМО в текст запроса и в итоговую структуру полей:
// Пример доработки текста запроса сбора сведений
ТекстЗапроса =
"ВЫБРАТЬ
| Организации.Ссылка КАК Организация,
| Организации.ИНН КАК ИНН,
| Организации.КПП КАК КПП,
| Организации.КодПоОКАТО КАК КодПоОКАТО,
| Организации.КодПоОКТМО КАК КодПоОКТМО
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.Ссылка = &Организация";
После включения реквизита в выборку модуль передаст его в структуру данных печати, и реквизит станет доступен для вывода в макет.
Функции получения сведений об организациях и параметрах учетной политики часто выносятся в общие модули с признаком Повторное использование возвращаемых значений (на время сеанса или на время вызова). В этом случае даже после внесения изменений в запрос или изменения значения реквизита в базе данных система может возвращать старую структуру из кэша.
Для сброса кэша выполним следующие действия:
ОчиститьКэшПовторногоИспользования().Если обновление конфигурации базы данных выполнялось динамически (без перезапуска клиентских сеансов и рабочих процессов сервера rphost), может возникнуть рассинхронизация схемы метаданных в кэше сервера и клиента. В результате в сеансе отладки метаданные объекта могут считываться некорректно.
Проверим и исправим эту ситуацию:
При добавлении нового реквизита через дерево метаданных платформа по умолчанию не назначает права на чтение этого реквизита для неполных ролей. Если процедура формирования печатной формы выполняется под пользователем с ограниченными правами без перехода в привилегированный режим, запрос вернет для нового реквизита пустое значение (NULL).
Убедимся, что:
УстановитьПривилегированныйРежим(Истина).