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