Ошибка при установке значения атрибута контекста текущаястрока

   mrParadox

26.11.12 — 11:33

Хочу установить текущую строку тебличного поля.

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

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

НужнаяСтрока в отладке устанавливается.

При установки текущей строки возникает ошибка:

—————-

{Форма.Форма.Форма(101)}: Ошибка при установке значения атрибута контекста (ТекущаяСтрока)

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

по причине:

Невозможно изменить текущую строку

—————-

Что я делаю не так?

   mrParadox

1 — 26.11.12 — 11:38

1С:Предприятие 8.2 (8.2.15.310)

   Шапокляк

2 — 26.11.12 — 11:40

Ищи строку сразу в ЭлементеФормы и активизируй ее

   mrParadox

3 — 26.11.12 — 11:42

Это как?

   palpetrovich

4 — 26.11.12 — 11:44

проверь на всякий случай:

Если НужнаяСтрока = Неопределено Тогда

ну и так получается?

ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]

   Шапокляк

5 — 26.11.12 — 11:45

Это так

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

Если НужнаяСтрока<>Неопределено Тогда

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

КонецЕсли;

   mrParadox

6 — 26.11.12 — 11:46

Нужная строка точно не равна неопределено — в отладчике смотрю

   mrParadox

7 — 26.11.12 — 11:47

ЭлементыФормы.ТаблицаЗаявок.Текущаястрока = ТаблицаЗаявок[0]

Ошибка та же

   Шапокляк

8 — 26.11.12 — 11:47

(7) см 5

   mrParadox

9 — 26.11.12 — 11:48

(5)

{Форма.Форма.Форма(100)}: Метод объекта не обнаружен (Найти)

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

   Reset

10 — 26.11.12 — 11:48

(5) Ээээ? эээ

   Галахад

11 — 26.11.12 — 11:49

А вообще в каком месте (0) вызывается?

   НЕА123

12 — 26.11.12 — 11:49

может отбор какой…

   НЕА123

13 — 26.11.12 — 11:49

кстати, да

(11)+1

   mrParadox

14 — 26.11.12 — 11:51

(11)

В модуле формы.

Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

После редактирования я перезаполняю заново таблицу (из СКЛ) и хочу сделать актичной строку на которую редактировал

   palpetrovich

15 — 26.11.12 — 11:51

(0) давай колись, что это вообще и где эта процедура :)

   mrParadox

16 — 26.11.12 — 11:51

Процедура ТаблицаЗаявокПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)

   Если НоваяСтрока Тогда

       ДобавитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);

   Иначе

       ИзменитьЗаявкуВ_СКЛ(Элемент.ТекущиеДанные, ОтменаРедактирования);

   КонецЕсли;

   
   НомерЗаявки=Элемент.ТекущиеДанные.NomerZayavki;

   
   ОбновитьТаблицу();

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

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

   
КонецПроцедуры

   mrParadox

17 — 26.11.12 — 11:52

Я помню, что точно так раньше делал много раз, все работало

   palpetrovich

18 — 26.11.12 — 11:53

(14) наверное тут собака и порылась :)

«ПередОкончаниемРедактирования» и «я перезаполняю заново таблицу»

   Reset

19 — 26.11.12 — 11:53

Оно и должно работать вроде

   mrParadox

20 — 26.11.12 — 11:53

(14) Что не так?

   mrParadox

21 — 26.11.12 — 11:54

   Шапокляк

22 — 26.11.12 — 11:55

(10) Извиняюсь, затупила.

   НЕА123

23 — 26.11.12 — 11:55

надо ПРИ а не ПЕРЕД

   mrParadox

24 — 26.11.12 — 11:55

ОбновитьТаблицу() — загрузка таблицы из СКЛ после внесения в СКЛ изменений.

   Rovan

25 — 26.11.12 — 11:56

(16) ПередОкончаниемРедактирования курсор находится в строке

и сменить ее не может !

   Reset

26 — 26.11.12 — 11:56

(25) Вот похоже на правду)

   Aprobator

27 — 26.11.12 — 11:59

надо же было так найти место для перезаполнения то. Уметь надо.

   Reset

28 — 26.11.12 — 11:59

да и подменять источник данных в момент их редактирования нехорошо

   mrParadox

29 — 26.11.12 — 11:59

(23) Сделал, ошибка пропала, но Текущая строка все равно не присваевается

   Reset

30 — 26.11.12 — 12:00

Навреное, надо ПОСЛЕ :)

   Reset

31 — 26.11.12 — 12:01

Вообще логику пересмотреть имхо

   mrParadox

32 — 26.11.12 — 12:01

(30) После нет

   Aprobator

33 — 26.11.12 — 12:02

При , Перед — и там и там работать не будет. В событиях при работе со строкой в целом, форма такого безобразия особо не потерпит. Вот ПриПолученииДанных — другое дело. Но, имхо, надо сам процесс пересматриваться.

   Aprobator

34 — 26.11.12 — 12:06

впрочем по поводу ПриПолученииДанных тоже могу ошибаться. Какой смысл всего этого безобразия по умолчанию то?

   Aprobator

35 — 26.11.12 — 12:07

Работаешь с конкретной заявкой, так влепи отбор. Ну или сортировку там у таблицы то и вводи данные как тебе удобно.

   sadden

36 — 26.11.12 — 12:07

(0) для чего тебе устанавливать тек строку (что хочешь дать пользователю)? тогда можно подумать как реализовать

   Reset

37 — 26.11.12 — 12:11

(32) А нужно именно после. Не может сойти с текущего, пока редактирование не завершится. Решай как.

Или «обновляй» таблицу так, чтобы текущая строка осталась в таблице — тогда и менять не нужно будет

   Aprobator

38 — 26.11.12 — 12:12

(37) события После нет для этого безобразия.

   mrParadox

39 — 26.11.12 — 12:13

(35)(36)

Данная таблица — отображение таблицы в МС СКЛ сервере с возможностью её редактирования. Если пользователь изменяет/добавляет новую строку в данную таблицу, то после этого таблица очищается и полностью перезаполняется. Соответственно курсор соскакивает с редактируемой строки и её приходится искать вручную. При болльших объемах возникает путаница и морока.

   Reset

40 — 26.11.12 — 12:13

(38) Я не говорю что есть событие. Я о хроно-точке во временном пространстве

   Reset

41 — 26.11.12 — 12:14

(39) А зачем при изменении одной строчки очищать всю таблицу?

   sadden

42 — 26.11.12 — 12:14

(39) воо — тут ключевое слово очищается

   Aprobator

43 — 26.11.12 — 12:14

(40) а — понятно, я как то более приземленно мыслю.

(39) из за добавления одной записи надо перезаполнять всю таблицу заново??? Что то явно не так в датском королевстве.

   mrParadox

44 — 26.11.12 — 12:15

(34) ПриПолученииданных не проканало, 1С стала вести себя неадекватно, по несколько раз вызывать одно и то же событие «ПередОкончаниемРедактирования» /»ПриОкончанииРедактирвоания»

   sadden

45 — 26.11.12 — 12:15

кнешно у тебя не установит тек строку — строки то уже очистились и заполнились новыми

   mrParadox

46 — 26.11.12 — 12:16

(41) Чтобы наверняка быть уверенным, что те действия, которые осущестлялись, реально осуществились с базой СКЛ

   Reset

47 — 26.11.12 — 12:16

(44) В свете алгоритма решения, кто ведет себя адекватно — тот еще вопрос :)

   mrParadox

48 — 26.11.12 — 12:16

(45) Так я ищу нужную строку среди новых по коду и её пытаюсь сделать активной

   Aprobator

49 — 26.11.12 — 12:17

(47) +100500. Странное какое то добавление новой строки данных.

   Reset

50 — 26.11.12 — 12:18

(46) Ерунда какая-то. Записал строку в БД — проверяешь, записалась ли, чтоли? При этом чтением всей таблицы.

   sadden

51 — 26.11.12 — 12:20

(0) я не понял до конца зачем всё так, но могу предложить следующий механизм: после редактирования строки записываешь в глобал номер заявки, далее делаешь свои хитрые манипуляции с таблицей, в событии ПриПолученииДанных по глобалу находишь нужную строку и устанавливаешь её с очисткой глобала

   mrParadox

52 — 26.11.12 — 12:21

(50) Вполне сносный алгоритм. таблица СКЛ маленькая, чтение происходит мгновенно. Если бы не сложности с окончанием редактирования

   mrParadox

53 — 26.11.12 — 12:21

(51) Пробовал , см. (44)

   sadden

54 — 26.11.12 — 12:22

(53) у меня всё получилось

   mrParadox

55 — 26.11.12 — 12:23

(54) Ок, после обеда еще раз попробую :)

   Reset

56 — 26.11.12 — 12:23

(48) Ищи, не ищи, как совершенно верно заметили в (25), НЕВОЗМОЖНО сменить текущу строку.

Когда ты суп ложкой ешь, ты НЕ МОЖЕШЬ взять другую ложку, пока из рта ее не вытащищь, хоть двадцать раз ты ее найди глазами или руками или чем там ты раьоту работаешь

   Aprobator

57 — 26.11.12 — 12:23

(52) ну если только от слова снести. Вообще с помощью 1С напрямую редактировать СКЛ таблицу — вставляет.

   mrParadox

58 — 26.11.12 — 12:23

Код кинь, может я чё не так делаю?

   mrParadox

59 — 26.11.12 — 12:24

   НЕА123

60 — 26.11.12 — 12:26

ПриОкончанииРедактирования (OnEditEnd)

Синтаксис:

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

Параметры:

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

Тип: Булево.

Признак редактирования новой строки. Имеет значение Истина, если строка была добавлена или скопирована.

<ОтменаРедактирования>

Тип: Булево.

Истина, если произошла отмена редактирования.

Значение по умолчанию: Ложь

Описание:

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

Примечание:

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

См. также:

ТабличноеПоле, событие ПриНачалеРедактирования

   НЕА123

61 — 26.11.12 — 12:28

(60)

гм… грязновятенько получится.

   НЕА123

62 — 26.11.12 — 12:30

(61)

хз. когда новая строка, то ее, скорее может и не быть.

   Reset

63 — 26.11.12 — 12:41

(60) Я попробовал. Если в этом событии переустанавливать, ошибки не возникает, но текущая не меняется. Видимо, несмотря на то, что возникает «после», состояние редактирования еще остается «активным»

   Reset

64 — 26.11.12 — 12:44

+(63) при ОтменаРедактирования=Истина, однако, работает (смена текущей)

   sadden

65 — 26.11.12 — 12:52

(64) он таблицу очищает, не сработает так

   sadden

66 — 26.11.12 — 13:10

(0) сделай так:

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


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

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

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

Глобал = Неопределено;
   sadden

67 — 26.11.12 — 13:11

(66) работает, проверял

   mrParadox

68 — 26.11.12 — 13:37

(66) а процедура ОбновлениеОтображения() откуда вызывается?

   Reset

69 — 26.11.12 — 13:38

(68) Это событие

   sadden

70 — 26.11.12 — 13:39

(68) это стандартное событие формы, глянь в свойствах твоей формы

   Rovan

71 — 26.11.12 — 13:39

(63) делай через ОбработкуОжидания с интервалом 0.1 сек

   sadden

72 — 26.11.12 — 13:40

(71) — зачем? только систему нагрузит

   mrParadox

73 — 26.11.12 — 13:40

(70) Точняк, работает. Спасобо большое.

(71) Думал над этим вариантом, но попробовать не успел.

   mrParadox

74 — 26.11.12 — 13:41

(72) Можно сделать чтобы единовременно запускался, без повторов.

   sadden

75 — 26.11.12 — 13:41

(71) потом не факт, что перезаполнение таблицы уложится в 0.1 сек

   mrParadox

76 — 26.11.12 — 13:42

я имел ввиду, что в «ПриОкончанииРедактирования» ставить обработчик ожидания для единоразового запуска

   sadden

77 — 26.11.12 — 13:43

(76) можно так, но тоже, ты же не знаешь момент времени, когда событие ПриОкончанииРедактирования отработает

   sadden

78 — 26.11.12 — 13:44

(76) а ОбновлениеОтоброжение аккурат сработает после ОкончанияРедактирования

   Reset

79 — 26.11.12 — 13:44

(71) Спасибо, мне оно не нужно ;)

А будет нужно, разберусь :)

   mrParadox

80 — 26.11.12 — 13:45

не сталкивался с таким событием. Век живи век учись.

   mrParadox

81 — 26.11.12 — 13:45

(79) я не тебе конкретно

   mrParadox

82 — 26.11.12 — 13:46

Короче путаница пошла :)

   Reset

83 — 26.11.12 — 13:46

(81) Я тоже не тебе ;)

   Reset

84 — 26.11.12 — 13:49

(77) Это пофиг кстати, когда отработает.

Но из двух зол через событие обновления — зло меньшее

   sadden

85 — 26.11.12 — 13:55

(84) как уж пофиг когда отработает событие ОкончаниеРедактирования, попробуй сделать через Оповестить(), не сработает

   sadden

86 — 26.11.12 — 13:56

(84) или задержку сделать в ОкончаниеРедактирования так чтобы Обработчик раньше сработал

   Reset

87 — 26.11.12 — 13:57

(85)(86)

Я говорю что пофиг сколько он будет отрабатывать и все заполнения, выполняемые в нем — обработчик ожидания все равно запустится после этого

   sadden

88 — 26.11.12 — 13:58

(87) пробовал — не получилось

   Reset

89 — 26.11.12 — 13:59

(88) Чего не получилось? :- Яснее

   sadden

90 — 26.11.12 — 13:59

(87) нужно дождаться окончания события ОкончаниеРедактирования

   Reset

91 — 26.11.12 — 13:59

(90) Я в курсе, елки палки

   Reset

92 — 26.11.12 — 14:00

(91) и этого можно добиться, поставив одноразывый обработчик ожидания либо в событии обновления отображения.

КЭП

   sadden

93 — 26.11.12 — 14:00

в примере моём (66) вместо ОбновленияОтображения после перезаполнения таблицы в ОкончаниеРедактирования делал Оповестить()

   sadden

94 — 26.11.12 — 14:03

(92) на какое время ставить ОбработчикОжидания от куда ты можешь узнать?

   Reset

95 — 26.11.12 — 14:04

(94) Пофиг на какое

   Reset

96 — 26.11.12 — 14:05

+(95) Все равно выполниться после всех действий, сколько бы они не длились

   sadden

97 — 26.11.12 — 14:06

(96) может быть (нужно проверить) тогда почему через оповестить не получилось?

   sadden

98 — 26.11.12 — 14:09

+(97)

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

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

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

99 — 26.11.12 — 14:18

(97)(98) Попробовал — обработчик оповещения отрабатывает еще до завершения обработчика ПриОкончанииРедактирования, т.е. цель (`выполниться после`) не достигается

   Reset

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

Комментарии доступны только авторизированным пользователям

  1. Подскажите, как решить эту проблему

    Процедура ДоговорКонтрагентаПередНачаломДобавления(Элемент, Отказ, Копирование, ВидыДоговораВзаиморасчетов,СтандартнаяОбработка, СтруктураПараметров, ДоговорКонтрагента, СтруктураДополнительныхПараметров = Неопределено) 
    
    МетаданныеДокумента = ДокументОбъект.Метаданные();
    
    Если Не Контрагент.Пустая() Тогда
    ФормаВыбора = Справочники.ДоговорыКонтрагентов.ПолучитьФормуВыбора();
    ФормаВыбора.ПараметрОтборПоВладельцу = Контрагент;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Владелец.Доступность = Ложь;
    
    Если ВидыДоговораВзаиморасчетов<>Неопределено Тогда
    
    // Оставим в выборе только "правильные" договоры
    Если ТипЗнч(ВидыДоговораВзаиморасчетов) = Тип("СписокЗначений") Тогда
    ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения                    = ВидСравнения.ВСписке;
    Иначе
    ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.ВидСравнения                    = ВидСравнения.Равно;
    КонецЕсли;
    ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Значение                            = ВидыДоговораВзаиморасчетов;
    ФормаВыбора.СправочникСписок.Отбор.ВидДоговора.Использование                       = Истина;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.ВидДоговора.Доступность = Ложь;
    КонецЕсли;
    
    
    // Еще надо фильтровать по организации, если она заполнена
    Если ОбщегоНазначения.ЕстьРеквизитДокумента("Организация",МетаданныеДокумента)
    И ЗначениеЗаполнено(ДокументОбъект.Организация) Тогда
    ФормаВыбора.СправочникСписок.Отбор.Организация.Значение                            = ДокументОбъект.Организация;
    ФормаВыбора.СправочникСписок.Отбор.Организация.Использование                       = Истина;
    ФормаВыбора.СправочникСписок.Отбор.Организация.ВидСравнения                        = ВидСравнения.Равно;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Организация.Доступность = Ложь;
    КонецЕсли;
    
    
    // Добавим фильтры по дополнительным параметрам отбора
    Если ТипЗнч(СтруктураДополнительныхПараметров) = Тип("Структура") Тогда
    Для каждого ЭлементСтруктуры Из СтруктураДополнительныхПараметров Цикл
    
    СтруктураОтбора = ЭлементСтруктуры.Значение;
    
    ЗначениеОтбора     = Неопределено;
    ВидСравненияОтбора = Неопределено;
    ДоступностьОтбора  = Неопределено;
    
    Если СтруктураОтбора.Свойство("ЗначениеОтбора", ЗначениеОтбора) Тогда
    
    Если СтруктураОтбора.Свойство("ВидСравненияОтбора", ВидСравненияОтбора) Тогда
    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравненияОтбора;
    Иначе
    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].ВидСравнения = ВидСравнения.Равно;
    КонецЕсли;
    
    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Значение      = ЗначениеОтбора;
    ФормаВыбора.СправочникСписок.Отбор[ЭлементСтруктуры.Ключ].Использование = Истина;
    
    Если СтруктураОтбора.Свойство("ДоступностьОтбора", ДоступностьОтбора) Тогда
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = ДоступностьОтбора;
    Иначе
    ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора[ЭлементСтруктуры.Ключ].Доступность = Ложь;
    КонецЕсли;
    
    КонецЕсли;
    
    КонецЦикла;
    
    КонецЕсли;
    
    
    
    
    
    
    
    КонецЕсли;
    
    
    ФормаВыбора.ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
    ФормаВыбора.ЭлементыФормы.СправочникСписок.ТекущаяСтрока = ДоговорКонтрагента;
    
    ФормаВыбора.Открыть();
    
    
    КонецПроцедуры
    

    Выдает ошибку:


  2. x_under

    Offline

    x_under
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    16
    Баллы:
    29

    Ну так вы пытаетесь превратить арбузы в шапки! Это как? Вы текущей строке (с типом строка табличного поля) пытаетесь пристоить ссылку на справочник. Зачем спрашивается.


  3. BabySG

    Offline

    BabySG
    Администраторы
    Команда форума
    Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    18
    Баллы:
    29

    Посмотрите, какого типа должно быть значения для ТекущаяСтрока. Ваше значения туда нельзя подпихнуть в таком виде.


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

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

В свое время пришлось решать задачу позиционирования табличного поля, которое формировалось путем выгрузки результата запроса в таблицу значений. При этом стандартная реакция системы после такого обновления табличного поля — переход к первой строке, что не устраивало. Решение задачи оказалось несколько неочевидным, но весьма элегантным. Оказалось, что для этого используется свойство ТекущаяСтрока элемента формы, которое предназначено не только для чтения, но и для записи. В этом свойстве, в зависимости от того, что отображается в табличном поле (т.е. в зависимости от расширения табличного поля для соответствующего объекта), хранится либо данные всей строки, либо ключ записи (или что-то еще rolleyes).

Итак, набросок кода:

// Здесь ТабличноеПоле1 - реквизит формы, соответствующий элементу управления
// тип - таблица значений.
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
СтруктураПоиска = Новый Структура();
// Допустим, надо спозиционироваться на строке, колонка "Код" которой равна
// значению переменной КодСтроки.
СтруктураПоиска.Вставить("Код", КодСтроки);

// ищем нужную строку и позиционируемся
Строки = ТабличноеПоле1.НайтиСтроки(СтруктураПоиска);
Если Строки.Количество() > 0 Тогда
  ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = Строки[0];
КонецЕсли;

Приведенный выше код (т.е. с использованием структуры поиска и последующим анализом полученного результата) является универсальным — т.е. если строку для позиционирования надо искать по какому-то сложному алгоритму. Если же мы до обновления табличной части запомнили текущую строку и уверены в том, что эта строчка останется после обновления, то, очевидно, код значительно упростится:

ТекСтр = ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока;
ТабличноеПоле1 = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока = ТекСтр;

Вот такая вот проблемка, над которой, как ни странно, мы довольно долго ломали голову. Надеюсь, эта заметка кому-нибудь пригодится! smile

Вопросы и ответы

Вопрос (Дмитрий): не работает у меня, в форме стоит Табличное поле с типом значения Регистр сведений и я не могу после обновления вернуть курсор на текущее поле.

ВремИнд = ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока = ВремИнд; 

Ошибка при установке значения атрибута контекста (ТекущаяСтрока)

Ответ: для начала — строка, которую мы запомнили в первой строке (ВремИнд), остается после применения отбора?

Дмитрий: ВремИнд это текущая строка таблицы (ТаблицаТоваров), на которой стоит курсор, мне надо после обновления вернуть его на место. ВремИнд конечно остается.

Ответ: странно все. Значит по первому варианту надо пробовать (через структуру поиска).

Дмитрий: я не знаю, правильно ли это, но вот так стало работать:

Врем = ЭлементыФормы.ТаблицаТоваров.ТекущиеДанные;
Если Врем <> Неопределено Тогда
  Врем = ТаблицаТоваров.Индекс(Врем);
Иначе
  Врем = 0;
КонецЕсли;
ТаблицаТоваров.Отбор.Весы.Установить(ЭлементыФормы.ТаблицаВесов.ТекущаяСтрока);
ТаблицаТоваров.Прочитать();
КолВо = ТаблицаТоваров.Количество() - 1;
Если КолВо > 0 Тогда
  ЭлементыФормы.ТаблицаТоваров.ТекущаяСтрока =
    ТаблицаТоваров.Получить(?(Врем > КолВо, КолВо, Врем));
КонецЕсли;

Ответ: некоторое недоумение вызывает последняя конструкция — ?(Врем > КолВо, КолВо, Врем) wacko, а так, в принципе, по индексу тоже неплохая идея.
P.S. Хотя если до изменения весов в этой таблице было больше строк, тогда да. Сначала немного тупанул.

Категория: Программирование, 1С | Опубликовано 26.03.2009 | Редакция от 08.01.2017

Понравилась статья? Поделить с друзьями:
  • Ошибка при установке значения атрибута контекста текст
  • Ошибка при установке значения атрибута контекста сессия
  • Ошибка при установке значения атрибута контекста путькданнымзаголовка
  • Ошибка при установке значения атрибута контекста путькданным недопустимое значение
  • Ошибка при установке значения атрибута контекста приоритет