При изучении архитектуры 1С начинающие разработчики часто сталкиваются с учебными задачами, которые требуют понимания структуры данных. Одной из классических задач является создание механизма для связки Контрагенты и Контактные лица, где одно лицо может работать у нескольких контрагентов в разных должностях, при этом накладывается жесткое ограничение: не использовать регистры сведений.
Поскольку использование Регистры сведений запрещено, нам необходимо перенести логику хранения связей внутрь самих справочников. Существует два основных подхода к реализации такой структуры:
Контрагенты: Это наиболее естественный способ, если мы рассматриваем контрагента как основной объект. Мы создаем табличную часть, например, с названием КонтактныеЛица, в которой будем хранить ссылку на Контактные лица и строковый или ссылочный реквизит Должность.Контактные лица: Этот вариант позволяет видеть места работы конкретного человека. Однако для бизнес-задач, где важно быстро получить список всех ответственных лиц по конкретной компании, первый вариант является более предпочтительным.Рассмотрим по шагам, как реализовать этот подход. Для начала перейдем в конфигуратор, выберем справочник Контрагенты и добавим в него новую табличную часть КонтактныеЛица. Внутри этой табличной части создадим два реквизита:
КонтактноеЛицо — тип данных СправочникСсылка.КонтактныеЛица.Должность — тип Строка (или СправочникСсылка.Должности, если такой справочник предусмотрен архитектурой).Такое решение позволяет нам при открытии карточки контрагента сразу видеть полный список сотрудников с их должностями, что соответствует условиям задачи.
Теперь перейдем к созданию служебной обработки. Наша задача — выявить всех контрагентов, у которых список контактных лиц пуст. Важное условие: игнорировать группы (папки) справочника Контрагенты.
Для реализации проверки воспользуемся запросом к базе данных. Использование ЛЕВОЕ СОЕДИНЕНИЕ позволит нам эффективно найти тех контрагентов, для которых не нашлось соответствующих записей в табличной части.
Разберем пример кода для выполнения этой задачи:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Контрагент
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ
Справочник.Контрагенты.КонтактныеЛица КАК КонтактныеЛица
ПО
Контрагенты.Ссылка = КонтактныеЛица.Ссылка
ГДЕ
Контрагенты.ЭтоГруппа = ЛОЖЬ
И КонтактныеЛица.КонтактноеЛицо ЕСТЬ NULL
Давайте проанализируем, почему мы выбрали именно такой путь:
ЛЕВОЕ СОЕДИНЕНИЕ: Это стандартный метод поиска «отсутствующих» данных. Если после соединения левой таблицы с правой у нас в правой части (которая берется из табличной части) везде стоят значения NULL, значит, связей для данного контрагента нет.ЭтоГруппа = ЛОЖЬ: Это критически важный момент. Если его не добавить, система будет проверять группы контрагентов, что приведет к неверным результатам, так как группы не содержат контактных лиц по своей природе.Справочник.Контрагенты.КонтактныеЛица работает быстро и предсказуемо.Когда вы решаете такие задачи, старайтесь не просто следовать инструкциям, а задавать себе вопрос: «Что будет, если мне понадобится хранить историю?». Например, в будущем может потребоваться узнать, когда именно человек занимал ту или иную должность. В таком случае табличная часть уже не справится, и вам неизбежно придется перейти к использованию регистра сведений. Однако для учебных целей использование табличной части — это отличная тренировка навыков работы с объектной моделью 1С и понимания связей между данными.
Продолжайте экспериментировать с конструктором запросов, пробуйте добавлять дополнительные отборы или группировки, чтобы лучше закрепить навык написания алгоритмов на платформе 1С:Предприятие.