При работе с типовыми конфигурациями, такими как Бухгалтерия предприятия 3.0, часто возникает необходимость расширить функционал стандартных отчетов, добавив в них специфические данные. Рассмотрим на примере отчета Ведомость по амортизации ОС, как правильно добавить новое поле, чтобы оно корректно отображалось в виде отдельной колонки и было доступно всем пользователям.
Первым делом нам необходимо внести изменения в запрос схемы компоновки данных. Если мы работаем через расширение или копию отчета, находим основную схему компоновки. В тексте запроса добавим получение нужного нам реквизита. Проанализируем типичную ситуацию: когда поле получается через «точку» от другого объекта, например, из справочника ОсновныеСредства.
Важно помнить о правах доступа. Чтобы избежать проблем с отображением поля у пользователей с ограниченными правами, используем конструкцию ВЫРАЗИТЬ. Это необходимо, так как поле может иметь составной тип данных, и системе нужно явно указать тип для проверки прав. Пример кода в запросе:
ВЫРАЗИТЬ(ХозрасчетныйОстаткиИОбороты.ОсновноеСредство КАК Справочник.ОсновныеСредства).КодЯчейкиНаСкладе КАК ОС_КодЯчейкиНаСкладе
Часто программисты сталкиваются с тем, что новое поле добавляется в группировку (например, внутрь строки с основным средством), но не выводится отдельным столбцом. Выясним причину: СКД по умолчанию группирует нечисловые данные. Чтобы заставить систему вывести текстовое поле как отдельный показатель (аналогично суммам), разберем следующий прием:
ОС_КодЯчейкиНаСкладе в список ресурсов.Максимум(ОС_КодЯчейкиНаСкладе).После этого поле начнет вести себя как ресурс и появится в списке выбранных полей, доступных для вывода в колонки отчета.
Если мы хотим, чтобы поле появлялось у пользователей автоматически, без необходимости ручной настройки отчета, проанализируем работу модуля менеджера. В процедуре ПередКомпоновкойМакета можно программно добавить поле в настройки компоновщика:
НовоеПоле = КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Заголовок = "Код ячейки на складе";
НовоеПоле.Использование = Истина;
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ОС_КодЯчейкиНаСкладе");
Важный нюанс: если отчет ранее уже открывался пользователем, система загрузит старые настройки из кэша. Чтобы увидеть изменения, необходимо сбросить настройки отчета на стандартные (кнопка Еще — Установить стандартные настройки).
Рассмотрим ситуацию, когда под полными правами поле заполнено, а у рядового бухгалтера оно пустое или отсутствует. Это происходит из-за механизма RLS (Restriction at Leaf Level). Если обращение к реквизиту идет через точку от составного поля, система может блокировать доступ. Посмотрим на два способа решения:
ВЫРАЗИТЬ в запросе (как было показано в Шаге 1).ЛЕВОЕ СОЕДИНЕНИЕ с таблицей справочника ОсновныеСредства. Это более надежный способ с точки зрения производительности и прав доступа.В современной разработке на платформе 1С 8.3 крайне не рекомендуется копировать типовые отчеты целиком. Проанализируем преимущества использования расширений: мы можем добавить только измененную СКД, сохранив при этом типовые формы и логику обновления конфигурации. Это позволит избежать трудностей при последующих обновлениях 1C:Бухгалтерии, так как наши доработки останутся в отдельном слое.