|
Объект "XBase" - 1С:Предприятие 8.3 (8.3.6.1999) | ☑ | ||
---|---|---|---|---|
0
TARPV
30.06.15
✎
12:03
|
Создаю на клиенте объект "XBase", затем передаю его в качестве параметра в процедуру выполняемую на сервере, в ответ получаю следующее сообщение о ошибке:
{Форма.Форма.Форма(130)}: Ошибка при вызове метода контекста (СформироватьНаСервере) СформироватьНаСервере(ЭлементСпискаЗначений.Значение,xB); по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: Запись значения свойства 'param': форма: Элемент имя: {http://v8.1c.ru/8.2/managed-application/modules}param по причине: Ошибка отображения типов: Отсутствует отображение для типа 'XBase' Что я делаю не правильно??? |
|||
1
itlikbez
30.06.15
✎
12:21
|
(0) Все логично. Подумай сам - в чем смысл передачи параметра на сервер? По-твоему, база тоже на сервер "поедет"?
|
|||
2
Бубка Гоп
30.06.15
✎
12:27
|
(0) объект не сериализуется, так просто между клиент сервером его не попинаешь. если не критично, лучше создавай сразу на сервере.
|
|||
3
KarpovDeniska
30.06.15
✎
12:47
|
ПоместитьВоВременноеХранилище() ?
|
|||
4
TARPV
30.06.15
✎
12:52
|
(1) (2) Заполнить данными объект "XBase" я могу только на сервере т.к. он заполнятся на основании данных из "Запроса", затем его нужно вернуть на клиент и сохранить в файловой системе клиентского PC.
|
|||
5
ДенисЧ
30.06.15
✎
13:05
|
Прочитай на клиенте, результат передай на сервер.
И наоборот |
|||
6
Славен
30.06.15
✎
13:08
|
(0) а нафига ты его передаешь на сервер? ты с сервера получай результат запроса, а все заполняй на клиенте
|
|||
7
Славен
30.06.15
✎
13:08
|
(4) заполнить ты его можешь и должен только на клиенте, а вот данные для заполнения получишь на сервере
|
|||
8
TARPV
30.06.15
✎
13:21
|
(6) ВыборкаИзРезультатаЗапроса не доступна на тонком клиенте и соответственно ее нельзя передать на клиент и использовать для заполнения объект "XBase".
Получается замкнутый круг. Передавать объект "XBase" между клиентом и сервером нельзя, а как его тогда заполнить на клиенте по данным запроса не понятно!? |
|||
9
Славен
30.06.15
✎
13:23
|
(8) рукалицо
|
|||
10
EvgeniuXP
30.06.15
✎
13:23
|
Сначала базу заполняют на сервере, а потом клиент читает из нее и выводит на форму
|
|||
11
TARPV
30.06.15
✎
13:37
|
(10) При чем тут форма?
Вопрос про то, как объект "XBase" заполнить на сервере и вернуть на тонкий клиент, а там сохранить на жесткий диск. |
|||
12
Господин ПЖ
30.06.15
✎
13:39
|
(1) не. надо. этого. делать
|
|||
13
Господин ПЖ
30.06.15
✎
13:39
|
(12) -> (11)
|
|||
14
Провинциальный 1сник
30.06.15
✎
13:46
|
(11) Заполняй xbase на клиенте, а данные для заполнения доставай с сервера.
|
|||
15
Бубка Гоп
30.06.15
✎
13:46
|
вобщем, имхо проблема в том что товарищ не знает как получить данные с сервера на клиент
|
|||
16
Провинциальный 1сник
30.06.15
✎
13:47
|
(15) Как-то так.
&НаСервере Функция ПолучитьТЗ() Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ Наименование ИЗ Справочник.ПодразделенияОрганизаций"; ТабЗапроса=Запрос.Выполнить().Выгрузить(); возврат ТабЗапроса; КонецФункции &НаКлиенте Процедура Команда1(Команда) ТЗ=ПолучитьТЗ(); Для Каждого Строка ИЗ ТЗ цикл Сообщить(Строка.Наименование); КонецЦикла; КонецПроцедуры |
|||
17
Бубка Гоп
30.06.15
✎
13:50
|
(16) плохой пример
|
|||
18
Бубка Гоп
30.06.15
✎
13:50
|
(16) клиент не знает тз
|
|||
19
Господин ПЖ
30.06.15
✎
13:51
|
давно тз между клиентом и сервером ходить научили?
|
|||
20
Провинциальный 1сник
30.06.15
✎
13:57
|
(19) Там ходит что-то урезанное, указанный пример - рабочий.
|
|||
21
Провинциальный 1сник
30.06.15
✎
13:57
|
(20) Ой, извините, ошибся - проверил в толстом.
|
|||
22
Провинциальный 1сник
30.06.15
✎
13:58
|
Ну тогда лепить список из структур - они поддерживаются в тонком..
|
|||
23
banco
30.06.15
✎
14:00
|
(22) а не проще все сформировать и сохранить в файл на сервере и передать этот файл на клиент?
|
|||
24
Господин ПЖ
30.06.15
✎
14:00
|
Запрос.Выполнить() отдать на клиента и там уже издеваться над ним
|
|||
25
Бубка Гоп
30.06.15
✎
14:01
|
(16) Поправлено
&НаСервере Функция ПолучитьСтруктурку() Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ Наименование ИЗ Справочник.СтруктураПредприятия"; Структурка = Новый Структура; Результатик = Запрос.Выполнить(); Выборочка = Результатик.Выбрать(); Счетчичек = 0; Пока Выборочка.Следующий() Цикл; Структурка.Вставить("Имечко" + Счетчичек, Выборочка.Наименование); Счетчичек = Счетчичек + 1; КонецЦикла; возврат Структурка; КонецФункции &НаКлиенте Процедура Команда1(Команда) Структурка=ПолучитьСтруктурку(); Для Каждого Элементик ИЗ Структурка цикл Сообщить(Элементик.Ключ + ": " + Элементик.Значение); КонецЦикла; КонецПроцедуры |
|||
26
Бубка Гоп
30.06.15
✎
14:03
|
(24) Какой из методов РезультатаЗапроса доступен на клиенте?
|
|||
27
DmitrO
30.06.15
✎
14:04
|
вы что тут мозг человеку выносите
1.сразу вызываешь серверную функцию 2.на сервере создаешь дбф файл с именем временного файла (ПолучитьИмяВременогоФайла) 3.заполняешь его данными 4.закрываешь файл 5.создаешь объект ДвоичныеДанные, указываешь имя своего врем. файла, помещаешь его во временное хранилище 6.возвращаешь из функции адрес в хранилище 7.на клиенте функцией ПолучитьФайл размещаешь файл в ФС клиента |
|||
28
DmitrO
30.06.15
✎
14:04
|
(23)правильно
|
|||
29
mTema32
30.06.15
✎
14:05
|
(25) Так это структура...
Может ошибаюсь, но вроде можно ТЗ пульнуть в реквизит формы и оттуда прочитать клиентом. Не? |
|||
30
Бубка Гоп
30.06.15
✎
14:07
|
(29) Нет
|
|||
31
hhhh
30.06.15
✎
14:07
|
(29) да, просто создать реквизит формы ТЗ типа таблица значений. И он прекрасно виден и на клиенте и на сервере. М не надо никаких структурок.
|
|||
32
Бубка Гоп
30.06.15
✎
14:08
|
(30) Вру, можно
|
|||
33
DmitrO
30.06.15
✎
14:11
|
(31)можно, но только зачем? если проще все сделать на сервере и просто вернуть файл.
структуру дбф еще в реквизит формы закладывать придется. |
|||
34
mTema32
30.06.15
✎
14:14
|
(33) Да, на счет структуры дбф - согласен. Если там 100500 колонок то через файл может и проще.
|
|||
35
Бубка Гоп
30.06.15
✎
14:15
|
ТС притих чего то
|
|||
36
TARPV
30.06.15
✎
14:21
|
(27) 5.создаешь объект ДвоичныеДанные, указываешь имя своего врем. файла, помещаешь его во временное хранилище
А обязательно создавать объект ДвоичныеДанные? Без него временный файл нельзя поместить во временное хранилище? |
|||
37
EvgeniuXP
30.06.15
✎
14:21
|
зачем клиенту твой дбф-файл? Че он сним делать будет?
|
|||
38
EvgeniuXP
30.06.15
✎
14:23
|
Смотреть? Редактировать? Или он хочет знать где лежит? Или его трясет что лежиь на сервере - а это секретные данные и только у него? Так сохрани ему на комп, упакуй и пароль поставь
|
|||
39
etc
30.06.15
✎
14:25
|
(38) на дискетку запишет :)
|
|||
40
DmitrO
30.06.15
✎
14:25
|
(36)нельзя. тебя это пугает? =)
|
|||
41
Бубка Гоп
30.06.15
✎
14:26
|
(27) Кстати адрес в хранилище необязателен, можно тупо вернуть на клиента ДвоичныеДанные
|
|||
42
DmitrO
30.06.15
✎
14:30
|
(41)Швадратные Ктаны (не удержался :))
по документации ДвоичныеДанные не доступны в тонком |
|||
43
Бубка Гоп
30.06.15
✎
14:31
|
(42) ДвоичныеДанные (BinaryData)
ДвоичныеДанные (BinaryData) Методы: Записать (Write) Размер (Size) Конструкторы: На основании файла Описание: Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: base64Binary, hexBinary |
|||
44
Бубка Гоп
30.06.15
✎
14:32
|
чтобы не быть голословным вот рабочий пример
&НаСервере Функция ПолучитьФайлик() Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ Наименование ИЗ Справочник.СтруктураПредприятия"; Результатик = Запрос.Выполнить(); ИмяФайла = ПолучитьИмяВременногоФайла(); Файл = Новый ЗаписьТекста (ИмяФайла); Выборочка = Результатик.Выбрать(); Пока Выборочка.Следующий() Цикл; Файл.ЗаписатьСтроку(Выборочка.Наименование); КонецЦикла; Файл.Закрыть(); ДД = Новый ДвоичныеДанные(ИмяФайла); Возврат ДД; КонецФункции &НаКлиенте Процедура Команда1(Команда) ДД = ПолучитьФайлик(); ДД.Записать("Какой_то_там_локальный_путь\файлик.txt"); КонецПроцедуры |
|||
45
DmitrO
30.06.15
✎
14:33
|
(44)я знаю
|
|||
46
Бубка Гоп
30.06.15
✎
14:33
|
(45) тогда почему (42) ?
|
|||
47
DmitrO
30.06.15
✎
14:34
|
(43)а вот из 8.3
ДвоичныеДанные (BinaryData) Методы: Записать (Write) Размер (Size) Конструкторы: На основании файла Описание: Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: base64Binary, hexBinary. |
|||
48
Бубка Гоп
30.06.15
✎
14:35
|
(47) эва как, тогда мои пардоны, я безнадежно устарел, загнил так сказать на своей 8.2, которая так умеет
|
|||
49
Бубка Гоп
30.06.15
✎
14:37
|
(47) кстати, ...Сериализуется.
интересненько |
|||
50
DmitrO
30.06.15
✎
14:40
|
(48)конечно, иначе бы хрен бы мы его засунули во временное хранилище
но сериализовать его в текст и передавать строкой конечно же менее эффективно чем ПолучитьФайл. Получить файл это простое двоичное копирование с сервера на клиент. |
|||
51
DmitrO
30.06.15
✎
14:41
|
(36)не забудь еще временный файл зачистить (УдалитьФайлы)
|
|||
52
Бубка Гоп
30.06.15
✎
14:43
|
(50) Интересно, почему в 8.3 у клиента отпилили ДД? Утоньшение тонкого клиента?
|
|||
53
DmitrO
30.06.15
✎
14:44
|
(36)+на шаге 5 помещать во временное хранилище надо без указания идентификатора формы (2 параметр ПоместитьВоВременноеХранилище), это обеспечит удаление объекта из временного хранилища при следующем серверном вызове.
|
|||
54
DmitrO
30.06.15
✎
14:47
|
(52)да херней занимаются, проповедуют идею: чтобы эти 1сники не писали не эффективный код (они ж тупые) мы их ограничим так чтобы написать его было нельзя.
|
|||
55
Бубка Гоп
30.06.15
✎
14:48
|
(54) Годная политика
|
|||
56
TARPV
30.06.15
✎
14:58
|
(27) функция ПолучитьИмяВременногоФайла("dbf") возвращает что то вроде: C:\Users\i907_1c_service\AppData\Local\Temp\v8_CE67_f6dd.dbf
А метод СоздатьФайл() объект "XBase" требует имени файла не более 8 символов. Соответственно эта функция для этой задачи не подходит :( |
|||
57
Бубка Гоп
30.06.15
✎
15:02
|
(56) дык переименуй прежде чем создавать xbase
|
|||
58
DmitrO
30.06.15
✎
15:07
|
(56)ну значит получай имя каталога временных файлов, а имя файла придумай сам.
Тут проблема будет только в том что имя может совпасть с другим файлом из другого сеанса. Например другой юзер в тот же момент будет выполнять ту же функцию. Можно сделать каталоги и менем из идентификатора сеанса например, чтобы гарантированно изолировать их друг от друга. |
|||
59
TARPV
30.06.15
✎
15:08
|
Всем спасибо за советы!!!
Вообщем -то получилось, как описано (27), но на клиент я передаю объект ДвоичныеДанные и там его сохраняю т.е. временное хранилище не использую. |
|||
60
DmitrO
30.06.15
✎
15:08
|
добро пожаловать в настоящую клиент-серверную среду =)
|
|||
61
Бубка Гоп
30.06.15
✎
15:13
|
(59) В 8.3 ДД нет на клиенте, но использовать его можно?
|
|||
62
TARPV
30.06.15
✎
15:18
|
(61)
1С:Предприятие 8.3 (8.3.6.1999) ДвоичныеДанные (BinaryData) Записать (Write) Синтаксис: Записать(<ИмяФайла>) Параметры: <ИмяФайла> (обязательный) Тип: Строка. Имя файла, в который необходимо записать двоичные данные. Если файл существует, он будет перезаписан, иначе - создан. Описание: Записывает двоичные данные в файл. Доступность: Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
63
Бубка Гоп
30.06.15
✎
15:20
|
(62) Класс. Объект не доступен, его метод - доступен. 1С такая 1С
|
|||
64
DmitrO
30.06.15
✎
15:28
|
(63)не это похоже в документации 8.3.5 ошибка, проверил - работает вроде =)
но смотрите: только в тонком, в веб-клиенте (хз теперь уже, проверять надо) Ну и чрез ПолучитьФайл, конечно меньше будет информации передаваться т.к. не будет сериализации параметров в текст. |
|||
65
Провинциальный 1сник
30.06.15
✎
15:32
|
(63) А как тогда поступать, если надо наоборот с клиента передать файл на сервер?
|
|||
66
Бубка Гоп
30.06.15
✎
15:33
|
(65) Также, вроде разобрались что у клиента таки есть ДД
|
|||
67
DmitrO
30.06.15
✎
15:38
|
(65)правильно: это использовать функцию ПоместитьФайл
Это обеспечит работу и в веб-клиенте. |
|||
68
DmitrO
30.06.15
✎
15:40
|
ДвоичныеДанные (BinaryData)
На основании файла Синтаксис: Новый ДвоичныеДанные(<ИмяФайла>) Параметры: <ИмяФайла> (обязательный) Тип: Строка. Имя файла, из которого будет загружено значение в виде двоичных данных. Описание: Создает объект и помещает в него двоичные данные, взятые из файла. В режиме веб-клиента недоступен. |
|||
69
DmitrO
30.06.15
✎
15:40
|
но доверять СП надо осторожно :)
|
|||
70
Провинциальный 1сник
30.06.15
✎
15:53
|
(68) Это от какой версии? У меня в 8.3.6.1977 написано что поддерживается и на тонком клиенте, и на веб-клиенте.
|
|||
71
DmitrO
30.06.15
✎
15:59
|
(70)8.3.5.1517
|
|||
72
mTema32
30.06.15
✎
16:05
|
(70) 8.3.6.2041 - тут тоже доступно.
|
|||
73
Провинциальный 1сник
30.06.15
✎
16:26
|
Странно, да.. Похоже у 1с поменялись планы - хотели сначала отказаться от ДД на клиенте, а передумали)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |