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