Директивы Модулей_вот не работает функция,вызванная с ОбщегоМодуля!!!

1. jan-pechka 408 05.01.18 18:19 Сейчас в теме
Есть модуль формы,н-р, документа, в нем на клиенте процедура, в которой нужно рассчитать данные.

1.Если из этой клиентской процедуры - вызывать рассчетную функцию/проц прямо из этого модуля формы под сервером - то работает,
2.Если из этой клиентской процедуры - вызывать рассчетную функцию/проц из модуля данного объекта - работает,
3.А если рассчетную функцию/проц вынести в ОбщиеМодули,то никак не работает!!!....уже что только не делала с настройками ОбщегоМодуля - ничего не работает!!!

п.с. слово Экспорт ставлю
Найденные решения
17. Alexey_ 27 05.01.18 20:22 Сейчас в теме
(16)нельзя передавать таблицу значений между клиентом и сервером
Xershi; jan-pechka; +2 Ответить
41. Alexey_ 27 07.01.18 20:39 Сейчас в теме
(39)передаешь структуру в параметрах, а возвращаешь ТЗ, в этом ошибка, галки поставь те, которые я тебе сказал: Сервер, Вызов сервера
jan-pechka; +1 Ответить
49. Alexey_ 27 07.01.18 21:34 Сейчас в теме
(48) // Преобразует таблицу значений в массив.
//    Может использоваться для передачи на клиента данных, полученных
//    на сервере в виде таблицы значений в том случае, если таблица
//    значений содержит только такие значения, которые могут
//  быть переданы на клиента.
//
//    Полученный массив содержит структуры, каждая из которых повторяет
//    структуру колонок таблицы значений.
//
//    Не рекомендуется использовать для преобразования таблиц значений
//    с большим количеством строк.
//
//    Параметры: 
//    ТаблицаЗначений - ТаблицаЗначений
//
//    Возвращаемое значение: 
//    Массив
//
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
    
    Массив = Новый Массив();
    СтруктураСтрокой = "";
    НужнаЗапятая = Ложь;
    Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        Если НужнаЗапятая Тогда
            СтруктураСтрокой = СтруктураСтрокой + ",";
        КонецЕсли;
        СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
        НужнаЗапятая = Истина;
    КонецЦикла;
    Для Каждого Строка Из ТаблицаЗначений Цикл
        НоваяСтрока = Новый Структура(СтруктураСтрокой);
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
        Массив.Добавить(НоваяСтрока);
    КонецЦикла;
    Возврат Массив;

КонецФункции
Показать
jan-pechka; +1 Ответить
43. Alexey_ 27 07.01.18 20:40 Сейчас в теме
(42)вместо ТЗ массив из структрур, ключами которых являются имена колонок ТЗ
45. Alexey_ 27 07.01.18 20:45 Сейчас в теме
(44)Массив = Новый Массив;
Массив.Добавить(Новый Структура("Колонка1, Колонка2", ЗначениеКолонки1, ЗначениеКолонки2)); и т.д.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. mkalimulin 1169 05.01.18 18:33 Сейчас в теме
(1) Что еще делала, кроме слова "экспорт"?
8. jan-pechka 408 05.01.18 19:11 Сейчас в теме
(3)Все делала...Все галочки по очереди включала,выключала....

Даже пробывала написать два раза Экспорт)) - не помогает....
Прикрепленные файлы:
2. herfis 499 05.01.18 18:30 Сейчас в теме
Формы обычные или управляемые?
Если управляемые, то не понимаю как у тебя работает из клиентской процедуры вызов функции модуля объекта.
Если обычные, то не понимаю что такое "под клиентом", "под сервером". Там все под клиентом.
4. jan-pechka 408 05.01.18 18:38 Сейчас в теме
5. herfis 499 05.01.18 18:45 Сейчас в теме
Ну, показывай, как у тебя в УФ работает вызов с клиента функции модуля объекта. Интересно посмотреть на такое чудо.
И запомни, фразу "ничего не работает" могут позволить себе только пользователи. Программисты говорят - "на такой-то строке кода выдает такую-то ошибку".
jan-pechka; sommid; +2 Ответить
13. jan-pechka 408 05.01.18 19:27 Сейчас в теме
(5)
вызов с клиента функции модуля объекта. Интересно посмотреть на такое чудо


да нет там никаких чудес - просто передаете параметры формы в реквизит...я же в (7) показала этот код - третий кодинг смотрите...Это тут не при чем...
6. sommid 05.01.18 18:52 Сейчас в теме
+ какие галки стоят на общем модуле? чтобы вызывать с клиентской процедуры - должна стоять "вызов сервера" или про клиента управляемого приложения
7. jan-pechka 408 05.01.18 19:03 Сейчас в теме
Потерялось сообщение,придется писать заново))

Решала небольшую задачку вот здесь https://forum.infostart.ru/forum34/topic184214/
Решить-то решила,но вопросы по директивам у меня остались.

Итак,все по порядку:
1.В модуле формы документа под кнопкой у меня есть процедура на клиенте:

&НаКлиенте
Процедура КонтактыКлиента(Команда)
	Структура=Новый Структура("Партнеры,Контрагенты",Объект.Партнер,Объект.Контрагент);
///вызываю рассчетную проц.,из-за которой и есть данный вопрос
	КонтактыКлиентаНаСервере(Структура,ТаблицаЗапр);
//здесь просто вызов модальной формы отчета
	 УсловияОтбора=Новый Структура("Партнеры,Контрагенты,Договор,ДатаДоговора,СсылкаДоговора",
	 								Объект.Партнер,Объект.Контрагент,Объект.Номер,Объект.Дата,Объект.Ссылка);
	 ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", УсловияОтбора, Истина);
	 ОткрытьФорму("Отчет.КонтактыКлиентов.ФормаОбъекта", ПараметрыФормы); 
КонецПроцедуры
Показать


2.В данном же модуле формы документа,только на сервере создаю эту рассчетную проц.

&НаСервере
Процедура СоздатьТабКонтактыКлиента(ТаблицаЗапр)
	Контрагенты=Объект.Контрагент;
	Партнеры=Объект.Партнер;
	
	ВнешниеДанные=Новый ТаблицаЗначений;
	ВнешниеДанные.Колонки.Добавить("Партнеры",Новый ОписаниеТипов("СправочникСсылка.Партнеры"));
	ВнешниеДанные.Колонки.Добавить("Контрагенты",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
	стр=ВнешниеДанные.Добавить();
	стр.Контрагенты=Контрагенты;
	стр.Партнеры=Партнеры;	
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВнешниеДанные.Контрагенты,
		|	ВнешниеДанные.Партнеры
		|ПОМЕСТИТЬ ВнешниеДанные
		|ИЗ
		|	&ВнешниеДанные КАК ВнешниеДанные
		|;
		
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	КонтрагентыКонтактнаяИнформация.Представление КАК ВидКонтактов,
		|	КонтрагентыКонтактнаяИнформация.Вид.Наименование КАК Контакты
		|ИЗ
		|	ВнешниеДанные КАК ВнешниеДанные
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
		|		ПО ВнешниеДанные.Контрагенты = КонтрагентыКонтактнаяИнформация.Ссылка
		
		|ОБЪЕДИНИТЬ
		
		|ВЫБРАТЬ
		|	ПартнерыКонтактнаяИнформация.Представление,
		|	ПартнерыКонтактнаяИнформация.Вид.Наименование
		|ИЗ
		|	ВнешниеДанные КАК ВнешниеДанные
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
		|		ПО ВнешниеДанные.Партнеры = ПартнерыКонтактнаяИнформация.Ссылка";
		
		Запрос.УстановитьПараметр("ВнешниеДанные",ВнешниеДанные);
		
		РезультатЗапроса = Запрос.Выполнить();
		
		ТаблицаЗапр=РезультатЗапроса.Выгрузить();
		
	 //Для каждого СтрокаТаблицы Из ТаблицаЗапр Цикл
	 //	 Сообщить("" + СтрокаТаблицы.ВидКонтактов+СтрокаТаблицы.Контакты);
	 //КонецЦикла; 

КонецПроцедуры
Показать


3.в таком варианте (что пункт2) - работает, теперь я могу рассчетную проц.запихнуть в МодульДокумента, и вызвать ее оттуда.Для этого я в первой проц буду ссылаться не на саму рассчетную проц., а лишь через ссылку сервера, естественно,что рассчетную проц,к-я уже в МодулеДока я обозвала немного иначе "КонтактыКлиентаНаСервереМодуль"

&НаСервере
Процедура КонтактыКлиентаНаСервере(Структура,ТаблицаЗапр)
		НашОбъект=РеквизитФормыВЗначение("Объект");
		НашОбъект. КонтактыКлиентаНаСервереМодуль(Структура,ТаблицаЗапр);
		ЗначениеВРеквизитФормы(НашОбъект,"Объект");
 КонецПроцедуры


4.так тоже работает. Но мне очень хотелось затолкать рассчетную процедуру в ОбщийМодуль,чтобы ее можно было вызывать откуда угодно....Ничего не вышло - не работает
9. jan-pechka 408 05.01.18 19:22 Сейчас в теме
Вот что не понятно:

1. Находясь в клиентской процедуре в модуле формы - я могу здесь же(в модуле формы) вызвать серверную проц.расчета и все работает, но почему если я отсюда (с клиентской проц.в модуле формы) буду вызывать ту же серверную проц. но из ОбщегоМодуля,то не работает???

2.Хорошо,из клиентской проц в модуле формы вызываю здесь же серверную проц., и уже через нее пытаюсь вызвать серверную рассчетную проц. из ОбщегоМодуля - не работает...

Пишу все правильно: указываю имя ОбщегоМодуля:

ОбщийМодульКонтакты. КонтактыКлиентаНаСервереМодульОбщий(Структура,ТаблицаЗапр)

нет,не работает....

3.Ладно, делаю еще ход конем: из клиентской проц.модуля формы - ссылаюсь на северную проц.модуля формы, в ней передаю параметры объекта и таким образом вызываю еще одну проц.северную,которая в МодулеОбъекта формы - и вот отсюда я вновь пробую вызвать рассчетную проц.северную из ОбщегоМодуля - не работает!!!
10. PiotrLoginov 05.01.18 19:23 Сейчас в теме
Все не читал. Почему-то сразу решил, что у ТС общий модуль не виден на клиенте. Т.е. нет галки "Вызов сервера"
11. jan-pechka 408 05.01.18 19:24 Сейчас в теме
(10)есть там галка...
Прикрепленные файлы:
12. Alexey_ 27 05.01.18 19:24 Сейчас в теме
Не работает, не получается, не выходит, не удаётся...
jan-pechka; +1 Ответить
14. jan-pechka 408 05.01.18 19:53 Сейчас в теме
(12)
Не работает, не получается, не выходит, не удаётся...


Поэтому и спрашиваю...

Ошибку система выдает как "Переменная не определена - ОбщийМодульКонтакты" (см.рис.)....

И почему система название Общего модуля видит как переменная - тоже не понятно...

п.с. на всякий случай, сбрасываю сюда свой черновик, сейчас там настроен - вызов глобальной процедуры ОбщийМодульКонтакты.КонтактыКлиентаНаСервереМодульОбщий(Структура,ТаблицаЗапр) из северной проц.в модуле формы документа "ДоговорСтроительноМонтажныхРабот"

Может кто разберется, да подскажет в чем секрет "галок" и директив???
Прикрепленные файлы:
1Cv8.cf
1Cv8_база.dt
15. Alexey_ 27 05.01.18 20:11 Сейчас в теме
(14) убери флаг Глобальный
jan-pechka; +1 Ответить
16. jan-pechka 408 05.01.18 20:20 Сейчас в теме
(15)убрала,при запуске в пользовательском режиме вот такую ошибку выдает см.рис.

п.с. кто скачал и проверяет базу, до докиньте в конец рассчетной процедуры вот такой простенький вывод на экран данных:

		Для каждого СтрокаТаблицы Из ТаблицаЗапр Цикл
			Сообщить("" + СтрокаТаблицы.ВидКонтактов+СтрокаТаблицы.Контакты);
		КонецЦикла; 


на текущий момент в базе все подключено к рассчетной проц.на ОбщемМодуле,вот туда и нужно вставить этот вывод данных
Прикрепленные файлы:
17. Alexey_ 27 05.01.18 20:22 Сейчас в теме
(16)нельзя передавать таблицу значений между клиентом и сервером
Xershi; jan-pechka; +2 Ответить
18. jan-pechka 408 05.01.18 20:25 Сейчас в теме
(17)это я тоже проверяла - перегоняла только структруру - тот же результат...

п.с.Но в текущем варианте подключения - вызывает именно серверная проц.модуля формы .- серверную проц.ОбщегоМодуля , то есть сервер сервер опрашивает...
19. Alexey_ 27 05.01.18 20:27 Сейчас в теме
(18)не в том месте ищешь. Если нажмешь Подробно, увидишь, где проблема
jan-pechka; +1 Ответить
20. jan-pechka 408 05.01.18 20:34 Сейчас в теме
(19)
не в том месте ищешь


Ура!!!!!!!!!!!!!!!! Заработало!!!

Вновь везде перегнала структура, а в ОбщемМодуле - поставила не Процедура, а Функция с возвратом на клиентскую проц. в модуль формы Таблицы - и заработало!!!

Спасибо!!!!!!!!!!!!!!!

п.с. Добавлю сюда базу-черновик,где все работает!!! памятка будет))
Прикрепленные файлы:
1Cv8_базаРаботает!.dt
21. jan-pechka 408 07.01.18 19:29 Сейчас в теме
В принципе, механизм запроса серверной процедуры модуля формы документа в ОбщийМодуль серверной функции - работает: просто в параметрах передаю структуру,а обратно из функции получаю таблицу значений.

Но вот внимательно продолжаю читать книгу Хрусталева/Радченко "Практическое пособие разработчика 8.3" стр.206,где четко написано:

"При вызове процедуры или функции ее поиск осуществляется сначала на клиенте. Если скомпилированный контекст клиента не содержит данную процедуру,то поиск продолжается на стороне сервера. Если вызываемая процедура будет найдена,то выполнение кода будет передано на сервер.После завершения процедуры выполнение кода продолжится на клиенте"

Теперь напомню рабочий вариант приведенного в этой ветке примера: в модуле формы на клиентской процедуре -
1. мы сначала переходим в серверную процедуру этой же команды в этом же модуле формы,
2.далее из серверной команды в модуле формы - мы вызываем серверную функцию из Общего Модуля.

А вот теперь вопрос - а почему нельзя сразу из клиентской процедуры модуля формы - вызвать серверную функцию ОбщегоМодуля?????
Ведь,в книге явно сказано,что это возможно!!!!

Проверяю данный вариант - пробую из клиентской проц.в модуле формы вызвать сразу северную ф-цию ОбщегоМодуля,см.рис1,то при проверке в пользоват.режиме - выскочит сл.ошибка "Метод объекта не обнаружен"!!!

Почему так не работает???? В чем разница-то???

Ведь при первом варианте - мы вызываем из клиента на форме - сервер на форме - и снего вызываем сервер ОбщегоМодуля,а потом обратно все результаты отправляем на КЛИЕНТА формы,где идет сл.выполнение кода!!!!
Прикрепленные файлы:
22. Alexey_ 27 07.01.18 19:32 Сейчас в теме
(21) можно, просто опять че-то не так делаешь, какие галки у модуля стоят?
jan-pechka; +1 Ответить
23. jan-pechka 408 07.01.18 19:36 Сейчас в теме
24. Alexey_ 27 07.01.18 19:37 Сейчас в теме
(23)нужна свежая информация
26. Alexey_ 27 07.01.18 19:48 Сейчас в теме
(25)директиву НаСервере убери
25. jan-pechka 408 07.01.18 19:47 Сейчас в теме
вот
Прикрепленные файлы:
27. Alexey_ 27 07.01.18 19:58 Сейчас в теме
(25) директиву НаСервере убери
28. jan-pechka 408 07.01.18 20:01 Сейчас в теме
(27)тогда даже док не открывается...
Прикрепленные файлы:
29. Alexey_ 27 07.01.18 20:04 Сейчас в теме
(28)покажи скрин общего модуля
30. jan-pechka 408 07.01.18 20:12 Сейчас в теме
(29)
общего модуля


в общМодуле - исполнение на сервере,т.к.там создается таблицаЗначений!!!!

Если у общего модуля отключу галку -на сервере,то будет ошибка из предыдущ.скрина,
если удалю директиву на сервере или заменю на клиенте - не определяются таб.знач!
Прикрепленные файлы:
31. Alexey_ 27 07.01.18 20:13 Сейчас в теме
(30)я разве просил снять галку "Сервер"??
если удалю директиву на сервере или заменю на клиенте

я разве просил заменять на НаКлиенте? что за бред вообще??
32. Alexey_ 27 07.01.18 20:14 Сейчас в теме
(30) нужно сделать ровно то, что написано в (27), и без лишних телодвижений
jan-pechka; +1 Ответить
33. jan-pechka 408 07.01.18 20:17 Сейчас в теме
(32)
что написано в (27)


хорошо,на скрине ошибка-не видит таб.знач.....
Прикрепленные файлы:
34. Alexey_ 27 07.01.18 20:20 Сейчас в теме
(33)теперь сними флаг "Клиент", забыл про него, должны остаться флаги Сервер и Вызов сервера и без директив компиляции
jan-pechka; +1 Ответить
35. jan-pechka 408 07.01.18 20:26 Сейчас в теме
(34)
сними флаг "Клиент"


ошибка Клиент/Сервер
Прикрепленные файлы:
36. Alexey_ 27 07.01.18 20:29 Сейчас в теме
(35)ты опять передаешь таблицу значений между клиентом и сервером, показывай весь код функции
37. jan-pechka 408 07.01.18 20:34 Сейчас в теме
Ставлю в общем модуле те же настройки,что и были:

Клиент,Сервер,ВызовСервера=Да

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

И если запускаю отладку не под Тонким клиентом,а под Толстым клиентом,то работает!!!!см.рис.

п.с.под толстым работает,даже если снять с ОбщегоМодуля галку на Клиенте (ф-ция в Общ.Модуле все равно расчет делает под сервером),то работает!!!

А под тонким клиентом - не работает!
Прикрепленные файлы:
38. Alexey_ 27 07.01.18 20:35 Сейчас в теме
(37) под тонким нельзя гонять ТЗ между клиентом и сервером, я уже писал
jan-pechka; +1 Ответить
39. jan-pechka 408 07.01.18 20:38 Сейчас в теме
(38)
под тонким нельзя гонять ТЗ между клиентом и сервером


В параметрах клиент.проц с модуля формы - передаю Структуру!см.рис.

В серверной ф-ции в Общем модуле (к ней в параметры тоже приходит Структура,см.предыдущ.скрины) - идет расчет и результаты складываются в таблицуЗнач.
Прикрепленные файлы:
41. Alexey_ 27 07.01.18 20:39 Сейчас в теме
(39)передаешь структуру в параметрах, а возвращаешь ТЗ, в этом ошибка, галки поставь те, которые я тебе сказал: Сервер, Вызов сервера
jan-pechka; +1 Ответить
40. Alexey_ 27 07.01.18 20:38 Сейчас в теме
(37)ты в функции возвращаешь ТЗ, этого делать нельзя, выход - возвращать массив структур
jan-pechka; +1 Ответить
42. jan-pechka 408 07.01.18 20:39 Сейчас в теме
(40)
выход - возвращать массив структур


как это? я не знаю...Поясните,пожалуйста...

п.с.а простой массив - можно результатом функции передать в клиентскую проц???
если простой массив,то сейчас попробую, а что такое Массив структур - я не знаю...
43. Alexey_ 27 07.01.18 20:40 Сейчас в теме
(42)вместо ТЗ массив из структрур, ключами которых являются имена колонок ТЗ
44. jan-pechka 408 07.01.18 20:42 Сейчас в теме
(43)
ключами которых являются имена колонок ТЗ


я так не пойму,можно пример наглядный?

Вот эта расчетная серверная функция из ОбщегоМодуля

&НаСервере
//&НаКлиентеНаСервере
Функция КонтактыКлиентаНаСервереМодульОбщий(Структура)  Экспорт
	//Перем ТаблицаЗапр;
	////Контрагенты=Объект.Контрагент;
	////Партнеры=Объект.Партнер;
	Контрагенты=Структура.Контрагенты;
	Партнеры=Структура.Партнеры;

	
	ВнешниеДанные=Новый ТаблицаЗначений;
	ВнешниеДанные.Колонки.Добавить("Партнеры",Новый ОписаниеТипов("СправочникСсылка.Партнеры"));
	ВнешниеДанные.Колонки.Добавить("Контрагенты",Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
	стр=ВнешниеДанные.Добавить();
	стр.Контрагенты=Контрагенты;
	стр.Партнеры=Партнеры;	
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ВнешниеДанные.Контрагенты,
		|	ВнешниеДанные.Партнеры
		|ПОМЕСТИТЬ ВнешниеДанные
		|ИЗ
		|	&ВнешниеДанные КАК ВнешниеДанные
		|;
		
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	КонтрагентыКонтактнаяИнформация.Представление КАК ВидКонтактов,
		|	КонтрагентыКонтактнаяИнформация.Вид.Наименование КАК Контакты
		|ИЗ
		|	ВнешниеДанные КАК ВнешниеДанные
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
		|		ПО ВнешниеДанные.Контрагенты = КонтрагентыКонтактнаяИнформация.Ссылка
		
		|ОБЪЕДИНИТЬ
		
		|ВЫБРАТЬ
		|	ПартнерыКонтактнаяИнформация.Представление,
		|	ПартнерыКонтактнаяИнформация.Вид.Наименование
		|ИЗ
		|	ВнешниеДанные КАК ВнешниеДанные
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
		|		ПО ВнешниеДанные.Партнеры = ПартнерыКонтактнаяИнформация.Ссылка";
		
		Запрос.УстановитьПараметр("ВнешниеДанные",ВнешниеДанные);
		
		РезультатЗапроса = Запрос.Выполнить();
				
		ТаблицаЗапр=РезультатЗапроса.Выгрузить();
		
		////Для каждого СтрокаТаблицы Из ТаблицаЗапр Цикл
		////	Сообщить("" + СтрокаТаблицы.ВидКонтактов+СтрокаТаблицы.Контакты);
		////КонецЦикла; 

		Возврат   ТаблицаЗапр;
КонецФункции
Показать


Как в ней созданную таблицу Значений заменить на Массив структур????
45. Alexey_ 27 07.01.18 20:45 Сейчас в теме
(44)Массив = Новый Массив;
Массив.Добавить(Новый Структура("Колонка1, Колонка2", ЗначениеКолонки1, ЗначениеКолонки2)); и т.д.
47. jan-pechka 408 07.01.18 21:00 Сейчас в теме
(45)
Массив.Добавить(Новый Структура("Колонка1, Колонка2", ЗначениеКолонки1, ЗначениеКолонки2))


Когда я в табЗнач выгружаю РезультатЗапроса:

ТаблицаЗапр=РезультатЗапроса.Выгрузить();


то точно знаю,что в нем две колонки с именами,переданными запросом:"ВидКонтактов","Контакты", то есть это все равно,что двумерный массив...
Сейчас подумаю как заполнить именно двумерный массив, а потом как его расшифровать в принимающей проц.подумаю...

п.с.А из Вашего примера не разберусь: КАК запихать эти колонки в такой вид Массива со структурой и потом его еще расшифровать в принимающей проц - что-то не соображу никак....
46. Alexey_ 27 07.01.18 20:49 Сейчас в теме
(44)элемент массива(структура) это строка ТЗ
jan-pechka; +1 Ответить
50. jan-pechka 408 07.01.18 21:35 Сейчас в теме
(46)
элемент массива(структура) это строка ТЗ


Получилось!!! Это тоже самое,что и двумерный массив,но считывать можно по точке!!!

В конец рассчетной серверной ф-ции в Общем модуле ставлю код:

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


А в вызывающей/принимающей клиентской проц ставлю сл.считыватель такого Массива Структур:

	Для каждого СтрокаМассива Из МассивЗнач  Цикл
		   Сообщить("" + СтрокаМассива.ВидКонтактов+СтрокаМассива.Контакты);
	КонецЦикла; 


И все работает!!! ура,спасибо!!!
48. jan-pechka 408 07.01.18 21:24 Сейчас в теме
Итак, в конец рассчетной серверной функции в ОбщемМодуле добавляю преобразование данных из таблицы значений в двумерный массив:

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


А в принимающей клиентской процедуре - просто читаю данные из полученного с сервера двумерного Массива:

&НаКлиенте
Процедура КонтактыКлиента(Команда)
	Структура=Новый Структура("Партнеры,Контрагенты",Объект.Партнер,Объект.Контрагент);

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


Все работает!!!см.скрин
причем настройки Общего модуля=Сервер,ВызовСервера=Да,исполнение ф-ции в Общем модуле идет на сервере. Вызов рассчетной ф-ции идет с клиента, ответ получает все тот же клиент.
Отладка запускается под Тонким клиентом - все работает!

п.с. Но теперь очень хочу увидеть КАК тот же механизм можно запустить не двухмерным Массивом, а Массивом со структурой! Пожалуйста, напишите код!!!!!!!!!!!
Прикрепленные файлы:
49. Alexey_ 27 07.01.18 21:34 Сейчас в теме
(48) // Преобразует таблицу значений в массив.
//    Может использоваться для передачи на клиента данных, полученных
//    на сервере в виде таблицы значений в том случае, если таблица
//    значений содержит только такие значения, которые могут
//  быть переданы на клиента.
//
//    Полученный массив содержит структуры, каждая из которых повторяет
//    структуру колонок таблицы значений.
//
//    Не рекомендуется использовать для преобразования таблиц значений
//    с большим количеством строк.
//
//    Параметры: 
//    ТаблицаЗначений - ТаблицаЗначений
//
//    Возвращаемое значение: 
//    Массив
//
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
    
    Массив = Новый Массив();
    СтруктураСтрокой = "";
    НужнаЗапятая = Ложь;
    Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
        Если НужнаЗапятая Тогда
            СтруктураСтрокой = СтруктураСтрокой + ",";
        КонецЕсли;
        СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
        НужнаЗапятая = Истина;
    КонецЦикла;
    Для Каждого Строка Из ТаблицаЗначений Цикл
        НоваяСтрока = Новый Структура(СтруктураСтрокой);
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
        Массив.Добавить(НоваяСтрока);
    КонецЦикла;
    Возврат Массив;

КонецФункции
Показать
jan-pechka; +1 Ответить
51. jan-pechka 408 07.01.18 21:54 Сейчас в теме
(49)
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт


и так тоже работает,имя своей таблицы подставила:

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


п.с.этот кусочек кода вставить в конец рассчетной серверной ф-ции в ОбщемМодуле,в принимающей клиентской проц.расшифровка такого массива по точке:

	Для каждого СтрокаМассива Из МассивЗнач  Цикл
		   Сообщить("" + СтрокаМассива.ВидКонтактов+СтрокаМассива.Контакты);
	КонецЦикла; 


Все четко выполняется под Тонким Клиентом!!!Спасибо.

Вывод, в книге Радченко/Хрусталева - все правильно написано - можно передавать с клиента на сервер процедуры, и они возвращаются обратно на Клиент.

Важно только между клиентом и сервером перегонять в параметрах и в результатах или Структуру или Массив!!!

п.с. Остался совсем маленький уточняющий вопрос: а почему когда я передавала с серверной проц в модуле формы на серверную проц в Общем модуле в параметрах Структуру,а получала обратно в серверную проц.в модуле формы ТАБЛИЦУ значений и ее уже в параметрах серверной проц.из модуля формы отправляла в КЛИЕНТскую проц в модуле формы - то тоже все прекрасно работало??????????

Почему??? Почему что передача таблицы в параметрах между сервером и клиентом шла успешно в рамках ОДНОГО локального модуля на форме????

п.с.2 Если в рамках одного модуля можно передавать Таблицу значений между сервером и клиентом, то почему это нельзя в более крупных масштабах???
52. starik-2005 3038 07.01.18 22:08 Сейчас в теме
(51)
Если в рамках одного модуля можно передавать Таблицу значений между сервером и клиентом, то почему это нельзя в более крупных масштабах???
Вообще никак нельзя передать ТЗ с сервера на клиент, ибо на клиенте нет такого типа, как ТЗ. Если что-то работало, то где-то что-то кому-то померещилось. ТЗ на "клиенте" есть только в толстом клиенте, а тонком клиенте ТЗ на клиенте быть не может (если это, конечно, не таблица формы, которая имеет на клиенте и на сервере несколько иной тип, отличный от типа ТЗ).
jan-pechka; +1 Ответить
53. jan-pechka 408 07.01.18 22:16 Сейчас в теме
(52)
Если что-то работало, то где-то что-то кому-то померещилось.


в моем сообщении (20) можете взять мою базу-черновик,открыть модуль формы документа "ДоговорСтроительноМонтажныхРабот" и посмотреть что работает!!!

Скины данного рабочего варианта в том же диапазоне постов есть - все работает.

Если Вы можете объяснить - ПОЧЕМУ это работает,то будет очень интересно.....

п.с.Я вот пока негде не встречала в обучающих книгах,что между клиентом и сервером нельзя передавать таблицы значений...Может еще пока не дочитала до этого места,покажите цитату тогда Вы,пожалуйста...
54. starik-2005 3038 07.01.18 22:26 Сейчас в теме
(53)
покажите цитату
Э... А что, в синтаксис-помощнике забанили Вас?
Описание:

Таблица значений предназначена для хранения значений в табличном виде. Все основные операции с таблицей производятся именно через этот объект. Он позволяет манипулировать строками таблицы значений и предоставляет доступ к коллекции колонок. Колонки могут быть различных типов (в том числе множественных).

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable.


Видите, что никакого "клиент" нет в списке доступности.
jan-pechka; +1 Ответить
57. jan-pechka 408 07.01.18 22:43 Сейчас в теме
(54)
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер)


так расчет с таблицами у меня на сервере и идет - в ОбщемМодуле, но результат данной рассчетной ф-ции как ТАБЛИЦА значений - возвращается обратно и через сервер в модуле дока попадает по параметрам в клиент модуля того же дока и работает!!!

Поэтому - если внутри одного модуля - я могу через параметры передавать ТАБЛИЦУ значений между клиентом и сервером, почему я не могу этого сделать напрямую в сторонний модуль????
55. jan-pechka 408 07.01.18 22:38 Сейчас в теме
Приведу краткий пример КАК работает ТЗ на клиент-сервере в локальном модуле (это можно посмотреть в базе-черновике пост№ 20,но проще сюда привести данный код).

Итак,в модуле формы документа, в клиентской процедуре обращаемся в серверную процедуру того же модуля формы:

&НаКлиенте
Процедура КонтактыКлиента(Команда)
	Перем  ТаблицаЗапр;
Структура=Новый Структура("Партнеры,Контрагенты",Объект.Партнер,Объект.Контрагент);

КонтактыКлиентаНаСервере(Структура,ТаблицаЗапр);	

	 Для каждого СтрокаТаблицы Из ТаблицаЗапр Цикл
	 	 Сообщить("" + СтрокаТаблицы.ВидКонтактов+СтрокаТаблицы.Контакты);
	 КонецЦикла; 

Показать


В первом кодинге из клиентской проц.в модуле формы вызвали серверную проц.того же модуля=> КонтактыКлиентаНаСервере(Структура,ТаблицаЗапр);

Далее в этой серверной проц.в модуле формы мы вызываем серверную ф-цию из ОбщегоМодуля:

&НаСервере
Процедура КонтактыКлиентаНаСервере(Структура,ТаблицаЗапр)
ТаблицаЗапр=ОбщийМодульКонтакты.КонтактыКлиентаНаСервереМодульОбщий(Структура);	
КонецПроцедуры


Здесь обратите внимание,что в рассчетную функцию,которая выполняется на сервере в Общем Модуле - в параметрах мы передаем СТРУКТУРУ, а вот обратно из рассчетной ф-ции мы получаем ТАБЛИЦУ значений=>ТаблицаЗапр=ОбщийМодульКонтакты.КонтактыКлиентаНаСервереМодульОбщий(Структура);

И уже полученную обратно в серверную проц.модуля формы Таблицу значений - мы передаем ее в виде параметра обратно в клиентскую процедуру этого же модуля!!!!
А уже на клиенте из полученной назад ТАБЛИЦЫ значений выводим данные на экран.

	 Для каждого СтрокаТаблицы Из ТаблицаЗапр Цикл
	 	 Сообщить("" + СтрокаТаблицы.ВидКонтактов+СтрокаТаблицы.Контакты);
	 КонецЦикла; 


Это все на КЛИЕНТЕ,причем выводим на экран циклом коллекций значений.

Работает же! И клиент с сервера получает Талицу значений и перерабатывает ее в цикле и выводит на экран!
А почему??? Если "вообще ТЗ нельзя передавать между клиентом и сервером"?
56. Alexey_ 27 07.01.18 22:41 Сейчас в теме
(55)а ты посмотри в отладчике тип значения ТаблицаЗапр на клиенте
jan-pechka; +1 Ответить
58. jan-pechka 408 07.01.18 23:02 Сейчас в теме
(56)
посмотри в отладчике тип значения ТаблицаЗапр на клиенте


ньдя.....ТаблицаЗначений....на Клиенте!

п.с. и запускается только под Толстым Клиентом!!! Этт я тогда почему-то не доглядела...

Все,поняла,наконец-таки!)))...буду учить мат.часть дальше))
Прикрепленные файлы:
59. starik-2005 3038 08.01.18 11:36 Сейчас в теме
(58)
Все,поняла,наконец-таки!)))...буду учить мат.часть дальше))
Ох уж эти женщины )))
jan-pechka; +1 Ответить
60. jan-pechka 408 08.01.18 11:43 Сейчас в теме
(59)я только учусь...А здесь на форуме попалась интересная задачка с оптимизацией запроса - как раз та тема, над которой я билась в тот момент, но пока ее решила - появились по ходу события новые вопросы,вот и разбиралась в них...

Кроме директив и табЗначения у меня еще остался вопрос,отголосок эха той задачки, просто уже боюсь его задавать на форуме))...это про отчеты...
Оставьте свое сообщение

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