Как реализовать связь «контрагент — контактное лицо» без использования регистров сведений?

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

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

Анализ архитектурного решения

Поскольку использование Регистры сведений запрещено, нам необходимо перенести логику хранения связей внутрь самих справочников. Существует два основных подхода к реализации такой структуры:

  1. Табличная часть в справочнике Контрагенты: Это наиболее естественный способ, если мы рассматриваем контрагента как основной объект. Мы создаем табличную часть, например, с названием КонтактныеЛица, в которой будем хранить ссылку на Контактные лица и строковый или ссылочный реквизит Должность.
  2. Табличная часть в справочнике Контактные лица: Этот вариант позволяет видеть места работы конкретного человека. Однако для бизнес-задач, где важно быстро получить список всех ответственных лиц по конкретной компании, первый вариант является более предпочтительным.

Реализация через табличную часть контрагента

Рассмотрим по шагам, как реализовать этот подход. Для начала перейдем в конфигуратор, выберем справочник Контрагенты и добавим в него новую табличную часть КонтактныеЛица. Внутри этой табличной части создадим два реквизита:

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

Создание обработки «Проверка контрагентов»

Теперь перейдем к созданию служебной обработки. Наша задача — выявить всех контрагентов, у которых список контактных лиц пуст. Важное условие: игнорировать группы (папки) справочника Контрагенты.

Для реализации проверки воспользуемся запросом к базе данных. Использование ЛЕВОЕ СОЕДИНЕНИЕ позволит нам эффективно найти тех контрагентов, для которых не нашлось соответствующих записей в табличной части.

Разберем пример кода для выполнения этой задачи:


ВЫБРАТЬ
    Контрагенты.Ссылка КАК Контрагент
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ 
    Справочник.Контрагенты.КонтактныеЛица КАК КонтактныеЛица
ПО 
    Контрагенты.Ссылка = КонтактныеЛица.Ссылка
ГДЕ
    Контрагенты.ЭтоГруппа = ЛОЖЬ
    И КонтактныеЛица.КонтактноеЛицо ЕСТЬ NULL

Почему это решение эффективно?

Давайте проанализируем, почему мы выбрали именно такой путь:

Методические советы для обучения

Когда вы решаете такие задачи, старайтесь не просто следовать инструкциям, а задавать себе вопрос: «Что будет, если мне понадобится хранить историю?». Например, в будущем может потребоваться узнать, когда именно человек занимал ту или иную должность. В таком случае табличная часть уже не справится, и вам неизбежно придется перейти к использованию регистра сведений. Однако для учебных целей использование табличной части — это отличная тренировка навыков работы с объектной моделью 1С и понимания связей между данными.

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

← На главную