Имя: Пароль:
1C
1С v8
КА 8.2 (8.2.14.540) Управляемая форма: не обновляется ТЧ после заполнения
0 Kleo
 
12.03.12
11:55
Помогите, пожалуйста, разобраться с управляемой формой:
есть документ, в нем основная форма - управляемая и дополнительная форма (управляемая), которая открывается по команде, в ней вносятся два реквизита для формирования в дальнейшем запросов, в модуле формы этой доп. формы формируются данные для заполнения основной формы. все выполняется, но по результатам выполнения запроса табличная часть основной формы не обновляется. если после записи документа снова зайти в документ, то видно все изменения - табличная часть становится заполненной. почему они не отображаются сразу? а только после записи и закрытии документа. я уже пробовала вставлять:
ОтобразитьИзменениеДанных(Объект.Материалы,ВидИзмененияДанных.Изменение);

всеравно не помогает((

где и что нужно подправить?
1 Kleo
 
12.03.12
12:39
ап
2 Kleo
 
12.03.12
13:44
ОбновитьОтображениеДанных();

в основной форме при записи и перед записью не помогло(((
3 vmv
 
12.03.12
13:47
заполнение ТЧ, как правило, идет на сервере и если это не при создании на сервере, то для визуализации необходимо, например,

на клиенте
Элемент.Товары.Обновить();

как там Краснодар, стоит?
4 Kleo
 
12.03.12
13:50
заполнение, как раз делается на клиенте. если на сервере, то не заполняет. заполнение делается на клиенте в доп. форме, а не в основной форме, где находится табличная часть, - через отладчик все смотрела, все присваивается.
5 Kleo
 
12.03.12
13:51
хотя попробую.
про Краснодар - не поняла. вы о чем?
6 Kleo
 
12.03.12
14:00
элементы.материалы. обновить() не помогло на клиенте уже в основной форме
7 эцп
 
12.03.12
14:51
(0) Покурите РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.
Не забывайте, что форма работает на клиенте, а вы, скорее всего, что-то изменяете на сервере, а форма об этом просто не знает
8 Kleo
 
13.03.12
05:32
(7) запрос формируется на сервере в модуле доп.формы, а заполнение на клиенте в доп.форме. при этом заполняется ТЧ осн. формы
про РеквизитФормыВЗначение и ЗначениеВРеквизитФормы в курсе, но здесь не про это
9 Web00001
 
13.03.12
05:37
ОповеститьОбИзменении() смотрели?
10 Kleo
 
13.03.12
05:46
пробовала разные способы:

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
   //ОтобразитьИзменениеДанных(Объект.Материалы,ВидИзмененияДанных.Изменение);
   //ОбновитьОтображениеДанных();
   Элементы.Материалы.Обновить();
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
   //ОтобразитьИзменениеДанных(Объект.Материалы,ВидИзмененияДанных.Изменение);
   //ОбновитьОтображениеДанных();
   Элементы.Материалы.Обновить();
КонецПроцедуры

в комментах то, что пробовала до этого...
11 Kleo
 
13.03.12
05:47
(9) где нужно вызвать ОповеститьОбИзменении() ?
12 Kleo
 
13.03.12
05:57
попробовала ОповеститьОбИзменении()  в модуле доп.упр.формы на клиенте

{Документ.МойДок.Форма.ФормаДокументаЗаполнитьПоОстаткам.Форма(220)}: Ошибка при вызове метода контекста (ОповеститьОбИзменении)
   ОповеститьОбИзменении("ДокументСсылка.МойДок");
по причине:
Несоответствие типов (параметр номер '1')
13 Kleo
 
13.03.12
06:06
попробовала ОповеститьОбИзменении()   в модуле осн. формы перед записью и после записи не помогает.

тогда подскажите, пожалуйста, как реализовать решение следующей задачи:
по кнопке на осн. упр.форме нужно вызвать команду - Заполнение ТЧ формы, при вызове команды нужно открывать форму, в которой указать доп. параметры, необходимые для отбора для формирования запроса, чтобы заполнить ТЧ осн. упр. формы. Затем заполнить ТЧ осн.упр.формы.
как сделать?
14 Omskdizel
 
13.03.12
06:19
(8) Мне кажется не очень логичным делать запрос в модуле допформы. Потом хвосты искать... Допформа надо для параметров запроса, вот пусть она их и возвращает. А в модуле основной формы запрос и все действия по заполнению. Насчет того, почему не заполняется - трудно сказать, у меня почему-то заполняется. Может код процедур в студию? Посмотрим, где собака порылась.
15 Ranger_83
 
13.03.12
06:24
(0)Потому что ТЧ формы ссылается на данные объекта,а ежели он не записан,то данные только в табличном поле открытой формы
16 Kleo
 
13.03.12
06:24
(14) так запрос выполняется, заполнение тоже, только заполнение отображается после того, как сохраняется, закрывается документ. заходим - все заполнено.

хорошо, я сейчас так и начала делать параметры задаю на доп.форме. а дальше что? как передать заполнение в осн. форму? указываю ссылку на процедуру модуля осн.формы в модуле доп. формы - пишет, что нет такой процедуры. как передать эстафетную палочку на выполнение всего заполнения в осн. форме?
17 Kleo
 
13.03.12
06:25
(15) тогда нужно записать изменения? как?
18 Ranger_83
 
13.03.12
06:28
Записать()
19 Ranger_83
 
13.03.12
06:31
Еще другой форме нужно сообщить о том,что данные в объекте изменились.
Оповестить() в доп.форме и ОбработкаОповещения() в другой.
В обработчике оповещения обновить табличное поле на форме
20 Omskdizel
 
13.03.12
06:32
(15) Зачем быть записанными, если достаточно быть заполненными данные объекта? Как вообще тогда отображаются данные в созданном но не записанном документе?

(16) Ну если грубо, то на форме кнопка, она выполняет команду, команда сначала открывает допформу, которая заполняет параметры запроса и возвращает их в команду ну и далее запрос и прочие действия...
21 Kleo
 
13.03.12
06:34
хорошо расскажу, как реализаую:

есть док. "МойДок", в котором есть осн. упр.форма. создаю команду "ЗаполнитьПоОстаткам" в документе, модуль команды:

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

КонецПроцедуры

ФормаДокуметаЗаполнитьПоОстаткам - это доп. форма, в которй задаются параметры, нужные для отбора: Склад и Номенклатура.

Далее в модуле этой формы "ФормаДокуметаЗаполнитьПоОстаткам" создаю процедуры:

&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
   // Вставить содержимое обработчика.
       
   Если Объект.Материалы.Количество() > 0 Тогда
       
       ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
       Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );
       Если Ответ <> КодВозвратаДиалога.Да Тогда
           Возврат;
       КонецЕсли;
       
       Объект.Материалы.Очистить();
   КонецЕсли;
   

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

   Закрыть(Истина);
КонецПроцедуры

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


все. заполнение происходит, но появляется только после закрытия и повторного открытия документа.
22 Ranger_83
 
13.03.12
06:34
(20)У нее 2 формы
23 Kleo
 
13.03.12
06:36
(19) где и как полностью написать вызов этих функций?
24 Kleo
 
13.03.12
06:45
в осн.форме создала процедуру:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   //Вставить содержимое обработчика
   Элементы.Материалы.Обновить();
КонецПроцедуры


а Оповестить() где в доп.форме разместить? в Процедура ЗаполнитьПоОстаткам(Команда) можно?
25 Kleo
 
13.03.12
07:13
Ranger_83, подскажи, пожалуйста, как в Оповестить() указать ссылку на другую осн.форму, если, как тебя поняла Оповестить() нужно разместить в модуле доп.формы. так?
26 Kleo
 
13.03.12
07:21
добавила
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
   Оповестить();
КонецПроцедуры

не помогло. все равно не обновляет табличную часть динамически...
27 Kleo
 
13.03.12
07:28
Omskdizel, вы написали "Ну если грубо, то на форме кнопка, она выполняет команду, команда сначала открывает допформу, которая заполняет параметры запроса и возвращает их в команду ну и далее запрос и прочие действия..."
команда есть, открывает доп.форму, заполняется параметры.... а вот далее запрос и прочее как? где? потому что если указываю ссылку на процедуру модуля осн.формы в модуле доп. формы, то пишет, что нет такой прооцедуры! как быть?
28 Ranger_83
 
13.03.12
08:06
(24)Оповестить("ОстаткиЗаполнены") можно разместить где угодно,главное чтобы данные записались в объект.
Например,в Процедуре ЗаполнитьПоОстаткам(Команда) после Записать().
////
(25)
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   //Вставить содержимое обработчика
Если ИмяСобытия="ОстаткиЗаполнены" Тогда
   Элементы.Материалы.Обновить();
КонецЕсли;
КонецПроцедуры

Тут http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=562000&threadtype=0
почитай еще для общего развития
29 Omskdizel
 
13.03.12
08:24
(28) Ну вот хоть убей - не пойму, зачем обязательно записывать объект, чтобы данные отобразились.

(27) Уточните плиз, в какой момент команда вызывается, или каким образом? Если по нажатию кнопки, то где эта кнопка расположена?
30 Kleo
 
13.03.12
09:00
(29) команда документа. кнопка расположена на форме осн.формы
(28) попробую еще раз. но не работает всеравно...
31 Kleo
 
13.03.12
10:32
(28)  Ranger_83, спасибо большое. но не помогает, видимо это связано как-то  реализацией самого документа. документ самописный - не мною. видимо что-то в нем не так. он сам вообще все записывает при изменении реквизитов.
например, я создаю новый док, выбираю в нем организацию и прежде, чем мне вызвать команду заполнения он просит сохраниться - я это не реализовывала, и затем хочу в открывшейся доп.форме выбрать склад, он пишет, что документ заблокирован мною же. закрываю док, захожу снова и тогда могу спокойно выбирать склад. такая же ситуация и с заполнением. заполнение реализуется, но отображается только после того, как закрыть док и снова открыть.
32 Omskdizel
 
13.03.12
10:36
Сейчас загрузится УТ11, чтобы было хоть где поэкспериментировать. Но то, что вы описали в (31) очень уж странно.
33 Omskdizel
 
13.03.12
10:40
Попробуйте к типовому документу такую штуку прикрутить.

Кстати, а табличная часть на какие данные ссылается? Может таблица на форме только При открытии отрисовывается?
34 Kleo
 
13.03.12
11:04
(33) табличная часть не прорисовывается, прописана в данных документа
прикуртить к другому типовому доку долго, т.к. в КА нет почти док-в типовых на управляемых формах. а если пробовать, то на упр.формах. только УТ остается.
35 vmv
 
13.03.12
11:23
Записать();
Перечитать();

эта шняга и в 8.1. была если работать с заполнением с извращениями и допформами
36 vmv
 
13.03.12
11:25
Прочитать() вернее
37 vmv
 
13.03.12
11:27
(31) если данные объекта изменены и не сохранены, то и возникает сообщение о блокировке при попытке использования данных объекта - 82 тут ни при чем, так было всегда. прочитать() спасает
38 freelanc
 
13.03.12
11:28
(0) была такаяже проблема в начале работы на УГ11. Как оказалось надо было просто забыть идеологию работы на 1С8.1.
Посмотрел как работают типовые вещи типа стандартные обработки табличных частей "ПриИзмененииКоличества" например и теперь уже даже не помню как на 8.1 было и что я такого делаю чтобы таких вопросов как ваш не возникает.

(35) Записать и Перечитать после чего в базе появится куча не нужных документов. ну или документы которые задним число перепроведятся и нарушают последовательность движений.
39 vmv
 
13.03.12
11:30
(38) по последнему абзацу вы адекватно воспринимаете метод обновления данных объекта(чтения записанных данных из БД)   или просто решили написать чушь?
40 Kleo
 
13.03.12
11:31
Взяла УТ 11. Внесла команду "ЗаполнитьПоОстаткам" в ней процедура

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


далее создала форму "ФормаЗаполнить" - управляемая. в ней одно поле "Склад" и процедура:


&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
   // Вставить содержимое обработчика.
   
   СтрокаТабличнойЧасти = Объект.Товары.Добавить();
       
       
       СтрокаТабличнойЧасти.Количество   = 1;
       СтрокаТабличнойЧасти.Склад        = СкладЗаполнитьПоОстаткам;
       
       Записать();
   Оповестить("ОстаткиЗаполнены");
   Закрыть(Истина);


КонецПроцедуры


в модуле формы "ФормаДокумента" в процедуре ОбработкаОповещения добавила свой код

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   
   ...
       ...
   
   Если ИмяСобытия="ОстаткиЗаполнены" Тогда
       Элементы.Товары.Обновить();
   КонецЕсли;


КонецПроцедуры



та же ситуация- так же заполняет, но нужно закрыть,а  потом отркыть док. значит не в доке дело, а в моем методе реализации задачи
41 freelanc
 
13.03.12
11:35
(39) ну судя по Вашим комментам в других темах Вы особо то не спец. Предлагать принудительную запись это лишать пользователя возможности откатить свои действия(удалила случайно строчку и все гудбай). Тем более в (40) девушка продемонстрировала что это не оченьто и помогает. И тем более можно обойтись без этого.
42 Kleo
 
13.03.12
11:38
(38) так что вы предлагаете для реализации? что конкретно?
(36) Прочитать() не помогло
43 vmv
 
13.03.12
11:38
(41) вы можете считать как угодно - это ваше право, но проблема именно в этом в допформе происходит модификация объекта, который уже модифицирован и не записан - это типичная ошибка, детали не так у ж и важны
44 vmv
 
13.03.12
11:41
+(41) вы конспектируете мои вбросы знаний - это правильный путь, возможно вы станете зубром)
45 freelanc
 
13.03.12
11:44
(42) ОбработкаВыбора в ЗаказКлиента в УГ11 посмотрите. Там цепочка вызовов которая Вам нужна.
46 freelanc
 
13.03.12
11:45
(42) еще раз. не делайте принудительные записи. лишаете юзера возможности отката своих действий.
47 vmv
 
13.03.12
11:45
(42) а так?

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   
   ...
       ...
   
   Если ИмяСобытия="ОстаткиЗаполнены" Тогда
       ПрочитатьНаСервере();      
       Элементы.Товары.Обновить();
   КонецЕсли;


КонецПроцедуры

&НаСервере
Процедура ПрочитатьНаСервере()    
Объект.Прочитать();
КонецПроцедуры
48 vmv
 
13.03.12
11:46
(46) ты (31) чиатал? ее вынуждают это делать и вопрос так не стоит вообще в постановке задачи)
49 Кокос
 
13.03.12
11:50
(48) кто вынуждает?
50 vmv
 
13.03.12
11:58
вообщем так

1. открывается форма объекта, допустим, Документ.РасходДС
(49) кто-то из создатаетелей этого документа заложил механизм при выборе организации, чтобы была доступна команда вызова формы заполнения остатков - возникает вопрос сохрангения, видимо чтобы работать со ссылкой.

Будем гадать, что происходит далее, в команду поступает ссылка только что записанного документа "ПараметрыВыполненияКоманды.Источник"

ОткрытьФормуМодально(ИмяФормы, ПараметрыФормы, ПараметрыВыполненияКоманды.Источник)

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

Далее происходит вызов оповещения о заполнении остатков, но они заполнены для другого объекта, не того что был открыт изначально.

Ваши аргументы господа спецы к этому варианту развития событий или будем важно крутить носом?)
51 Kleo
 
13.03.12
11:59
Объект.Прочитать(); - такой метод не обнаружен
52 vmv
 
13.03.12
12:01
(51)

описание в (50) верно?
53 Omskdizel
 
13.03.12
12:02
Ребяты, ну какой смысл ругаться, да еще и на личности переходить?

2Kleo: Ну вот смотрите. Сделал документ, в нем табличная часть. На форме кнопка, команда прикручена к форме документа. Код модуля формы:


&НаСервере
Процедура ЗаполнитьНаСервере()
   
   Для Н = 1 По 3 Цикл
       Стр = Объект.Товары.Добавить();
       Стр.Реквизит1 = "Текст1+"+Н;
       Стр.Реквизит2 = "Текст2+"+Н;
       Стр.Реквизит3 = "Текст3+"+Н;
   КонецЦикла;
   
КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)
   
   ЗаполнитьНаСервере();
   
КонецПроцедуры


Все спокойно заполняется и отрисовывается. Остается прикрутить вызов допформы, поймать из нее параметры и сделать запрос.
54 Кокос
 
13.03.12
12:07
(53) об чем и речь. В ОбработкаВыбора все так и есть. Почемубы ее и не использовать.

Вызвать доп форму при закрытии которой вызывать код чтото типа:
Если ПеренестиВДокумент Тогда
   
   АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
   Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
   ПеренестиВДокумент = Истина;
   ОповеститьОВыборе(Структура);
   
КонецЕсли;

а в обработке выбора поймать данные и обновить
55 vmv
 
13.03.12
12:09
(53)  там где я - всегда скандалы, интриги, поножовщина, пожары...
это работа в рамках одной формы одного объекта, там все просто, но ведь задача так не стоит, хотя грамотно делать примерно так.

(51) как это не обнаружен, если в (50) история событий примерно похожа, то
ДокументОбъект.<Имя документа> (DocumentObject.<Имя документа>)
Прочитать (Read)
Синтаксис:

Прочитать()
Описание:

Считывает данные документа из базы данных.

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

Сервер, толстый клиент, внешнее соединение.
Примечание:

Позволяет прочесть данные заново. Недопустим для нового объекта.
Пример:

РасходнаяНакладная.Прочитать();

