Вход | Регистрация


1С:Предприятие ::

Метки: 

Вызов серверной функции из клиентской процедуры

Я
   Exilles
 
15.02.18 - 21:45
Здравствуйте, новичек в 1С, пытаюсь реализовать автоматическое заполнение поля "Цена" в документе при выборе "Услуга" с помощью регистра сведений "Расценка".
Есть следующий код:
&НаКлиенте
Процедура ДоговорУслугаПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Договор.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = ДоговорУслугаПриИзмененииНаСервере(Объект.Дата, СтрокаТабличнойЧасти);
    РаботаСДокументами.РассчитатьВыполненныйОбъем(СтрокаТабличнойЧасти);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДоговорУслугаПриИзмененииНаСервере(АктуальнаяДата, СтрокаТабличнойЧасти)
    Отбор = Новый Структура("Услуга", СтрокаТабличнойЧасти.Услуга);
    ЗначенияРесурсов = РегистрыСведений.Расценка.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат ЗначенияРесурсов.Цена;
КонецФункции

В синтаксисе всё норм при проверке, а когда начинаю заполнять документ, при выборе какой-либо "Услуга", то выходит ошибка:
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементЭлементКоллекции'
 
  Рекламное место пустует
   МимохожийОднако
 
1 - 15.02.18 - 21:58
Встань отладчиком на строку с ошибкой. Что-то не договариваешь...
   jsmith82
 
2 - 15.02.18 - 22:05
И что ты хотел?
   4St
 
3 - 15.02.18 - 22:06
Передавай в серверную  функцию не всю строку таб. части, а только то, что тебе надо. Т.е. Услуга. И лучше передавай по значению, чуток на трафике сэкономишь .
   jsmith82
 
4 - 15.02.18 - 22:06
Раз ты пишешь процедуру без контекста, передавай не данные формы элемент коллекции, а номенклатуру (СтрокаТабличнойЧасти.Номенклатура)
   Fram
 
5 - 15.02.18 - 22:10
(3) что значит "передавай по значению" ?
   vv2304
 
6 - 15.02.18 - 22:28
"Раз ты пишешь процедуру без контекста, передавай не данные формы элемент коллекции, а номенклатуру (СтрокаТабличнойЧасти.Номенклатура)"
Ну или убери &НаСервереБезКонтекста
   Cyberhawk
 
7 - 15.02.18 - 22:29
(5) Параметр метода Знач
   Exilles
 
8 - 15.02.18 - 22:49
(1) Ошибка в конфигурации появляется
(3) и (4) стал передавать только Услугу и вышла новая ошибка вместо предыдущей:
Поле объекта не обнаружено (Расценка)

"Расценка" - это регистр сведений, где у меня цена за услуги заполняется с помощью другого документа.

Теперь код выглядит так:
&НаКлиенте
Процедура ДоговорУслугаПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.Договор.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = ДоговорУслугаПриИзмененииНаСервере(Объект.Дата, СтрокаТабличнойЧасти.Услуга);
    РаботаСДокументами.РассчитатьВыполненныйОбъем(СтрокаТабличнойЧасти);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДоговорУслугаПриИзмененииНаСервере(АктуальнаяДата, Услуга)
    Отбор = Новый Структура("Услуга", Услуга);
    ЗначенияРесурсов = РегистрыСведений.Расценка.ПолучитьПоследнее(АктуальнаяДата, Отбор);
    Возврат ЗначенияРесурсов.Цена;
КонецФункции
   Exilles
 
9 - 15.02.18 - 22:51
Ошибка, потому что называется не "Расценка", а "Расценки" и теперь всё работает.
Всем огромное спасибо!
Очень долго с этим мучился, потом решился написать сюда и не ошибся, ура, товарищи!
   Fram
 
10 - 15.02.18 - 22:53
(7) это экономит трафик?
 
  Рекламное место пустует
   jsmith82
 
11 - 15.02.18 - 23:07
Я не понял, как можно ссылку на справочник передать по значению?
   Cyberhawk
 
12 - 15.02.18 - 23:18
(10) Конечно
   jsmith82
 
13 - 15.02.18 - 23:28
(12) (11)
   Cyberhawk
 
14 - 15.02.18 - 23:39
(13) Ну (7) же
   ВРедная
 
15 - 15.02.18 - 23:50
(11) Ссылку же, не объект.
   jsmith82
 
16 - 15.02.18 - 23:51
(14) Я не про это. Я про то, что по значению передаются копии объектов (таблица значений, например)
Что будет передано при передаче ссылке по значению? Ссылка же не хранит адрес в оперативной памяти какого-нибудь объекта
Во-вторых, при передаче по значению стек, наоборот, увеличивается
   jsmith82
 
17 - 15.02.18 - 23:51
*ссылка 1с
   Cyberhawk
 
18 - 15.02.18 - 23:55
(16) "по значению передаются копии объектов (таблица значений, например)"// Если смены контекста не происходит, то копия не передается, однако.

"Что будет передано при передаче ссылке по значению?"// Ну, объект встроенного языка с типом "СправочникСсылка.такой-то" или "ДокументСсылка.такой-то" и т.д.
   jsmith82
 
19 - 15.02.18 - 23:59
Если речь идёт о клиент-серверном взаимодействии, то:

При передаче объекта на сервер происходит сериализация, т.е. выполняется "глубокая" копия объекта. А при наличии слова Знач объект не поедет с сервера обратно на клиента.
http://catalog.mista.ru/public/388527/

Т.е. если не использовать Знач, значит СправочникСсылка будет ездить в сериализованном виде?
   Cyberhawk
 
20 - 15.02.18 - 23:59
(19) Будет ездить, ага
   jsmith82
 
21 - 15.02.18 - 23:59
Почему все примеры на сайте 1с и на ИС для объектов типа таблица значений, список значений, массив и проч.?
Почему не говорят про ссылки?
   Cyberhawk
 
22 - 16.02.18 - 00:01
(21) Наверное, потому что примеры с агрегатными объектами лучше отражают особенности поведения, чем ссылки
   Cyberhawk
 
23 - 16.02.18 - 00:01
Чего про ссылки-то говорить? Я так и не понял, почему ты решил докопаться до них )
   jsmith82
 
24 - 16.02.18 - 00:03
(23) Пополняю багаж знаний. Не подумал бы, что ссылки надо по значению передавать между клиентом и сервером.
   Cyberhawk
 
25 - 16.02.18 - 00:04
(24) Между клиентом и сервером рекомендуется передавать по значению вообще все параметры, которые не являются выходными
   jsmith82
 
26 - 16.02.18 - 00:06
Обычно под передачей по значению имеют в виду как раз передачу копии объекта (при этом затрачивается время на "сериализацию", растёт размер стека)
А тут получается (в случае К-С) создание сериализованной копии происходит, наоборот, при (формальной) передаче не по значению.
Поэтому у меня когнитивный диссонанс вышел.
   Cyberhawk
 
27 - 16.02.18 - 00:13
(26) Нет, в К-С копия создается _всегда_, независимо от того, по значению параметр передается или не по значению
   Cyberhawk
 
28 - 16.02.18 - 00:15
И наоборот: копия объекта-параметра без К-С (без смены контекста) не создается _никогда_, независимо от того, по значению он или не по значению передается :)
   Fram
 
29 - 16.02.18 - 00:25
(27) тогда почему (12)?
   Fram
 
30 - 16.02.18 - 00:28
(29) пардон.. тут речь про объект. это понятно.
так почему при передаче "по значению" трафик меньше. по идее копия параметра же создается
   Cyberhawk
 
31 - 16.02.18 - 00:31
(30) Экономия только в К-С, т.к. обратно копия не сериализуется, не возвращается, не десериализуется
   Fram
 
32 - 16.02.18 - 00:34
(31) ясно.. экономия на ответном трафике
   Fram
 
33 - 16.02.18 - 00:39
а это только в теории? анализатором трафика проверял кто-нить чего там кодеры платформы наделали?
 
 
   H A D G E H O G s
 
34 - 16.02.18 - 01:14
Как это печально.

http://v8.1c.ru/o7/201312opt/index.htm

В-четвёртых, использование ключевого слова Знач при объявлении параметров процедур и функций. Дело в том, что при клиент-серверном взаимодействии это ключевое слово значит совсем не то, что при работе внутри одного компьютера, клиентского или серверного. Когда мы используем Знач при объявлении параметра серверной процедуры и вызываем её с клиента, это означает, что значение этого параметра обратно на клиент не приедет. Если же мы не устанавливаем Знач, а стандартно так и есть, то происходит следующее. Допустим, мы вызываем серверную процедуру и передаём в неё массив. Предположим, что на клиенте мы даже не собираемся потом этим массивом пользоваться. Он просто был параметром и на самом деле нам не нужен больше. Но когда серверный вызов закончится, массив будет упакован в XML или JSON (на веб-клиенте), и уедет обратно на клиент. Понятно, что это совсем неэффективно. Поэтому если вам не нужно возвращаемое значение, переданное через параметр, пишите ключевое слово Знач у таких параметров. Конечно, если параметр Булево, Знач можно сэкономить и не писать. Но по сути это нехорошо.
   Cyberhawk
 
35 - 16.02.18 - 10:48
(34) Так уже обсосали все это. Чо сказать хотел, не знал что ли?



Список тем форума
Рекламное место пустует  
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует