Имя: Пароль:
1C
1С v8
Текущая строка
0 mrParadox
 
26.11.12
11:33
Хочу установить текущую строку тебличного поля.

   НужнаяСтрока = ТаблицаЗаявок.Найти(НомерЗаявки,"NomerZayavki");
   ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;

НужнаяСтрока в отладке устанавливается.
При установки текущей строки возникает ошибка:

----------------
{Форма.Форма.Форма(101)}: Ошибка при установке значения атрибута контекста (ТекущаяСтрока)
   ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;
по причине:
Невозможно изменить текущую строку
----------------

Что я делаю не так?
1 mrParadox
 
26.11.12
11:38
1С:Предприятие 8.2 (8.2.15.310)
2 Шапокляк
 
26.11.12
11:40
Ищи строку сразу в ЭлементеФормы и активизируй ее
3 mrParadox
 
26.11.12
11:42
Это как?
4 palpetrovich
 
26.11.12
11:44
проверь на всякий случай:
Если НужнаяСтрока = Неопределено Тогда
ну и так получается?
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]
5 Шапокляк
 
26.11.12
11:45
Это так
  НужнаяСтрока = ЭлементыФормы.ТаблицаЗаявок.Найти(НомерЗаявки,"NomerZayavki");
Если НужнаяСтрока<>Неопределено Тогда
   ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;

КонецЕсли;
6 mrParadox
 
26.11.12
11:46
Нужная строка точно не равна неопределено - в отладчике смотрю
7 mrParadox
 
26.11.12
11:47
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]

Ошибка та же
8 Шапокляк
 
26.11.12
11:47
(7) см 5
9 mrParadox
 
26.11.12
11:48
(5)

{Форма.Форма.Форма(100)}: Метод объекта не обнаружен (Найти)
   НужнаяСтрока = ЭлементыФормы.ТаблицаЗаявок.Найти(НомерЗаявки,"NomerZayavki");
10 Reset
 
26.11.12
11:48
(5) Ээээ? эээ
11 Галахад
 
гуру
26.11.12
11:49
А вообще в каком месте (0) вызывается?
12 НЕА123
 
26.11.12
11:49
может отбор какой...
13 НЕА123
 
26.11.12
11:49
кстати, да
(11)+1
14 mrParadox
 
26.11.12
11:51
(11)
В модуле формы.
Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

После редактирования я перезаполняю заново таблицу (из СКЛ) и хочу сделать актичной строку на которую редактировал
15 palpetrovich
 
26.11.12
11:51
(0) давай колись, что это вообще и где эта процедура :)
16 mrParadox
 
26.11.12
11:51
Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
   Если НоваяСтрока Тогда
       ДобавитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
   Иначе
       ИзменитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
   КонецЕсли;
   
   НомерЗаявки=Элемент.ТекущиеДанные.NomerZayavki;
   
   ОбновитьТаблицу();
           
   НужнаяСтрока =ТаблицаЗаявок.Найти(НомерЗаявки,"NomerZayavki");
   ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;

   
КонецПроцедуры
17 mrParadox
 
26.11.12
11:52
Я помню, что точно так раньше делал много раз, все работало
18 palpetrovich
 
26.11.12
11:53
(14) наверное тут собака и порылась :)
"ПередОкончаниемРедактирования" и "я перезаполняю заново таблицу"
19 Reset
 
26.11.12
11:53
Оно и должно работать вроде
20 mrParadox
 
26.11.12
11:53
(14) Что не так?
21 mrParadox
 
26.11.12
11:54
(20) к (18)
22 Шапокляк
 
26.11.12
11:55
(10) Извиняюсь, затупила.
23 НЕА123
 
26.11.12
11:55
надо ПРИ а не ПЕРЕД
24 mrParadox
 
26.11.12
11:55
ОбновитьТаблицу() - загрузка таблицы из СКЛ после внесения в СКЛ изменений.
25 Rovan
 
гуру
26.11.12
11:56
(16) ПередОкончаниемРедактирования курсор находится в строке
и сменить ее не может !
26 Reset
 
26.11.12
11:56
(25) Вот похоже на правду)
27 Aprobator
 
26.11.12
11:59
надо же было так найти место для перезаполнения то. Уметь надо.
28 Reset
 
26.11.12
11:59
да и подменять источник данных в момент их редактирования нехорошо
29 mrParadox
 
26.11.12
11:59
(23) Сделал, ошибка пропала, но Текущая строка все равно не присваевается
30 Reset
 
26.11.12
12:00
Навреное, надо ПОСЛЕ :)
31 Reset
 
26.11.12
12:01
Вообще логику пересмотреть имхо
32 mrParadox
 
26.11.12
12:01
(30) После нет
33 Aprobator
 
26.11.12
12:02
При , Перед - и там и там работать не будет. В событиях при работе со строкой в целом, форма такого безобразия особо не потерпит. Вот ПриПолученииДанных - другое дело. Но, имхо, надо сам процесс пересматриваться.
34 Aprobator
 
26.11.12
12:06
впрочем по поводу ПриПолученииДанных тоже могу ошибаться. Какой смысл всего этого безобразия по умолчанию то?
35 Aprobator
 
26.11.12
12:07
Работаешь с конкретной заявкой, так влепи отбор. Ну или сортировку там у таблицы то и вводи данные как тебе удобно.
36 sadden
 
26.11.12
12:07
(0) для чего тебе устанавливать тек строку (что хочешь дать пользователю)? тогда можно подумать как реализовать
37 Reset
 
26.11.12
12:11
(32) А нужно именно после. Не может сойти с текущего, пока редактирование не завершится. Решай как.
Или "обновляй" таблицу так, чтобы текущая строка осталась в таблице - тогда и менять не нужно будет
38 Aprobator
 
26.11.12
12:12
(37) события После нет для этого безобразия.
39 mrParadox
 
26.11.12
12:13
(35)(36)

Данная таблица - отображение таблицы в МС СКЛ сервере с возможностью её редактирования. Если пользователь изменяет/добавляет новую строку в данную таблицу, то после этого таблица очищается и полностью перезаполняется. Соответственно курсор соскакивает с редактируемой строки и её приходится искать вручную. При болльших объемах возникает путаница и морока.
40 Reset
 
26.11.12
12:13
(38) Я не говорю что есть событие. Я о хроно-точке во временном пространстве
41 Reset
 
26.11.12
12:14
(39) А зачем при изменении одной строчки очищать всю таблицу?
42 sadden
 
26.11.12
12:14
(39) воо - тут ключевое слово очищается
43 Aprobator
 
26.11.12
12:14
(40) а - понятно, я как то более приземленно мыслю.
(39) из за добавления одной записи надо перезаполнять всю таблицу заново??? Что то явно не так в датском королевстве.
44 mrParadox
 
26.11.12
12:15
(34) ПриПолученииданных не проканало, 1С стала вести себя неадекватно, по несколько раз вызывать одно и то же событие "ПередОкончаниемРедактирования" /"ПриОкончанииРедактирвоания"
45 sadden
 
26.11.12
12:15
кнешно у тебя не установит тек строку - строки то уже очистились и заполнились новыми
46 mrParadox
 
26.11.12
12:16
(41) Чтобы наверняка быть уверенным, что те действия, которые осущестлялись, реально осуществились с базой СКЛ
47 Reset
 
26.11.12
12:16
(44) В свете алгоритма решения, кто ведет себя адекватно - тот еще вопрос :)
48 mrParadox
 
26.11.12
12:16
(45) Так я ищу нужную строку среди новых по коду и её пытаюсь сделать активной
49 Aprobator
 
26.11.12
12:17
(47) +100500. Странное какое то добавление новой строки данных.
50 Reset
 
26.11.12
12:18
(46) Ерунда какая-то. Записал строку в БД - проверяешь, записалась ли, чтоли? При этом чтением всей таблицы.
51 sadden
 
26.11.12
12:20
(0) я не понял до конца зачем всё так, но могу предложить следующий механизм: после редактирования строки записываешь в глобал номер заявки, далее делаешь свои хитрые манипуляции с таблицей, в событии ПриПолученииДанных по глобалу находишь нужную строку и устанавливаешь её с очисткой глобала
52 mrParadox
 
26.11.12
12:21
(50) Вполне сносный алгоритм. таблица СКЛ маленькая, чтение происходит мгновенно. Если бы не сложности с окончанием редактирования
53 mrParadox
 
26.11.12
12:21
(51) Пробовал , см. (44)
54 sadden
 
26.11.12
12:22
(53) у меня всё получилось
55 mrParadox
 
26.11.12
12:23
(54) Ок, после обеда еще раз попробую :)
56 Reset
 
26.11.12
12:23
(48) Ищи, не ищи, как совершенно верно заметили в (25), НЕВОЗМОЖНО сменить текущу строку.

Когда ты суп ложкой ешь, ты НЕ МОЖЕШЬ взять другую ложку, пока из рта ее не вытащищь, хоть двадцать раз ты ее найди глазами или руками или чем там ты раьоту работаешь
57 Aprobator
 
26.11.12
12:23
(52) ну если только от слова снести. Вообще с помощью 1С напрямую редактировать СКЛ таблицу - вставляет.
58 mrParadox
 
26.11.12
12:23
Код кинь, может я чё не так делаю?
59 mrParadox
 
26.11.12
12:24
(58) к (54)
60 НЕА123
 
26.11.12
12:26
ПриОкончанииРедактирования (OnEditEnd)
Синтаксис:

ПриОкончанииРедактирования(<НоваяСтрока>, <ОтменаРедактирования>)
Параметры:

<НоваяСтрока>

Тип: Булево.
Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована.
<ОтменаРедактирования>

Тип: Булево.
Истина, если произошла отмена редактирования.
Значение по умолчанию: Ложь
Описание:

Возникает ++++++++++++++++++ПОСЛЕ++++++++++++++++++ окончания редактирования строки табличного поля.
Примечание:

Возникает, если редактирование производится непосредственно в табличном поле.
См. также:

ТабличноеПоле, событие ПриНачалеРедактирования
61 НЕА123
 
26.11.12
12:28
(60)
гм... грязновятенько получится.
62 НЕА123
 
26.11.12
12:30
(61)
хз. когда новая строка, то ее, скорее может и не быть.
63 Reset
 
26.11.12
12:41
(60) Я попробовал. Если в этом событии переустанавливать, ошибки не возникает, но текущая не меняется. Видимо, несмотря на то, что возникает "после", состояние редактирования еще остается "активным"
64 Reset
 
26.11.12
12:44
+(63) при ОтменаРедактирования=Истина, однако, работает (смена текущей)
65 sadden
 
26.11.12
12:52
(64) он таблицу очищает, не сработает так
66 sadden
 
26.11.12
13:10
(0) сделай так:

Перем Глобал;


Процедура ХитрыеМанипуляции()
   Таб.Очистить();
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 1;
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 2;
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 3;
КонецПроцедуры

Процедура ТабПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
   Глобал = Элемент.ТекущиеДанные.НомерЗаявки;
   ХитрыеМанипуляции();
КонецПроцедуры

Процедура ОбновлениеОтображения()
   Если Глобал <> Неопределено  Тогда
       ТекСтрока = Таб.Найти(Глобал, "НомерЗаявки");
       Если ТекСтрока <> Неопределено Тогда
           ЭлементыФормы.Таб.ТекущаяСтрока = ТекСтрока;
       КонецЕсли;
   КонецЕсли;
   Глобал = Неопределено;
КонецПроцедуры

Глобал = Неопределено;
67 sadden
 
26.11.12
13:11
(66) работает, проверял
68 mrParadox
 
26.11.12
13:37
(66) а процедура ОбновлениеОтображения() откуда вызывается?
69 Reset
 
26.11.12
13:38
(68) Это событие
70 sadden
 
26.11.12
13:39
(68) это стандартное событие формы, глянь в свойствах твоей формы
71 Rovan
 
гуру
26.11.12
13:39
(63) делай через ОбработкуОжидания с интервалом 0.1 сек
72 sadden
 
26.11.12
13:40
(71) - зачем? только систему нагрузит
73 mrParadox
 
26.11.12
13:40
(70) Точняк, работает. Спасобо большое.

(71) Думал над этим вариантом, но попробовать не успел.
74 mrParadox
 
26.11.12
13:41
(72) Можно сделать чтобы единовременно запускался, без повторов.
75 sadden
 
26.11.12
13:41
(71) потом не факт, что перезаполнение таблицы уложится в 0.1 сек
76 mrParadox
 
26.11.12
13:42
я имел ввиду, что в "ПриОкончанииРедактирования" ставить обработчик ожидания для единоразового запуска
77 sadden
 
26.11.12
13:43
(76) можно так, но тоже, ты же не знаешь момент времени, когда событие ПриОкончанииРедактирования отработает
78 sadden
 
26.11.12
13:44
(76) а ОбновлениеОтоброжение аккурат сработает после ОкончанияРедактирования
79 Reset
 
26.11.12
13:44
(71) Спасибо, мне оно не нужно ;)
А будет нужно, разберусь :)
80 mrParadox
 
26.11.12
13:45
не сталкивался с таким событием. Век живи век учись.
81 mrParadox
 
26.11.12
13:45
(79) я не тебе конкретно
82 mrParadox
 
26.11.12
13:46
Короче путаница пошла :)
83 Reset
 
26.11.12
13:46
(81) Я тоже не тебе ;)
84 Reset
 
26.11.12
13:49
(77) Это пофиг кстати, когда отработает.
Но из двух зол через событие обновления - зло меньшее
85 sadden
 
26.11.12
13:55
(84) как уж пофиг когда отработает событие ОкончаниеРедактирования, попробуй сделать через Оповестить(), не сработает
86 sadden
 
26.11.12
13:56
(84) или задержку сделать в ОкончаниеРедактирования так чтобы Обработчик раньше сработал
87 Reset
 
26.11.12
13:57
(85)(86)
Я говорю что пофиг сколько он будет отрабатывать и все заполнения, выполняемые в нем - обработчик ожидания все равно запустится после этого
88 sadden
 
26.11.12
13:58
(87) пробовал - не получилось
89 Reset
 
26.11.12
13:59
(88) Чего не получилось? :-\ Яснее
90 sadden
 
26.11.12
13:59
(87) нужно дождаться окончания события ОкончаниеРедактирования
91 Reset
 
26.11.12
13:59
(90) Я в курсе, елки палки
92 Reset
 
26.11.12
14:00
(91) и этого можно добиться, поставив одноразывый обработчик ожидания либо в событии обновления отображения.
КЭП
93 sadden
 
26.11.12
14:00
в примере моём (66) вместо ОбновленияОтображения после перезаполнения таблицы в ОкончаниеРедактирования делал Оповестить()
94 sadden
 
26.11.12
14:03
(92) на какое время ставить ОбработчикОжидания от куда ты можешь узнать?
95 Reset
 
26.11.12
14:04
(94) Пофиг на какое
96 Reset
 
26.11.12
14:05
+(95) Все равно выполниться после всех действий, сколько бы они не длились
97 sadden
 
26.11.12
14:06
(96) может быть (нужно проверить) тогда почему через оповестить не получилось?
98 sadden
 
26.11.12
14:09
+(97)

Процедура ХитрыеМанипуляции()
   Таб.Очистить();
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 1;
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 2;
   Стр = Таб.Добавить();
   Стр.НомерЗаявки = 3;
КонецПроцедуры

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

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
   Если ИмяСобытия = "УстановкаЗаявки" И Источник = ЭтаФорма  Тогда
       ТекСтрока = Таб.Найти(Параметр, "НомерЗаявки");
       Если ТекСтрока <> Неопределено Тогда
           ЭлементыФормы.Таб.ТекущаяСтрока = ТекСтрока;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры
99 Reset
 
26.11.12
14:18
(97)(98) Попробовал - обработчик оповещения отрабатывает еще до завершения обработчика ПриОкончанииРедактирования, т.е. цель (`выполниться после`) не достигается
100 Reset
 
26.11.12
14:18
(100)
101 sadden
 
26.11.12
14:19
(99) о том и речь, счего ты взял что ОбработчикОжидания не сработает до?
102 Reset
 
26.11.12
14:20
(101) Потому что это ТАК.
103 Reset
 
26.11.12
14:21
Вот цитата из СП

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

Ключевое - "в период ожидания системы"
104 sadden
 
26.11.12
14:23
проверил с задержкой ОкончанияРедактирования, точно в любом случае отрабатывает после. Тем не менее визуально через ОбработчикОжидания притормаживает установка тек строки, видно сначала устанавливает первую строку, потом перепрыгивает на нужную, чего нет через ОбновлениеОтображения
105 Reset
 
26.11.12
14:23
(104) я про два зла сказал (84) :)
106 sadden
 
26.11.12
14:23
(104) к (102)
107 sadden
 
26.11.12
14:24
(105) ок - но проверить же нужно было :-)
108 Reset
 
26.11.12
14:25
:-)
109 mrParadox
 
26.11.12
14:28
(104) У меня через ОбновлениеОтображения тоже притормаживает, в смысле, сначала формируется таблица, активна 1-я сстрока, потом через маленькую паузу активируется нужная строка
110 sadden
 
26.11.12
14:32
(109) можешь код показать?
111 mrParadox
 
26.11.12
14:38
Перем ГлобНомерЗаявки;

Процедура ТаблицаЗаявокПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
   Если НоваяСтрока Тогда
       ДобавитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
   Иначе
       ИзменитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
   КонецЕсли;
   
   ГлобНомерЗаявки=Элемент.ТекущиеДанные.NomerZayavki;
   
   ОбновитьТаблицу();
КонецПроцедуры


Процедура ОбновлениеОтображения()
   Если ГлобНомерЗаявки <> Неопределено  Тогда
       ТекСтрока = ТаблицаЗаявок.Найти(ГлобНомерЗаявки, "NomerZayavki");
       Если ТекСтрока <> Неопределено Тогда
           ЭлементыФормы.ТаблицаЗаявок.ТекущаяСтрока = ТекСтрока;
       КонецЕсли;
   КонецЕсли;
   ГлобНомерЗаявки = Неопределено;
КонецПроцедуры

ГлобНомерЗаявки=Неопределено;
112 mrParadox
 
26.11.12
14:39
Заметил на реальной базе это происходит быстро, а на тестовой притормаживает. Терпимо в общем.
113 sadden
 
26.11.12
14:48
ТекСтрока = ТаблицаЗаявок.Найти(ГлобНомерЗаявки, "NomerZayavki"); долго отрабатывает вообщем, но тут уже ничем не поможешь
114 sadden
 
26.11.12
14:49
(111) ОбновитьТаблицу() убери лучше
115 mrParadox
 
26.11.12
14:54
(114) Пофигу. Этот интерфейс предназначается администратору системы, т.е. мне лично. Я уж переживу полсекундное зависание :)
116 sadden
 
26.11.12
14:55
(115) просто это лишнее - зачем код портить?
117 sadden
 
26.11.12
14:56
(113) хотя можно в таблицу свою индексы добавить по коолонке поиска - быстрее буит отрабатывать (думаю так :-) )
118 mrParadox
 
26.11.12
15:01
Если убрать ОбновитьТаблицу, тогда данной проблемы не будет изначально :)
119 sadden
 
26.11.12
15:06
(118) проверил уже? :)
120 mrParadox
 
26.11.12
15:06
(118) Я знал изначально. Эта проблема и появляется из-за этой процедуры.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн