Имя: Пароль:
1C
1С v8
ПолучитьДействие
0 ЯЧайник
 
27.08.15
14:08
Управляемые формы.
В общем модуле НаКлиенте пишу:
ТоварыТаб = Форма.Объект.Товары;
СтрТовары = ТоварыТаб.Добавить();
            ЗаполнитьЗначенияСвойств(СтрТовары,ТекущиеДанные)
СтрТовары.Количество = ВыбраннаяСерия.Количество-ВыбраннаяСерия.СвободныйОстаток;
СтрТовары.КоличествоУпаковок = ВыбраннаяСерия.Количество-ВыбраннаяСерия.СвободныйОстаток;

После Чего Я хочу, чтобы сработало действие "ПриИзменении" у поля КоличествоУпаковок. У меня ничего не выходит. Подскажите,как это сожно сделать?
1 ЯЧайник
 
27.08.15
14:09
можно сделать
2 PR третий
 
27.08.15
14:10
Никак.
3 bolobol
 
27.08.15
14:10
А в каком месте это хотение реализовано?, чтобы говорить о том, что "ничего не выходит"
4 ДенисЧ
 
27.08.15
14:10
а что, просто позвать соответствующую функцию - нельзя?
5 ibreiter
 
27.08.15
14:11
Вызови ее
6 bolobol
 
27.08.15
14:12
(4) Тут нет позиционирования в нужную строку, как и обновления данных формы.
7 Митрополит Кирюха
 
27.08.15
14:12
ТоварыТаб = Форма.Объект.Товары;
СтрТовары = ТоварыТаб.Добавить();
            ЗаполнитьЗначенияСвойств(СтрТовары,ТекущиеДанные)
СтрТовары.Количество = ВыбраннаяСерия.Количество-ВыбраннаяСерия.СвободныйОстаток;
СтрТовары.КоличествоУпаковок = ВыбраннаяСерия.Количество-ВыбраннаяСерия.СвободныйОстаток;

ПриИзменении(<твой элемент>)
8 ЯЧайник
 
27.08.15
14:12
Как ее позвать из общего модуля на клиенте?
9 bolobol
 
27.08.15
14:14
(8) По возвращению на клиент, на форму - циклом обойти все строки, активизируя их, выполнить ПриИзменении()
10 Митрополит Кирюха
 
27.08.15
14:14
(7) это в контексте формы разумеется. Из общего точно сказать не могу
11 ЯЧайник
 
27.08.15
14:23
(7),(10)
Документ.ЗаказКлиента.Форма.ФормаДокумента.Форма(447,4)}: Процедура или функция с указанным именем не определена (ПриИзменении)
            <<?>>ПриИзменении(Стр.КоличествоУпаковок); (Проверка: Тонкий клиент)
12 ЯЧайник
 
27.08.15
14:24
Вроде,надо как-то Действ = ПолучитьДействие()
Выполнить(Действ)
Это так? Если делать,как советует (9)
13 ibreiter
 
27.08.15
14:24
А вы ее откуда вызываете?
14 ibreiter
 
27.08.15
14:24
(11) Имеется ввиду
15 bolobol
 
27.08.15
14:25
(11) А ежели не определена, то что вызывать-то хотите?
16 ЯЧайник
 
27.08.15
14:26
(13) Там же ясно видно, что Форма документа ЗаказКлиента
17 ЯЧайник
 
27.08.15
14:27
Я ее всмысле хочу вызвать из другой процедуры, как (9) советует
18 ibreiter
 
27.08.15
14:27
(16) (17) Контекст какой у этой процедуры?
19 Митрополит Кирюха
 
27.08.15
14:28
(16) Вопрос в том, что процедура ПриИзменении находится в контексте формы документа ЗаказКлиента? И на сколько я вижу вы не элемент пихаете в ПриИзменении
20 Митрополит Кирюха
 
27.08.15
14:29
(18) И да, ПриИзменении у вас может называться по другому, например ЗаказыПриИзменении
21 ЯЧайник
 
27.08.15
14:29
Да,я поняла о чем речь,сейчас попробую
22 bolobol
 
27.08.15
14:31
(21) Я тоже понял, при чём тут ПолучитьДействие() - чтоб не париться о наименовании процедуры и вообще о её наличии. Нет действия - нет выполнения. Логично, чо! Но, не юзал сие.
23 ЯЧайник
 
27.08.15
14:41
Пишу
Для Каждого Стр ИЗ ЭтаФорма.Элементы.Товары Цикл
                ТоварыКоличествоУпаковокПриИзменении(<Элемент>);

КонецЦикла;

Не пойму, что должно быть на месте <Элемент>?
24 Митрополит Кирюха
 
27.08.15
14:43
(23) Элементы.ТоварыКоличествоУпаковок
25 ЯЧайник
 
27.08.15
14:45
Ага! У меня на другое ругается, что нельзя писать для каждого стр из элементы.товары. Я запуталась, как писать надо?
26 Митрополит Кирюха
 
27.08.15
14:49
(25) Элементы.Товары это у вас не коллекция, у Элементы.Товары есть свойство ПодчиненныеЭлементы, вот их перебрать можно
27 Митрополит Кирюха
 
27.08.15
14:52
(23) И я бы на вашем месте не вызывал ПриИзменении в цикле, это бессмысленно, после цикла вызовите ТоварыКоличествоУпаковокПриИзменении(Элементы.ТоварыКоличествоУпаковок);
28 ЯЧайник
 
27.08.15
14:54
Я так написала
Для Каждого Стр ИЗ Объект.Товары Цикл
                ТоварыКоличествоУпаковокПриИзменении(ЭтаФорма.Элементы.ТоварыКоличествоУпаковок);
КонецЦикла;
Работает
Попробую без цикла
29 ЯЧайник
 
27.08.15
15:01
Нет, без цикла у меня меняется только та строчка,на которой стоит курсор, потому что в процедуре ПриИзменении Написано:
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
и дальше естественно все процедуры выполняются  с текущаяСтрока
Только вот думаю - это же,наверное,много времени машинного будет занимать в цикле то вызывать. мне так-то надо только измененную строку и добавленную ( то изменение строки и добавление происходит в общем модуле на клиенте)
можете подсказать какое-то решение?
30 bolobol
 
27.08.15
15:19
(29) Ну, там же не списание по партиям в цикле))
31 bolobol
 
27.08.15
15:20
(28) Вообще - не должно работать! Потому как нет перепозиционирования текущей строки в вашем цикле. То есть - цикл отрабатывает много раз, но только для исходной выделенной строки.
32 ЯЧайник
 
27.08.15
15:37
(30) где списание по партиям в цикле? у меня нет цикла, у меня обработчик события выбора серии. надо,когда выбираешь серию и этой серии не хватает на складе,надо, чтобы строчка разбивалась на две: в первой уменьшалось количество, во второй остаток к обеспечению
33 ЯЧайник
 
27.08.15
15:45
(31) Я же попробовала,работает. просто мне не нужен цикл. А без цикла как раз и надо позиционироваться на добавленной строке. В процессе пока...)))
34 ibreiter
 
27.08.15
15:48
(32) Да ну вы чего...он же пошутил)
35 ЯЧайник
 
27.08.15
15:50
Не,мой мозг не распознает такие шутки и смысл их не догоняет))) в чем прикол-то?
36 ЯЧайник
 
27.08.15
16:02
В общем, скопировала процедуру из общего модуля (переименовала) и поместила ее в модуле формы, там:

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

Вроде,работает. Может,есть замечания?
37 bolobol
 
27.08.15
16:12
(35) Да нет там шутки. Это ответ на "много машинного времени". Вот где "много" - я и указал. Если там в ПриИзменении такого нет, то и "много" никакого нет.

Но с точки зрения оптимизации - согласен. Она никогда не лишняя. Другой вопрос, что тут детально рассматривать нужно, особенно - источник того, откуда изменения в строках приплыли. Как определить сколько их, в общем - вникать капитально.

Одного не пойму - ааа... в (36) уже корректно - строка текущая ставится и на неё ПриИзменении натравить - да. И в модуль формы если перенесено - то да, и цикл не нужен.
38 ЯЧайник
 
27.08.15
16:19
Спасибо за помощь и за комментарии))) Изменения в строках при выборе серии - далее обработка выбора с источником "Обработка.ПодборСерийВДокументы.Форма.ФормаПодбора".И там уже сравнивается количество в строке и свободный остаток, в зависимости от этого строка разбивается или нет на две строки
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.