Как получить ИНН контрагента из справочника Водители без изменения конфигурации?

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

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

Почему поиск по наименованию — это плохая практика

Первым делом проанализируем распространенный, но крайне ненадежный способ — поиск с помощью метода НайтиПоНаименованию. Часто разработчики пытаются связать объекты, склеивая строки, например: Справочники.Контрагенты.НайтиПоНаименованию(спр.Водители.Наименование + \" (водитель)\").

Почему этого делать не стоит:

  1. Ошибки человеческого фактора: Лишний пробел, опечатка или изменение формата записи в справочнике Контрагенты приведет к тому, что печатная форма перестанет работать или будет выводить неверные данные.
  2. Дублирование данных: Если в базе появятся тезки или полные дубли имен, система вернет первую попавшуюся ссылку, что чревато подстановкой чужого ИНН в юридически значимые документы.
  3. Производительность: Поиск по строке в больших справочниках работает медленнее, чем обращение по ссылке, особенно если по полю Наименование нет соответствующего индекса.

Метод 1: Использование механизма свойств объектов

Если конфигурация запрещена к изменению (нельзя добавлять новые реквизиты в справочники), воспользуйтесь механизмом Свойств объектов (ПВХ СвойстваОбъектов). Это позволяет прикрепить дополнительные данные к любому объекту без изменения структуры метаданных в Конфигураторе.

Разберем этот подход:

  1. Перейдите в режим «1С:Предприятие».
  2. Откройте настройки дополнительных реквизитов и сведений.
  3. Создайте новое свойство «ИНН» для справочника Водители.
  4. Заполните значения этого свойства для каждого водителя, перенеся туда данные из Контрагентов.

Теперь в коде печатной формы вы сможете получить значение свойства через регистр сведений ЗначенияСвойствОбъектов, что гораздо надежнее, чем поиск по строке.

Метод 2: Создание регистра соответствий

Если правка конфигурации невозможна, а функционала свойств недостаточно, создайте независимый Регистр сведений «СоответствиеВодителейИКонтрагентов». Это архитектурно чистое решение:

  1. Создайте регистр с измерением Водитель (тип СправочникСсылка.Водители).
  2. Добавьте ресурс Контрагент (тип СправочникСсылка.Контрагенты).
  3. Внесите данные о соответствии один раз.

Теперь в запросе или коде печатной формы вы сможете легко получить нужный ИНН:


// Пример получения контрагента через регистр
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    Соответствие.Контрагент.ИНН КАК ИНН
               |ИЗ
               |    РегистрСведений.СоответствиеВодителейИКонтрагентов КАК Соответствие
               |ГДЕ
               |    Соответствие.Водитель = &Водитель";
Запрос.УстановитьПараметр("Водитель", СсылкаНаВодителя);
Результат = Запрос.Выполнить().Выбрать();

Метод 3: Оптимизация структуры (если правка допустима)

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

  1. Добавьте в справочник Водители реквизит Контрагент с типом СправочникСсылка.Контрагенты.
  2. Привяжите всех водителей к их контрагентам через этот реквизит.
  3. В печатной форме используйте обращение через точку: Водитель.Контрагент.ИНН.

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

Всегда стремитесь к тому, чтобы связь между объектами была явной и жесткой. Если вам приходится работать с «мутной» архитектурой, старайтесь максимально изолировать свои доработки, используя регистры или дополнительные свойства, вместо прямого строкового поиска.

← На главную