Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Заполнение табличной части создаваемого документа через ЗначениеЗаполнения в ОткрытьФорму.

Заполнение табличной части создаваемого документа через ЗначениеЗаполнения в ОткрытьФорму.
Я
   Mikeware
 
09.11.20 - 07:01
Подскажите, как (можно ли) такое реализовать?
шапка заполняется.
добавить в параметры заполнения таблицу значений не могу - на клиенте ТаблицыЗначений не существует. Структура структур?
в ИТС не нашел, в типовой КА тоже примера не нашел.
   SleepyHead
 
1 - 09.11.20 - 08:44
(0) Либо значения, доступные на клмиенте, либо где-то на сервере положить ТЗ во временное хранилище и запомнить его адрес. Передать при открытии формы.
   Mikeware
 
2 - 09.11.20 - 08:50
(1) т.е. список в структуру и на сервер. на сервере структуру загнать в ТЗ. ТЗ - поместить в хранилище. адрес на клиента, на клиенте адрес в структуру? круто...
а если тз в реквизитах обработки сделать?
   Дык ё
 
3 - 09.11.20 - 08:54
(0) у тебя вызывается обработчик заполнения в модуле объекта с переданной структурой. передавай как хочешь, а в модуле объекта обрабатывай
   SleepyHead
 
4 - 09.11.20 - 08:54
(2) Стой-стой, я не это говорил.

Если все передаешь через клиента, то вместо ТЗ передавай массив структур. Каждой строке ТЗ соответствует структура в массиве.

Если же принципиально передавать именно ТЗ, то сделай серверную процедуру, которая поместит нужные данные в ТЗ, потом эту ТЗ во временное хранилище и вернет строку (адрес временного хранилища), эту строку уже передавай в форму при открытии.
   SleepyHead
 
5 - 09.11.20 - 08:55
(2) " если тз в реквизитах обработки сделать?"

Не понял, что это даст, ты же создаешь новый документ, и передаешь в него данные заполнения.
   Mikeware
 
6 - 09.11.20 - 09:09
(3) я не хочу модуль документа менять.
(4) массив структур - спасибо, не додумался. сейчас попробую
Мне непринципиально передавать именно ТЗ - но я не понимал, что еще можно передать, ведь на структуру ТЧ хорошо ложится именно ТЗ. сейчас попробую с масссивом структур
(5) заполню "ТЗ в реквизитах" на клиенте, на сервере уложу это в хоронилище, верну адрес и т.д....
   Дык ё
 
7 - 09.11.20 - 09:13
(6) добавь подписку или расширение
   Mikeware
 
8 - 09.11.20 - 09:21
(7) не уверен, что это постоянно надо будет. ну и хочется типовой механизЪм, ведь "в восьмерке все реализовано"®. а велосипеды лепить я умею, да - все как полагается, и колеса квадратные, и педали на руле...
   Mikeware
 
9 - 09.11.20 - 10:56
массив структур не сработал. печаль.
Еще "типовые" решения есть, как считаете?
   FIXXXL
 
10 - 09.11.20 - 10:57
(9) "не сработал" - это как? его же на входе надо получить и кодом заполнить ТЧ
само оно не заполнится...
   Mikeware
 
11 - 09.11.20 - 10:59
(10) тююю. а шо, механизма типового заполнения - нету?
   Василий Алибабаевич
 
12 - 09.11.20 - 11:02
(0) Непонятно. Обработка заполнения выполняется на сервере.
"добавить в параметры заполнения таблицу значений не могу" через патамучта на клиенте...
Как так? Зачем на клиенте иметь ТЗ?
Типовой сценарий с ТЗ: Заполнить ТЗ (на сервере). Поместить во временное хранилище (на сервере). Адрес вернуть клиенту. Адрес передать в ПараметрахЗаполнения. В открываемой форме (на сервере) в ОбработкаЗаполнения получить ТЗ из временного хранилища. Все.
   Mikeware
 
13 - 09.11.20 - 11:10
(12) у меня сценарий такой - дерево "с флажками" на клиенте. кнопка "сформировать документы" - на клиенте. открывается форма (формы, последовательно) документа юзверю - на клиенте.


все данные для заполнения документа у меня есть на клиенте. зачем мне таскать данные туда-сюда?
шапка дока через передачу ЗначенияЗаполнения в параметры открываемой формы заполняется. вопрос: есть ли типовой, штатный механизм заполнения ТЧ?
   Василий Алибабаевич
 
14 - 09.11.20 - 11:17
(13)
1. "дерево "с флажками" на клиенте" - это скорее всего ТЗ на сервере. Или ДС с доп реквизитами. И то и то живет на сервере. Иначе я не могу понять что означает "дерево на клиенте".
2. ОбработкаЗаполнения при любом раскладе живет на сервере. Для "типового сценария" туда все равно ходить нужно.
   Василий Алибабаевич
 
15 - 09.11.20 - 11:18
+ (14) Возможно "дерево с флажками" это ДС + какой-то СписокЗначений для отмечания флажками? Тогда просто передай этот список.
   Василий Алибабаевич
 
16 - 09.11.20 - 11:20
+ (15) Покажи "ПутьКДанным" из твоего дерева.
   Mikeware
 
17 - 09.11.20 - 11:25
(14) дерево - это ДеревоЗначений на форме. в котором юзверь отмечает, что он выберет для "сделать щазз", а что пока отложит на потом.
да, сформированон на сервере, передано на клиента. обрабатывается юзверем уже на клиенте

Обработка заполнения - ну мне пофиг, где она живет. я же ОткрытьФорму только на клиенте могу. ВОт я и хочу п осреговиковой методологии открыть форму нового документа и передать в параметре все данные для заполнения этого документа. все данные у меня есть на клиенте.  
я даже могу 
    Форма=ПолучитьФорму("Документ.*.Форма.ФормаДокумента"); 
    ДанныеФормы=Форма.Объект;
    ДанныеФормы=СоздатьНаСервере(ДанныеФормы);
    КопироватьДанныеФормы(ДанныеФормы,Форма.Объект);
    Форма.Открыть();
   Mikeware
 
18 - 09.11.20 - 11:28
   Василий Алибабаевич
 
19 - 09.11.20 - 11:31
(17) Птля... Так у тебя ОФ? (Исходя из ПолучитьФорму(...)).
В таком варианте у тебя есть полный доступ к реквизитам через объект "Форма". Для ОФ это и есть практически "типовой вариант".
   Mikeware
 
20 - 09.11.20 - 11:32
(19) УФ
   Mikeware
 
21 - 09.11.20 - 11:33
(19) прочитал, что так делать нехаляльно, халяльно - заполнять через структуру параметры, указывая в ней структуру ЗначенияЗаполнения. вот, пытаюсь сделать халяльно уже второй день
   Василий Алибабаевич
 
22 - 09.11.20 - 11:34
(18) "ДеревоОстатков" и есть ТЗ. И живет она на сервере.
   Василий Алибабаевич
 
23 - 09.11.20 - 11:36
(21) "пытаюсь сделать халяльно". Халяльно - это через ОткрытьФорму. Через ПолучитьФорму - "это залет, воин".
   Mikeware
 
24 - 09.11.20 - 11:38
(22) но форму-то я открываю на клиенте... и жду ее закрытия оповещением тоже на клиенте.
зы. да, я тупой семерочник.
ззы. мне надо тупое
Для каждого стр из ТЗ
 ОткрытьФормуМодально("Документ.*", стр)
   Mikeware
 
25 - 09.11.20 - 11:39
(23) вотя я и пытаюсь 
    ПараметрыЗаполнения = Новый Структура("Организация", Организация);
    ПараметрыЗаполнения.Вставить("Дата",Период.ДатаОкончания);
    Парам=Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
    ОткрытьФорму("Документ.*.Форма.ФормаДокумента",
                Парам,,,,,Оповещение,);

Шапку заполняет, ТЧ не могу
   Василий Алибабаевич
 
26 - 09.11.20 - 11:41
(25) Нужно смотреть ОбработкаЗаполнения в открываемом объекте.
   Mikeware
 
27 - 09.11.20 - 11:44
(26) уййоооо. так вроде в общем модуле заполняться должно, в доке нет особой обработки. а трассировать я задолбался. нервов на эти УГФ не хватает.
   Mikeware
 
28 - 09.11.20 - 11:48
я правильно понимаю, что "в восьмерке реализовано всё, кроме именно этого"?
зы. КА2.4. УФ
   RomanYS
 
29 - 09.11.20 - 11:49
(25) Если не заморачиваться с обработкой заполнения каждой формы, можно после открытия формы дозаполнить ТЧ. Правда нюансы могут вылезти, т.к. на момент открытия данных в ней не было всякие итоги могут не посчитаться.

Ф = ОткрытьФорму("Документ.*.Форма.ФормаДокумента",Парам,,,,,Оповещение,);

Для каждого Стр Из ТЗ цикл
  СтрТЧ = Ф.Объект.ТЧ.Добавить();
  ЗаполнитьЗначенияСвойств(СтрТЧ, Стр);
КонецЦикла
   Василий Алибабаевич
 
30 - 09.11.20 - 11:49
(28) Не путай платформу и конкретную конфигурацию.
 
 Рекламное место пустует
   Василий Алибабаевич
 
31 - 09.11.20 - 11:51
(29) А если "заполнение" заключается не в тупом ЗаполнитьЗначенияСвойств, а по отметке в списке (как у ТС) взять например ссылку нужного объекта, да получить связанные реквизиты..?
   Mikeware
 
32 - 09.11.20 - 11:54
(29) да знаю (прочитал на ИТС и инфостарте). собственно, из-за этого и решил не "заполнять вручную" и не "пересчитывать вручную", а по советам оттуда "воспользоваться типовым механизмом".
   RomanYS
 
33 - 09.11.20 - 11:55
(31) ТС заявляет, что у него "всё есть" на клиенте. А открываемых форм много и корячить их не желательно
   Mikeware
 
34 - 09.11.20 - 11:59
(33) т.е. "дозаполнять вручную"?
   RomanYS
 
35 - 09.11.20 - 12:02
(34) Если у целевых форм/объектов нет нужных интерфейсов, то я бы сделал так.
Если всё-таки решишь разобраться с обработками заполнения, то учти, что передавать надо не ЗначенияЗаполнения, а Основание.
   Mikeware
 
36 - 09.11.20 - 12:04
(35) как в анекдоте: "- и вышел обратно на Дерибасовскую!"©
в общем, не читал бы ИТС и инфостарт - сделал бы давно.
   Mikeware
 
37 - 09.11.20 - 12:05
(35) спасибо.
зы. основания-то нет. я ж не на основании заполняю, и у данного дока основание не предусмотрено
   RomanYS
 
38 - 09.11.20 - 12:09
(37) Ты не правильно понимаешь. Можно передавать и структуру и она обработается в обработке заполнения.
   RomanYS
 
39 - 09.11.20 - 12:11
+(38) Из ЗначенияЗаполнения данные просто копируются причем похоже аналогично ЗаполнитьЗначенияСвойств, поэтому ТЧ и игнорятся.
А Основание придёт параметром в обработку заполнения, и там обрабатывай как хочешь
   Василий Алибабаевич
 
40 - 09.11.20 - 12:29
(37) "Основание" и "ОбработкаЗаполнения" в снеговике связаны между собой очень мало.
ОбработкаЗаполнения будет вызвана для любого ЗначенияЗаполнения.
Наличие основания - просто будет генерировать системный пункт меню "ввести на основании".
При этом также будет вызвана "ОбработкаЗаполнения". Точно также как и для "ОткрытьФорму". И если в "ОткрытьФорму" определены "ЗначенияЗаполнения" то они точно также будут доступны в "ОбработкаЗаполнения" не зависимо от того указано "ЗначенияЗаполнения" в качестве "Основания" или нет.
Коротко : события "ввод на основании" и "обработка заполнения" в снеговике разделены.
   RomanYS
 
41 - 09.11.20 - 12:32
(40) Что значит события разделены? У ВнО - есть отдельный обработчики?
ЗначенияЗаполнения не будет доступно в обработке заполнения объекта (не формы)
   Василий Алибабаевич
 
42 - 09.11.20 - 12:39
(41) Я же написал ввод на основании в снеговике больше интерфейсная штука. ОбработкаЗаполнения - бизнеслогика.
https://its.1c.ru/db/v8std/content/396/hdoc
   Василий Алибабаевич
 
43 - 09.11.20 - 12:43
+ (42) А вот место для ОбработкаЗаполнения :
https://its.1c.ru/db/metoddevu#content:8021375:hdoc:_top:обработказаполнения
ЦЫ
"
Для самых простых случаев можно использовать свойство ЗначениеЗаполнения, которое есть у реквизитов объектов конфигурации (см. Как сделать, чтобы при создании новой накладной автоматически подставлялся главный склад?).

В более сложных случаях можно использовать данные заполнения (см. Как сделать, чтобы при вводе новой накладной в нее сразу же подставлялись те значения склада и поставщика, по которым отобран список накладных?).

Если ни тот, ни другой способы не подходят, на встроенном языке можно описать собственный алгоритм начального заполнения данных нового объекта. Для этого предназначено событие объекта Обработка заполнения.

Это событие можно обработать в модуле объекта в процедуре со стандартным именем ОбработкаЗаполнения.
"
О доступности в модуле объекта - отдельное упоминание.
   RomanYS
 
44 - 09.11.20 - 12:44
(42) Именно, что интерфейсная, это просто "кнопка". Вызывается событие ОбработкаЗаполнения и разницы нет откуда.
   Mikeware
 
45 - 09.11.20 - 12:45
Попробовал с помещением в хранилище, и адресом - тоже не взлетает.
Странно - вроде типовая задача для заполнения...
придется "ручками"
   Василий Алибабаевич
 
46 - 09.11.20 - 12:46
(44) 100 пудов. И ЗначенияЗаполнения передаются в ОбработкаЗаполнения независимо от того есть что-либо в списке "вводится на основании" или нет. Если они указаны в ОткрытьФорма.
   Василий Алибабаевич
 
47 - 09.11.20 - 12:46
(45) Что не получилось? Покажи процедуру помещения во временное хранилище.
   RomanYS
 
48 - 09.11.20 - 12:48
(46) В обработку заполнения передаётся <!>Основание</!> первым параметром. ЗначенияЗаполнения могут быть доступны через параметры формы и точно не доступны в модуле объекта.
   RomanYS
 
49 - 09.11.20 - 12:49
(45) На уровне платформы нет заполнения ТЧ, или ты попадаешь в интерфейсы конфигурации/БСП или пилишь сам.
   Василий Алибабаевич
 
50 - 09.11.20 - 12:51
(48) "и точно не доступны в модуле объекта." ГЫ. А у меня доступны. И в ИТС тоже. см (43)
   Mikeware
 
51 - 09.11.20 - 12:53
(47)
....
ПараметрыЗаполнения.Вставить("КредиторскаяЗадолженность", УпаковатьМассивВТЗ(МассивКредиторов));

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

&НаСервере
Функция упаковатьМассивВТЗ(МассивТЧ)
ТЗ=Новый ТаблицаЗначений;
Если МассивТЧ.Количество()=0 Тогда
    Возврат Неопределено;
КонецЕсли;
ЗаписьШаблон=МассивТЧ[0];
Для Каждого Элемент Из ЗаписьШаблон Цикл
    тз.Колонки.Добавить(Элемент.Ключ);
КонецЦикла;
Для Каждого эл Из МассивТЧ Цикл
    СтрТЗ=ТЗ.Добавить();
    ЗаполнитьЗначенияСвойств(стрТЗ, эл);
КонецЦикла;
Адрес=ПоместитьВоВременноеХранилище(ТЗ,Новый УникальныйИдентификатор );    
Возврат адрес;
КонецФункции
   RomanYS
 
52 - 09.11.20 - 12:53
(50)
(43) "410 Страница не найдена" вход выполнен
   Mikeware
 
53 - 09.11.20 - 12:56
(49) нету, согласен. как нет заплнения и шапки тоже.
Шапка заполняется через ЗаполнитьЗначенияСвойств в модуле ОбщегоНазначенияУТ
   Василий Алибабаевич
 
54 - 09.11.20 - 12:59
(45) Примерно так :
//Получим ТЧ из удаленной системы
&НаСервере
Функция ЗагрузитьИсториюПродажНаСервере(ДатаНачала, ДатаОкончания)
    Перем ТекстОшибки;
    Прокси = ОбменМобильныеПереопределяемый.ПолучитьПрокси(ТекстОшибки);
...
    ТЧ = Прокси.ПолучитьИсториюПродаж(ДатаНачала, ДатаОкончания, Объект.Покупатель).Получить();
...
    Возврат ПоместитьВоВременноеХранилище(ТЧ, ЭтаФорма.УникальныйИдентификатор);
КонецФункции

//Откроем форму подбора

&НаКлиенте
Процедура ВыборПериодаИстории(Результат, П) Экспорт
...
    АдресИстории = ЗагрузитьИсториюПродажНаСервере(Результат.ДатаНачала, Результат.ДатаОкончания);
    П = Новый Структура;
    П.Вставить("ЗакрыватьПриВыборе", Ложь);
    П.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина);
    П.Вставить("АдресИстории", АдресИстории);
    ОткрытьФОрму("ОбщаяФорма.ПодборВыборТипа", П, ЭтаФорма);
КонецПроцедуры

******************************
В общей форме
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  Если Параметры.Свойство("АдресИстории") Тогда
    АдресИстории = Параметры.АдресИстории;
    ТЧ = ПолучитьИзВременногоХранилища(АдресИстории);
  КонецЕсли;
КонецПроцедуры
   Василий Алибабаевич
 
55 - 09.11.20 - 13:01
(54) Я сам себя обхитывал вот здесь :

Возврат ПоместитьВоВременноеХранилище(ТЧ, ЭтаФорма.УникальныйИдентификатор);

Возвращал не Адрес, а ЭтаФорма.УникальныйИдентификатор
   RomanYS
 
56 - 09.11.20 - 13:01
(50) Проверил, действительно передается. Если есть оба параметра- приходит Основание, иначе приходит один указанный.
   Mikeware
 
57 - 09.11.20 - 13:02
(54) и тут опять попадаем на правку документа (у тебя - ОбщейФормы)?
   Василий Алибабаевич
 
58 - 09.11.20 - 13:06
(57) 100 пудов. Оно же универсальное. И заранее не знает откуда брать и куда впихнуть невпихуемое. Если имена реквизитов совпадают просто скопирует из источника в приемник по примеру ЗаполнитьЗначенияСвойств и все. Более сложные случаи - сам. Руцями.
   Василий Алибабаевич
 
59 - 09.11.20 - 13:08
(57) Слушай. А может тебе пойти другим путем? Накидать внешнюю "обработкуЗаполненияТабличныхЧастей"? Не знаю твоей задачи, но без вмешательства во внутрь стандартных объектов оно ИМХО самое то.
   RomanYS
 
60 - 09.11.20 - 13:08
(57) открыл КА2 и документ реализации. Заполнение ТЧ Товары там предусмотрено:
Процедура ЗаполнитьДокументПоОтбору(Знач ДанныеЗаполнения)
    Если ДанныеЗаполнения.Свойство("РеквизитыШапки") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения.РеквизитыШапки);
    КонецЕсли;
    
    Если ДанныеЗаполнения.Свойство("Партнер") Тогда
        
        Партнер = ДанныеЗаполнения.Партнер;
        
        Если ПолучитьФункциональнуюОпцию("ИспользоватьСоглашенияСКлиентами") Тогда
            ЗаполнитьУсловияПродажПоУмолчанию();
        КонецЕсли;
        
    КонецЕсли;
    
    Если ДанныеЗаполнения.Свойство("ВариантОформленияПродажи") Тогда
        ВариантОформленияПродажи = ДанныеЗаполнения.ВариантОформленияПродажи;
    КонецЕсли;
    
    Если ДанныеЗаполнения.Свойство("Товары") Тогда
        Для Каждого ТекСтрока Из ДанныеЗаполнения.Товары Цикл
            ЗаполнитьЗначенияСвойств(Товары.Добавить(), ТекСтрока);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры
 
 Рекламное место пустует
   Mikeware
 
61 - 09.11.20 - 13:22
(58) Ну вот казалось бы, типовой же случай:
есть все данные для заполнения документа. заполнить, открыть форму незаписанного дока, и предложить юзверю решить - записать как есть, исправить или вообще отменить запись...
типовее некуда...
ан нет...
и всего-то добавить что-то типа:

Для каждого ТабЧасть ИЗ Метаданные.Документы[ИмяОбъекта].ТабличныеЧасти Цикл
  Если ДанныеЗаполнения.Свойство(Табчасть.Имя, ДЗТабчасть) тогда
        Для Каждого ТекСтрока Из ДЗТабчасть Цикл
            ЗаполнитьЗначенияСвойств(Табчасть.Добавить(), ТекСтрока);
   RomanYS
 
62 - 09.11.20 - 13:30
(61) Сделай такую подписку для нужных объектов.
   Mikeware
 
63 - 09.11.20 - 13:54
(62) в общем, как всегда... "...и патронов тоже нет!"©.
   Дык ё
 
64 - 09.11.20 - 14:01
(63) не кипишуй :) восьмерка еще сырая. там нормально сделано только то, что красиво смотрится на слайдах презентаций
   Mikeware
 
65 - 09.11.20 - 14:06
(64) "я знаю!"©анекдот про "формулу всего"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.