26.11.12 — 11:33
Хочу установить текущую строку тебличного поля.
НужнаяСтрока = ТаблицаЗаявок.Найти(НомерЗаявки,»NomerZayavki»);
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;
НужнаяСтрока в отладке устанавливается.
При установки текущей строки возникает ошибка:
—————-
{Форма.Форма.Форма(101)}: Ошибка при установке значения атрибута контекста (ТекущаяСтрока)
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;
по причине:
Невозможно изменить текущую строку
—————-
Что я делаю не так?
1 — 26.11.12 — 11:38
1С:Предприятие 8.2 (8.2.15.310)
2 — 26.11.12 — 11:40
Ищи строку сразу в ЭлементеФормы и активизируй ее
3 — 26.11.12 — 11:42
Это как?
4 — 26.11.12 — 11:44
проверь на всякий случай:
Если НужнаяСтрока = Неопределено Тогда
ну и так получается?
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]
5 — 26.11.12 — 11:45
Это так
НужнаяСтрока = ЭлементыФормы.ТаблицаЗаявок.Найти(НомерЗаявки,»NomerZayavki»);
Если НужнаяСтрока<>Неопределено Тогда
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;
КонецЕсли;
6 — 26.11.12 — 11:46
Нужная строка точно не равна неопределено — в отладчике смотрю
7 — 26.11.12 — 11:47
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]
Ошибка та же
8 — 26.11.12 — 11:47
(7) см 5
9 — 26.11.12 — 11:48
(5)
{Форма.Форма.Форма(100)}: Метод объекта не обнаружен (Найти)
НужнаяСтрока = ЭлементыФормы.ТаблицаЗаявок.Найти(НомерЗаявки,»NomerZayavki»);
10 — 26.11.12 — 11:48
(5) Ээээ? эээ
11 — 26.11.12 — 11:49
А вообще в каком месте (0) вызывается?
12 — 26.11.12 — 11:49
может отбор какой…
13 — 26.11.12 — 11:49
кстати, да
(11)+1
14 — 26.11.12 — 11:51
(11)
В модуле формы.
Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
После редактирования я перезаполняю заново таблицу (из СКЛ) и хочу сделать актичной строку на которую редактировал
15 — 26.11.12 — 11:51
(0) давай колись, что это вообще и где эта процедура
16 — 26.11.12 — 11:51
Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
Если НоваяСтрока Тогда
ДобавитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
Иначе
ИзменитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);
КонецЕсли;
НомерЗаявки=Элемент.ТекущиеДанные.NomerZayavki;
ОбновитьТаблицу();
НужнаяСтрока =ТаблицаЗаявок.Найти(НомерЗаявки,»NomerZayavki»);
ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока;
КонецПроцедуры
17 — 26.11.12 — 11:52
Я помню, что точно так раньше делал много раз, все работало
18 — 26.11.12 — 11:53
(14) наверное тут собака и порылась
«ПередОкончаниемРедактирования» и «я перезаполняю заново таблицу»
19 — 26.11.12 — 11:53
Оно и должно работать вроде
20 — 26.11.12 — 11:53
(14) Что не так?
21 — 26.11.12 — 11:54
22 — 26.11.12 — 11:55
(10) Извиняюсь, затупила.
23 — 26.11.12 — 11:55
надо ПРИ а не ПЕРЕД
24 — 26.11.12 — 11:55
ОбновитьТаблицу() — загрузка таблицы из СКЛ после внесения в СКЛ изменений.
25 — 26.11.12 — 11:56
(16) ПередОкончаниемРедактирования курсор находится в строке
и сменить ее не может !
26 — 26.11.12 — 11:56
(25) Вот похоже на правду)
27 — 26.11.12 — 11:59
надо же было так найти место для перезаполнения то. Уметь надо.
28 — 26.11.12 — 11:59
да и подменять источник данных в момент их редактирования нехорошо
29 — 26.11.12 — 11:59
(23) Сделал, ошибка пропала, но Текущая строка все равно не присваевается
30 — 26.11.12 — 12:00
Навреное, надо ПОСЛЕ
31 — 26.11.12 — 12:01
Вообще логику пересмотреть имхо
32 — 26.11.12 — 12:01
(30) После нет
33 — 26.11.12 — 12:02
При , Перед — и там и там работать не будет. В событиях при работе со строкой в целом, форма такого безобразия особо не потерпит. Вот ПриПолученииДанных — другое дело. Но, имхо, надо сам процесс пересматриваться.
34 — 26.11.12 — 12:06
впрочем по поводу ПриПолученииДанных тоже могу ошибаться. Какой смысл всего этого безобразия по умолчанию то?
35 — 26.11.12 — 12:07
Работаешь с конкретной заявкой, так влепи отбор. Ну или сортировку там у таблицы то и вводи данные как тебе удобно.
36 — 26.11.12 — 12:07
(0) для чего тебе устанавливать тек строку (что хочешь дать пользователю)? тогда можно подумать как реализовать
37 — 26.11.12 — 12:11
(32) А нужно именно после. Не может сойти с текущего, пока редактирование не завершится. Решай как.
Или «обновляй» таблицу так, чтобы текущая строка осталась в таблице — тогда и менять не нужно будет
38 — 26.11.12 — 12:12
(37) события После нет для этого безобразия.
39 — 26.11.12 — 12:13
(35)(36)
Данная таблица — отображение таблицы в МС СКЛ сервере с возможностью её редактирования. Если пользователь изменяет/добавляет новую строку в данную таблицу, то после этого таблица очищается и полностью перезаполняется. Соответственно курсор соскакивает с редактируемой строки и её приходится искать вручную. При болльших объемах возникает путаница и морока.
40 — 26.11.12 — 12:13
(38) Я не говорю что есть событие. Я о хроно-точке во временном пространстве
41 — 26.11.12 — 12:14
(39) А зачем при изменении одной строчки очищать всю таблицу?
42 — 26.11.12 — 12:14
(39) воо — тут ключевое слово очищается
43 — 26.11.12 — 12:14
(40) а — понятно, я как то более приземленно мыслю.
(39) из за добавления одной записи надо перезаполнять всю таблицу заново??? Что то явно не так в датском королевстве.
44 — 26.11.12 — 12:15
(34) ПриПолученииданных не проканало, 1С стала вести себя неадекватно, по несколько раз вызывать одно и то же событие «ПередОкончаниемРедактирования» /»ПриОкончанииРедактирвоания»
45 — 26.11.12 — 12:15
кнешно у тебя не установит тек строку — строки то уже очистились и заполнились новыми
46 — 26.11.12 — 12:16
(41) Чтобы наверняка быть уверенным, что те действия, которые осущестлялись, реально осуществились с базой СКЛ
47 — 26.11.12 — 12:16
(44) В свете алгоритма решения, кто ведет себя адекватно — тот еще вопрос
48 — 26.11.12 — 12:16
(45) Так я ищу нужную строку среди новых по коду и её пытаюсь сделать активной
49 — 26.11.12 — 12:17
(47) +100500. Странное какое то добавление новой строки данных.
50 — 26.11.12 — 12:18
(46) Ерунда какая-то. Записал строку в БД — проверяешь, записалась ли, чтоли? При этом чтением всей таблицы.
51 — 26.11.12 — 12:20
(0) я не понял до конца зачем всё так, но могу предложить следующий механизм: после редактирования строки записываешь в глобал номер заявки, далее делаешь свои хитрые манипуляции с таблицей, в событии ПриПолученииДанных по глобалу находишь нужную строку и устанавливаешь её с очисткой глобала
52 — 26.11.12 — 12:21
(50) Вполне сносный алгоритм. таблица СКЛ маленькая, чтение происходит мгновенно. Если бы не сложности с окончанием редактирования
53 — 26.11.12 — 12:21
(51) Пробовал , см. (44)
54 — 26.11.12 — 12:22
(53) у меня всё получилось
55 — 26.11.12 — 12:23
(54) Ок, после обеда еще раз попробую
56 — 26.11.12 — 12:23
(48) Ищи, не ищи, как совершенно верно заметили в (25), НЕВОЗМОЖНО сменить текущу строку.
Когда ты суп ложкой ешь, ты НЕ МОЖЕШЬ взять другую ложку, пока из рта ее не вытащищь, хоть двадцать раз ты ее найди глазами или руками или чем там ты раьоту работаешь
57 — 26.11.12 — 12:23
(52) ну если только от слова снести. Вообще с помощью 1С напрямую редактировать СКЛ таблицу — вставляет.
58 — 26.11.12 — 12:23
Код кинь, может я чё не так делаю?
59 — 26.11.12 — 12:24
60 — 26.11.12 — 12:26
ПриОкончанииРедактирования (OnEditEnd)
Синтаксис:
ПриОкончанииРедактирования(<НоваяСтрока>, <ОтменаРедактирования>)
Параметры:
<НоваяСтрока>
Тип: Булево.
Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована.
<ОтменаРедактирования>
Тип: Булево.
Истина, если произошла отмена редактирования.
Значение по умолчанию: Ложь
Описание:
Возникает ++++++++++++++++++ПОСЛЕ++++++++++++++++++ окончания редактирования строки табличного поля.
Примечание:
Возникает, если редактирование производится непосредственно в табличном поле.
См. также:
ТабличноеПоле, событие ПриНачалеРедактирования
61 — 26.11.12 — 12:28
(60)
гм… грязновятенько получится.
62 — 26.11.12 — 12:30
(61)
хз. когда новая строка, то ее, скорее может и не быть.
63 — 26.11.12 — 12:41
(60) Я попробовал. Если в этом событии переустанавливать, ошибки не возникает, но текущая не меняется. Видимо, несмотря на то, что возникает «после», состояние редактирования еще остается «активным»
64 — 26.11.12 — 12:44
+(63) при ОтменаРедактирования=Истина, однако, работает (смена текущей)
65 — 26.11.12 — 12:52
(64) он таблицу очищает, не сработает так
66 — 26.11.12 — 13:10
(0) сделай так:
Перем Глобал; Процедура ХитрыеМанипуляции() Таб.Очистить(); Стр = Таб.Добавить(); Стр.НомерЗаявки = 1; Стр = Таб.Добавить(); Стр.НомерЗаявки = 2; Стр = Таб.Добавить(); Стр.НомерЗаявки = 3; КонецПроцедуры Процедура ТабПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) Глобал = Элемент.ТекущиеДанные.НомерЗаявки; ХитрыеМанипуляции(); КонецПроцедуры Процедура ОбновлениеОтображения() Если Глобал <> Неопределено Тогда ТекСтрока = Таб.Найти(Глобал, "НомерЗаявки"); Если ТекСтрока <> Неопределено Тогда ЭлементыФормы.Таб.ТекущаяСтрока = ТекСтрока; КонецЕсли; КонецЕсли; Глобал = Неопределено; КонецПроцедуры Глобал = Неопределено;
67 — 26.11.12 — 13:11
(66) работает, проверял
68 — 26.11.12 — 13:37
(66) а процедура ОбновлениеОтображения() откуда вызывается?
69 — 26.11.12 — 13:38
(68) Это событие
70 — 26.11.12 — 13:39
(68) это стандартное событие формы, глянь в свойствах твоей формы
71 — 26.11.12 — 13:39
(63) делай через ОбработкуОжидания с интервалом 0.1 сек
72 — 26.11.12 — 13:40
(71) — зачем? только систему нагрузит
73 — 26.11.12 — 13:40
(70) Точняк, работает. Спасобо большое.
(71) Думал над этим вариантом, но попробовать не успел.
74 — 26.11.12 — 13:41
(72) Можно сделать чтобы единовременно запускался, без повторов.
75 — 26.11.12 — 13:41
(71) потом не факт, что перезаполнение таблицы уложится в 0.1 сек
76 — 26.11.12 — 13:42
я имел ввиду, что в «ПриОкончанииРедактирования» ставить обработчик ожидания для единоразового запуска
77 — 26.11.12 — 13:43
(76) можно так, но тоже, ты же не знаешь момент времени, когда событие ПриОкончанииРедактирования отработает
78 — 26.11.12 — 13:44
(76) а ОбновлениеОтоброжение аккурат сработает после ОкончанияРедактирования
79 — 26.11.12 — 13:44
(71) Спасибо, мне оно не нужно
А будет нужно, разберусь
80 — 26.11.12 — 13:45
не сталкивался с таким событием. Век живи век учись.
81 — 26.11.12 — 13:45
(79) я не тебе конкретно
82 — 26.11.12 — 13:46
Короче путаница пошла
83 — 26.11.12 — 13:46
(81) Я тоже не тебе
84 — 26.11.12 — 13:49
(77) Это пофиг кстати, когда отработает.
Но из двух зол через событие обновления — зло меньшее
85 — 26.11.12 — 13:55
(84) как уж пофиг когда отработает событие ОкончаниеРедактирования, попробуй сделать через Оповестить(), не сработает
86 — 26.11.12 — 13:56
(84) или задержку сделать в ОкончаниеРедактирования так чтобы Обработчик раньше сработал
87 — 26.11.12 — 13:57
(85)(86)
Я говорю что пофиг сколько он будет отрабатывать и все заполнения, выполняемые в нем — обработчик ожидания все равно запустится после этого
88 — 26.11.12 — 13:58
(87) пробовал — не получилось
89 — 26.11.12 — 13:59
(88) Чего не получилось? :- Яснее
90 — 26.11.12 — 13:59
(87) нужно дождаться окончания события ОкончаниеРедактирования
91 — 26.11.12 — 13:59
(90) Я в курсе, елки палки
92 — 26.11.12 — 14:00
(91) и этого можно добиться, поставив одноразывый обработчик ожидания либо в событии обновления отображения.
КЭП
93 — 26.11.12 — 14:00
в примере моём (66) вместо ОбновленияОтображения после перезаполнения таблицы в ОкончаниеРедактирования делал Оповестить()
94 — 26.11.12 — 14:03
(92) на какое время ставить ОбработчикОжидания от куда ты можешь узнать?
95 — 26.11.12 — 14:04
(94) Пофиг на какое
96 — 26.11.12 — 14:05
+(95) Все равно выполниться после всех действий, сколько бы они не длились
97 — 26.11.12 — 14:06
(96) может быть (нужно проверить) тогда почему через оповестить не получилось?
98 — 26.11.12 — 14:09
+(97)
Процедура ХитрыеМанипуляции() Таб.Очистить(); Стр = Таб.Добавить(); Стр.НомерЗаявки = 1; Стр = Таб.Добавить(); Стр.НомерЗаявки = 2; Стр = Таб.Добавить(); Стр.НомерЗаявки = 3; КонецПроцедуры Процедура ТабПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) Глобал = Элемент.ТекущиеДанные.НомерЗаявки; ХитрыеМанипуляции(); ОтменаРедактирования = Истина; Оповестить("УстановкаЗявки", Глобал, ЭтаФорма); КонецПроцедуры Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "УстановкаЗаявки" И Источник = ЭтаФорма Тогда ТекСтрока = Таб.Найти(Параметр, "НомерЗаявки"); Если ТекСтрока <> Неопределено Тогда ЭлементыФормы.Таб.ТекущаяСтрока = ТекСтрока; КонецЕсли; КонецЕсли; КонецПроцедуры
99 — 26.11.12 — 14:18
(97)(98) Попробовал — обработчик оповещения отрабатывает еще до завершения обработчика ПриОкончанииРедактирования, т.е. цель (`выполниться после`) не достигается
100 — 26.11.12 — 14:18
-2
Табличное поле ~ Как установить текущую строку в табличном поле?
Схема программной установки нужной нам строки активной.
Для начала хочу напомнить, что данные табличной части документа(или таблицы значений) и табличное поле – это разные объекты. Для того чтобы сделать какие-то визуальные действия мы работаем с табличным полем. В данном случае, мы будем использовать его свойство «ТекущаяСтрока», как раз оно и отвечает за то, какая строка активна.
Чтобы выделить в табличном поле необходимую нам строку понадобится два шага:
1. Найти нужную нам строку в объекте данных которые отображает табличное поле
Подчеркну что здесь понадобиться именно объект данных. Например, у нас имеется документ РеализацияТоваровУслуг у которого есть табличная часть «Товары» и мы решили сделать активной 2-ю строку на форме документа. Тогда в модуле формы документа мы напишем:
Код 1C v 8.х
// у второй строки индекс равен одному
НужнаяСтрока = Товары[1];
Или мы знаем, что во второй строке в колонке Номенклатура у элемента Код равен «001» тогда мы используем конструкцию:
Код 1C v 8.х
// сначала находим элемент справочника Номенклатура по коду
// а затем ищем его в Табличной части «Товары»
НужнаяСтрока = Товары.Найти(Справочники.Номенклатура.НайтиПоКоду(«001»));
2. Установить значением текущей строки найденную строку
Теперь нам нужно присвоить значение переменной НужнаяСтрока свойству табличного поля ТекущаяСтрока:
Код 1C v 8.х
// если табличное поле у нас тоже называется Товары
ЭлементыФормы.Товары.Текущаястрока = НужнаяСтрока;
Или
Код 1C v 8.х
// если табличное поле называется ТабличноеПоле1
ЭлементыФормы.ТабличноеПоле1.Текущаястрока = НужнаяСтрока;
В итоге строки кода могут выглядеть вот так:
Код 1C v 8.х
НужнаяСтрока = Товары.Найти(Справочники.Номенклатура.НайтиПоКоду(«001»));
ЭлементыФормы.ТабличноеПоле1.Текущаястрока = НужнаяСтрока;
Хочу установить текущую строку тебличного поля. НужнаяСтрока в отладке устанавливается. При установки текущей строки возникает ошибка: —————- {Форма.Форма.Форма}: Ошибка при установке значения атрибута контекста (ТекущаяСтрока) ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока; по причине: Невозможно изменить текущую строку —————- Что я делаю не так?
Хочу установить текущую строку тебличного поля. НужнаяСтрока в отладке устанавливается. При установки текущей строки возникает ошибка: —————- {Форма.Форма.Форма}: Ошибка при установке значения атрибута контекста (ТекущаяСтрока) ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = НужнаяСтрока; по причине: Невозможно изменить текущую строку —————- Что я делаю не так?
1С:Предприятие 8.2 (8.2.15.310)
Ищи строку сразу в ЭлементеФормы и активизируй ее
проверь на всякий случай: Если НужнаяСтрока = Неопределено Тогда ну и так получается? ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]
Нужная строка точно не равна неопределено — в отладчике смотрю
{Форма.Форма.Форма}: Метод объекта не обнаружен (Найти)
А вообще в каком месте вызывается?
В модуле формы. Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) После редактирования я перезаполняю заново таблицу (из СКЛ) и хочу сделать актичной строку на которую редактировал
давай колись, что это вообще и где эта процедура
Я помню, что точно так раньше делал много раз, все работало
наверное тут собака и порылась «ПередОкончаниемРедактирования» и «я перезаполняю заново таблицу»
Оно и должно работать вроде
ОбновитьТаблицу — загрузка таблицы из СКЛ после внесения в СКЛ изменений.
ПередОкончаниемРедактирования курсор находится в строке и сменить ее не может !
надо же было так найти место для перезаполнения то. Уметь надо.
да и подменять источник данных в момент их редактирования нехорошо
Сделал, ошибка пропала, но Текущая строка все равно не присваевается
Вообще логику пересмотреть имхо
При , Перед — и там и там работать не будет. В событиях при работе со строкой в целом, форма такого безобразия особо не потерпит. Вот ПриПолученииДанных — другое дело. Но, имхо, надо сам процесс пересматриваться.
впрочем по поводу ПриПолученииДанных тоже могу ошибаться. Какой смысл всего этого безобразия по умолчанию то?
Работаешь с конкретной заявкой, так влепи отбор. Ну или сортировку там у таблицы то и вводи данные как тебе удобно.
для чего тебе устанавливать тек строку (что хочешь дать пользователю)? тогда можно подумать как реализовать
А нужно именно после. Не может сойти с текущего, пока редактирование не завершится. Решай как. Или «обновляй» таблицу так, чтобы текущая строка осталась в таблице — тогда и менять не нужно будет
события После нет для этого безобразия.
Данная таблица — отображение таблицы в МС СКЛ сервере с возможностью её редактирования. Если пользователь изменяет/добавляет новую строку в данную таблицу, то после этого таблица очищается и полностью перезаполняется. Соответственно курсор соскакивает с редактируемой строки и её приходится искать вручную. При болльших объемах возникает путаница и морока.
Я не говорю что есть событие. Я о хроно-точке во временном пространстве
А зачем при изменении одной строчки очищать всю таблицу?
воо — тут ключевое слово очищается
а — понятно, я как то более приземленно мыслю. из за добавления одной записи надо перезаполнять всю таблицу заново??? Что то явно не так в датском королевстве.
ПриПолученииданных не проканало, 1С стала вести себя неадекватно, по несколько раз вызывать одно и то же событие «ПередОкончаниемРедактирования» /»ПриОкончанииРедактирвоания»
кнешно у тебя не установит тек строку — строки то уже очистились и заполнились новыми
Чтобы наверняка быть уверенным, что те действия, которые осущестлялись, реально осуществились с базой СКЛ
В свете алгоритма решения, кто ведет себя адекватно — тот еще вопрос
Так я ищу нужную строку среди новых по коду и её пытаюсь сделать активной
+100500. Странное какое то добавление новой строки данных.
Ерунда какая-то. Записал строку в БД — проверяешь, записалась ли, чтоли? При этом чтением всей таблицы.
я не понял до конца зачем всё так, но могу предложить следующий механизм: после редактирования строки записываешь в глобал номер заявки, далее делаешь свои хитрые манипуляции с таблицей, в событии ПриПолученииДанных по глобалу находишь нужную строку и устанавливаешь её с очисткой глобала
Вполне сносный алгоритм. таблица СКЛ маленькая, чтение происходит мгновенно. Если бы не сложности с окончанием редактирования
Ок, после обеда еще раз попробую
Ищи, не ищи, как совершенно верно заметили в , НЕВОЗМОЖНО сменить текущу строку. Когда ты суп ложкой ешь, ты НЕ МОЖЕШЬ взять другую ложку, пока из рта ее не вытащищь, хоть двадцать раз ты ее найди глазами или руками или чем там ты раьоту работаешь
ну если только от слова снести. Вообще с помощью 1С напрямую редактировать СКЛ таблицу — вставляет.
Код кинь, может я чё не так делаю?
Синтаксис: ПриОкончанииРедактирования(<НоваяСтрока>, <ОтменаРедактирования>) Параметры: <НоваяСтрока> Тип: Булево. Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована. <ОтменаРедактирования> Тип: Булево. Истина, если произошла отмена редактирования. Значение по умолчанию: Ложь Описание: Возникает ++++++++++++++++++ПОСЛЕ++++++++++++++++++ окончания редактирования строки табличного поля. Примечание: Возникает, если редактирование производится непосредственно в табличном поле. См. также: ТабличноеПоле, событие ПриНачалеРедактирования
гм… грязновятенько получится.
хз. когда новая строка, то ее, скорее может и не быть.
Я попробовал. Если в этом событии переустанавливать, ошибки не возникает, но текущая не меняется. Видимо, несмотря на то, что возникает «после», состояние редактирования еще остается «активным»
+ при ОтменаРедактирования=Истина, однако, работает (смена текущей)
он таблицу очищает, не сработает так
а процедура ОбновлениеОтображения откуда вызывается?
это стандартное событие формы, глянь в свойствах твоей формы
делай через ОбработкуОжидания с интервалом 0.1 сек
— зачем? только систему нагрузит
Точняк, работает. Спасобо большое. Думал над этим вариантом, но попробовать не успел.
Можно сделать чтобы единовременно запускался, без повторов.
потом не факт, что перезаполнение таблицы уложится в 0.1 сек
я имел ввиду, что в «ПриОкончанииРедактирования» ставить обработчик ожидания для единоразового запуска
можно так, но тоже, ты же не знаешь момент времени, когда событие ПриОкончанииРедактирования отработает
а ОбновлениеОтоброжение аккурат сработает после ОкончанияРедактирования
Спасибо, мне оно не нужно А будет нужно, разберусь
не сталкивался с таким событием. Век живи век учись.
Это пофиг кстати, когда отработает. Но из двух зол через событие обновления — зло меньшее
как уж пофиг когда отработает событие ОкончаниеРедактирования, попробуй сделать через Оповестить, не сработает
или задержку сделать в ОкончаниеРедактирования так чтобы Обработчик раньше сработал
Я говорю что пофиг сколько он будет отрабатывать и все заполнения, выполняемые в нем — обработчик ожидания все равно запустится после этого
Чего не получилось? :- Яснее
нужно дождаться окончания события ОкончаниеРедактирования
и этого можно добиться, поставив одноразывый обработчик ожидания либо в событии обновления отображения. КЭП
в примере моём вместо ОбновленияОтображения после перезаполнения таблицы в ОкончаниеРедактирования делал Оповестить
на какое время ставить ОбработчикОжидания от куда ты можешь узнать?
+ Все равно выполниться после всех действий, сколько бы они не длились
может быть (нужно проверить) тогда почему через оповестить не получилось?
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
-
Подскажите, как решить эту проблему
Процедура ДоговорКонтрагентаПередНачаломДобавления(Элемент, Отказ, Копирование, ВидыДоговораВзаиморасчетов,СтандартнаяОбработка, СтруктураПараметров, ДоговорКонтрагента, СтруктураДополнительныхПараметров = Неопределено) МетаданныеДокумента = ДокументОбъект.Метаданные(); Если Не Контрагент.Пустая() Тогда ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора(); ФормаВыбора.ПараметрОтборПоВладельцу = Контрагент; ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь; Если ВидыДоговораВзаиморасчетов<>Неопределено Тогда // Оставим в выборе только "правильные" договоры Если ТипЗнч(ВидыДоговораВзаиморасчетов) = Тип("СписокЗначений") Тогда ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения = ВидСравнения.ВСписке; Иначе ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения = ВидСравнения.Равно; КонецЕсли; ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Значение = ВидыДоговораВзаиморасчетов; ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Использование = Истина; ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидДоговора.Доступность = Ложь; КонецЕсли; // Еще надо фильтровать по организации, если она заполнена Если ОбщегоНазначения.ЕстьРеквизитДокумента("Организация",МетаданныеДокумента) И ЗначениеЗаполнено(ДокументОбъект.Организация) Тогда ФормаВыбора.СправочникСписок.Отбор.Организация.Значение = ДокументОбъект.Организация; ФормаВыбора.СправочникСписок.Отбор.Организация.Использование = Истина; ФормаВыбора.СправочникСписок.Отбор.Организация.ВидСравнения = ВидСравнения.Равно; ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Организация.Доступность = Ложь; КонецЕсли; // Добавим фильтры по дополнительным параметрам отбора Если ТипЗнч(СтруктураДополнительныхПараметров) = Тип("Структура") Тогда Для каждого ЭлементСтруктуры Из СтруктураДополнительныхПараметров Цикл СтруктураОтбора = ЭлементСтруктуры.Значение; ЗначениеОтбора = Неопределено; ВидСравненияОтбора = Неопределено; ДоступностьОтбора = Неопределено; Если СтруктураОтбора.Свойство("ЗначениеОтбора", ЗначениеОтбора) Тогда Если СтруктураОтбора.Свойство("ВидСравненияОтбора", ВидСравненияОтбора) Тогда ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравненияОтбора; Иначе ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравнения.Равно; КонецЕсли; ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Значение = ЗначениеОтбора; ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Использование = Истина; Если СтруктураОтбора.Свойство("ДоступностьОтбора", ДоступностьОтбора) Тогда ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = ДоступностьОтбора; Иначе ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = Ложь; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; ФормаВыбора.ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы; ФормаВыбора.ЭлементыФормы.СправочникСписок.ТекущаяСтрока = ДоговорКонтрагента; ФормаВыбора.Открыть(); КонецПроцедуры
Выдает ошибку:
-
Offline
x_under
Модераторы
Команда форума
Модератор- Регистрация:
- 25 апр 2007
- Сообщения:
- 2.576
- Симпатии:
- 16
- Баллы:
- 29
Ну так вы пытаетесь превратить арбузы в шапки! Это как? Вы текущей строке (с типом строка табличного поля) пытаетесь пристоить ссылку на справочник. Зачем спрашивается.
-
Offline
BabySG
Администраторы
Команда форума
Администратор- Регистрация:
- 10 июн 2007
- Сообщения:
- 11.853
- Симпатии:
- 18
- Баллы:
- 29
Посмотрите, какого типа должно быть значения для ТекущаяСтрока. Ваше значения туда нельзя подпихнуть в таком виде.
Рассматривается случай, когда после заполнения табличного поля нужно было выбрать определенную строку.
В свое время пришлось решать задачу позиционирования табличного поля, которое формировалось путем выгрузки результата запроса в таблицу значений. При этом стандартная реакция системы после такого обновления табличного поля — переход к первой строке, что не устраивало. Решение задачи оказалось несколько неочевидным, но весьма элегантным. Оказалось, что для этого используется свойство ТекущаяСтрока
элемента формы, которое предназначено не только для чтения, но и для записи. В этом свойстве, в зависимости от того, что отображается в табличном поле (т.е. в зависимости от расширения табличного поля для соответствующего объекта), хранится либо данные всей строки, либо ключ записи (или что-то еще ).
Итак, набросок кода:
// Здесь ТабличноеПоле1 - реквизит формы, соответствующий элементу управления // тип - таблица значений. ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(); СтруктураПоиска = Новый Структура(); // Допустим, надо спозиционироваться на строке, колонка "Код" которой равна // значению переменной КодСтроки. СтруктураПоиска.Вставить("Код", КодСтроки); // ищем нужную строку и позиционируемся Строки = ТабличноеПоле1.НайтиСтроки(СтруктураПоиска); Если Строки.Количество() > 0 Тогда ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = Строки[0]; КонецЕсли;
Приведенный выше код (т.е. с использованием структуры поиска и последующим анализом полученного результата) является универсальным — т.е. если строку для позиционирования надо искать по какому-то сложному алгоритму. Если же мы до обновления табличной части запомнили текущую строку и уверены в том, что эта строчка останется после обновления, то, очевидно, код значительно упростится:
ТекСтр = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока; ТабличноеПоле1 = Запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекСтр;
Вот такая вот проблемка, над которой, как ни странно, мы довольно долго ломали голову. Надеюсь, эта заметка кому-нибудь пригодится!
Вопросы и ответы
Вопрос (Дмитрий): не работает у меня, в форме стоит Табличное поле с типом значения Регистр сведений и я не могу после обновления вернуть курсор на текущее поле.
ВремИнд = ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока; ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока); ТаблицаТоваров.Прочитать(); ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ВремИнд;
Ошибка при установке значения атрибута контекста (ТекущаяСтрока)
Ответ: для начала — строка, которую мы запомнили в первой строке (ВремИнд), остается после применения отбора?
Дмитрий: ВремИнд это текущая строка таблицы (ТаблицаТоваров), на которой стоит курсор, мне надо после обновления вернуть его на место. ВремИнд конечно остается.
Ответ: странно все. Значит по первому варианту надо пробовать (через структуру поиска).
Дмитрий: я не знаю, правильно ли это, но вот так стало работать:
Врем = ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные; Если Врем <> Неопределено Тогда Врем = ТаблицаТоваров.Индекс(Врем); Иначе Врем = 0; КонецЕсли; ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока); ТаблицаТоваров.Прочитать(); КолВо = ТаблицаТоваров.Количество() - 1; Если КолВо > 0 Тогда ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ТаблицаТоваров.Получить(?(Врем > КолВо, КолВо, Врем)); КонецЕсли;
Ответ: некоторое недоумение вызывает последняя конструкция — ?(Врем > КолВо, КолВо, Врем)
, а так, в принципе, по индексу тоже неплохая идея.
P.S. Хотя если до изменения весов в этой таблице было больше строк, тогда да. Сначала немного тупанул.
Категория: Программирование, 1С | Опубликовано 26.03.2009 | Редакция от 08.01.2017