Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 мая 2024, 01:13

Вызов обработки на клиенте

Автор djkeysi, 13 фев 2017, 12:47

0 Пользователей и 1 гость просматривают эту тему.

djkeysi

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

2 метода на клиенте и на сервере, вот сам код:

&НаКлиенте
Процедура ВыполнитьОптимизацию(ДокументыДляОптимизации)   

РежимРаботы  = Вопрос("Группировать по пакетам?",РежимДиалогаВопрос.ДаНетОтмена,,КодВозвратаДиалога.Нет);
Группировать = Ложь;
Если РежимРаботы = КодВозвратаДиалога.Отмена Тогда
Возврат
КонецЕсли;

Если РежимРаботы = КодВозвратаДиалога.Да Тогда
КолВГруппе = 60;
ВвестиЧисло(КолВГруппе,"Количество Изделий в группировке",3,0);
Группировать = Истина;
Иначе
КолВГруппе = 0;
КонецЕсли;

РаботаСОптимизацией.ОбработатьДокументы(ДокументыДляОптимизации, КолВГруппе, Группировать);

Предупреждение("Оптимизация выполнена", 5);



    Результат = СервСформировать2(ДокументыДляОптимизации,КолВГруппе);
Если Вопрос("Проставить КИС в график?", РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да Тогда

ГрафикПроизв(ДокументыДляОптимизации);

ФормаОбр = ПолучитьФорму("Обработка.КИСВГрафиках.Форма.Форма");

Если Результат.Количество() Тогда
Для Каждого Строка Из Результат[0] Цикл
Если КолВГруппе = 0 Тогда
НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
Иначе
Расчет = Окр(Строка.Количество / КолВГруппе);
Для п =0 По Расчет+2 Цикл
Если п <> 0 и п <> 1 Тогда
НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();

Строка.Количество = Строка.Количество / п;

ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
КонецЕсли;
КонецЦикла;
КонецЕсли;

Значение =0;
//Значение2 =0;
Для п =0 По ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Количество()-1 Цикл
Отбор = Новый Структура;
Отбор.Вставить("ИмяФайла",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].ИмяФайла);
// Отбор.Вставить("Материал",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].Материал);
НадСтроки = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.НайтиСтроки(Отбор);
КонецЦикла;

  Для п = 0 По НадСтроки.Количество()-1 Цикл
Значение = Значение + НадСтроки[п].Количество;
КонецЦикла;

НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
//Строка.КоличествоФакт = Строка[3] - Значение2 ;
Строка.Количество = Строка[3] - Значение ;
ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
КонецЦикла;

Иначе
Вопрос("В выбранных нарядах отсутствуют материалы." , РежимДиалогаВопрос.ОК);
Возврат
КонецЕсли;

ФормаОбр.Объект.ОснованиеГрафикПроизводства = ДокументыДляОптимизации;
ФормаОбр.Объект.КИСПроставлен = ДокументыДляОптимизации[0].КИСПроставлен;
ФормаОбр.ОткрытьМодально();
КонецЕсли;


КонецПроцедуры // ВыполнитьОптимизацию()

&НаСервере
Функция СервСформировать2(ПараметрКоманды, КолВГруппе =0) Экспорт

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрафикПроИзводстваНаряды.Документ,
| ГрафикПроИзводстваНаряды.Группировка КАК Группировка
|ИЗ
| Документ.ГрафикПроизводства.Наряды КАК ГрафикПроИзводстваНаряды
|ГДЕ
| ГрафикПроИзводстваНаряды.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| Группировка,
| ГрафикПроИзводстваНаряды.НомерСтроки";

МассОпераций = Новый Массив;
МассОпераций.Добавить("Раскрой");
МассОпераций.Добавить("Пленка");

Запрос.УстановитьПараметр("Операции", МассОпераций);
Запрос.УстановитьПараметр("Ссылка", ПараметрКоманды[0].Ссылка);
Результат = Запрос.Выполнить().Выгрузить();

//РаскройТаблицаДанных = Новый ТаблицаЗначений;
//ПленкаТаблицаДанных = Новый ТаблицаЗначений;
РаскройТаблицаДанных = Неопределено;
ПленкаТаблицаДанных = Неопределено;

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

РаскройТаблицаДанныхИтоговая.Колонки.Добавить("Группировка");
РаскройТаблицаДанныхИтоговая.Колонки.Добавить("НарядВПроизводство");
РаскройТаблицаДанныхИтоговая.Колонки.Добавить("ИмяФайла");
РаскройТаблицаДанныхИтоговая.Колонки.Добавить("НомерФайла");
// РаскройТаблицаДанныхИтоговая.Колонки.Добавить("ПланыРаскроя");

РаскройТаблицаДанныхИтоговая.ЗаполнитьЗначения(Строка.Группировка,"Группировка");
РаскройТаблицаДанныхИтоговая.ЗаполнитьЗначения(Строка.Документ.Ссылка,"НарядВПроизводство");
РаскройТаблицаДанныхИтоговая.ЗаполнитьЗначения(Строка.Документ.Номер,"ИмяФайла");
РаскройТаблицаДанныхИтоговая.ЗаполнитьЗначения(Строка.Документ.Запасы[0].ПланыРаскроя,"ПланыРаскроя");

Если РаскройТаблицаДанных = Неопределено Тогда
РаскройТаблицаДанных = РаскройТаблицаДанныхИтоговая.Скопировать();
ИначеЕсли КолВГруппе = 0  Тогда
Для Каждого СтрокаТД Из РаскройТаблицаДанныхИтоговая Цикл

НоваяСтрока = РаскройТаблицаДанных.Добавить();
//  СтрокаТД.Количество= 60;
Для ТекКолонка = 0 по РаскройТаблицаДанных.Колонки.Количество()-1  Цикл
НоваяСтрока[ТекКолонка] = СтрокаТД[ТекКолонка];

КонецЦикла;
КонецЦикла;
Иначе
Для Каждого СтрокаТД Из РаскройТаблицаДанныхИтоговая Цикл

НоваяСтрока = РаскройТаблицаДанных.Добавить();
//  СтрокаТД.Количество= 60;
Для ТекКолонка = 0 по РаскройТаблицаДанных.Колонки.Количество()-1  Цикл
НоваяСтрока[ТекКолонка] = СтрокаТД[ТекКолонка];

КонецЦикла;
КонецЦикла;


КонецЕсли;



//
//ИначеЕсли Строка(Строка.Документ.Операция) = "Пленка" Тогда
// Если ПленкаТаблицаДанных = Неопределено Тогда
//
// Иначе
//
// КонецЕсли;
//КонецЕсли;
КонецЦикла;
    РезультатРаскроев = новый Массив;
Если РаскройТаблицаДанных = Неопределено Тогда
РаскройТаблицаДанных = Неопределено;
Иначе
РаскройТаблицаДанных.Колонки.Добавить("Порядок");
Счетчик = 0;
ПоследнийНомер = "";
Для Каждого Строка Из РаскройТаблицаДанных Цикл
Если ПоследнийНомер <> Строка.Номер Тогда
ПоследнийНомер = Строка.Номер;
Счетчик = Счетчик + 1;
КонецЕсли;
Строка.Порядок = Счетчик;
КонецЦикла;

  //Результат =   РаскройТаблицаДанных[0].Количество/10;
РезультатРаскроев.Добавить(РаскройТаблицаДанных);


КонецЕсли;

Если ПленкаТаблицаДанных = Неопределено Тогда

Иначе
ПленкаТаблицаДанных.Колонки.Добавить("Порядок");
Счетчик = 0;
ПоследнийНомер = "";
Для Каждого Строка Из ПленкаТаблицаДанных Цикл
Если ПоследнийНомер <> Строка.Номер Тогда
ПоследнийНомер = Строка.Номер;
Счетчик = Счетчик + 1;
КонецЕсли;
Строка.Порядок = Счетчик;
КонецЦикла;

КонецЕсли;
// АдресХранилища = ПоместитьВоВременноеХранилище(,Форма);
//
//ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);
строка1 = ЗначениеВСтрокуВнутр(РезультатРаскроев);
Возврат ЗначениеИзСтрокиВнутр(строка1);



// МассивДанных = Новый Массив;
//Для Каждого СтрЛог из РезультатРаскроев Цикл
// // Создаем структуру для хранения данных строки таблицы значений,
// // список полей можно получить динамически, перебрал 1 строку ТЗ
// Стр = Новый Структура("Количество");
// // Копируем данные из строки таблицы значений в структуру
// ЗаполнитьЗначенияСвойств(Стр,СтрЛог);
// // Помещаем структуру в массив
// МассивДанных.Добавить(Стр);
//КонецЦикла;




//Возврат МассивДанных;

КонецФункции




После нажатия да! должна сформироватся обработка

alex0402

Цитата: djkeysi от 13 фев 2017, 12:47НачалоСвойства: ret   Форма: Элемент   Тип: {http://www.w3.org/2001/XMLSchema}anyType

возвращается тип, который не поддерживается в тонком клиенте.
Спасибо за Сказать спасибо

djkeysi


LexaK

то что можно делать на сервере (или то что нельзя делать на тонком клиенте), надо и делать на сервере!
вот этот кусок кода, перенесите его выполнение на Сервер


   
            Результат = СервСформировать2(ДокументыДляОптимизации,КолВГруппе);
            Для Каждого Строка Из Результат[0] Цикл
                Если КолВГруппе = 0 Тогда
                    НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
                Иначе
                    Расчет = Окр(Строка.Количество / КолВГруппе);
                    Для п =0 По Расчет+2 Цикл
                        Если п <> 0 и п <> 1 Тогда
                            НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                           
                            Строка.Количество = Строка.Количество / п;
                                                       
                            ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
               
                Значение =0;
                //Значение2 =0;
                Для п =0 По ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Количество()-1 Цикл
                    Отбор = Новый Структура;
                    Отбор.Вставить("ИмяФайла",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].ИмяФайла);
                    //    Отбор.Вставить("Материал",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].Материал);
                    НадСтроки = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.НайтиСтроки(Отбор);
                КонецЦикла;
               
                  Для п = 0 По НадСтроки.Количество()-1 Цикл
                            Значение = Значение + НадСтроки[п].Количество;
                    КонецЦикла;
               
                НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                //Строка.КоличествоФакт = Строка[3] - Значение2 ;
                Строка.Количество = Строка[3] - Значение ;
                ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
             КонецЦикла;

       

если помогло нажмите: Спасибо!

djkeysi

Цитата: LexaK от 14 фев 2017, 09:18
то что можно делать на сервере (или то что нельзя делать на тонком клиенте), надо и делать на сервере!
вот этот кусок кода, перенесите его выполнение на Сервер


   
            Результат = СервСформировать2(ДокументыДляОптимизации,КолВГруппе);
            Для Каждого Строка Из Результат[0] Цикл
                Если КолВГруппе = 0 Тогда
                    НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
                Иначе
                    Расчет = Окр(Строка.Количество / КолВГруппе);
                    Для п =0 По Расчет+2 Цикл
                        Если п <> 0 и п <> 1 Тогда
                            НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                           
                            Строка.Количество = Строка.Количество / п;
                                                       
                            ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
                        КонецЕсли;
                    КонецЦикла;
                КонецЕсли;
               
                Значение =0;
                //Значение2 =0;
                Для п =0 По ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Количество()-1 Цикл
                    Отбор = Новый Структура;
                    Отбор.Вставить("ИмяФайла",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].ИмяФайла);
                    //    Отбор.Вставить("Материал",ФормаОбр.Объект.ТабличнаяЧастьСоответствие[п].Материал);
                    НадСтроки = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.НайтиСтроки(Отбор);
                КонецЦикла;
               
                  Для п = 0 По НадСтроки.Количество()-1 Цикл
                            Значение = Значение + НадСтроки[п].Количество;
                    КонецЦикла;
               
                НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                //Строка.КоличествоФакт = Строка[3] - Значение2 ;
                Строка.Количество = Строка[3] - Значение ;
                ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
             КонецЦикла;

       




Пробывал данный код выполняется на клиенте и выскакивается ошибка типа на сервере мы неможет вызывать управляемые формы:
НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);

LexaK

э-э-э, так слово ФормаОбр уберите, получится так

//НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
НоваяСтрока = Объект.ТабличнаяЧастьСоответствие.Добавить();


в этом коде примера все остальные ФормаОбр уберите. Должно заработать.
если помогло нажмите: Спасибо!

djkeysi

Цитата: LexaK от 14 фев 2017, 13:03
э-э-э, так слово ФормаОбр уберите, получится так

//НоваяСтрока = ФормаОбр.Объект.ТабличнаяЧастьСоответствие.Добавить();
НоваяСтрока = Объект.ТабличнаяЧастьСоответствие.Добавить();


в этом коде примера все остальные ФормаОбр уберите. Должно заработать.
Всеравно не работает сделал функцию
&НаСервере
Функция Тест(КолВГруппе,Форма,ДокументыДляОптимизации)

    Результат = СервСформировать2(ДокументыДляОптимизации,КолВГруппе);
//Если Вопрос("Проставить КИС в график?", РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да Тогда

//ГрафикПроизв(ДокументыДляОптимизации);


Если Результат.Количество() Тогда
Для Каждого Строка Из Результат[0] Цикл
   НоваяСтрока = Форма.Объект.ТабличнаяЧастьСоответствие.Добавить();
   ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
    КонецЦикла;
КонецЕсли;


Вызываю

   // Результат = СервСформировать2(ДокументыДляОптимизации,КолВГруппе);
Если Вопрос("Проставить КИС в график?", РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да Тогда

    ГрафикПроизв(ДокументыДляОптимизации);

   ФормаОбр = ПолучитьФорму("Обработка.КИСВГрафиках.Форма.Форма");
   
  Тест(ДокументыДляОптимизации,ФормаОбр,КолВГруппе);



Ошибка
{Документ.ГрафикПроизводства.Команда.ОтправитьВОптимизацию.МодульКоманды(39)}: Ошибка при вызове метода контекста (Тест)
        Тест(ДокументыДляОптимизации,ФормаОбр,КолВГруппе);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'УправляемаяФорма'

alex0402

нужно выбросить ВСЕ и продумать алгоритм заново, так что бы четко разделить весь код. запросы к базе на сервере. интерактивные (действия с формами и элементами) на клиенте.
Спасибо за Сказать спасибо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск