В процессе разработки и расширения типовых конфигураций «1С:Предприятие 8» (таких как «1С:ERP Управление предприятием», «1С:Комплексная автоматизация» или «1С:Управление торговлей») программисты часто создают новые документы. Одной из базовых потребностей пользователей при работе с новыми объектами является возможность просматривать связи между ними — так называемую структуру подчиненности или связанные документы.
Рассмотрим классическую задачу: мы создали новый документ Акт, который связан с типовым документом Заказ поставщику через соответствующий реквизит. Мы хотим, чтобы из формы нашего Акта можно было в один клик открыть дерево всех связанных с ним документов.
Выясним причину, почему при попытке решить эту задачу «в лоб» разработчики сталкиваются с трудностями. При анализе общей команды СвязанныеДокументы (синоним «Связанные документы» или «Структура подчиненности») в конфигураторе мы можем обнаружить странную вещь: в списке типов её параметров присутствуют только кадровые и зарплатные документы (например, БольничныйЛист, Отпуск), но там нет ни одного торгового документа (ни Заказа поставщику, ни Реализации товаров и услуг).
Это происходит потому, что в современных версиях Библиотеки стандартных подсистем (БСП) используется механизм динамического подключения команд. Типовые торговые документы подключаются к этой команде программно во время работы системы, в то время как статически в метаданных команды прописаны лишь некоторые устаревшие объекты или специфические документы блока ЗУП.
Разберем подробно два основных способа решения этой задачи: простой (статический) и правильный (динамический, по стандартам БСП), а также особенности реализации этой задачи через расширения конфигурации.
Этот способ наиболее прост в реализации и отлично подходит для нетиповых или сильно измененных конфигураций, которые находятся на ручном обслуживании и не требуют частого автоматического обновления.
Проанализируем шаги, которые необходимо выполнить для настройки статического вывода команды:
СвязанныеДокументы. На вкладке «Данные» в поле «Тип» добавим наш новый документ Акт. Затем перейдем на вкладку «Состав» и отметим галочкой реквизит нашего нового документа (например, ЗаказПоставщику), который связывает его с родительским документом. Это позволит системе находить связи «снизу вверх».СвязанныеДокументы (в некоторых версиях БСП она называется СтруктураПодчиненности). Откроем свойства этой команды и найдем свойство «Тип параметра команды». Нам необходимо добавить наш документ ДокументСсылка.Акт в этот список типов.После выполнения этих действий платформа автоматически выведет стандартную кнопку «Связанные документы» на форму нашего документа. Однако у этого способа есть существенный минус: при обновлении конфигурации измененные свойства общей команды могут быть перезаписаны, что приведет к потере функционала. Поэтому рассмотрим более надежный путь.
В современных конфигурациях 1С кнопка структуры подчиненности выводится на форму динамически с помощью подсистемы «Подключаемые команды». Чтобы сделать все по стандартам разработки 1С и избежать проблем при будущих обновлениях, выполним интеграцию программно.
Разберем этот процесс по шагам.
Шаг 1. Настройка критерия отбора
Этот шаг аналогичен первому способу. Нам обязательно нужно зарегистрировать связь документов в критерии отбора СвязанныеДокументы, иначе система не сможет построить дерево связей в отчете.
Шаг 2. Регистрация документа в подсистеме вариантов отчетов
Для того чтобы система БСП понимала, что для нашего документа необходимо формировать команды отчетов, его нужно зарегистрировать в общем модуле. Найдем общий модуль ВариантыОтчетовПереопределяемый и перейдем к процедуре ОпределитьОбъектыСКомандамиОтчетов (в зависимости от версии БСП она также может называться ПриОпределенииОбъектовСКомандамиОтчетов). Добавим туда наш документ:
Процедура ОпределитьОбъектыСКомандамиОтчетов(Объекты) Экспорт
// Добавляем наш новый документ в список объектов, поддерживающих команды отчетов
Объекты.Добавить(Метаданные.Документы.Акт);
КонецПроцедуры
Шаг 3. Реализация программного интерфейса в модуле менеджера
Теперь откроем модуль менеджера нашего нового документа Акт и добавим экспортную процедуру, которая будет указывать БСП, какую именно команду нужно подключить к документу. В нашем случае это команда связанных документов:
#Область ПрограммныйИнтерфейс
// Заполняет список команд отчетов, подключаемых к объекту.
//
// Параметры:
// КомандыОтчетов - ТаблицаЗначений - состав полей см. в ВариантыОтчетов.СоздатьКоллекциюКомандОтчетов.
// Параметры - Структура - вспомогательные параметры настройки.
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
// Вызываем метод переопределяемого модуля для добавления команды структуры подчиненности
ВариантыОтчетовУТПереопределяемый.ДобавитьКомуОтчетСвязанныеДокументы(КомандыОтчетов);
КонецПроцедуры
#КонецОбласти
Примечание: Имя вызываемого метода (например, ДобавитьКомуОтчетСвязанныеДокументы) может незначительно отличаться в зависимости от конкретной версии конфигурации (КА 2.4, ERP 2.5 или УТ 11). Чтобы не ошибиться, рекомендуется открыть модуль менеджера любого аналогичного типового документа (например, ЗаказПоставщику) и скопировать вызов оттуда.
Шаг 4. Внедрение кода в форму документа
Кнопка связанных документов выводится в подменю «Отчеты» на форме. Чтобы подсистема БСП могла динамически внедрить эту кнопку на форму при ее открытии, нам нужно доработать модуль формы документа Акт.
В процедуре ПриСозданииНаСервере добавим вызов инициализации подключаемых команд:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
Также нам необходимо обработать нажатие на эту динамическую кнопку на клиенте. Для этого добавим стандартный обработчик команд БСП:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
// Перенаправляем выполнение команды в модуль БСП
ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
Шаг 5. Обновление информационной базы
Поскольку БСП кэширует список подключенных команд в специальных регистрах сведений для оптимизации производительности, при простом запуске базы кнопка может не появиться. Чтобы принудительно обновить кэш БСП, запустите сеанс «1С:Предприятие» под администратором с параметром запуска:
/C ЗапуститьОбновлениеИнформационнойБазы
После завершения процедуры обновления зайдите в документ Акт — в шапке формы или в меню «Отчеты» появится заветная кнопка «Связанные документы», которая будет корректно работать.
Если ваша типовая конфигурация находится на строгой поддержке и вносить изменения в основную конфигурацию нельзя, всю эту задачу можно решить через расширение. Однако здесь есть важный нюанс: платформа 1С не позволяет напрямую изменять состав критериев отбора в расширениях.
В этом случае профессиональные разработчики применяют следующий паттерн:
ит_СвязанныеДокументы), куда добавляются новые документы расширения и настраиваются их связи.&ИзменениеИКонтроль переопределяется служебная функция БСП СтруктураПодчиненностиСлужебный.ИндексТиповСвязанныхОбъектов(). В возвращаемое этой функцией соответствие программно добавляются типы документов из нашего расширения.СвязанныеДокументы (в месте построения дерева связей), чтобы алгоритм учитывал данные не только основного критерия отбора, но и нашего нового критерия из расширения.Такой подход гарантирует абсолютную чистоту типовой конфигурации и беспроблемное автоматическое обновление системы в будущем.