Имя: Пароль:
1C
1С v8
Открытие формы нового элемента справочника с заполнением
0 OzziK2000
 
09.09.21
08:28
Доброе утро! Помогите решить следующую задачу. Вопрос наверное не новый, но ответа нигде не могу найти.
Есть справочник с табличной частью. Обработка и показ табличной части на форме происходит в "ПриСозданииНаСервере", то есть если
идти стандартным путем через ПолучитьФорму, заполнить на сервере, КопироватьДанныеФормы, ФормаОткрыть - табличная часть на форме не отображается. Ну это понятно.

Пытаюсь открыть форму с ЗначенияЗаполнения - ругается на ТаблицуЗначений, нельзя ее передавать с клиента на сервер.

Можно создать элемент справочника и сформировать ДанныеФормы на сервере, но только как потом открыть форму?

Я понимаю, что можно открыть форму и потом ручками добавить все, но неужели нет стандартного механизма?

Помогите. Пожалуйста :-)
1 hhhh
 
09.09.21
08:49
(0) надо создать и заполнить документ, без всяких форм. А потом уже, когда всё заполнено, открывать форму, или не открывать форму.
2 OzziK2000
 
09.09.21
08:51
(1) Нельзя сохранять, надо открыть форму нового элемента справочника, чтобы можно потом либо записать либо отказаться от записи. Если через запись - то конечно все работает.
3 banco
 
09.09.21
08:56
(2) Передать ДанныеЗаполнения и заполнять в ОбработкаЗаполнения
4 Василий Алибабаевич
 
09.09.21
08:59
(0) "ругается на ТаблицуЗначений, нельзя ее передавать с клиента на сервер."
Как удалось поиметь ТаблицуЗначений на клиенте?
5 OzziK2000
 
09.09.21
09:03
(3) Нельзя менять конфу.
6 OzziK2000
 
09.09.21
09:05
(4)

Например так

ОписаниеТЗ = Новый ОписаниеТипов("ТаблицаЗначений");
ТабЗначений = ОписаниеТЗ.ПривестиЗначение(Элементы.ТЧ);
7 banco
 
09.09.21
09:06
(5) Конфу менять нельзя, сохранить объект нельзя, расширение использовать нельзя. Ну если столько запретов, то ничего не делать.
8 Василий Алибабаевич
 
09.09.21
09:08
(6) Это все понятно. Но! Ситуация запутывается все больше и больше.
Что такое Элементы.ТЧ? Это табличное поле? Или где?
9 OzziK2000
 
09.09.21
09:14
(8) На форме обработки создал ТЗ, аналогичную той, что в нужном справочнике, заполняю ее на сервере, чтобы потом получить на клиенте вышеописанным способом. ТЧ - таблица на форме связанная с этой ТЗ.
10 АнализДанных
 
09.09.21
09:25
(0)
Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта");

Для Каждого Строка Из ЭтаФорма.ТЧ Цикл
  
  нСтр = Форма.Объект.Товары.Добавить();
  ЗаполнитьЗначениеСвойств(нСтр, Строка);

КонецЦикла;

Форма.Открыть();
11 OzziK2000
 
09.09.21
09:28
(10) Не. "ПриСозданииНаСервере" отработало при "ПолучитьФорму". Дальнейшее заполнение не отобразит на форме эту ТЧ.
12 acht
 
09.09.21
09:32
(6) О, мьсе любитель вприсядку! Повторите, пожалуйста, это самое в веб-клиенте.
13 OzziK2000
 
09.09.21
09:38
(12) Да да, это не выход, я понимаю, просто пытался найти решение разными способами)
14 DrShad
 
09.09.21
09:40
создай объект, заполни его как тебе надо, потом открывай форму и параметром "Ключ" передай этот объект и будет тебе счастие
15 OzziK2000
 
09.09.21
09:43
(14) для этого надобно его записать, а этого делать нельзя. У пользователя должен быть выбор отказаться от записи
16 DrShad
 
09.09.21
09:44
(15) где я сказал что его нужно записать?
17 АнализДанных
 
09.09.21
09:45
(11) Я не понял задачу, опиши еще раз.
> если идти стандартным путем через ПолучитьФорму, заполнить на сервере, КопироватьДанныеФормы, ФормаОткрыть - табличная часть на форме не отображается
Почему не отображается ? Почему код из (10) не отработает?
18 OzziK2000
 
09.09.21
09:46
(16) ну незаписанный объект передастся на клиент в виде пустой ссылки, откроется новая пустая форма же, нет?
19 DrShad
 
09.09.21
09:48
(18) для чего эти гадания? напиши и попробуй, сильно удивишься
20 АнализДанных
 
09.09.21
09:49
(18) Тебе надо открыть форму существующего объекта, а потом изменить там ТЧ ?

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", СсылкаНаДокумент);

Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);
21 OzziK2000
 
09.09.21
09:52
(17) Потому что как таковой табличной части на форме нет, она есть только в реквизитах справочника. А на форме при создании ее на сервере, программно создаются элементы формы и заполняются данными из этой Табличной части. Соответственно если ТЧ заполнять после Создания формы, то они на форме не отобразятся. (20) Нет, новый элемент, свежесозданный
22 OzziK2000
 
09.09.21
09:55
(19) ну конечно я пробовал. Если передавать на клиент спр.ссылка - открывает пустую форму. Ну а сам объект спр передать, соответственно, нельзя.
23 DrShad
 
09.09.21
10:15
(22) почему у меня можно? что я делаю не так?
24 OzziK2000
 
09.09.21
10:23
(23) вот так у тебя работает???

&НаСервере
Функция Команда1НаСервере()
    
    Нов = Справочники.Контрагенты.СоздатьЭлемент();
    
    Нов.Наименование = "Администрация Президента";
    
    
    Возврат Нов.Ссылка;
    
    
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    
    
    
    ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", Новый Структура("Ключ", Команда1НаСервере()));
    
    
КонецПроцедуры
25 АнализДанных
 
09.09.21
10:27
(21) Опиши задачу подробно. Ты открываешь какой-то справочник у которого на форме есть таблица значений, Таблица заполняется по данным этого справочника при создании на сервере ? Ты хочешь поменять данные в этой таблице, и дать возможность пользователю записать эти данные в справочник ? Механизма записи данных из таблицы в справочник на форме нет, она существует только для отображения текущих значений? При этом дорабатывать ничего нельзя ? У тебя какая-то внешняя обработка, где ты все это хочешь сделать ?
Если это внешняя обработка, тогда единственный вариант: скопируй в нее форму справочника и допили (главное, чтобы основной объект у формы был от этого справочника, а не от твоей обработки), открывай свою новую форму и делай там что хочешь.
26 Kassern
 
09.09.21
10:28
(24) что за.... вот тебе рабочий вариант, сделай по аналогии:

    Форма = ПолучитьФорму("Документ.ОтчетКомиссионера.ФормаОбъекта");
    ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
    ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
    Форма.Открыть();
27 Kassern
 
09.09.21
10:28
(26) надеюсь не стоит объяснять, что надо делать в ЗаполнитьДокументНаСервере(ДанныеФормы)?)
28 АнализДанных
 
09.09.21
10:30
(24) Ты же не записываешь объект, поэтому у тебя Команда1НаСервере() возвращает всегда пустую ссылку.
29 DrShad
 
09.09.21
10:32
(24) нафига ты возвращаешь ссылку?
30 Kassern
 
09.09.21
10:33
(27) ладно, распишу немножко:

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

КонецПроцедуры
31 OzziK2000
 
09.09.21
10:34
(27) это не поможет. Да, ты заполнишь ТабличнуюЧасть, все верно. Но она на форме не отобразится, так как рисуется в ПриСозданииНаСервере, а в твоем примере эта процедура отработает в первой строчке в получитьФорму, когда ТЧ еще пустая.
32 OzziK2000
 
09.09.21
10:36
(29) а что мне возвращать, сам объект?)) попробуй)
33 Kassern
 
09.09.21
10:42
(31) "отработает в первой строчке в получитьФорму, когда ТЧ еще пустая." ну и пускай отработает, что в этом плохого?
34 OzziK2000
 
09.09.21
10:46
(25)  Да, есть справочник. У него есть табличная часть. Но она не выведена на форму. Она выводится на форму программно в процедуре ПриСозданииНаСервере. Соответственно когда (33) создаем новый объект табличная часть еще пустая, и на форме ничего не показывается. Мы можем создать объект, записать его и тогда при открытии все прекрасно отображается. Вопрос как это сделать не записывая.
35 OzziK2000
 
09.09.21
10:48
(25) спасибо большое за идею, я попробую это сделать, сам не додумался бы так сделать, спасибо еще раз.
36 OzziK2000
 
09.09.21
11:02
Ну а все же вопрос то открытым остается. Существует ли способ сначала создать объект, заполнить его, а уже потом получить форму и открыть ее, не записывая объект.
37 acht
 
09.09.21
11:11
(29) Потому что у него не толстый клиент.
38 banco
 
09.09.21
15:01
(36) Сделай свою форму объекта и там заполняй что хочешь.
39 АнализДанных
 
09.09.21
15:58
(36) Только при условии, что в "обработке заполнения" документа есть соответствующий код:

ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("Дата", ТекущаяДата());
ДанныеЗаполнения.Вставить("Комментарий", "Тест");

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДанныеЗаполнения", ДанныеЗаполнения);

Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);
40 acht
 
09.09.21
16:57
(39) Плюс дополнительно у реквизитов в метаданных должен быть установлен флаг "Заполнять из даннх заполнения" и/или в модуле объекта установлен обработчик заполнения.
41 OzziK2000
 
09.09.21
17:04
(39) Огромное тебе спасибо. Все сделал, как ты мне в  (25) посоветовал. Скопировал форму себе в обработку, и с минимальными дописками все взлетело.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан