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