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