При работе с типовыми отчетами 1С, такими как «Шахматная ведомость», часто возникают задачи по фильтрации данных, которые не предусмотрены стандартным интерфейсом. В частности, пользователям может потребоваться исключить из отчета конкретный бухгалтерский счет, например, 51-й. Давайте разберем, как реализовать такую задачу с помощью механизма расширений, сохраняя при этом работоспособность отчета.
Перенос отчета, построенного на системе компоновки данных (СКД), в расширение — задача нетривиальная. Основная сложность заключается в том, что типовые отчеты 1С сильно интегрированы с подсистемой БухгалтерскиеОтчеты. При переносе запроса в расширение вы можете столкнуться с ошибками доступа к полям виртуальных таблиц, такими как СчетДт.Забалансовый или Организация. Это происходит потому, что контекст метаданных внутри СКД в расширении не всегда корректно сопоставляется с объектами основной конфигурации.
Прежде чем приступать к коду, убедитесь, что все используемые в запросе объекты (регистр бухгалтерии Хозрасчетный, справочники, перечисления) добавлены в расширение. Однако, даже при правильном добавлении, конструктор запросов может выдавать ошибки из-за особенностей работы с параметрами в БСП (Библиотеке стандартных подсистем).
Если задача требует точечного изменения логики выборки, самым надежным методом является программная подмена текста запроса в схеме компоновки данных. Рассмотрим, как это сделать через событие инициализации.
Для начала создадим процедуру-обработчик в расширении, которая будет подменять макет СКД. Мы используем аннотацию &Вместо для метода ИнициализацияКомпоновщикаНастроек:
&Вместо("ИнициализацияКомпоновщикаНастроек")
Процедура ОД_ИнициализацияКомпоновщикаНастроек(Форма, ОрганизацияИзменилась, ИмяВариантаНастроек)
// Инициализируем стандартную логику или пропускаем ее
Форма.КомпоновщикИнициализирован = Истина;
// Получаем макет из нашего расширения
ИмяОтчета = БухгалтерскиеОтчеты.ИмяОтчета(Форма);
ИмяСхемы = "ОД_Макет";
Схема = Отчеты[ИмяОтчета].ПолучитьМакет(ИмяСхемы);
// Заменяем текст запроса в наборе данных
НаборДанных = Схема.НаборыДанных.Найти("ХозрасчетныйОборотыДтКт");
НаборДанных.Запрос = СтрЗаменить(НаборДанных.Запрос, "ГДЕ", "ГДЕ СчетКт <> &Счет51 И ");
// Продолжаем инициализацию СКД
Форма.СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(Схема, Форма.УникальныйИдентификатор);
ИнициализироватьКомпоновщикНастроекСКД(Форма.Отчет.КомпоновщикНастроек, Форма.СхемаКомпоновкиДанных, ИмяОтчета);
// ... дальнейшая логика загрузки настроек
КонецПроцедуры
Важное замечание: При программном изменении текста запроса всегда проверяйте, чтобы в параметры СКД был передан ваш новый параметр, например, &Счет51. Это можно сделать через Форма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.
Если правка типового отчета через расширение вызывает постоянные конфликты при обновлении конфигурации, рекомендуется использовать подход с внешним отчетом. Это более «безопасный» путь для долгосрочной эксплуатации.
ПриСозданииНаСервере для отключения стандартных механизмов БухгалтерскиеОтчетыВызовСервера, которые могут пытаться навязать типовую структуру.Пример структуры кода для внешнего отчета:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Отключаем типовую инициализацию, чтобы она не конфликтовала с нашим отчетом
// БухгалтерскиеОтчетыВызовСервера.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
// Выполняем свою инициализацию схемы компоновки данных
// ...
КонецПроцедуры
В процессе работы с отчетами БП 3.0 помните о следующих нюансах:
&Вместо опасно, так как при изменении имен полей в типовой конфигурации ваш отчет перестанет работать. Всегда проводите тщательное тестирование на копии базы перед установкой изменений в рабочую систему.Используя предложенные методы, вы сможете успешно модифицировать отчеты, не нарушая целостность типового функционала и обеспечивая нужную гибкость для бухгалтерского учета.