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