надо перечитать данные того объекта из которого была вызвана команда ибо заполнение в допформе другого экземпляра объекта то возможно, а вот запись нет, да он будет ругаться, что объект уже блокирован. Вообще передавать нужно в допформы либо весь объект через РеквизитФормыВзанчение() либо данных формы, а использовать в вызове команды ссылку открытого объекта, модифицировть его где-то и пытаться увидеть модификации в первой форме - от лукавого
56 Omskdizel
 
13.03.12
12:11
(54) Ну ду, этот механизм и прикрутить.

Я не знаю как из других форм, но из модуля родной формы все отрисовывается безо всяких танцев с бубном. Я почему и говорю, что не надо из другой формы заполнять текущую, чтобы можно было легко контролировать код - все, что относится к текущей форме лучше чтобы было в ее модуле.
57 Omskdizel
 
13.03.12
12:16
(55) После кода комментарий смотрите. Сейчас просто несколько некогда еще и допформу прикручивать и код проверять.
58 Kleo
 
13.03.12
12:28
(45) в ОбработкаВыбора() я смотрела. тем более, что уже есть такая процедура, но не пойму, как прикрепить к моей команде, где при вызове команды у меня открывается доп.форма, а на ней кнопка Заполнить, по которой вызывается заполнение. как понимаю, нужно передать те параметры, которые выберу на доп. форме в обработку ОбработкаВыбора() ... вот только мало работала с управлемыми формами.... не знаю, как подойти к решению этого вопроса...
59 vmv
 
13.03.12
12:30
приведу пример как я работаю с доп формами в УФ и без ващего геммороя, схема кастрирована, но вполне шаблонизирована и ее можно легко модифицировать и под эту задачу и под любую другую - все работает и проверено.

приведу два блока шаблонизированного кода по заполнению ТЧ ДокументаОбъекта в УФ.

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

1-й блок

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Документ.Add_DC_СуточныйРапорт.Форма.ФормаДокумента.Модуль
// Автор: vmv, 2012
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// Обработчики команд

// --- Общие команды табличных частей документа. ТЧ "Режим" /////////////////////////////////////////////////////////////

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

   // Получение имени вызываемой формы
   //Параметры.СтрукураИменаВызываемыхФорм.Свойство("ЗагрузкаЭксельРежим" ,ВызываемаяФормаИмя);
   //Если ВызываемаяФормаИмя = Неопределено Тогда
   //   Предупреждение("В параметрах формы не установлено имя формы по ключу ""ЗагрузкаЭксельРежим""", 10);
   //   Возврат;    
   //КонецЕсли;
   //
   
   // Упростил для форума
   ВызываемаяФормаИмя = "Обработка.Add_DP_СуточныйРапортОперации.Форма.ФормаЗагрузкаЭксельРежим"
   
   // Инициализируем параметры вызываемой формы
   ВызываемаяФормаПараметры = Новый Структура;
   ВызываемаяФормаПараметры.Вставить("ЗначенияЗаполнения", Новый Структура("СуточныйРапорт", Объект.Ссылка));
   
   // Попытка получения вызываемой формы с передачей в качестве владельца этой формы
   Попытка
       ВызываемаяФорма = ПолучитьФорму(ВызываемаяФормаИмя, ВызываемаяФормаПараметры, ЭтаФорма, УникальныйИдентификатор);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   // Попытка открытия вызываемой формы с выполнением в ней действий обусловленных ею
   Попытка
       ОбовленыДанные = ВызываемаяФорма.ОткрытьМодально();
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
         
   // Выполненение действий после закрытия вызываемой формы, если она была открыта модально
   Если ОбовленыДанные <> Неопределено Тогда
       Если ОбовленыДанные Тогда
           РежимОбновитьСредниеЗначения();
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры

2-й блок

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обработка.Add_DP_СуточныйРапортОперации.Форма.ФормаЗагрузкаЭксельРежим.Модуль
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// Обработчики формы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   Если Не ИнициализацияСервер() Тогда
       СтандартнаяОбработка = Ложь;
       Отказ = Истина;
       Возврат;
   КонецЕсли;
   
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
   Если Не ИнициализацияКлиент() Тогда
       Отказ = Истина;
       Возврат;
   КонецЕсли;
       
КонецПроцедуры



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// Обработчики команд

&НаКлиенте
Процедура КомандаВыполнитьГлавноеДействие(Команда)
   
   ОбовленыДанные = ОбновитьДанныеРапортаРежим();
   
   Закрыть(ОбовленыДанные);
   
КонецПроцедуры



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////// Вспомогательные методы

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

&НаКлиенте
Функция ИнициализацияКлиент()
   
   Если ТипЗнч(ВладелецФормы) <> Тип("УправляемаяФорма") Тогда
       Возврат Ложь;
   КонецЕсли;
   
   // Проверка заполнения обязательных реквизитов при инициализации на сервере
   Если ВладелецФормы.Объект.Ссылка.Пустая() Тогда
       Возврат Ложь;
   КонецЕсли;
   
   Возврат Истина;
   
КонецФункции

&НаКлиенте
Функция ОбновитьДанныеРапортаРежим()
   
   // Произведем необходимые проверки заполнения перед загрузкой
   Если Не ЗначениеЗаполнено(ВладелецФормы.Объект.Дата) Тогда
       Предупреждение("Не выбрана дата рапорта", 10);
       Возврат Ложь;
   КонецЕсли;

   Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
       Предупреждение("Не выбран путь к файлу данных", 10);
       Возврат Ложь;
   КонецЕсли;
   
   Возврат ЗагрузитьДанныеИзФайлаВТабличнуюЧастьРежим();
   
КонецФункции

&НаКлиенте
Функция ЗагрузитьДанныеИзФайлаВТабличнуюЧастьРежим()
   
   // .......
   
   ДфК = ВладелецФормы.Объект.Режим;  // Данные формы коллекция "Режим"
   ДфК.Очистить();
       
   Для Row = РежимНомерНачальнойСтроки По РежимНомерПоследнейСтроки Цикл
       
       СтруктураСтрокиДанных = Новый Структура;
       
       ///////////////// Чтение данных строки в переменные
       //
       МоментВремени   = ExcelЛист.Cells(Row, 1 ).Value;
       //
       Давление        = ExcelЛист.Cells(Row, 2 ).Value;
       Температура     = ExcelЛист.Cells(Row, 3 ).Value;
       // ....
       //
       //....
               
       СтруктураСтрокиДанных.Вставить("МоментВремени"             , МоментВремени);
           
       СтруктураСтрокиДанных.Вставить("Давление"   , Add_ComM_ТИСКлиент.ПреобразоватьВЧисло(Давление));
       СтруктураСтрокиДанных.Вставить("Температура", Add_ComM_ТИСКлиент.ПреобразоватьВЧисло(Температура));
       
       // ....
       
       ДфЭК = ДфК.Добавить();   // элемент коллекции, строка "Режим"
       
       ЗаполнитьЗначенияСвойств(ДфЭК, СтруктураСтрокиДанных);
       
   КонецЦикла;

   Попытка
       ExcelКнига.Close();
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
   // Перед загрузкой табличная часть документа очищается и если она содержит строки,
   // значит загрузка произведена
   Возврат ДфК.Количество();                  
   
КонецФункции



кушойте и никакого гимора с блокировками, пероедачей ссылок и прочей мути, надеюсь все понятно
60 vmv
 
13.03.12
12:33
+(59) в вызываемой форме нужно установить флаг "Получать из данных заполнения для реквизитов формы"
61 Omskdizel
 
13.03.12
12:37
(58) Команда в таком случае не делает ничего, кроме вызова допформы. ОбработкаВыбора() ловит событие, по структуре полученных данных понимаете, что это из допформы, берете эти данные и заполняете документ как вам надо.
62 Kleo
 
13.03.12
12:39
(52) я поняла, что не в доке дело, а вообще в методе реализации. т.к. в УТ 11 попробовала сделать та же песня. смысл в том, что сохранение не прописано нигде, оно требуется даже при заполнении в УТ
63 vmv
 
13.03.12
12:40
ГЛАВНОЕ - при заполнении табличных частей на УФ с использрованием вызова дополнительних формы, в качестве ВЛАДЕЛЬЦА ДопФормы  нужно передавать форму открытого объекта, как я и делаю.

Тогда в ДопФорме у вас будет доступен контекст первой формы и вы просто заполняте табличные чати через элементы контеста формы-владельца и усе
64 Omskdizel
 
13.03.12
12:40
+(61) Там даже не по структуре данных а по источнику, он вторым параметром в ОбработкаВыбора() передается.

(62) Блин... Сохранять НЕ надо. Просто заполняйте форму из ее же модуля, пользуйте допформу только для получения выбранных параметров.
65 Kleo
 
13.03.12
12:40
(55) ошибка выдается конфигурации и при вызове контекстного меню нет такой процедуры Прочитать()
66 Omskdizel
 
13.03.12
12:42
(63) Не надо таким образом заполнять форму, потом запаришься искать, откуда что берется на форме. Буквально недавно на подобное нарвался, когда чужой код разгребал. Правда не на УФ.
67 vmv
 
13.03.12
12:42
(62) мой метод не требует даже сохранения дока, я его делаю только потому, что там строгий учет по моментам времени, а так контекст формы он и в африке контекст формы и вовсе не обязательно должен содержать данные сохраненного в базе объекта.

Эта все господа спецы, вводных данных я дал достаточно, но мы можете проджолжать пилить ногти пилочкой или что там у вас)
68 vmv
 
13.03.12
12:43
(66) если ты посмотрить мой код 5 минут, то не увидишь там косяков, если кто-то пишет криво то это его проблемы не мои и отвергать элементарную логику глупо только потому, что в мире полно идиотов!
69 Кокос
 
13.03.12
12:43
(67) Аминь
70 Kleo
 
13.03.12
12:45
(53) так вы прикрутили к осн.форме. а откуда параметры взять для запроса, которые нужно выбратьв  доп.форме? в осн. форме понятно, что будет все работать
71 Кокос
 
13.03.12
12:47
(70) также передать при вызове допформы. ничем практически от 8.1 не отличается
72 Kleo
 
13.03.12
12:47
(61) как это сделать? мало опыта, непоятно, куда и что?
73 Kleo
 
13.03.12
12:49
(71) делала, заполняет, но заполнение отражается только после того, как выйдешь из дока и снова зайти. все, как реализлвывала - написанов данной ветке. хочется именно корректировок в моем коде или объясните как передать параметры из доп.формы в осн.форму?
74 Omskdizel
 
13.03.12
12:49
(70) Так, еще раз и по пунктам.

1. Команда - вызывает форму.
2. Доп форма оповещает о выборе пользователем параметров для запроса.
3. ОбработкаВыбора() ловит эти параметры и вызывает например процедуру, аналогично ЗаполнитьНаСервере() в (53)

Как вернуть из допформы параметры смотрите в (54) в частности метод ОповеститьОВыборе(Структура)
75 Кокос
 
13.03.12
12:50
(73) смотри (54) Оповестить о выборе.
76 vmv
 
13.03.12
12:50
(72)

ВызываемаяФормаПараметры.Вставить("ЗначенияЗаполнения", Новый Структура("СуточныйРапорт, Параметр1, Параметр2", Объект.Ссылка, Параметр1, Параметр2));

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

как их прочесть указано в коде выше
77 Omskdizel
 
13.03.12
12:51
+(74) Оповещается та форма, которая указана в параметре Владелец при вызове ОткрытьФормуМодально(), т.е. ОбработкаВыбора() сработает в форме Владельца
78 Kleo
 
13.03.12
12:53
(59) 2-блок: меня интересует откуда взялась переменная ВладелецФормы?
79 vmv
 
13.03.12
12:53
а это обратный возврат, зачем вообще передавать данные, только результат успех/не успех.

допформа как раз и должна брать на себя все функции заполнения, не гоняя массивы данных туда/сюда, иначе практичического смысла в нет просто нет
80 Kleo
 
13.03.12
12:53
(77) попробую реализовать
81 vmv
 
13.03.12
12:54
(78)

Попытка
       ВызываемаяФорма = ПолучитьФорму(ВызываемаяФормаИмя, ВызываемаяФормаПараметры, ЭтаФорма, УникальныйИдентификатор);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;


ЭтаФорма
82 Omskdizel
 
13.03.12
12:54
2Kleo: Если вы пытаетесь понять все, что написано, то смотрите по отдельности сообщение vmv, у него подход как вы планировали сделать. По мне так то, что описываю я и graviton в общем-то проще. Но тут на вкус и цвет как говорится.
83 Kleo
 
13.03.12
12:55
(78) вы куски выхватываете... а где это описывать? вообще запуталась
84 Kleo
 
13.03.12
12:56
(82) у него я вообще ничего не поняла. лучше вообще сделать как-то по-другому...
85 Omskdizel
 
13.03.12
12:56
(79) Массивы она не гоняет, а только параметры запроса.
(83) ОткрытьФормуМодально(<ИмяФормы>, <Параметры>, <Владелец>) Вот он Владелец формы. Туда передавайте ЭтаФорма.
86 Omskdizel
 
13.03.12
12:58
2vmv: В вашей схеме я бы сделал через другую форму только в одном случае - если это заполнение находится в другой обработке и требуется ее использование не в одном документе.
87 Kleo
 
13.03.12
13:00
(74) хорошо. ваш план:

1. Команда - вызывает форму.
2. Доп форма оповещает о выборе пользователем параметров для запроса.
3. ОбработкаВыбора() ловит эти параметры и вызывает например процедуру, аналогично ЗаполнитьНаСервере() в (53):

Вызвать доп форму при закрытии которой вызывать код чтото типа:
Если ПеренестиВДокумент Тогда
   
   АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
   Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
   ПеренестиВДокумент = Истина;
   ОповеститьОВыборе(Структура);
   
КонецЕсли;

а в обработке выбора поймать данные и обновить

но у меня тогда куча вопросов по этому кусочку кода? что такое ПоместитьТоварыВХранилище()?
88 Omskdizel
 
13.03.12
13:02
(87) В этом куске вам надо только ОповеститьОВыборе(Структура)

В Структура запихиваете все выбранные параметры для запроса с этой допформы.
89 Kleo
 
13.03.12
13:06
можно, пожалуйста, по моему коду:

в модуле доп.формы у меня процедура и функция:

&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
   // Вставить содержимое обработчика.
       
   Если Объект.Материалы.Количество() > 0 Тогда
       
       ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
       Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );
       Если Ответ <> КодВозвратаДиалога.Да Тогда
           Возврат;
       КонецЕсли;
       
       Объект.Материалы.Очистить();
   КонецЕсли;
   

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

&НаСервере
Функция ЗаполнитьПоОстаткамНаСервере()
   Документ = РеквизитФормыВЗначение("Объект");
     ДатаОстатков = НачалоДня(Документ.Дата+1);
   Запрос = Новый Запрос;
....
ЗначениеВРеквизитФормы(Документ, "Объект");
   ТЗ = Запрос.Выполнить().Выгрузить();
   Возврат ТЗ;    
КонецФункции

есть в модуле осн.формы процедура:



&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)


КонецПроцедуры


как мне связать выбранные в моей процедуре ЗаполнитьПоОстаткам(Команда) и ОбработкаВыбора()

как передать в ВыбранноеЗначение мои поля Склад и Номенклатура на доп.форме в виде структуры в параметр ВыбранноеЗначение ?
90 Omskdizel
 
13.03.12
13:06
Кстати, попробуйте сначала также как у меня в коде тупо заполнить табличную часть и посмотреть, заполнится она или нет. А то может эти события пока и городить не стоит :)
91 Kleo
 
13.03.12
13:07
(88) где мне этот ксок вставить?

Если ПеренестиВДокумент Тогда
   
   АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
   Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
   ПеренестиВДокумент = Истина;
   ОповеститьОВыборе(Структура);
   
КонецЕсли;

откуда ПоместитьТоварыВХранилище() ? можно объяснить на моем примере? я просто элементарно не пойму, куда и что вставить?
92 Kleo
 
13.03.12
13:07
(90) а какой смысл делать как у вас? если у меня точно также сделано? смысл?
93 Kleo
 
13.03.12
13:09
ничего не поняла, чем ваш код от моего-то отличается? вы мне скажите, по моему примеру, как мне перенести из доп. формы в осн. форму параметры?
94 Кокос
 
13.03.12
13:09
(91) при нажатии кнопки ОК(при закрытии доп формы)
95 Omskdizel
 
13.03.12
13:10
(93) Ваш код кардинально отличается тем, что вы заполняете табчасть из допформы, а я из основной формы
96 Kleo
 
13.03.12
13:10
вы в (53) сделали процедуру заполнения в осн.форме. это можно сделать, если будут параметры, а у меня  их в основной форме нет.... я вообще запуталась
97 Kleo
 
13.03.12
13:12
(94) что значит "при нажатии кнопки ОК(при закрытии доп формы)"? вы сами прочитайте, что написали?

что за процедура ПоместитьТоварыВХранилище() ?? что в ней происходит. где пишется этот код? в доп. или осн.форме?
98 Omskdizel
 
13.03.12
13:12
(96) Представьте, что это запрос и он выполняется с уже переданными параметрами. У вас две задачи к решению - заполнить форму и передать параметры. Решайте их по отдельности.
99 Kleo
 
13.03.12
13:12
ПеренестиВДокумент? что это за переменная?
100 Кокос
 
13.03.12
13:12
(96) в кнопке на основной форме открываете доп форму с параметрами

