Как найти ссылку по строке на сервере и передать её на клиент в управляемых формах 1С?

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

В процессе разработки на платформе «1С:Предприятие» часто возникают задачи, связанные с передача данных между сервером и клиентом. Одна из типичных ситуаций — когда у нас есть текстовое представление объекта (например, наименование справочника или код), и нам необходимо найти саму ссылку на этот объект в базе данных, чтобы отобразить её в поле ввода на форме. Разберем эту задачу подробно, проанализируем архитектуру управляемых форм и рассмотрим правильные методы поиска.

Понимание архитектуры: Реквизиты и Элементы формы

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

В управляемых формах (УФ) существует четкое разделение:

  1. Реквизиты формы — это данные. Это то, что мы храним (строки, числа, ссылки, объекты). Они существуют в памяти формы.
  2. Элементы формы — это визуальное отображение. Это то, как пользователь видит данные (поля ввода, флажки, таблицы).

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

Таким образом, наша задача сводится к двум этапам:

  1. Найти ссылку в базе данных (это делается на сервере).
  2. Присвоить эту ссылку реквизиту формы (это тоже делается на сервере, а платформа сама передаст данные на клиент).

Где и как выполнять поиск?

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

Оптимальным местом для инициализации значений при открытии формы является событие ПриСозданииНаСервере. Именно здесь форма конструируется, и мы имеем полный доступ к данным.

Методы поиска ссылок

Рассмотрим основные способы получения ссылки из текстовой строки. Допустим, у нас есть строковая переменная (например, полученная из параметров запуска или сформированная алгоритмически), и мы хотим найти элемент справочника.

1. Поиск по Наименованию

Если ваша строка содержит название элемента, используем метод менеджера справочника НайтиПоНаименованию.


// Пример процедуры на сервере
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Допустим, строка поиска пришла к нам каким-то образом
    СтрокаПоиска = "Основной склад"; 
    
    // Выполняем поиск
    // Справочники.Склады - обращаемся к менеджеру конкретного справочника
    НайденнаяСсылка = Справочники.Склады.НайтиПоНаименованию(СтрокаПоиска);
    
    // Проверяем, нашлось ли что-то
    Если Не НайденнаяСсылка.Пустая() Тогда
        // Присваиваем значение РЕКВИЗИТУ формы. 
        // Допустим, на форме есть реквизит "Склад" типа СправочникСсылка.Склады
        Объект.Склад = НайденнаяСсылка; 
        // Или если это отдельный реквизит формы, не связанный с основным Объектом:
        // ЭтаФорма.ВыбранныйСклад = НайденнаяСсылка;
    КонецЕсли;

КонецПроцедуры

Важный нюанс: Метод НайтиПоНаименованию имеет второй параметр — ТочноеСоответствие. Если вы ищете конкретное название, лучше установить его в Истина, иначе система может найти похожие наименования, начинающиеся с этой строки.


НайденнаяСсылка = Справочники.Товары.НайтиПоНаименованию(СтрокаПоиска, Истина);

2. Поиск по Коду

Если строка содержит код элемента или артикул (если он является кодом), используем НайтиПоКоду.


&НаСервере
Процедура ЗаполнитьКонтрагентаПоКоду(КодКонтрагента)
    
    // Ищем ссылку
    СсылкаНаКонтрагента = Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента);
    
    // Присваиваем реквизиту формы
    ЭтаФорма.Контрагент = СсылкаНаКонтрагента;

КонецПроцедуры

3. Поиск по реквизиту

Если строка — это значение какого-то другого реквизита (например, ИНН для контрагента или Артикул для номенклатуры), используем метод НайтиПоРеквизиту.


&НаСервере
Процедура НайтиПоИНН(СтрокаИНН)
    
    // Ищем контрагента с указанным ИНН
    НайденнаяСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", СтрокаИНН);
    
    Если НайденнаяСсылка.Пустая() Тогда
        Сообщить("Контрагент с таким ИНН не найден.");
    Иначе
        ЭтаФорма.Контрагент = НайденнаяСсылка;
    КонецЕсли;

КонецПроцедуры

Реализация решения для задачи автора

Вернемся к вопросу из темы. Автор спрашивал: «Как сформировать ссылочное значение на клиенте по текстовой строке на сервере?». Исходя из обсуждения, правильный алгоритм действий выглядит так:

  1. В конфигураторе создаем Реквизит формы (на вкладке «Реквизиты»). Назовем его, например, ТекущийЭлемент. Укажем ему тип СправочникСсылка.НужныйВидСправочника.
  2. Перетаскиваем этот реквизит на форму — создается Элемент формы (Поле ввода), связанный с реквизитом.
  3. В модуле формы в процедуре ПриСозданииНаСервере пишем код поиска и присваивания.

Полный код модуля формы будет выглядеть следующим образом:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Получаем строку-ключ. 
    // В реальной задаче она может браться из Параметров формы, если мы передали её при открытии.
    // Например: КлючПоиска = Параметры.КлючПоиска;
    // Для примера зададим жестко:
    КлючПоиска = "Иванов Иван Иванович";
    
    // 2. Ищем ссылку в базе данных
    // Предположим, мы ищем в справочнике "ФизическиеЛица"
    РезультатПоиска = Справочники.ФизическиеЛица.НайтиПоНаименованию(КлючПоиска, Истина);
    
    // 3. Присваиваем результат реквизиту формы
    // Даже если ничего не найдено, вернется "Пустая ссылка", 
    // и поле ввода просто останется пустым, ошибки не будет.
    ЭтаФорма.ТекущийЭлемент = РезультатПоиска;
    
КонецПроцедуры

Почему не нужно передавать строку на Клиент?

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

  1. На клиенте (в тонком клиенте) нет доступа к базе данных для выполнения поиска. Метод НайтиПоНаименованию там просто недоступен.
  2. Лишние вызовы сервера. Если бы мы передали строку на клиент, нам пришлось бы снова вызывать серверную функцию, чтобы найти ссылку. Гораздо эффективнее сделать всё сразу в момент создания формы на сервере.

Таким образом, мы выяснили, что секрет успеха кроется в понимании того, что форма «живет» данными (реквизитами), а поиск объектов БД — это исключительно серверная задача.

← На главную