Имя: Пароль:
1C
1С v8
Изучаю 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
(63) М.Радченко об этом скажите

http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=557359#557359
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 компа?
Ошибка? Это не ошибка, это системная функция.