как у вмв только без остального мусора:

 
   // Инициализируем параметры вызываемой формы

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

   Попытка
       ВызываемаяФорма = ПолучитьФорму(ВызываемаяФормаИмя, ВызываемаяФормаПараметры, ЭтаФорма, УникальныйИдентификатор);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
   
   // Попытка открытия вызываемой формы с выполнением в ней действий обусловленных ею

   Попытка
       ОбовленыДанные = ВызываемаяФорма.ОткрытьМодально();
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат;
   КонецПопытки;
101 Кокос
 
13.03.12
13:13
(99) Можете не писать ПеренестиВДокумент.
просто в ПриЗакартии() пишете

 АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
   Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
   ПеренестиВДокумент = Истина;
   ОповеститьОВыборе(Структура);
102 Кокос
 
13.03.12
13:14
ПриЗакрытии.
103 Kleo
 
13.03.12
13:14
(98) как заполнить в осн.форме я знаю, такое делала. а вот как передать, подскажите, пожалуйста, на моем примере на примере процедуры, вызываемой из доп.формы

&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
   // Вставить содержимое обработчика.

   
   // здесь что написать, чтобы передать параметры в осн.форму?

   
   
   Закрыть(Истина);
   
КонецПроцедуры
104 Kleo
 
13.03.12
13:15
(101) где это написать? в доп.форме?
105 Kleo
 
13.03.12
13:15
что такое ПоместитьТоварыВХранилище()?
106 vmv
 
13.03.12
13:15
(86) Табличная часть "Режим" только одна из несколькох ТЧ документа с которым(ми) работают несколько пользователей, если все загрузчики лепить в модуле формы документа, то он станет монстроидальным. Да и вообще у меня давно строгое правило - все загрузчики выносить на допформы, ибо документ должен давать стандартные средсва редактирования строк и т.д., а держать в его модуле алгоритмы загрузки - моветон. Если учесть, что источники могут быть какие угодно, то это глупо вдвойне.

что там в коде непонятного, упрощено до предела, поменять имена форм и объектов и все
107 Кокос
 
13.03.12
13:16
пример функции
&НаСервере
Функция ПоместитьТоварыВХранилище()
   
   Товары = ТаблицаТоваров.Выгрузить(ТаблицаТоваров.НайтиСтроки(Новый Структура("Выбран", Истина)));
   
   Серии = Новый ТаблицаЗначений;
   Серии.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
   Серии.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
   Серии.Колонки.Добавить("Серия", Новый ОписаниеТипов("СправочникСсылка.СерииНоменклатуры"));
   Серии.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,3)));
   
   Если ПолучатьСерииНоменклатуры Тогда
       
       Запрос = Новый Запрос;
       СформироватьТекстЗапросаПоСериямДокументаПоступления(Запрос.Текст);
       Запрос.УстановитьПараметр("ТаблицаТовары", Товары);
       Запрос.УстановитьПараметр("Документ", ДокументПоступления);
       
       ВыборкаПоНоменклатуре = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
       Пока ВыборкаПоНоменклатуре.Следующий() Цикл
           
           ВыборкаПоХарактеристикам = ВыборкаПоНоменклатуре.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           Пока ВыборкаПоХарактеристикам.Следующий() Цикл
               
               КоличествоКРаспределению = ВыборкаПоХарактеристикам.КоличествоВыбрано;
               Выборка = ВыборкаПоХарактеристикам.Выбрать();
               Пока Выборка.Следующий() Цикл
                   
                   СтрокаСерии = Серии.Добавить();
                   ЗаполнитьЗначенияСвойств(СтрокаСерии, Выборка);
                   КоличествоКРаспределению = КоличествоКРаспределению - СтрокаСерии.Количество;
                   Если КоличествоКРаспределению < 0 Тогда
                       СтрокаСерии.Количество = СтрокаСерии.Количество + КоличествоКРаспределению;
                       Прервать;
                   КонецЕсли;
               КонецЦикла;
               
               Если КоличествоКРаспределению < 0 Тогда
                   Продолжить;
               КонецЕсли;
               
           КонецЦикла;
           
       КонецЦикла;
       
   КонецЕсли;
   
   ВозвращаемаяСтруктура = Новый Структура("Товары, Серии", Товары, Серии);
   
   АдресТоваровВХранилище = ПоместитьВоВременноеХранилище(ВозвращаемаяСтруктура, УникальныйИдентификатор);
   
   Возврат АдресТоваровВХранилище;
   
КонецФункции // ПоместитьТоварыВХранилище()
108 Kleo
 
13.03.12
13:17
(107) вы можете ответиь на простой вопрос, где пиштся ваш код? и какое отношение он имеет к решению моей задачи?
109 Кокос
 
13.03.12
13:18
(103)
пишешь один в один

   АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
   Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
   ПеренестиВДокумент = Истина;
   ОповеститьОВыборе(Структура);


а серверную функцию ПоместитьТоварыВХранилище реализовываешь по своему.
110 Кокос
 
13.03.12
13:18
ПоместитьВоВременноеХранилище это стандартная функция
111 vmv
 
13.03.12
13:19
(103)

// здесь что написать, чтобы передать параметры в осн.форму?


что есть "параметры" в этой фразе
- результат операции загрузки: обновлено/не обновленно
- данные загрузки: структура полученных строк

в любом случае передать что-либо из допформы в основную можно двумя способами
1. если в допформе есть контекст основной формы
2. через обработку оповещений + хранилище
3. эмуляции глобальных значений - не рассматриваем
112 vmv
 
13.03.12
13:22
(110) я считаю, что использовать хранилище нужно только тогда, когда работа с данными через контексты формы невозможна.

Ведь операция помещения в хранилище и потом извлечение из него весьма прожорливы да и головомойка с назначением адресов, передачей управления и т.д.
А если в ТЧ 50К строк и что помещать/извлекать в хранилище, а если это еще в цикле создания документов за период при загрузке из внешних - не дорогое удовольствие?
113 Kleo
 
13.03.12
13:22
(110) вы читаете мои вопросы? я про ПоместитьВоВременноеХранилище вопрос не задавала...

(111) все тупо до безумия, а вы горы кода приводите, который мне не нужен.

тупо есть доп формы. в ней есть два поля Склад и Номенклатура. нужно их передать в процедуру осн.формы ОбработкаВыбора в параметр ВыбранноеЗначение. вы мне про это скажите? зачем мне ваш код?
114 vmv
 
13.03.12
13:25
(113) я бы сказал иначе, все просто до безумия, но вы путаетесь в базовых понятих, думаю даже литерал "контекст формы" вами не совсем осознан, пичаль
115 Кокос
 
13.03.12
13:26
(113) ну тут люди показывают как надо. А Вы хотите чтобы всё написали за Вас. Тогда просто выложите ТЗ и может кто нибудь напишет именно то что Вам нужно. Может как тут говорят и "взлетит с фоткой"
116 Kleo
 
13.03.12
13:29
(115) так вы привели куски кода и даже ответить по своему коду не можете, куда его вставить и где написать.
117 Kleo
 
13.03.12
13:33
(114) вообще-то это вы путаетесь в понятиях. эти все понятия мне знакомы. просто я у вас по вашему же коду спрашиваю, вы не отвечаете.
зачем мне ваш код, он даже близко мне не подходит?

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

Omskdizel, спасибо за помощь, но вы опять же приводит пример противоположного кода, когда заполняете ТЧ из осн.формы. вы попробуйте мой кусок кода встаить и проверить. зачем проверять противоположное решение???
118 vmv
 
13.03.12
13:36
(113) это совсем просто, конкретный ответ на конктретный вопрос)

В модуле формы документа
СтрутураВозврата = Допформа.ОткрытьМодально();

В модуле допформыформы

&НаКлиенте
Процедура КомандаСкладИНоменклатураПередать(Команда)
   
       СтруктураВозврата = Новый Структура("СкладВДопФорме, НоменклатураВДопФорме", Склад, Номенткратура);
   ОбовленыДанные = ОбновитьДанныеРапортаРежим();
   
   Закрыть(СтруктураВозврата);
   
КонецПроцедуры
119 vmv
 
13.03.12
13:37
ОбовленыДанные = ОбновитьДанныеРапортаРежим();
это лишнее

просто я показал, что ответ на этот вопрос уже был)
120 Kleo
 
13.03.12
13:39
хорошо, а :

В модуле формы документа
СтрутураВозврата = Допформа.ОткрытьМодально();


это где нужно прописать? в какой процедуре?
121 Kleo
 
13.03.12
13:39
и зачем снова ее открывать?
122 vmv
 
13.03.12
13:40
может мне кто-нибудь поскажет как написать еще проще, ну не знаю мож язык поменять, итальянский будет понятен, а вдруг)
123 Кокос
 
13.03.12
13:42
(120) это нужно писать в команде вызываемой по кнопке
124 Кокос
 
13.03.12
13:43
(120)
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   
   ПараметрыФормы = Новый Структура("Ключ", ПараметрКоманды);
   ИмяФормы = "Документ." + ПараметрКоманды.Метаданные().Имя + ".Форма.ФормаЗаполнить";
   ОткрытьФормуМодально(ИмяФормы, ПараметрыФормы, ПараметрыВыполненияКоманды.Источник);
КонецПроцедуры


вот тут. в Параметры формы вставляете в структуру то что хотите передать в открываему форму. Структуру просто делаете более сложную и все.
125 vmv
 
13.03.12
13:43
(120) ну вы же как-то где-то ее отккрываете, так?

так вот открыаать ее нужно модально, т.к. при закрытии молдальной, как указано в (118) мы можем передать на сторону вызовать, то ЧТО ХОТИМ.

А вот где вы сохраните на стороне вызова результат отработки допформы - это исключительно дело вашего вкуса.

предлагате помочь вам создать переменные клиента в модуле документа или ревизиты в форме документа?

Ну давайте придумаем красивые названия, например

РфСтруткрураИзДоПФормыСкладИНомеклатура - для реквизита формы
или
ПеремСтруткрураИзДоПФормыСкладИНомеклатура - для переменной клиента
)
126 Кокос
 
13.03.12
13:47
на всякий случай:

ОбработкаВыбора стандартный эвент формы. если ее нет то надо ее создавать не ручками а лупой через список эвентов формы.
127 Kleo
 
13.03.12
13:48
(123) в доп.форме?
128 Кокос
 
13.03.12
13:48
(127) нет. в основной. где Вы вызываете форму для подбора данных
129 Kleo
 
13.03.12
13:49
(126) я знаю, что это типовая процедура. она есть в документе и используется для другого заполнения, но там нет доп.формы, там открывается список документо и на его основании заполняется ТЧ дока. а у меня параметры берутся из доп.формы
130 Kleo
 
13.03.12
13:50
(128) в основной у меня есть команда, по которой открывается доп.форма, откуда мне нужно взять параметры. где я параметры свои возьму в осн. форме??
по-моему вы не поняли, что мне нужно сделать... жалко... столько времени здесь постратила...
131 Кокос
 
13.03.12
13:51
(129) вобщем такая последовательность.
У вас есть кнопка которая вызывает команду с допформой. там открываете модально передав нужные параметры в структуре
в допформе при открытии поднимаете параметры делаете то что нужно и при закрытии передаете эти данные как уже было показано
в ОбработкаВыбора которая вызовется автоматически при закрытии допформы поднимаете хранилище распаковываете и заполняете нужные данные через серверную функцию
132 Кокос
 
13.03.12
13:53
вот это код:

АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
ПеренестиВДокумент = Истина;
ОповеститьОВыборе(Структура);

ОповеститьОВыборе в ПриЗакрытии допформы инициирует эвент ОбработкаВыбора с Параметром = Параметру ОповеститьОВыборе в данном случае Структура
133 Kleo
 
13.03.12
13:53
(125) стоп. вы можете понять, что я делаю.

есть осн.форма. в ней я вызываю команду. в модуле уоманды прописано:

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

я это уже давно писала в начале ветки. естественно, что я открываю доп.форму, чтобы внести туда в поля свои параметры Склад и Номенклатура
134 Кокос
 
13.03.12
13:53
+ инициирует эвент ОбработкаВыбора в основной форме
135 Kleo
 
13.03.12
13:54
(132) зачем мне этот код? куда его вставить????? у меня уже терпения нет. вы читаете, что я вам пишу?
136 Кокос
 
13.03.12
13:55
Структура = Новый Структура("Склад,Номенклатура", Склад,Номенклатура);
ПеренестиВДокумент = Истина;
ОповеститьОВыборе(Структура);
137 vmv
 
13.03.12
13:55
(131) резюмэ)

После выбора склада и номенклатуры в допформе по команде из основной - основная форма должна сохранить на клиенте в своих переменных или реквизите формы данные выбора. Это может быть переменная структура или две переменные. для реквизитов аналогично.

Тогда можно использовать эти значения в методе опевещения, ибо метод команды вызова допформы и метод оповещения - это разные методы, но результаты работы допформы должны быть у них в одной области видимости значений)
138 Kleo
 
13.03.12
13:55
вот этот код:
АдресТоваровВХранилище = ПоместитьТоварыВХранилище();
Структура = Новый Структура("АдресТоваровВХранилище", АдресТоваровВХранилище);
ПеренестиВДокумент = Истина;
ОповеститьОВыборе(Структура);
я вообще не поняла, куда его вставить и какое он к реализации моей задачи имеет?
139 vmv
 
13.03.12
13:56
(136) это уже третий вариант, думаю наиболее приемлымый для автора, т.к. вообще ничего не надо делать, аналог "красной кнопки"
140 vmv
 
13.03.12
13:56
(138) лучше сказать себе, что такого варианта нет - это слишком сложно, без обид
141 Kleo
 
13.03.12
14:05
(136) вы можете ответить просто, где этот код нужно написать?

(139) если честно, то объяснять вы не умеете. и судя по всему сами путаетесь в понятиях.
142 Кокос
 
13.03.12
14:13
(141) (136) нужно писать в ПриЗакрытии доп формы
143 vmv
 
13.03.12
14:16
(141) вам уже все расжевали с разных сторон, как можно что-то объяснить тому, кто не владеет базисным пониманием.)

ведь можно собраться и переосмыслить ключевые посылы тут, а не пытаться сразу получить готовый рецепт - мы ведь не борщ тут варим)
144 Kleo
 
13.03.12
14:19
(124) мне нужно не в открываемую форму передавать параметры, а из открываемой в основную форму.

задача стоит так:
1. есть команда на осн.форме: Заполнить - Заполнить по остаткам. до мен уже была реализована группа команд "Заполнить", куда я вставила свою команду ("заполнитьПоОстаткам")

в модуле команды написан код:

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

открывается доп.форма, в которой два поля Склад и Номенклатура. мне эти параметры нужно передатьв основную форму, которая открыта уже, т.к. осн.форма - это форма документа, где я вызвала команду для заполнения. ее открывать не нужно.

2. после передачи параметров в осн. форму реализовать заполнение в осн.форме, кот.легко сделать.

вопрос лишь в том, как передать.

в (107) для чего вы мне код привели? это у вас для обычного заполнения в форме документа.
145 Kleo
 
13.03.12
14:20
(142) спасибо, попробую.
146 Kleo
 
14.03.12
06:06
Сделала вчера вечером. Пишу здесь больше для себя в качестве напоминалки, но вдруг кому-то пригодится.

1) Первая ошибка, по которой происходила блокировка документа, когда в доп.форме выбирался Склад. Не нужно было передавать ПараметрФорм при открытиии доп.формы модально.

Итак, первый шаг, в документе создается команда, в модуле которой прописывается процедура:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
   
   ОткрытьФормуМодально("Документ.МойДок.Форма.ФормаДокументаЗаполнитьПоОстаткам", , ПараметрыВыполненияКоманды.Источник); // второй параметр пустой
   
КонецПроцедуры


2) Далее создается доп.форма документа "ФормаДокументаЗаполнитьПоОстаткам"

в модуле этой формы пишется код:


&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
   // Вставить содержимое обработчика.
       
   Структура = Новый Структура("Склад,Номенклатура", СкладОтбор,НоменклатураОтбор);
   Оповестить("ПередатьПараметрыЗаполнитьПоОстаткам", Структура);
   ЭтаФорма.Модифицированность = Ложь;
   Закрыть(Истина);    
КонецПроцедуры

3) Далее в модуле осн.формы пишется код:


...
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   //Вставить содержимое обработчика
   Если ИмяСобытия="ПередатьПараметрыЗаполнитьПоОстаткам" Тогда
       
       Если Объект.Материалы.Количество() > 0 Тогда
           
           ТекстВопроса = "Перед заполнением табличная часть будет очищена. Заполнить?";
           Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, );
           Если Ответ <> КодВозвратаДиалога.Да Тогда
               Возврат;
           КонецЕсли;
           
           Объект.Материалы.Очистить();
       КонецЕсли;

       ЗаполнитьПоОстаткамНаСервере(Параметр.Склад,Параметр.Номенклатура);
   
   КонецЕсли;
КонецПроцедуры


&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере(СкладОтбор,НоменклатураОтбор)

       Документ = РеквизитФормыВЗначение("Объект");
     ДатаОстатков = НачалоДня(Документ.Дата+1);
   Запрос = Новый Запрос;
       ...
       ...

       Выборка = Запрос.Выполнить().Выбрать();
       Пока Выборка.Следующий() Цикл
           
        Если Выборка.Количество = 0 Тогда
            Продолжить;
        КонецЕсли;
           
        СтрокаТабличнойЧасти = Документ.Материалы.Добавить();
           
        СтрокаТабличнойЧасти.Номенклатура = Выборка.Номенклатура;
        СтрокаТабличнойЧасти.Количество   = Выборка.Количество;
        СтрокаТабличнойЧасти.Склад        = СкладОтбор;
   КонецЦикла;
       
   ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры




все.спасибо большое всем, кто помог и пытался помочь
147 Omskdizel
 
14.03.12
06:19
Так и хочется сказать "Аминь!" :)
148 Кокос
 
14.03.12
10:44
Аминь :)
149 эцп
 
14.03.12
10:55
(7) (8) (146) А кто-то говорил еще, что я не прав! Табличная часть заполняется на сервере, а форма, работающая на клиенте, об этом не знает. Её нужно было оповестить об изменениях с помощью:
> ЗначениеВРеквизитФормы(Документ, "Объект");
150 vmv
 
14.03.12
10:55
ок, тока сервак можно было и терзать - все что нужно сделать мог делать и клиент.

да ладно, не будем вводить в искушение - это ж не расчет полета на Марс, а торговля вермутом, сайдет - зачтено
151 vmv
 
14.03.12
10:56
(149) ты прав, но наивен, ибо неоправдано расточительно грузишь сервак черновой работенкай
152 эцп
 
14.03.12
10:57
(151) с этого места подробнее
153 эцп
 
14.03.12
10:58
(151) весь смысл тонкого клиента - перенести всю работу на сервер
154 vmv
 
14.03.12
11:02
Полследний штрих, я заметил, что новички в УФ маниакально не могут отказаться от стандартных привычных коллекций: "ДеревоЗначений", "ТаблицаЗначений", "ТабличнаяЧасть" и при необходимости заполнить ту же ТЧ с упрямоством и отвагой горных казлов, вроде туры из называют, скачут на скалистые откосы сервера, чтобы в звенящей мощи бездны осуществить свои приземленные делишки.

Неужели нельзя понять, что "ДанныеФормыКоллекция" это таже табличная часть и если вы заполнеете ее перебором из некой другой коллекции, например выборки результата запроса, то незачем пригать в бездну, гораздо логичнее покопаться в гумусе у подножья горы, т.е. на клиенте
155 vmv
 
14.03.12
11:03
(153) это тебе кто тебе такую чущь сказал, назови имя!?)
156 эцп
 
14.03.12
11:11
(154) Здесь может вы и правы, но обрати внимание, что к остаткам на клиенте не обратиться, но раз уж произошло обращение к северу, то лучше прямо тут заполнить все нужные реквизиты (в том числе и ТЧ), а потом одним махом все изменения передать на сервер.
157 эцп
 
14.03.12
11:11
(155) Это выходит из самого понятия "Тонкий клиент". Сам посмотри на процедуры в (146): на сервере идет обращение к остаткам и заполнение ТЧ, а на клиенте диалог с пользователем.
158 vmv
 
14.03.12
11:30
(157) в случае если источник заполнения на основании запроса к БД, то да - без сервера никак.

но использовать

Документ = РеквизитФормыВЗначение("Объект");
и
ЗначениеВРеквизитФормы(Документ, "Объект");
не иммет смысла, если ТЧ заполняется перебором.

Тем же перебором можно заполнить ТЧ и через коллекции данных формы, т.к. работа тут именно интерактивна, а первый вариант оправдан для "роботов" заполнения табличных частей
159 эцп
 
14.03.12
11:48
(158) Хорошо. С примерами покажи, как ты предлагаешь заполнять ТЧ. Пока твои слова достаточно абстрактны
160 эцп
 
14.03.12
11:49
(158) (159) именно с обращением к остаткам
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn