Ярлыки

.Net (17) (9) 1с8 (4) 1с8.2 УП (3) документирование (1) интеграция (10) карта (1) собеседование (1) ado (1) ajax (11) ASP (1) asp.net (10) authentication (1) c# (14) coding (2) Crm Ribbon (2) csv (1) datareader (1) delegate (5) dhtml (5) exam (1) excel (10) ext (1) extjs (8) google maps (1) iis (3) javascript (33) JSON (5) linq (1) LN (5) log (1) lotus notes (5) mail (1) MS CRM (63) MS CRM 2015 (3) MS CRM 5 (48) MS CRM 6 (28) ms office (2) msi (1) MVC (1) namespace (1) oData (3) outlook (1) parent-child (2) plugin (1) program (4) Project Management (1) remote debugger (1) REST (1) SharePoint (1) SharePoint 2010 (2) Silverlight (2) soft (1) sql (13) sql reporting service (8) sql2005 (3) ssrs (2) Thread (4) tree (1) vb (6) vba (1) VSTO (1) WCF (4) wmi (1) wsc (2) xml (1) Xrm.Page (1) xslt (1)

суббота, 25 февраля 2012 г.

1с8.2: Ошибка отображения типов

В управляемом тонком клиенте при нажатии кнопки Пересчитать получал ошибку, но на сервере обработка происходила успешно - сообщение появляется как надо


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

Почему? Ведь загружается форма без ошибок. И в толстом клиенте ошибки нет. И функция-обработчик передает и принимает примитивные типы... Оказалось, что не всегда.
Вот код общей формы МесяцыГода:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗаполнитьТаблицуМесяцев(Год, тзМесяцыГода);
КонецПроцедуры
   
 &НаКлиенте
Процедура Пересчитать(Команда)
 МассивМесяцевГода = ЗаполнитьТаблицуМесяцев(Год);
 тзМесяцыГода.Очистить();
 Для каждого МесяцГода Из МассивМесяцевГода Цикл
  Строка = тзМесяцыГода.Добавить();
  Строка.Месяц = МесяцГода[0];
  Строка.Дней=МесяцГода[1];
 КонецЦикла; 
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаполнитьТаблицуМесяцев(Год, тзМесяцыГода=Неопределено)
 
    Если тзМесяцыГода = Неопределено Тогда
   тзМесяцыГода = Новый ТаблицаЗначений;
  типСтрока = Новый ОписаниеТипов("Строка");
  типЧисло = Новый ОписаниеТипов("Число");
  тзМесяцыГода.Колонки.Добавить("Месяц",  типСтрока, "Месяц");
  тзМесяцыГода.Колонки.Добавить("Дней",  типЧисло, "Дней");
  КонецЕсли; 
 
 Если Год = 0 Тогда Год=Год(ТекущаяДата()) КонецЕсли;
 
 дт =  КонецМесяца(НачалоГода(Дата(Год, 1,1)));
  
 Для Сч=0 По 11 Цикл
 
  Месяц=Формат(дт,"ДФ=MMMM");
  Дней = День(дт);
  
  Строка = тзМесяцыГода.Добавить();
  Строка.Месяц = Месяц;
  Строка.Дней=Дней;
  
  дт = КонецМесяца(ДобавитьМесяц(дт,1));
 
 КонецЦикла;
 
 Сообщение = Новый СообщениеПользователю;
 Сообщение.Текст = "В "+Год+"  году " + тзМесяцыГода.Итог("Дней") + " дней.";
 Сообщение.Сообщить(); 
 
 Массив = Новый Массив;
 
 Для каждого ссс Из тзМесяцыГода Цикл
  м=Новый Массив;
  м.Добавить(ссс.Месяц);
  м.Добавить(ссс.Дней);
  Массив.Добавить(м);
 КонецЦикла; 
 
 Возврат Массив;

КонецФункции// ЗаполнитьТаблицуМесяцев()

//------------------------------
//Модуль управляемого приложения
//------------------------------
Процедура ПриНачалеРаботыСистемы()
 ОткФормуМесяцыГода();
КонецПроцедуры
Процедура ОткФормуМесяцыГода()
 ОткрытьФорму("ОбщаяФорма.МесяцыГода");
КонецПроцедуры

Расчет производится в серверном методе ЗаполнитьТаблицуМесяцев(Год, тзМесяцыГода=Неопределено), где тзМесяцыГода имеет тип ДанныеФормыКоллекция при вызове с сервера. При вызове с клиента тип будет приведен в самой функции к типу ТаблицаЗначений. Оба типа не доступны для передачи между сервером и клиентом в Тонком клиенте. Не смотря на то, что на клиенте при нажатии кнопки Пересчитать в ЗаполнитьТаблицуМесяцев второй параметр не передается, но он все равно участвует в получении данных от сервера. Передача параметров происходит по ссылке, серверный код использует параметр тзМесяцыГода потом возвращает его измененного на клиента. (Если в поле Год ввести 0, то после нажатия кнопки в поле будет записан текущий год). Теперь понятно, что делать:

  1. или изменить имя тзМесяцыГода в функции на локальную переменную
  2. или изменить сигнатуру Функция ЗаполнитьТаблицуМесяцев(Год, знач тзМесяцыГода = Неопределено)

Тогда все будет нормально.

Комментариев нет: