Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передать значение адреса объекта с клиента на сервер
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Gigi
Всем привет уважаемые форумчане и специалисты!

Гуууу! Сколько уже вожусь и никак не получается...перерыл везде, где мог и ничего не нашел, как сделать следующее:Допустим есть справочник: "ОБЪЕКТ". И нужно, что бы из формы этого справочника по указанному адресу был найден указанный код реквизита на сервере, но в другом справочнике, на пример в списке справочника "ТОЧКА". Для чего есть команда: "НайтиПоКоду". И вроде бы с этим все получилось по вот такой схеме:

 
&НаКлиенте
Процедура Тест_Пойск(Команда)
    ТекстКода="000000001";
    текзначение=ПолучитьКод("СпрТочки", ТекстКода);
    сообщить(текзначение);
КонецПроцедуры

&НаСервере
Функция ПолучитьКод(Путь, ТекстПойска)
    Если Путь="СпрТочки" Тогда
        ПутьСпр = Справочники.ТОЧКА;  
        Возврат ПутьСпр.НайтиПоКоду(ТекстПойска);
    Иначе
        Возврат неопределено;
    конецесли;
КонецФункции


Но дело в том, что этот путь не удовлетворяет цель. которая в следующем:
Создать функцию для сервера с параметром адреса указанного на Клиенте.
Ибо функция для того и нужна, что бы для каждого случая не писать ее отдельно.
Т.е. суть вопроса в том, что бы код функции оставался неизменным. И что в ней было прописано то, что она должна сделать.
А все .... необходимые параметры, что бы можно было задавать на клиенте.
К сожалению указанный вариант годиться для индивидуального случая. Т.е. когда адрес поиска: Справочники.ТОЧКА.
А если другой адрес? Тогда его опять нужно указывать на сервере.
Вообще, нельзя ли сделать так, что бы на клиенте можно было указать любой адрес поиска.
И это для параметра одной и той же общей функции на сервере. Просто передать ЛЮБОЙ адрес. Который может меняться.

Вот в чем вопрос!

Буду очень признателен за ответ и за помощь!
Если кто то подкорректирует ....

 ! 

необходимо зарегистрироваться для просмотра ссылки: Правда так лучше код выглядит? тема переехала в раздел 8.3
 
Batchir
&НаСервере 
Функция ПолучитьКод(Путь, ТекстПойска)
    текЗначение = Неопределено;
    Выполнить("текЗначение = Справочники."+Путь+".НайтиПоКоду(ТекстПойска)");
    Возврат текЗначение;
КонецФункции
Flexy
&НаСервереБезКонтекста
Функция ПолучитьКод(Менеджер, Код)
    Возврат Справочники[Менеджер].НайтиПоКоду(Код);
КонецФункции
Batchir
Flexy, Топик стартер просил универсальности, я лишь даю намек на то что есть такая команда как выполнить, с помощью которой можно скомпоновать любой код на выполнение wink.gif
Так в зависимости от условий можно спокойно собрать имя функции из частей и выполнить её.
Flexy
Batchir @ Сегодня, 19:48 необходимо зарегистрироваться для просмотра ссылки ,
Да. Я в курсе, что есть такая функция. И с помощью ее можно творить супер-универсальные алгоритмы.
Но согласитесь, что все возможные "Пути" (по сути менеджеры справочников) в идеале должны быть предопределены разработчиком. Это методически правильно имхо.
По этому мой пост автору - это лишь еще один из вариантов реализации его задачи smile.gif
Gigi
Flexy @ Вчера, 21:04 необходимо зарегистрироваться для просмотра ссылки ,
Отлично!
Как раз то, что было нужно.
Вот что, значит когда не сильно глубоко знаком с разными фишками.
Сколько искал ... а все просто... достаточно было только знать, что есть очень полезная команда: "выполнить". В которую можно вогнать все что угодно.
Теперь все уже будет выглядеть вот так:

&НаКлиенте
Процедура Тест_Пойск(Команда)
ТекстКода="000000001";
АдреСпр ="Справочники.ТОЧКА";
ТекЗначение=ПолучитьКод(АдреСпр, ТекстКода);
сообщить(ТекЗначение);
КонецПроцедуры

&НаСервере
Функция ПолучитьКод(Путь, ТекстПойска)
ПутьОбъект = Неопределено;
Выполнить("ПутьОбъект = "+ Путь);
ТекЗначение = ПутьОбъект.НайтиПоКоду(ТекстПойска);
Возврат ТекЗначение;
КонецФункции


А на счет такого решения пока не разобрался:

Цитата(Flexy @ 20.04.17, 20:33) необходимо зарегистрироваться для просмотра ссылки
&НаСервереБезКонтекста
Функция ПолучитьКод(Менеджер, Код)
    Возврат Справочники[Менеджер].НайтиПоКоду(Код);
КонецФункции


Короче!
Огромное вам спасибо ребята!

icon_beer17.gif
Flexy
Цитата(Gigi @ 21.04.17, 13:57) необходимо зарегистрироваться для просмотра ссылки
А на счет такого решения пока не разобрался:

&НаСервереБезКонтекста
Функция ПолучитьКод(Путь, Код)
    Возврат Справочники[Путь].НайтиПоКоду(Код);
КонецФункции


Цитата(Gigi @ 21.04.17, 13:57) необходимо зарегистрироваться для просмотра ссылки
есть очень полезная команда: "выполнить". В которую можно вогнать все что угодно.

"Что угодно" низзя - код не выполниться и вывалиться ошибка. Можно только реальное имя существующего в конфигурации справочника. Это касается и примера, который я писал выше.
Или через попытку / исключение. Ошибки не будет... но это имхо не феншуйное решение.
&НаСервереБезКонтекста 
Функция ПолучитьКод(Путь, ТекстПойска)
    текЗначение = Неопределено;
    Попытка
    Выполнить("текЗначение = Справочники."+Путь+".НайтиПоКоду(ТекстПойска)");
    Исключение
    КонецПопытки
    Возврат текЗначение;
КонецФункции
Gigi
Flexy @ Сегодня, 15:13 необходимо зарегистрироваться для просмотра ссылки ,

&НаСервереБезКонтекста
Функция Справочник_ПолучитьКод(Путь, Код)
Возврат Справочники[Путь].НайтиПоКоду(Код);
КонецФункции
&НаСервереБезКонтекста
Функция Документы_ПолучитьКод(Путь, Код)
Возврат Документы[Путь].НайтиПоКоду(Код);
КонецФункции


Да теперь дошло 47067070.gif

Цитата(Flexy @ 21.04.17, 15:13) необходимо зарегистрироваться для просмотра ссылки
"Что угодно" низзя - код не выполниться и вывалиться ошибка


Да .... все верно... "все что угодно" это я так .. образно.
Естественно если путь реально существует. А иначе только через "попытку" и "исключение"
Но вообще что касается этого вопроса, то в моем случае суть в том, что я и не хочу в недре кода вообще указывать адрес.
Не на клиенте, на на сервере. Просто стоит задача и приходиться ее решать мелкими шагами. Сперва один вопрос. потом другой и т.д.
Но вопрос передачи адреса уже решен. И не важно феншуйное или не феншуйное решение. Главное работает! А в остальное ......
И поэтому уже теперь возникает другой вопрос который больше касается клиента, но который все равно имеет отношение к передаче значения и думаю в рамках рассматриваемой темы. Ну хотя бы косвенно ... 32542460.gif
Вопрос в том, как сделать, что бы система сама определяла адрес с которым связан на пример какой ни будь реквизит табличной части и в форме?
Судя по тому, что знаю для этого есть команда: ПолучитьНавигационнуюСсылку но она к сожалению не срабатывает.
Вот код с учетом того, сказанного...
Ну если это не сильно противоречит теме. то опять буду признателен если есть соображения

&НаКлиенте
Процедура Тест_Пойск(Команда)
ТекстКода="000000001";
АдреСпр = ПолучитьНавигационнуюСсылку(Элементы.ТаличнаяЧасть1.ТекущиеДанные.Рекв1);
//Адресс ссылки реквизита: Рекв1 в ТаличнаяЧасть1 это "Справочники.ТОЧКА"
//Ну это как обычно в свойствах "тип".
//Так вот, как раз для исключения варианта не существующего адреса нужно, что бы
//На клиенте адрес ссылки реквизита определялся сам.
//Что бы не было надобности указывать:  АдреСпр ="Справочники.ТОЧКА"; или  АдреСпр ="ТОЧКА";
//Ведь ссылка реквизта может меняться.
//Но передать адрес на сервер через: "ПолучитьНавигационнуюСсылку" не срабатывает!
ТекЗначение=ПолучитьКод(АдреСпр, ТекстКода);
Сообщить(ТекЗначение);
КонецПроцедуры

&НаСервере
Функция ПолучитьКод(Путь, ТекстПойска)
ПутьОбъект = Неопределено;
Выполнить("ПутьОбъект = "+ Путь);
ТекЗначение = ПутьОбъект.НайтиПоКоду(ТекстПойска);
Возврат ТекЗначение;
КонецФункции
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.