Имя: Пароль:
1C
1С v8
Объект "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с поменялись планы - хотели сначала отказаться от ДД на клиенте, а передумали)
2 + 2 = 3.9999999999999999999999999999999...