Имя: Пароль:
1C
1С v8
Загрузка ТЗ в табличную часть документа
,
0 Kashey
 
07.06.12
16:53
Управляемое приложение. Результат запроса, выгруженный в ТЗ, пытаюсь загрузить в табличную часть документа


&НаКлиенте
Процедура ТипЦеныПриИзменении(Элемент)
   
   ОбщийСервер.ПоменятьТипЦенТабличнойЧастиСервер(Объект.ТипЦены,Объект.Ссылка,Объект.Дата);
   ЭтаФорма.ОбновитьОтображениеДанных();
   
КонецПроцедуры


содержимое общего модуля
&НаСервере
Процедура ПоменятьТипЦенТабличнойЧастиСервер(ТипЦены,Документ,Дата) Экспорт

                 //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПоступлениеТовараТовар.НомерСтроки,
       |    ПоступлениеТовараТовар.Номенклатура,
       |    ПоступлениеТовараТовар.Брак,
       |    ПоступлениеТовараТовар.Количество,
       |    ПоступлениеТовараТовар.Сумма,
       |    ПоступлениеТовараТовар.ЕдиницаИзмерения
       |ИЗ
       |    Документ.ПоступлениеТовара.Товар КАК ПоступлениеТовараТовар
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦены.Ссылка = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
       |        ПО ПоступлениеТовараТовар.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
       |ГДЕ
       |    ПоступлениеТовараТовар.Ссылка = &Ссылка";

   Запрос.УстановитьПараметр("Ссылка", Документ);
   Запрос.УстановитьПараметр("Дата", Дата);
   Запрос.УстановитьПараметр("ТипЦены", ТипЦены);

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

Открываю существующий документ и меняю тип цен. Цены на форме остаются прежние, хотя должны выставиться в соответствии с запросом.
Почему не обновляется содержимое формы документа?
1 shuhard
 
07.06.12
16:56
(0)[Документ.ПолучитьОбъект().Товар.Загрузить(Результат);]
ну и у какого объекта ты ТЧ загрузил ?
2 salvator
 
07.06.12
16:56
(0) А где ты цену определяешь?
3 Kashey
 
07.06.12
16:59
(2) Вручную в независимом регистре сведений ЦеныНоменклатуры
4 DrShad
 
07.06.12
16:59
в коде где?
5 Kashey
 
07.06.12
17:02
(4) Опеределяю запросом срез последних цен на дату документа
6 DrShad
 
07.06.12
17:03
(5) и что?
7 salvator
 
07.06.12
17:03
(5) Ткни пальцем в строчку запроса
8 Kashey
 
07.06.12
17:06
(7)РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦены.Ссылка = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
9 DrShad
 
07.06.12
17:09
(8) ну и нахрена ты его присоединил? что-то получил из него в выборку данных?
10 Любопытная
 
07.06.12
17:09
(8) а дальше? Где у тебя эта самая ЦеныНоменклатурыСрезПоследних используется для расчета суммы в ТЧ?
11 salvator
 
07.06.12
17:10
К тому же метод Загрузить очищает строки в ТЧ. И колонка с ценой у тебя должна очиститься, что никак не вяжется с "Цены на форме остаются прежние"
12 Kashey
 
07.06.12
17:10
(9) В ТЗ получается нужный мне набор данных. Запрос отрабатывает нормально вроде, но в форму дока, точнее в таб.часть не попадают новые цены.
13 Mort
 
07.06.12
17:11
То что автор суёт свою ТЗ в абсолютно левый ДокОбъект (который живет то всего пару строк) никого не смутило?
14 shuhard
 
07.06.12
17:13
(13) как это не смутило (1) ?
15 Mort
 
07.06.12
17:13
+(13) Даже не пару строк, а одну, и то с натяжкой ))
16 Mort
 
07.06.12
17:14
(14) А, пропустил. Как и автор, походу...
17 shuhard
 
07.06.12
17:14
(12) ну нет в выборке цены, хоть ты лопни
   "ВЫБРАТЬ
       |    ПоступлениеТовараТовар.НомерСтроки,
       |    ПоступлениеТовараТовар.Номенклатура,
       |    ПоступлениеТовараТовар.Брак,
       |    ПоступлениеТовараТовар.Количество,
       |    ПоступлениеТовараТовар.Сумма,
       |    ПоступлениеТовараТовар.ЕдиницаИзмерения
18 Aprobator
 
07.06.12
17:16
жуть то какая.
19 Kashey
 
07.06.12
17:18
Снеговика недавно ковыряю, так что извиняйте...
(13) почему левый? ссылка на текущий документ по-идее?
20 shuhard
 
07.06.12
17:19
(19)[ссылка на текущий документ по-идее]
ну здравствуй пятница
21 Aprobator
 
07.06.12
17:20
+(18) если вкратце:
Документ.ПолучитьОбъект() на выходе дает нефига не тот объект, с которым взаимодействует открытая форма.
22 Aprobator
 
07.06.12
17:21
почитай еще в СП про РеквизитФормыВЗначение и ЗначениеВРеквизитФормы.
23 Mort
 
07.06.12
17:24
РеквизитФормыВЗначение тут, конечно, нахер не нужен, но почитать всё равно стоит.
24 Kashey
 
07.06.12
17:25
(21) Странно, в отладчике кажет ссылку на мой док
25 Aprobator
 
07.06.12
17:25
(24) ссылка <> Объект.
26 Aprobator
 
07.06.12
17:27
(23) просвети, как тогда ТЧ Объекта перезаполнить методом в (0)?
27 Kashey
 
07.06.12
17:28
ааа. сорри, речь шла про получитьобъект()
28 Mort
 
07.06.12
17:28
(26) Объект.Товары.Загрузить(ТЗ);
ДанныеФормыКоллекция прекрасно жрет таблицы значений, получать объект тут не нужно.
29 Aprobator
 
07.06.12
17:28
(28) результат запроса - скушает?
30 Aprobator
 
07.06.12
17:30
+(29) ну в принципе там ТЗ на выходе. Пасиб.
31 Mort
 
07.06.12
17:30
(29) Результат запроса не скушает. Скушает ТЗ полученную выгрузкой из результата запроса. Ну если в терминах.
32 Aprobator
 
07.06.12
17:31
(27) ну так понял - чего сделать то надо?
33 Kashey
 
07.06.12
17:32
(32) каким-то образом получить контекст объекта для моего дока?
34 Aprobator
 
07.06.12
17:34
(33) Объект передай на сервер и там заполняй его.
35 Mort
 
07.06.12
17:35
(33) Он там уже есть.
36 shuhard
 
07.06.12
17:35
Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПоступлениеТовараТовар.НомерСтроки,
       |    ПоступлениеТовараТовар.Номенклатура,
       |    ПоступлениеТовараТовар.Брак,
       |    ПоступлениеТовараТовар.Количество,
       |    ПоступлениеТовараТовар.Сумма,
       |    ПоступлениеТовараТовар.ЕдиницаИзмерения,
       |    ЦеныНоменклатурыСрезПоследних.Цена
       |ИЗ
       |    Документ.ПоступлениеТовара.Товар КАК ПоступлениеТовараТовар
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦены.Ссылка = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
       |        ПО ПоступлениеТовараТовар.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
       |ГДЕ
       |    ПоступлениеТовараТовар.Ссылка = &Ссылка";

   Запрос.УстановитьПараметр("Ссылка", Документ);
   Запрос.УстановитьПараметр("Дата", Дата);
   Запрос.УстановитьПараметр("ТипЦены", ТипЦены);

   Результат = Запрос.Выполнить().Выгрузить();
   Документ.Товар.Загрузить(Результат);
37 Aprobator
 
07.06.12
17:39
(0) кстати, это самописка такая что ли? Нафига из за одного конкретного документа, это все в общий модуль вытаскивать?
38 Mort
 
07.06.12
17:43
А блин, это ещё общий модуль? Не. Без серверного вызова в форме не взлетит. Теоретически можно но зачем такой гимор?
39 Aprobator
 
07.06.12
17:43
в общий модуль как бы более широкого назначения вещи выводятся. Посмотри типовые конфигурации. Впрочем, с нуля, это тяжеловато будет.
40 Aprobator
 
07.06.12
17:45
(38) да учится чел. Я сам там конструктор с первого раза не увидел. Меня еще - ЭтаФорма.ОбновитьОтображениеДанных() убило. Чего я в сторону  РеквизитФормыВЗначение то кинулся.
41 Kashey
 
07.06.12
17:48
Перенести сереверную процедуру в модуль формы документа и передавать в неё объект вместо объект.ссылка, я правильно понял?
42 DrShad
 
07.06.12
17:49
в Модуль объекта, а не формы
43 Mort
 
07.06.12
17:50
хм. походу быстрее будет так...


&НаКлиенте
Процедура ТипЦеныПриИзменении(Элемент)
   
   ПоменятьТипЦенТабличнойЧастиСервер();
   
КонецПроцедуры

// Там же в форме

&НаСервере
Процедура ПоменятьТипЦенТабличнойЧастиСервер() Экспорт

                 //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

   // Данный фрагмент построен конструктором.

   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!


   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПоступлениеТовараТовар.НомерСтроки,
       |    ПоступлениеТовараТовар.Номенклатура,
       |    ПоступлениеТовараТовар.Брак,
       |    ПоступлениеТовараТовар.Количество,
       |    ПоступлениеТовараТовар.Сумма,
       |    ПоступлениеТовараТовар.ЕдиницаИзмерения
       |ИЗ
       |    Документ.ПоступлениеТовара.Товар КАК ПоступлениеТовараТовар
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦены.Ссылка = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
       |        ПО ПоступлениеТовараТовар.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
       |ГДЕ
       |    ПоступлениеТовараТовар.Ссылка = &Ссылка";

   Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
   Запрос.УстановитьПараметр("Дата", Объект.Дата);
   Запрос.УстановитьПараметр("ТипЦены", Объект.ТипЦены);

   Результат = Запрос.Выполнить().Выгрузить();
   Объект.Товар.Загрузить(Результат);

   КонецПроцедуры // ПоменятьТипЦенТабличнойЧастиСервер()
44 Aprobator
 
07.06.12
17:50
(41) общий модуль используется для вещей более широкого назначения.
45 Aprobator
 
07.06.12
17:51
(43) ну только в данном случае нужна контролька, что документ не новый.
46 Aprobator
 
07.06.12
17:53
да и экспорт в данном случае не нужен.
47 Mort
 
07.06.12
17:54
+(43) Кошерно конечно вынести процедуру в модуль объекта и заполнять через тот же ЗначениеВРеквизитФормы. Но это уже можно и потом вынести после того как из формы работать будет.

Ха. Только вникнул в запрос.... Блин всё не то.
48 Aprobator
 
07.06.12
17:54
а вообще, заполнение и изменение табличных частей обычно выносится в модуль объекта со словом экспорт, на случай их использования в случае программного создания объекта.
49 Aprobator
 
07.06.12
17:55
дык - вечер четверга. Пятница почти. Против биоритмов не попрешь. Мозг уже отключается ))))
50 Mort
 
07.06.12
17:56
Запрос надо делать по ТЗ табличной части с временными таблицами и т.п. Иначе это лажа.
51 Kashey
 
07.06.12
17:57
(50) Да, до кучи и с запросом чето намудрил я (
52 Aprobator
 
07.06.12
17:57
(0) возьми та ты мил человек учебник Радченко и пройди его. Таким самотыком учиться - ну его нафиг. Карму себе - однозначно испортишь.
(50) +100500 согласен.
53 Aprobator
 
07.06.12
17:58
+(52) у франей набор по обучению программированию Цена вопроса где то 600 рублев.
54 Aprobator
 
07.06.12
17:58
(51) у тебя просто самого подходе еще нету к решению подобных задач.
55 Kashey
 
08.06.12
11:13
Господа, гляньте подправленный вариант. Так лучше?

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

Модуль объекта дока
Процедура ПоменятьТипЦенТабличнойЧастиСервер(ТипЦены,Документ,Дата) Экспорт
   
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    ПоступлениеТовараТовар.Номенклатура,
       |    ПоступлениеТовараТовар.Брак,
       |    ЦеныНоменклатурыСрезПоследних.Цена,
       |    ПоступлениеТовараТовар.Количество,
       |    ПоступлениеТовараТовар.Сумма,
       |    ПоступлениеТовараТовар.ЕдиницаИзмерения
       |ИЗ
       |    Документ.ПоступлениеТовара.Товар КАК ПоступлениеТовараТовар
       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦены = &ТипЦены) КАК ЦеныНоменклатурыСрезПоследних
       |        ПО ПоступлениеТовараТовар.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
       |ГДЕ
       |    ПоступлениеТовараТовар.Ссылка = &Ссылка";

   Запрос.УстановитьПараметр("Ссылка", Документ);
   Запрос.УстановитьПараметр("Дата", Дата);
   Запрос.УстановитьПараметр("ТипЦены", ТипЦены);
   Товар.Загрузить(Запрос.Выполнить().Выгрузить(););

       
КонецПроцедуры // ПоменятьТипЦенТабличнойЧастиСервер()
56 salvator
 
08.06.12
11:21
Хотя б синтаксис что ль проверил бы.
57 DrShad
 
08.06.12
11:22
(55) однокуйственно
58 Kashey
 
08.06.12
11:31
(56)а что с синтаксисом? там просто процедуры из 2-х модулей разных, так скопировалось
(57) Как в (47) советовали перенёс в модуль объекта процедуру заполнения ТЧ дока, ну и запрос подредактировал.
59 DrShad
 
08.06.12
11:33
(58) а цену то он у тебя не выбирает - результат не достигнут
60 salvator
 
08.06.12
11:34
(58) Ты синтаксис контроль выполнял? У тебя как минимум в последней строке ошибка
61 Undefined
 
08.06.12
11:36
в модуле объекта необязательно было это делать. Вполне с данными формы можно работать было.
62 Kashey
 
08.06.12
11:39
(58) Ну вроде вот эта строка выбирает цену из вирт.таблицы

|    ЦеныНоменклатурыСрезПоследних.Цена,
63 Kashey
 
08.06.12
11:40
(62) -> (59)
64 DrShad
 
08.06.12
11:50
(63) сорри, ожидал увидеть ее в конце
65 Aprobator
 
08.06.12
13:33
Внутреннее соединение убьет строки с номенклатурой без цен.
И запрос надо делать не по документу (документ может быть тупо не записан, например, и тогда запрос вообще ничего не даст или состояние ТЧ на форме не соответствовать той, что записана в базу), а выгрузить ТЧ с формы документа и уже ее пихать в запрос (временная таблица и пакетный запрос).
AdBlock убивает бесплатный контент. 1Сергей