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