Нельзя изменять поле, содержащее объект данных формы

1. Baskin 5 09.11.17 04:58 Сейчас в теме
В документе ЧЕКККМ есть кнопка вызова Формы СкидкаUDS
При нажатии Запросить ошибка

{Документ.ЧекККМ.Форма.ФормаСкидкиUDS.Форма(185)}: Ошибка при установке значения атрибута контекста (ТаблицаИнформацииОтСервера)
ИнформацияОтСервера=ПолучитьИнформациюОКомпании(ТаблицаИнформацииОтСервера,КодСкидкиUDS);
по причине:
Нельзя изменять поле, содержащее объект данных формы




&НаСервере
Функция ПолучитьИнформациюОКомпании(КодСкидки)   экспорт
		//-H 'Accept: application/json' \
	//-H 'X-Api-Key: api-key' \
	//-H 'X-Origin-Request-Id: a8d03734-5b63-4f04-9c69-46a3e1db378a' \
	//-H 'X-Timestamp: 2016-07-11T09:39:07.000Z' \
	//-X GET -s https://udsgame.com/v1/partner/company
	
	Токен =  "1111111";
    Сервер = "udsgame.com";
	ИмяФайла = ПолучитьИмяВременногоФайла("txt2_");
	
	XOriginRequestId = Строка(Новый УникальныйИдентификатор());
	XTimestamp = Строка(Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddT05hh:mm:ssZ" ));
	
	URL = "/v1/partner/company";
	
	ТекстЗапросаКомпании = Новый HTTPЗапрос;
	ТекстЗапросаКомпании.Заголовки.Вставить("Accept", "application/json");
	ТекстЗапросаКомпании.Заголовки.Вставить("X-Origin-Request-Id", Строка(XOriginRequestId));
	ТекстЗапросаКомпании.Заголовки.Вставить("X-Timestamp", Строка(XTimestamp));
	ТекстЗапросаКомпании.Заголовки.Вставить("X-Api-Key", Токен);
	
	ТекстЗапросаКомпании.АдресРесурса = URL;
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL();
	Con = Новый HTTPСоединение(Сервер, , , , , 10, ssl);
		
	Con.Получить(ТекстЗапросаКомпании, ИмяФайла);
	
	ТекстДок = Новый ТекстовыйДокумент;
	ТекстДок.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
	Ответ2 = ТекстДок.ПолучитьТекст();
		
	ЧтениеИнформацииОКомпании = Новый ЧтениеJSON;
	ЧтениеИнформацииОКомпании.УстановитьСтроку(Ответ2);
	
	СтруктураОтвета2 = ПрочитатьJSON(ЧтениеИнформацииОКомпании, ,"dateCreated");
	
	//ТаблицаИнформацииОтСервера = Новый ТаблицаЗначений;
	//ТаблицаИнформацииОтСервера.Колонки.Добавить("Поле");
	//ТаблицаИнформацииОтСервера.Колонки.Добавить("Значение");
	
	Если СтруктураОтвета2.marketingSettings.Свойство("discountBase") Тогда
		НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "БазоваяСкидка";
		НоваяСтрокаТаблицы.Значение = Строка(СтруктураОтвета2.marketingSettings.discountBase);
	КонецЕсли;
	Если СтруктураОтвета2.baseDiscountPolicy = "CHARGE_SCORES" Тогда
		НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "СкидкаИлиКэшбэк";
		НоваяСтрокаТаблицы.Значение = "Кэшбэк";
	ИначеЕсли СтруктураОтвета2.baseDiscountPolicy = "APPLY_DISCOUNT" Тогда
		НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "СкидкаИлиКэшбэк";
		НоваяСтрокаТаблицы.Значение = "Скидка";
	КонецЕсли;
	НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
	НоваяСтрокаТаблицы.Поле = "ПроцентПорогаСписанияБаллов";
	НоваяСтрокаТаблицы.Значение = Строка(СтруктураОтвета2.marketingSettings.maxScoresDiscount);
	Если СтрДлина(КодСкидки) = 6 Тогда
		ПолучитьИнформациюОКлиенте(ТаблицаИнформацииОтСервера, КодСкидки);
	ИначеЕсли СтрДлина(КодСкидки) < 6 Тогда
		Сообщить("Код скидки не может быть меньше шести цифр!");
		Отказ = Истина;
	КонецЕсли;
	Возврат ТаблицаИнформацииОтСервера;
КонецФункции

&НаСервере


Функция ПолучитьИнформациюОКлиенте(ТаблицаИнформацииОтСервера, КодСкидки)
	//X-Origin-Request-Id	(required) Request identifier (UUID) header	string
	//X-Timestamp	(required) Timestamp in ISO8601 datetime format header	string code	(required)
	//Customer promo code query	string
	//curl  -H "Accept: application/json" -X GET https://udsgame.com/v1/partner/customer -v
	//Curl curl -X GET --header "Accept: application/json" --header "X-Origin-Request-Id: fe6930f8-1231-4798-aa2d-02a5f8e7d931" --header "X-Timestamp: 2015-03-17T12:00:01.000Z" "http://udsgame.com/v1/partner/customer?code=rirg2425"
	//Request URL http://udsgame.com/v1/partner/customer?code=rirg2425 
Token="11111111";
    Сервер = "udsgame.com";

	ИмяФайла = ПолучитьИмяВременногоФайла("txt_");
	
	XOriginRequestId = Строка(Новый УникальныйИдентификатор());
	XTimestamp = Строка(Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddT05hh:mm:ssZ" ));
	
	URL = "/v1/partner/customer?code=" + КодСкидки;
	
	ТекстЗапросаПользователя = Новый HTTPЗапрос;
	ТекстЗапросаПользователя.Заголовки.Вставить("Accept", "application/json");
	ТекстЗапросаПользователя.Заголовки.Вставить("X-Origin-Request-Id", Строка(XOriginRequestId));
	ТекстЗапросаПользователя.Заголовки.Вставить("X-Timestamp", Строка(XTimestamp));
	ТекстЗапросаПользователя.Заголовки.Вставить("X-Api-Key", Токен);
	
	ТекстЗапросаПользователя.АдресРесурса = URL;
	
	ssl = Новый ЗащищенноеСоединениеOpenSSL();
	Con = Новый HTTPСоединение(Сервер, , , , , 10, ssl);
		
	Con.Получить(ТекстЗапросаПользователя, ИмяФайла);
	
	ТексДок = Новый ТекстовыйДокумент;
	ТексДок.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
	Ответ = ТексДок.ПолучитьТекст();
	//Возврат Ответ;
	
	ЧтениеИнформацииОПользователе = Новый ЧтениеJSON;
	ЧтениеИнформацииОПользователе.УстановитьСтроку(Ответ);
	
	СтруктураОтвета = ПрочитатьJSON(ЧтениеИнформацииОПользователе, ,"dateCreated");
		
	Если СтруктураОтвета.Свойство("scores") Тогда
		НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "КоличествоИмеющихсяБаллов";
		НоваяСтрокаТаблицы.Значение = Строка(СтруктураОтвета.scores); 
	КонецЕсли;
	Если СтруктураОтвета.Свойство("name") Тогда
		ИмяКлиента = "";
		ИмяКлиента = ИмяКлиента + СтруктураОтвета.name;
	КонецЕсли;
	Если СтруктураОтвета.Свойство("surname") Тогда
		НоваяСтрокаТаблицы = ТаблицаИнформацииОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "ИмяКлиента";
		ИмяКлиента = ИмяКлиента + ?(ИмяКлиента="",""," ") + СтруктураОтвета.surname;
		НоваяСтрокаТаблицы.Значение = ИмяКлиента;
	КонецЕсли;
	Если СтруктураОтвета.Свойство("errorCode") Тогда
		Сообщить("Получена ошибка: " + ?(СтруктураОтвета.errorCode = "notFound","неверный код скидки!",СтруктураОтвета.errorCode));
	КонецЕсли;
	Возврат ТаблицаИнформацииОтСервера;
КонецФункции
&НаСервере
Функция POST_purchase_Структура(СтруктураОперации, СтрокаJSONОперации) Экспорт
	Токен = "c19TN2hIb085WjkjdCVDNjlEbEVZZX4pOnoqTTphQmlsSFItSElwQGFSOCR­QVnJUXlI=";
	
	//curl -X POST -H "x-api-key: $key" http://udsgame.com/v1/partner/purchase?total=$total&cash=$cash&scores=$scores&code=$code

    Сервер = "www.udsgame.com";

	ФайлРезультата = ПолучитьИмяВременногоФайла("txt_");
	
	XOriginRequestId = Строка(Новый УникальныйИдентификатор());
	XTimestamp = Строка(Формат(ТекущаяДата(), "ДФ=yyyy-MM-ddT05hh:mm:ssZ" ));
	
	Если СтрДлина(СтруктураОперации.Code) > 6 Тогда
		КодИлиТелефон = "&phone=%2B7" + СтруктураОперации.Code;
	Иначе
		КодИлиТелефон = "&code=" + СтруктураОперации.Code;
	КонецЕсли;
	
	URL = "/v1/partner/purchase?total=$total&cash=$cash&scores=$scores" + КодИлиТелефон + "&cashierExternalId=$cashierExternalId";
		
	Если СтруктураОперации.Свойство("total") Тогда URL = СтрЗаменить(URL, "$total", Формат(СтруктураОперации.total, "ЧН=0; ЧГ=")); КонецЕсли;
	Если СтруктураОперации.Свойство("cashierExternalId") Тогда URL = СтрЗаменить(URL, "$cashierExternalId", СтруктураОперации.cashierExternalId); КонецЕсли;
	Если СтруктураОперации.Свойство("cash") Тогда URL = СтрЗаменить(URL, "$cash", Формат(Окр(СтруктураОперации.cash,0), "ЧН=0; ЧГ=")); КонецЕсли;
	Если СтруктураОперации.Свойство("scores") Тогда URL = СтрЗаменить(URL, "$scores", Формат(СтруктураОперации.scores, "ЧН=0; ЧГ=")); КонецЕсли;
		
	ssl = Новый ЗащищенноеСоединениеOpenSSL();
	Con = Новый HTTPСоединение(Сервер, , , , , 10, ssl);
	
	HTTPЗапрос = Новый HTTPЗапрос(URL);
	HTTPЗапрос.Заголовки.Вставить("X-Api-Key", Токен);
			
	Con.ОтправитьДляОбработки(HTTPЗапрос, ФайлРезультата);

	ТексДок = Новый ТекстовыйДокумент;
	ТексДок.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
	Ответ = ТексДок.ПолучитьТекст();

	Возврат Ответ;  
	
КонецФункции


//форма
&НаКлиенте
Процедура ОсновныеДействияФормыЗапросить(Кнопка)
перем КодСкидки;
	ИмяКлиента = "";
	ДоступноБонусов="";
		
	//КодСкидкиUDS=Объект.КодСкидкиUDS;
	ИнформацияОтСервера=ПолучитьИнформациюОКомпании(КодСкидкиUDS);
	ИскомаяСтрокаБаллов = ИнформацияОтСервера.Найти("КоличествоИмеющихсяБаллов","Поле");
	Если ИскомаяСтрокаБаллов = Неопределено Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	ДоступноБонусов =ИскомаяСтрокаБаллов.Значение;
	//ЗначениеВРеквизитФормы(ДоступноБонусов, Число(ИскомаяСтрокаБаллов.Значение));
	ИскомаяСтрокаИмениКлиента = ИнформацияОтСервера.Найти("ИмяКлиента","Поле");
	ИмяКлиента = ИскомаяСтрокаИмениКлиента.Значение;
		Если ИмяКлиента <> Неопределено Тогда 
			ЭтаФорма.Элементы.СписываемыеБаллы.Доступность = Истина;
			ЭтаФорма.Элементы.ИспользоватьСкидку.Доступность = Истина;
		КонецЕсли;
	//

	
КонецПроцедуры
&НаКлиенте

Процедура ОсновныеДействияФормыИспользоватьСкидку(Кнопка)
	ЭтаФорма.Закрыть(ИнформацияОтСервера);
КонецПроцедуры
&НаКлиенте

Процедура СписываемыеБаллыПриИзменении(Элемент)
	Если СписываемыеБаллы > ДоступноБонусов Тогда СписываемыеБаллы = ДоступноБонусов КонецЕсли;
КонецПроцедуры
&НаКлиенте

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если ИнформацияОтСервера.Количество() > 2 тогда
		НоваяСтрокаТаблицы = ИнформацияОтСервера.Добавить();
		НоваяСтрокаТаблицы.Поле = "СписываемыеБаллы";
		НоваяСтрокаТаблицы.Значение = Строка(СписываемыеБаллы);
	КонецЕсли;
КонецПроцедуры
&НаКлиенте

Процедура ПриОткрытии()
	//Если Найти(КодСкидкиUDS, "+++") <> 0 Тогда 
	//	ЭтаФорма.ЭлементыФормы.КодСкидкиUDS.Доступность = Ложь;
	//КонецЕсли;
	//ЭтаФорма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ИспользоватьСкидку.Доступность = Ложь;
КонецПроцедуры
&НаКлиенте

Процедура КодСкидкиUDSПриИзменении(Элемент)
	Если СтрДлина(КодСкидкиUDS) > 6 Тогда
		ЭтаФорма.Элементы.ИспользоватьСкидку.Доступность = Истина;
	Иначе
		ЭтаФорма.Элементы.Запросить.Доступность = Истина;
	КонецЕсли;	
КонецПроцедуры
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. mifka186 9 09.11.17 13:13 Сейчас в теме
(1) ТаблицаИнформацииОтСервера - случайно не реквизит формы? Если да, то её нельзя передавать как параметр на сервер, да и бессмысленно. Она в серверном контексте и так доступна.
2. Aitbay 09.11.17 06:23 Сейчас в теме
ИнформацияОтСервера=ПолучитьИнформациюОКомпании(ТаблицаИнформацииОтСервера,КодСкидкиUDS);

не верно в самой функции 1 параметр должно быть
ИнформацияОтСервера=ПолучитьИнформациюОКомпании(КодСкидкиUDS);
3. Hawk_sib 30 09.11.17 07:49 Сейчас в теме
(2) это тоже, но тогда другую бы ошибку дало...
по коду плохо понятно, что пытается сделать
4. Aitbay 09.11.17 09:03 Сейчас в теме
ЭтаФорма.Закрыть(ИнформацияОтСервера); - к чему это? есть форма с именем переменной или реквизита одинаковые?
5. comptr 35 09.11.17 12:15 Сейчас в теме
Думаю, стоило убрать из приведенного кода токены.
7. Baskin 5 10.11.17 03:00 Сейчас в теме
Всем привет! Код был написан под обычное приложение не уф
Хотим переделать по уф. Если не использовать таблицу значений то работает. Если с таблицой пишет ошибку. В отладчике смотрел там функция возвращает данные коллекции а как с ней работать не знаю, не селен в уф, начинающий)
8. mifka186 9 10.11.17 09:39 Сейчас в теме
(7)
а как с ней работать не знаю, не селен в уф, начинающий)


Таблицу как параметр не передавай. В серверном контексте используй

 Таблица = РеквизитФормыВЗначение("ТаблицаИнформацииОтСервера");

//Обработка таблицы

ЗначениеВРеквизитФормы(Таблица ,"ТаблицаИнформацииОтСервера") ;


Инфа есть в синтакс помощнике.
9. Baskin 5 10.11.17 11:23 Сейчас в теме
Вынес в общиймодуль

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


Теперь получил массив со структурой

метод "найти" не работает
10. user907301 17.01.19 13:41 Сейчас в теме
Объяви 2 переменные.
Перем1 = ТаблицаИнформацииОтСервера;
Перем2 = КодСкидкиUDS;

После передавай уже таким способом.

ИнформацияОтСервера=ПолучитьИнформациюОКомпании(Перем1 ,Перем2 );

Тем самым избежишь своей ошибки.
SagittariusA; +1 Ответить
11. SagittariusA 18.11.19 15:13 Сейчас в теме
(10)
Либо при описании функции в параметрах употребить слово "Знач":

&НаСервере
Функция ПолучитьИнформациюОКомпании(Знач ТаблицаИнформацииОтСервера, КодСкидкиUDS);
...
КонецФункции;


Ну это по-сути аналогия вашему примеру.
Aero; pridecom; user779781; +3 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот