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