Как программно связать документы и отобразить их в структуре подчиненности без изменения типовой конфигурации?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе разработки и адаптации типовых решений 1С часто возникает задача связать два документа, между которыми в типовой логике связь не предусмотрена. Например, пользователю необходимо, чтобы на основании документа Счет на оплату покупателю можно было создать Перемещение товаров, и эта связь корректно отображалась в стандартном отчете «Структура подчиненности» (или «Связанные документы»).

Главная сложность здесь заключается в желании сохранить конфигурацию на полной поддержке («на замке»), чтобы не усложнять процесс последующих обновлений. В данной статье мы разберем, как решить эту задачу с помощью современных механизмов платформы 1С:Предприятие 8.3.

Механизм связей в 1С: как это работает «под капотом»

Прежде чем переходить к реализации, давайте проанализируем, каким образом система строит дерево связанных документов. Основным объектом метаданных, отвечающим за эту функцию, является Критерий отбора. Как правило, в типовых конфигурациях он называется СвязанныеДокументы.

Этот объект содержит в себе перечень реквизитов различных документов, которые имеют тип «Ссылка» на другие документы. Когда вы нажимаете кнопку «Связанные документы», система выполняет запрос по всем таблицам, указанным в этом критерии отбора, и собирает иерархию. Следовательно, чтобы наше Перемещение «увидело» Счет, нам нужно выполнить два условия:

  1. В документе-приемнике (Перемещение) должен быть реквизит, хранящий ссылку на документ-основание (Счет).
  2. Этот реквизит должен быть включен в состав критерия отбора СвязанныеДокументы.

Способ 1: Реализация через расширение конфигурации

Рассмотрим подробнее наиболее современный и правильный метод — использование расширений. Этот механизм позволяет добавлять новые реквизиты и изменять логику работы, не снимая основную конфигурацию с поддержки.

Шаг 1: Создание расширения и добавление реквизита

Для начала создадим новое расширение и заимствуем в него документ ПеремещениеТоваров. Затем добавим в него новый реквизит, например, ДокументОснование_Счет с типом ДокументСсылка.СчетНаОплатуПокупателю. Важно помнить, что если вы добавите реквизит через расширение, данные будут физически храниться в базе, пока расширение активно.

Шаг 2: Включение в критерий отбора

Теперь нам нужно заимствовать в расширение критерий отбора СвязанныеДокументы. В свойствах критерия на вкладке «Состав» необходимо найти наш новый реквизит ДокументОснование_Счет и отметить его галочкой. Начиная с версий платформы 8.3.15, расширения позволяют модифицировать состав критериев отбора, что делает эту задачу выполнимой без «взлома» основной конфигурации.

Шаг 3: Программное заполнение связи

Чтобы связь устанавливалась автоматически при создании одного документа на основании другого, нам нужно перехватить событие ОбработкаЗаполнения в модуле объекта документа ПеремещениеТоваров. Проанализируем пример кода, который можно разместить в расширении:


&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Проверяем, что заполнение происходит именно на основании Счета
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда
        
        // Заполняем наш новый реквизит связи
        ЭтотОбъект.ДокументОснование_Счет = ДанныеЗаполнения;
        
        // Здесь можно также заполнить табличную часть документа данными из счета
        // Например, перенести товары, цены и количество
        Для Каждого СтрокаСчета Из ДанныеЗаполнения.Товары Цикл
            НоваяСтрока = ЭтотОбъект.Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСчета);
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Способ 2: Использование программного интерфейса БСП

Если ваша конфигурация разработана на базе Библиотеки Стандартных Подсистем (БСП), существует возможность «подмешать» связь программно, даже не добавляя реквизит в критерий отбора. Выясним, как это реализовано.

В БСП за построение структуры подчиненности отвечает общая форма СтруктураПодчиненности. Она обращается к модулям менеджеров документов или специализированным общим модулям (например, УправлениеСобытиями). Используя расширение, мы можем перехватить запрос, формирующий дерево, и добавить в него свои данные «на лету».

Этот метод сложнее в реализации, но он позволяет создавать «виртуальные» связи, которые не требуют хранения дополнительных данных в реквизитах, если связь можно вычислить логически (например, по номеру заказа или договору).

Способ 3: Универсальные регистры связей (для ERP и КА 2)

В крупных флагманских решениях от 1С (ERP 2.5, Комплексная автоматизация 2) реализован универсальный механизм связей через регистр сведений. Вместо того чтобы добавлять сотни реквизитов в каждый документ, система при проведении или записи документа создает запись в специальном регистре, где указывает «Ведущий документ» и «Ведомый документ».

Разберем, как воспользоваться этим преимуществом:

  1. Найдите в вашей конфигурации регистр сведений, отвечающий за связи (часто называется СвязиДокументов или аналогично).
  2. В расширении, в процедуре ПередЗаписью или ПриЗаписи документа Перемещение, добавьте код, который будет записывать связь в этот регистр.
  3. Типовой отчет «Связанные документы» в таких конфигурациях автоматически подхватит запись из регистра и отобразит дерево связей.

Подводные камни и технические нюансы

При использовании расширений для изменения структуры данных важно учитывать несколько критических моментов, которые мы проанализируем ниже:

Итоги

Мы выяснили, что наиболее эффективным и безопасным способом связать Счет и Перемещение является использование расширения конфигурации с добавлением реквизита и включением его в состав критерия отбора СвязанныеДокументы. Это позволяет сохранить типовую логику и при этом получить полноценный функционал структуры подчиненности.

Рассмотренные методы позволяют гибко настраивать систему под нужды бизнеса, не превращая процесс обновления программы в бесконечную рутину по ручному переносу изменений. Выбор конкретного способа зависит от сложности вашей задачи и версии используемой конфигурации. При обслуживании нескольких информационных баз для экономии времени целесообразно настроить автоматическое обновление и архивирование 1С в тихом режиме.

← На главную