![]() |
![]() |
![]() |
|
Изучаю 8.2. Нужно удалить строку табличной части. Выдает ошибку | ☑ | ||
---|---|---|---|---|
0
Drew
06.12.11
✎
05:52
|
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент) СтрокаТЧ = Элементы.Товары.ТекущиеДанные; СтрокаТЧ.ЕдиницаИзмерения = ПолучениеОсновнойЕдиницыИзмерения(СтрокаТЧ.Номенклатура); Цена = ПолучитьЦенуСервер(СтрокаТЧ.Номенклатура); Если Цена<>0 Тогда СтрокаТЧ.Цена = Цена; Иначе УдалитьСтрокуСервер(СтрокаТЧ.НомерСтроки); КонецЕсли; КонецПроцедуры &НаСервере Процедура УдалитьСтрокуСервер(ТекСтрока) ТабЧасть = Объект.Товары; ТабЧасть.Удалить(ТекСтрока); КонецПроцедуры |
|||
1
ZanderZ
06.12.11
✎
05:58
|
ошибка то где ?
скорее всего надо данные формы в значение получить, потом обратно в данные формы |
|||
2
GROOVY
06.12.11
✎
06:00
|
Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущаяСтрока);
|
|||
3
GROOVY
06.12.11
✎
06:00
|
На клиенте
|
|||
4
GROOVY
06.12.11
✎
06:01
|
Поправка, там вроде индекс надо передавать: Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущаяСтрока-1);
|
|||
5
Drew
06.12.11
✎
06:02
|
ошибка:{Документ.ПродажаТоваров.Форма.ФормаДокумента.Форма(24)}: Ошибка при вызове метода контекста (Удалить)
ТабЧасть.Удалить(ТекСтрока); по причине: Недопустимое значение параметра (параметр номер '1') |
|||
6
GROOVY
06.12.11
✎
06:03
|
(5) минусАдин добавь.
|
|||
7
GROOVY
06.12.11
✎
06:04
|
И ни в коем случае контекстный вызов сервера делать не надо, а то могут руки оторвать.
|
|||
8
Drew
06.12.11
✎
06:08
|
(7)
Если -1 делаю он пытается удалить 0 строку и тоже ошибку пишет |
|||
9
GROOVY
06.12.11
✎
06:11
|
Ну вот... придется запускать комп с 1с....
|
|||
10
mikeA
06.12.11
✎
06:14
|
(9) что, Чебурашка, не спится? (с) :)
|
|||
11
8vC1
06.12.11
✎
06:18
|
Может так ?
Запись = Объект.ТабличнойЧасти.Получить(ИндексСтроки); Объект.ТабличнойЧасти.Удалить(Запись); |
|||
12
Drew
06.12.11
✎
06:20
|
(11)тоже ошибка
{Документ.ПродажаТоваров.Форма.ФормаДокумента.Форма(25)}: Ошибка при вызове метода контекста (Получить) Запись = Объект.Товары.Получить(ИндексСтроки); по причине: Недопустимое значение параметра (параметр номер '1') |
|||
13
Морозов Александр
06.12.11
✎
06:22
|
блин... я фигею... как сложно удалить строчку
|
|||
14
8vC1
06.12.11
✎
06:23
|
ИндексСтроки должно быть число. Попробуй прописать
ИндексСтроки = 0; Запись = Объект.Товары.Получить(ИндексСтроки); Объект.ТабличнойЧасти.Удалить(Запись); |
|||
15
GROOVY
06.12.11
✎
06:24
|
Объект.ТабличнаяЧасть1.Удалить(Объект.ТабличнаяЧасть1[Элементы.ТабличнаяЧасть1.ТекущаяСтрока]);
|
|||
16
GROOVY
06.12.11
✎
06:24
|
Стормозил, там же данныеФормыКоллекция, и передавать надо элемент коллекции.
|
|||
17
GROOVY
06.12.11
✎
06:25
|
(10) Совсем не смешно.
(13) Что сложного то? |
|||
18
Drew
06.12.11
✎
06:30
|
(17)
Спасибо большое за помощь |
|||
19
ZanderZ
06.12.11
✎
06:41
|
(16) можно и по индексу Объект.Товары.Удалить(Элементы.Товары.ТекущиеДанные.НомерСтроки-1);
|
|||
20
GROOVY
06.12.11
✎
06:50
|
(19) В УФ? Ну попробуй... Думаешь я не проверил?
|
|||
21
GROOVY
06.12.11
✎
06:51
|
Я тебе даже алгоритм теста скажу:
Нужна ТЧ с реквизитом число или строка. Делаешь 3 строки и обязательно в реквизит пишешь номер строки. Потом по твоему алгоритму попробуй грохнуть строки. Посмотри что получится. Особенно приятно грохать первую строку... Или второй раз вторую... развлекайся в общем :) |
|||
22
ZanderZ
06.12.11
✎
06:53
|
(21) ТекущаяСтрока <> ТекущиеДанные.НомерСтроки
|
|||
23
GROOVY
06.12.11
✎
06:56
|
(22) Гарантируешь что номер строки всегда на клиенте доступен будет?
|
|||
24
ZanderZ
06.12.11
✎
06:58
|
(23) проверь
|
|||
25
GROOVY
06.12.11
✎
06:58
|
Я понимаю что можно извернуться как угодно и грохнуть строку. Не забывайте что это УФ.
|
|||
26
GROOVY
06.12.11
✎
07:00
|
(24) Проверяю: в настройках формы нет элементов с "галкой использовать всегда"/прав на чтение номера строки/установлена функциональная опция/пользователь отключил видимость колонки и сочетание всего этого => не отображается "НомерСтроки" и на клиенте нет этого реквизита. Система падает с ошибкой "четотам не найден".
|
|||
27
ZanderZ
06.12.11
✎
07:06
|
(26) "сударь знает толк в извращениях" :),
"Я понимаю что можно извернуться как угодно и НЕ грохнуть строку" |
|||
28
GROOVY
06.12.11
✎
07:08
|
(27) "Сударь" методист по системе 1С:Предприятие в целом и по управляемым формам в частности.
Тема у нас "Изучаю", учить надо как правильно, а не как быстро. :) В реальности конечно все иначе, а жаль. |
|||
29
ilpar
06.12.11
✎
07:11
|
Индекс() почему-то нигде нет в предыдущих постах
|
|||
30
GROOVY
06.12.11
✎
07:13
|
(29) Точно! Можно индекс еще получить! Из коллекции данных формы, передав туда элемент коллекции! В чем смысл?
|
|||
31
ZanderZ
06.12.11
✎
07:13
|
(28) просто необходимость в (26) в практике не нужна, даже если убрать "галкой использовать всегда", то номерстроки доступен, а установка ФО на колонку номер строки - это что-то ...
|
|||
32
GROOVY
06.12.11
✎
07:15
|
(31) (я счаз не придираюсь, так разговор подержать) а если юзер скроет при этом номер строки? Ну мешает он ему! А это золотой и капризный клиент...
|
|||
33
8vC1
06.12.11
✎
07:16
|
ИндексСтроки = Товары.Индекс(ЭлементыФормы.Товары.ТекущаяСтрока);
Запись = Объект.Товары.Получить(ИндексСтроки); Объект.ТабличнойЧасти.Удалить(Запись); |
|||
34
GROOVY
06.12.11
✎
07:17
|
+32 кстати УФ обычно менеджеры среднего звена сами настраивают...
|
|||
35
ZanderZ
06.12.11
✎
07:17
|
(32) если просто скроет из "Изменить форму" - то все равно доступен ТекущиеДанные.НомерСтроки
|
|||
36
ilpar
06.12.11
✎
07:17
|
Индекс() НайтиПоИдентификатору() ТекущаяСтрока()
|
|||
37
GROOVY
06.12.11
✎
07:18
|
(33) Неверно, Нужно передавать "ДанныеФОрмыЭлементКоллекции" в метод "Индекс".
(35) и если у реквизита будет снят флаг "ИспользоватьВсегда" то реквизита на стороне клиента не будет. |
|||
38
8vC1
06.12.11
✎
07:19
|
Все что я написал в (33) доступно на сервере.
|
|||
39
GROOVY
06.12.11
✎
07:19
|
(36) Сначала в СП загляните, потом комментируйте:
ДанныеФормыКоллекция.Индекс (FormDataCollection.IndexOf) ДанныеФормыКоллекция (FormDataCollection) Индекс (IndexOf) Синтаксис: Индекс(<Элемент>) Параметры: <Элемент> (необязательный) Тип: ДанныеФормыЭлементКоллекции. Элемент коллекции, индекс которого требуется получить. Возвращаемое значение: Тип: Число. Описание: Получает индекс элемента коллекции. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент. ДанныеФормыКоллекция.Удалить (FormDataCollection.Delete) ДанныеФормыКоллекция (FormDataCollection) Удалить (Delete) Вариант синтаксиса: По индексу Синтаксис: Удалить(<Индекс>) Параметры: <Индекс> (обязательный) Тип: Число. Индекс элемента в коллекции. Вариант синтаксиса: По элементу Синтаксис: Удалить(<Элемент>) Параметры: <Элемент> (обязательный) Тип: ДанныеФормыЭлементКоллекции. Удаляемый элемент. Описание: Удаляет элемент из коллекции. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент. |
|||
40
GROOVY
06.12.11
✎
07:20
|
(38) И что траффик гонять? Контекст передавать? А если строк дофига? А если тяжелые данные на форме?
Интерактивно удалять строки надо только, _исключительно_ на клиенте. |
|||
41
ilpar
06.12.11
✎
07:21
|
раскидав (36) вроде получаете правильно.
У меня работает. На клиенте получаем индекс и передаем для удаления на сервер |
|||
42
ZanderZ
06.12.11
✎
07:22
|
(37) не поверишь - доступно, даже со снятой галкой ...
|
|||
43
GROOVY
06.12.11
✎
07:22
|
(41) Удачи! GPRS модем в руки с тонким клиентом и удаляйте строки! Я посмотрю через сколько дней Ваш заказчик вернет обработку.
|
|||
44
GROOVY
06.12.11
✎
07:23
|
(42) Это глюк :) Не должно быть доступно.
|
|||
45
GROOVY
06.12.11
✎
07:24
|
Хотя вот галку снять можно с номера строки... А как оно синхронизировать строки между клиентом и сервером будет? По какому ключу? Надо в парсер залезть..
|
|||
46
ilpar
06.12.11
✎
07:25
|
(43)
имея индекс мы не можем внеконтекстно удалить строку(или не знаю =) ? не помню просто. Остальное типовое |
|||
47
GROOVY
06.12.11
✎
07:25
|
(42) Уточню и галка снята и на форме не отображается и все равно программно доступно? Да?
|
|||
48
GROOVY
06.12.11
✎
07:26
|
(46) Внеконтекстно мы ничего с объектом сделать не могем.
|
|||
49
8vC1
06.12.11
✎
07:26
|
Вообще то все зависит от задачи. Если удалять строку интерактивно, то на клиенте, а если из документов то на сервере.
|
|||
50
GROOVY
06.12.11
✎
07:27
|
(49) Конечно. Я сейчас рассуждаю в контексте поставленной задачи.
|
|||
51
ZanderZ
06.12.11
✎
07:28
|
(47) точно
|
|||
52
GROOVY
06.12.11
✎
07:30
|
(51) Ну либо глюк, либо (45). Надо проверять...
В общем делайте как я написал и будет счастье при условии что все глюки в платформе починят :) Проверю сегодня на низком уровне что передается гарантированно на клиент из формы с ТЧ. |
|||
53
ZanderZ
06.12.11
✎
07:33
|
(52) отпишись - интересно
|
|||
54
GROOVY
06.12.11
✎
07:36
|
Самому интересно, но это будет только к вечеру.
|
|||
55
Escander
06.12.11
✎
07:44
|
(52) у сэра есть доступ к коду матрицы?!!!
|
|||
56
8vC1
06.12.11
✎
07:44
|
В СП метод Индекс() есть в тонком клиенте, значит передается.
|
|||
57
GROOVY
06.12.11
✎
07:49
|
(55) Да не, есть просто снифер html траффика. Там все видно если шифрование не ставить.
(56) Метод "Индекс" есть у любой коллекции у которой определен итератор. В том числе и для коллекций УФ. Про "Передается" не понял, что передается? |
|||
58
8vC1
06.12.11
✎
07:56
|
(57) Спор про что ? Как удалить строку ТЧ в УФ через индекс ? У текущий строки индекс есть ? Значит удалить строку через индекс не проблема.
|
|||
59
GROOVY
06.12.11
✎
08:03
|
(58) Кто спорит?
Чтобы удалить строку через индекс его надо получить. Чтобы получить интекс удаляемого элемента коллекции надо его получить. При этом можно удалить строку указав просто удаляемый элемент коллеции. Вопрос: нафига это делать через получение индекса? Вариант без индекса: Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока]) Вариант с индексом Объект.ТЧ.Удалить(Объект.ТЧ.Индекс(Элементы.ТЧ.ТекущаяСтрока)) Второй вопрос: Это то о чем Вы пишете? |
|||
60
8vC1
06.12.11
✎
08:08
|
Началось с того что я предложил удалять через индекс, хотя правильнее передавать Элемерт коллекции, продолжилось с (36) по (58)
По второму вопросу: Вариант без индекса: Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока]) или с индексом ИндексСтроки = Товары.Индекс(ЭлементыФормы.Товары.ТекущаяСтрока); Запись = Объект.Товары.Получить(ИндексСтроки); Объект.ТабличнойЧасти.Удалить(Запись); А Вы о чем ? |
|||
61
Raps
06.12.11
✎
08:08
|
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент) СтрокаТЧ = Элементы.Товары.ТекущиеДанные; СтрокаТЧ.ЕдиницаИзмерения = ПолучениеОсновнойЕдиницыИзмерения(СтрокаТЧ.Номенклатура); Цена = ПолучитьЦенуСервер(СтрокаТЧ.Номенклатура); Если Цена<>0 Тогда СтрокаТЧ.Цена = Цена; Иначе ИдентификаторСтроки = Элемент.ТекущаяСтрока; ЭлементКоллекции = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки); ИндексЭлементаКоллекции = Объект.Товары.Индекс(ЭлементКоллекции); Объект.Товары.Удалить(ИндексЭлементаКоллекции); КонецЕсли; КонецПроцедуры |
|||
62
GROOVY
06.12.11
✎
08:10
|
Ох... Перечитайте ветку. Я все уже сказал. СОВСЕМ ВСЕ и повторять не буду. В ветке отпишусь после экспериментов с данными сеанса передаваемых при открытии формы.
|
|||
63
Defender aka LINN
06.12.11
✎
08:26
|
(61) Какая гадость...
|
|||
64
nddru
06.12.11
✎
08:28
|
&НаСервере
Процедура УдалитьСтрокуСервер(ТекСтрока) Данные = РеквизитФормыВЗначение("Объект"); ТабЧасть = Данные.Товары; ТабЧасть.Удалить(ТекСтрока); ЗначениеВРеквизитФормы(Данные,"Объект"); КонецПроцедуры так можно попробовать |
|||
65
Raps
06.12.11
✎
08:30
|
||||
66
Defender aka LINN
06.12.11
✎
08:30
|
facepalm.jpg
|
|||
67
Defender aka LINN
06.12.11
✎
08:31
|
(65) Это Радченко предлагает делать 2 вызова сервера там, где можно обойтись одним и удалять строки при изменении реквизитов? Что-то я сомневаюсь.
|
|||
68
Raps
06.12.11
✎
08:37
|
(67) Ну основной кусок процедуры взят у ТС, вопрос то был про ошибку удаления.
|
|||
69
Escander
06.12.11
✎
09:21
|
(67)
ну если сделать так: ИдентификаторСтроки = Элементы.ПереченьНоменклатуры.ТекущаяСтрока; ЭлементКоллекции = Объект.ПереченьНоменклатуры.НайтиПоИдентификатору(ИдентификаторСтроки); ИндексЭлементаКоллекции = Объект.ПереченьНоменклатуры.Индекс(ЭлементКоллекции); Объект.ПереченьНоменклатуры.Удалить(ИндексЭлементаКоллекции); все отрабатывает на клиенте. |
|||
70
Escander
06.12.11
✎
09:23
|
(5) ну про ошибку писали уже, если кратко:
набей 3 строки, удали их, сделай ещё 1 строку для неё значение Элементы.ПереченьНоменклатуры.ТекущаяСтрока будет равно 4. Хотя визуально будет только она одна |
|||
71
Defender aka LINN
06.12.11
✎
09:31
|
(70) см. (65)
|
|||
72
Escander
06.12.11
✎
10:00
|
(71) ну у меня почти то-же, только вместо
ИдентификаторСтроки = Элемент.ТекущаяСтрока; пишу: ИдентификаторСтроки = Элементы.ПереченьНоменклатуры.ТекущаяСтрока; где там 2 обращения к серверу? |
|||
73
Defender aka LINN
06.12.11
✎
10:03
|
(72) Пля, товарищи, ну вы читать умеете? 2 обращения к серверу в (61). В (61), блеать, 2 обращения к серверу.
|
|||
74
Escander
06.12.11
✎
10:37
|
(73)не вижу 2 обращений, поэтому и спрашиваю где они там? Читать не умеете, не вижу где их 2!
|
|||
75
Defender aka LINN
06.12.11
✎
10:43
|
(74) Плохо смотришь.
СтрокаТЧ.ЕдиницаИзмерения = ПолучениеОсновнойЕдиницыИзмерения(СтрокаТЧ.Номенклатура); <- 1 Цена = ПолучитьЦенуСервер(СтрокаТЧ.Номенклатура); <- 2 На клиенте поциент этих данных не получит, как ни бейся. Я еще и готов на пиво поспорить, что там контекстные вызовы идут. |
|||
76
0xFFFFFF
06.12.11
✎
11:12
|
Под сотню постов - удаляем строку. Жесть какая то, товарищи.
|
|||
77
Escander
06.12.11
✎
11:26
|
(74)стоп! но это-же не из (65)на который вы указывали, а из (0)!
Тот код вообще не самый компот! |
|||
78
Defender aka LINN
06.12.11
✎
12:43
|
(77) В (65) это тоже есть. И именно про эти строки я и говорил
|
|||
79
GROOVY
06.12.11
✎
16:09
|
(42) Недоступно. Проверил. Собственно просто отладчиком.
http://screencast.com/t/bzsWBydvfxn7 Следовательно ориентироваться на данные строки при ее удалении мы не можем, так как при стечении обстоятельств этих данных может не быть. Хотя вряд ли кто то номер строки из формы уберет, да еще и в конфигураторе снимет галку "Использовать всегда". |
|||
80
8vC1
06.12.11
✎
21:22
|
(79) Причем тут номер строки ? Речь шла про индекс строки, а не про номер.
|
|||
81
8vC1
06.12.11
✎
21:24
|
Понятно что получать индекс как советуют некоторые
ИндексСтроки = НомерСтроки-1; как минимум некорректно. |
|||
82
GROOVY
06.12.11
✎
21:36
|
(80) Это не по вашу тему...
По вашу тему комментарий: Чтобы получить индекс элемента коллекции нужно получить элемент коллекции. При этом имея элемент коллекции мы и так его можем удалить. Нафига получать индекс? |
|||
83
8vC1
06.12.11
✎
22:18
|
(82) Согласен. Поэтому подводя итоги темы. единственный правильный вариант удаления текущей строки из ТЧ УФ формы это
Объект.ТЧ.Удалить(Объект.ТЧ[Элементы.ТЧ.ТекущаяСтрока-1]) |
|||
84
8vC1
06.12.11
✎
22:33
|
Или же кто не хочет связываться с индексами
Объект.ТЧ.Удалить(Объект.ТЧ.ТекущиДанные) |
|||
85
Defender aka LINN
07.12.11
✎
08:28
|
(83) Я рыдаю...
|
|||
86
Escander
07.12.11
✎
09:29
|
(84)в коде орфографическая ошибка, да и если её пофиксить - не будет как надо!
(83) ну проведите тест из (70) а потом расскажите как оно отрабатывает. |
|||
87
8vC1
07.12.11
✎
21:59
|
(86) Какая орфографическая ошибка ? - ТекущиДанные понимать как ТекущиеДанные это опечатка. Конечно же будет так:
Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущиеДанные); Соттветственно с индексами строк лучше не связываться. Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущиеДанные.НомерСтроки-1); Правильный вариант соответсвено будет: Объект.ТабличнаяЧасть1.Удалить(Элементы.ТабличнаяЧасть1.ТекущиеДанные); |
|||
88
8vC1
07.12.11
✎
22:07
|
Специально дописал в контекст автора, чтобы закрыть тему окончательно:
&НаКлиенте Процедура ТоварыНоменклатураПриИзменении(Элемент) СтрокаТЧ = Элементы.Товары.ТекущиеДанные; СтрокаТЧ.ЕдиницаИзмерения = ПолучениеОсновнойЕдиницыИзмерения(СтрокаТЧ.Номенклатура); Цена = ПолучитьЦенуСервер(СтрокаТЧ.Номенклатура); Если Цена<>0 Тогда СтрокаТЧ.Цена = Цена; Иначе Объект.Товары.Удалить(СтрокаТЧ); КонецЕсли; КонецПроцедуры |
|||
89
GROOVY
07.12.11
✎
22:59
|
Может до сотни дотянем? :)
Как еще можно грохнуть ТЧ. Предлагайте правильные варианты. :) |
|||
90
Новиков
07.12.11
✎
23:34
|
Хороши вопросы по 8.2 сегодня. Прямо вспоминаю начало 2005-ого года ;)
зы: до ста осталось 9... |
|||
91
GROOVY
07.12.11
✎
23:37
|
(90) Дык политику то отключили..
|
|||
92
Escander
08.12.11
✎
06:12
|
(88) тест указанный в (70) попробуйте, а потом говорите что это правильно! Вариант с текущей строкой его просто не проходит!
(91) а каким снифером пользуетесь? Ваш снифер умеет ловить трафик когда всё выполняется в пределах 1 компа? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |