Имя: Пароль:
1C
1С v8
8.2. Ошибка при вызове процедуры общего модуля.
,
0 Pro-tone
 
28.07.11
09:30
Пытаюсь мутировать на 8.2.14. Решил сделать задачу по УТ на упр. формах.
Ставлю отбор на форме при открытии.

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


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

{Документ.РасходнаяНакладная.Форма.ФормаСписка.Форма(20)}: Ошибка при вызове метода контекста (ПолучитьВсеДокументы)
  ВыбНоменклатураСсылка = Серверный.ПолучитьВсеДокументы("РасходнаяНакладная");
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'

Как лечить ?
1 Stepa86
 
28.07.11
09:32
Перенеси этот код в ПриСозданииНаСервере(

Клиентские методы формы могут вызывать только методы этой формы
2 Ненавижу 1С
 
гуру
28.07.11
09:33
на форме из клиентского метода нельзя напрямую вызывать серверные объекты, надо передать управление в серверный метод формы и оттуда все делать

почему так они решили? политика партии
ща куча набежит и скажет, что это правильно ))
3 Stepa86
 
28.07.11
09:36
(2) еси чо, меня тоже выбешивает писать методы СделатьЧтоТо и СделатьЧтоТо_Сервер( только изза того, что напрямую сервер нельзя позвать из обработчика команды
4 Pro-tone
 
28.07.11
09:37
(1) сделал так как ты сказал, убрал из ПриОткрытии():

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   //Вставить содержимое обработчика
  ВыбНоменклатураСсылка = Серверный.ПолучитьВсеДокументы("РасходнаяНакладная");
  Список.Параметры.УстановитьЗначениеПараметра("ВыбНоменклатураСсылка",ВыбНоменклатураСсылка);    
   

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


та же самая ошибка ((
5 Ненавижу 1С
 
гуру
28.07.11
09:38
(3) ну значит есть братья по разуму ))
6 Stepa86
 
28.07.11
09:39
(4) ВыбНоменклатураСсылка не список значений случаем?
7 Pro-tone
 
28.07.11
09:41
(6) таблица значений
8 Pro-tone
 
28.07.11
09:43
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: v    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: QueryParam    Форма: Элемент    Тип: {http://v8.1c.ru/8.1/data-composition-system/core}ParameterValue
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: value    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'
9 Stepa86
 
28.07.11
09:45
ты в дин. список таблицу суешь??? я бы тоже огорчился
10 Defender aka LINN
 
28.07.11
09:46
(1)(2) Чего курили?
(7) Молодец.
11 Pro-tone
 
28.07.11
09:47
(9) ну да, отбор запросом дин списка

ВЫБРАТЬ
   ДокументРасходнаяНакладная.Ссылка,
   ДокументРасходнаяНакладная.ПометкаУдаления,
   ДокументРасходнаяНакладная.Номер,
   ДокументРасходнаяНакладная.Дата,
   ДокументРасходнаяНакладная.Проведен,
   ДокументРасходнаяНакладная.Контрагент,
   ДокументРасходнаяНакладная.Проект,
   ДокументРасходнаяНакладная.Товары.(
       Ссылка,
       НомерСтроки,
       Номенклатура
   ),
   ДокументРасходнаяНакладная.МоментВремени
ИЗ
   Документ.РасходнаяНакладная КАК ДокументРасходнаяНакладная
ГДЕ
   ДокументРасходнаяНакладная.Товары.Ссылка В(&ВыбНоменклатураСсылка)
12 Pro-tone
 
28.07.11
09:47
(9)(10) а как правильно ?
13 Stepa86
 
28.07.11
09:48
(10) свое надо иметь...
(11) массивом передавай, и есть подозрение, что в ТЗ лежит что то мутабельное
14 Sarmen
 
28.07.11
09:48
Список значений туда передавай, а не таблицу значений.
15 Sarmen
 
28.07.11
09:49
Да ещё табличную часть зачем выбираешь в запросе?
16 Stepa86
 
28.07.11
09:49
(14) периодически вылезает гемор со списком, лично я его между методами не передаю
17 Sarmen
 
28.07.11
09:50
Делай запрос по табличной части, а не по таблице расходной накладной.
18 Defender aka LINN
 
28.07.11
09:51
(13) Не, у тебя лучше. Это, ять, ТаблицаЗначений! Ты знаешь такой тип в тонком клиенте? Я - нет.
19 Pro-tone
 
28.07.11
09:51
(13) ппц, ок ща попробую. Что означает "мутабельное" ?
(15) это как бы сам 1 с софрмировал такой запрос, я только условие поставил в запрос
20 Sarmen
 
28.07.11
09:54
ВЫБРАТЬ
   Товары.Ссылка.Ссылка,
   Товары.Ссылка.Номер,
   Товары.Ссылка.Дата,
   Товары.Ссылка.ПометкаУдаления,
   Товары.Ссылка.Проведен,
   Товары.Ссылка.СуммаПоДокументу,
   Товары.Ссылка.МоментВремени
ИЗ
   Документ.РасходнаяНакладная.Товары КАК Товары
ГДЕ
   Товары.Номенклатура В (&СписокЗначений)


примерно так ...
21 Stepa86
 
28.07.11
09:54
(19) мутабельное, грубо говоря это то, что нельзя с сервера на клиент передавать и обратно... подробнее в гугле

ТЧ порежь лучше, и для таких отборов лучше критерий отбора заюзать
22 Pro-tone
 
28.07.11
09:55
(13) передал массивом стало работать ! спасибо ! Где об этом написано что таблица значений недоступна в запросе по динсписку формы клиента ?
23 Pro-tone
 
28.07.11
09:57
(21) ща попробую через критерий отбора
24 Ненавижу 1С
 
гуру
28.07.11
10:00
(10) почему?
25 BigRoma
 
28.07.11
10:00
Между клиентом и сервером нельзя передавать таблицу значений.
Когда делаете Список.Параметры.УстановитьЗначениеПараметра("ВыбНоменклатураСсылка",ТаблицаЗначений);
метод развалится, но не сразу, а при передаче формы на клиента.
26 Mort
 
28.07.11
10:04
(24) Вот транслятор свой напишешь, сразу догадаешься.
27 BigRoma
 
28.07.11
10:06
(26) вообще он прав, нельзя на тонком клиенте работать с северными объектами. Например, ДокументОбъект на клиенте не существует, таблица значений на тонком клиенте не существует.
28 Ненавижу 1С
 
гуру
28.07.11
10:07
(27) так и не надо, достаточно в тонком клиенте хранить только ссылки на них, а пусть они живут на далеком сервере
29 H A D G E H O G s
 
28.07.11
10:11
(28) Так так и сделано
30 BigRoma
 
28.07.11
10:12
ну... не обязательно ссылки, часть данных хранится в сериализуемых типах самой формы (данныеформыструктура, данныеформыколлеция).
31 Mort
 
28.07.11
10:12
(28) Ссылки и так есть. ТЗ на формах тоже нормально хранятся в коллециях. Чо не нравится-то? То что нельзя на клиенте Ссылка.реквизит написать? Дай такую возможность, сейчас бы 1Сники такого г0внокода написали, все бы от УФ крутили носом.
32 Ненавижу 1С
 
гуру
28.07.11
10:14
ладно, пошел писать свою платформу
33 Mort
 
28.07.11
10:15
(32) Блэк джек не забудь впилить. И шлюх.
34 Ненавижу 1С
 
гуру
28.07.11
10:17
(33) главное Неопределено выпилить, оставить только NULL
35 Pro-tone
 
28.07.11
10:17
Как я понимаю через критерий отбора (опять же в серверном модуле через вызов сервера с уф) будет примерно так:

Функция ОтборСерверная()

МассивСсылок = КритерииОтбора.ПоНоменклатуре.Найти(ВыбНоменклатура);
Для Каждого Ссылка Из МассивСсылок Цикл
   Сообщить(Ссылка);
КонецЦикла;

Возврат МассивСсылок;

КонецФункции
36 H A D G E H O G s
 
28.07.11
10:17
(32) good speed
37 Pro-tone
 
28.07.11
10:17
Функция ОтборСерверная(ВыбНоменклатура) конечно же
38 Stepa86
 
28.07.11
10:19
(35) вообще то я предлагал прям в запросе обращение к критерию сделать и передавать туда номенклатуру... тока не уверен, что в дин. списке это нормально выглядеть будет
39 Pro-tone
 
28.07.11
10:23
(38)

запрос к дин.списку

ВЫБРАТЬ
   ДокументРасходнаяНакладная.Ссылка,
   ДокументРасходнаяНакладная.ПометкаУдаления,
   ДокументРасходнаяНакладная.Номер,
   ДокументРасходнаяНакладная.Дата,
   ДокументРасходнаяНакладная.Проведен,
   ДокументРасходнаяНакладная.Контрагент,
   ДокументРасходнаяНакладная.Проект,
   ДокументРасходнаяНакладная.Товары.(
       Ссылка,
       НомерСтроки,
       Номенклатура
   ),
   ДокументРасходнаяНакладная.МоментВремени
ИЗ
   Документ.РасходнаяНакладная КАК ДокументРасходнаяНакладная
ГДЕ
   ДокументРасходнаяНакладная.Товары.Номенклатура В(&ВыбНоменклатураСсылка)


И после еще (по нажатию на кнопку ОтборПоНоменклатуре на форме списка)

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
   //Вставить содержимое обработчика


  Список.Параметры.УстановитьЗначениеПараметра("ВыбНоменклатураСсылка",КритерииОтбора.ПоНоменклатуре.Найти(ВыбНоменклатура));    

КонецПроцедуры
40 Mort
 
28.07.11
10:23
Если подходить к коду грамотно, практически никогда не возникает конструкций СделатьЧтоТо и СделатьЧтоТо_Сервер
41 Pro-tone
 
28.07.11
10:25
(38) фиг там, критерий отбора не живет на клиенте (
все равно опять тот же гемор к его получению через серверный модуль
42 Stepa86
 
28.07.11
10:31
(40) если у меня есть метод в серверном модуле, который делает то, что мне надо, как мне "Грамотно" написать команду, которая его вызывает?
43 BigRoma
 
28.07.11
10:33
(42) ВызватьСерверныйМетод(Параметры)
а ещё лучше, по возможности
ВызватьСерверныйМетодБезКонтекста(Параметры)
44 Stepa86
 
28.07.11
10:34
(43) а вот (40) говорит, что так не грамотно
45 BigRoma
 
28.07.11
10:36
(44) честно говоря не понял о чем (4) говорил
46 BigRoma
 
28.07.11
10:36
(44) честно говоря не понял о чем (40) говорил
47 Mort
 
28.07.11
10:39
(44) Да, так не грамотно. Имя функции должно отражать ЧТО она делает, а не где.
48 Mort
 
28.07.11
10:39
С "ГДЕ" прекрасно справляются директивы.
49 Stepa86
 
28.07.11
10:41
есть серверный модуль Серверный и там процедура СоздатьПодчиненныйДокумент(пОсновнойДокумент)

Добавляя кнопку на форму хочу написать:

&НаКлиенте
Процедура СоздатьПодчиненныйДокумент()

Если Не Объект.Ссылка.Пустая() Тогда

Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);

КонецЕсли;

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

а приходится писать так:

&НаКлиенте
Процедура СоздатьПодчиненныйДокумент()

СоздатьПодчиненныйДокумент_Сервер(Объект.Ссылка);

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

&НаСервере
Процедура СоздатьПодчиненныйДокумент_Сервер()

Если Не Объект.Ссылка.Пустая() Тогда

Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);

КонецЕсли;

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

если я правильно понял (40), то он утверждает, что при грамотной разработке проксирующий метод не нужен... вот мне и интересно как тут грамотно?
50 Mort
 
28.07.11
10:43
(49) Да, грамотно поставить галку "Вызов сервера" на модуль.
51 Mort
 
28.07.11
10:44
А ссылку на пустое значение проверять, например, методом ЗначениеЗаполнено()
52 Stepa86
 
28.07.11
10:44
+(49) Условия можно избежать, если сделать командой на объекте, а не на форме, тем более что в тонком клиенте она отвалится с ошибкой
53 BigRoma
 
28.07.11
10:44
(49) а вот это уже странно, я всегда писал по первому варианту. Можете объяснить, почему он не работает? Казалось бы Объект.Ссылка имеет ссылочный тип и нормально сериализуется.
54 Stepa86
 
28.07.11
10:45
(50) у кого? клиентские методы не видят экспортные серверные методы ни с галочкой ни без
55 Stepa86
 
28.07.11
10:46
(53) Тонкий и веб не видят модуля Серверный
56 Defender aka LINN
 
28.07.11
10:46
(49) а потому что не хочешь ты думать.

Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
   Серверный.СоздатьПодчиненныйДокумент(Объект.Ссылка);
КонецЕсли;
57 Defender aka LINN
 
28.07.11
10:47
(55) А галку "вызов сервера"-то ты поставил?
58 Pro-tone
 
28.07.11
10:49
(34) я вижу у тебя особая страсть к 2м типам "Неопределено" и "Null" =))
59 Stepa86
 
28.07.11
10:49
(56) да даже если без условия, то все равно падает (падало во всяком случае), условие тут не главное
(57) да
60 BigRoma
 
28.07.11
10:51
(59) а процедуру экспортной сделал? )
61 Ненавижу 1С
 
гуру
28.07.11
11:01
(58) и пустым ссылкам ))
62 BigRoma
 
28.07.11
11:03
(61) кста вопрос порой задают на собеседованиях чем отличается NULL от Неопределено.
63 Defender aka LINN
 
28.07.11
11:08
(59) У меня не падает. ЧЯДНТ?
64 Stepa86
 
28.07.11
11:10
(63) тонкий клиент клиент-сервера? и какая версия платформы
65 Pro-tone
 
28.07.11
11:15
(61) и неизвестному объекту еще тогда ))