Имя: Пароль:
1C
Обучение
Изменение значения последующей строки
0 NIGHTHUNTER
 
20.07.22
09:07
Подскажите как правильнее сделать, что при изменении значения в поле строки, меняется значение и доступность поля в последующей строке?
В табличной части документа.
1 Kassern
 
20.07.22
09:08
Проверяете, что существует следующая строка и по индексу находите следующую
2 vicof
 
20.07.22
09:09
условным оформлением, ваш кэп
3 Kassern
 
20.07.22
09:09
(2) "меняется значение" - это вы как условным оформлением сделаете?
4 Ryzeman
 
20.07.22
09:12
Ты как персонаж японских мультиков, твоё упорство восхищает. Не получилось в одной ветке - создаёшь ещё одну. Наткнулся на новую проблему и не получил разжеванный ответ - ещё ветка... Мало у кого есть такие качества)

По теме - а последующая строка - речь об уже созданный или тебе надо ограничить ввод каких-то данных по условию? К тому же, следующая - по номеру строки?
5 Kassern
 
20.07.22
09:14
(4) у самурая нет цели, только путь)
6 6awkup_true
 
20.07.22
09:15
(4) по номеру строки следующий упадет в 50% случаев. например, строки поменяли местами, часть строк удалили - нумерация будет 2,8,1,4 - как определить следующий? надо получать индекс строки
7 Ryzeman
 
20.07.22
09:16
(6) Я знаю, я хочу понять что он то имеет ввиду сам.
8 NIGHTHUNTER
 
20.07.22
09:20
(4) Это другая тема, ту я решил.
9 NIGHTHUNTER
 
20.07.22
09:23
(1) В какой процедуре это делать? При изменении поля?

(4) Введенные строки в тч документа. С верху в которой стоит значение в поле принято к выполнению, доступна для редактирования.
В последующих строках, это поле не доступно для редактирования, и с пустым значением.
Когда в строке в которой можно поменять значение с принято к выполнению, на выполнено, в следующей строке, должно появиться значение принято к выполнению.
И это поле должно стать доступным для редактирования, со значением принято к выполнению. В строке выше, значение изменилось на выполнено.
10 6awkup_true
 
20.07.22
09:26
(9) Смена значения предыдущей строки производится кем? пользователем или рег заданием? тч лежит тупо на форме(и данные тянутся из РС) или в объекте тоже есть?
11 Kassern
 
20.07.22
09:27
(10) ТЧ не может тупо лежать на форме, она всегда от объекта)
12 Kassern
 
20.07.22
09:27
(9) я вам в (2) уже все расписал как нужно сделать
13 Kassern
 
20.07.22
09:28
(12) *в (1)
14 Kassern
 
20.07.22
09:28
(9) "В какой процедуре это делать" При изменении строки в событии ТЧ
15 Kassern
 
20.07.22
09:29
Но по факту, такая практика хреновая и не понятно зачем нужна.
16 Ryzeman
 
20.07.22
09:30
(9) Тогда да, в (1) ответ. При изменении оходишь ТЧ и в строках с индексом большим, чем тебе нужно блокируешь\разрешаешь что нужно.
17 Ryzeman
 
20.07.22
09:30
(15) Никогда такого не было, и вот опять...
18 6awkup_true
 
20.07.22
09:33
(17) Четырёхлетний карапуз внимательно наблюдает, как его мать поддерживает форму на велотренажёре, и говорит:

— Мам, я знаю, что тебе надо подарить на день рождения.

— И что же это? - улыбнулась мать.

— Колёса для твоего велосипеда, а то ты так далеко не уедешь.
19 NIGHTHUNTER
 
20.07.22
09:36
(10) Пользователем.
20 NIGHTHUNTER
 
20.07.22
09:38
(14)  То есть, не при изменении значения в поле, а в собитии при изменении табличной части? Разбираю.
21 NIGHTHUNTER
 
20.07.22
09:45
(16) В этой последующий строке нужно ещё блокировку снять, с этого поля. Установить доступность точнее в истина.
В этой же процедуре?
22 Kassern
 
20.07.22
09:47
(21) Пробуйте
23 NIGHTHUNTER
 
20.07.22
10:03
(22) Я так сделал, вроде работает. нормально же? Я использовал процедуру при изменении поля, не табличной части.

Вроде все отработало.

//
&НаКлиенте
Процедура ВтулкиСостояниеПриИзменении(Элемент)
    й = 1;
    Если Объект.Втулки[Элементы.Втулки.ТекущаяСтрока].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
        Объект.Втулки[Элементы.Втулки.ТекущаяСтрока + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
    КонецЕсли;    
КонецПроцедуры
//
&НаКлиенте
Процедура ВтулкиПриИзменении(Элемент)
    й=1;
    //Объект.Втулки[Элементы.Втулки.ТекущаяСтрока + 1]
КонецПроцедуры
// <-
24 Kassern
 
20.07.22
10:11
(23) Ответьте на вопрос, чем отличается идентификатор строки от индекса строки?
25 6awkup_true
 
20.07.22
10:14
(24) в (6) описал ситуацию с идентификаторами как раз, не?
26 6awkup_true
 
20.07.22
10:19
конструкция для получения индекса вроде такая должна быть ТвояТЧ.Индекс(объект.ТвояТЧ.НайтиПоИдентификатору(Элементы.ТвояТЧ.ТекущаяСтрока))
27 NIGHTHUNTER
 
20.07.22
10:20
&НаКлиенте
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    Если Элементы.Втулки.ТекущаяСтрока + 1 = Объект.Втулки.Количество() Тогда
        Если Объект.Втулки[Элементы.Втулки.ТекущаяСтрока].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[Элементы.Втулки.ТекущаяСтрока + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры
28 6awkup_true
 
20.07.22
10:21
(27) перемести строки местами и часть удали. и выполни свой код. правильно отработает?
29 Kassern
 
20.07.22
10:21
(25) Вы описали, а ТС вряд ли понял судя по (23)
30 NIGHTHUNTER
 
20.07.22
10:22
(24) Что такое идентификатор строки? Я знаю идентификатор, имя поля, табличной части.
(26) а (27) не пойдет?
31 6awkup_true
 
20.07.22
10:25
(30) идентификатор строки статичен(не меняется). т.е. если у тебя были строки с идентификаторами(которые ты и получаешь) изначально были 1,2,3,4,5,6, а после пользователь поменял часть местами и удалил несколько и стало 5, 2, 4, 6. при обработке строки с номером 2, ты попытаешься записать в 3, а там будет неопределено, что вывалит ошибку
32 NIGHTHUNTER
 
20.07.22
10:26
(31) Понятно примерно. Нужно делать как написано в (26) .
33 Kassern
 
20.07.22
10:26
(26) Зачем так сложно? Можно ведь ТЧ.Индекс(Элемент.ТекущиеДанные)
34 NIGHTHUNTER
 
20.07.22
10:28
То есть что я в (27) должен заменить на

Объект.Втулки.Индекс(Объект.Втулки.НайтиПоИдентификатору(Элементы.Втулки.ТекущаяСтрока))


?
35 6awkup_true
 
20.07.22
10:29
(33) а ведь точно! благодарю! все мысли вокруг идентификаторов крутились)
36 Kassern
 
20.07.22
10:29
(32) Чтобы было понятнее, если ты вторую строчку перемещаешь на место первой, то ее идентификатор строки как был 1 так и остался. А индекс сменился вместо 1 стал 0 (первая строчка)
37 6awkup_true
 
20.07.22
10:29
(34) используй (33). тоже работает
38 Kassern
 
20.07.22
10:30
(34) вам тут все уже расписали, осталось немножко самому подумать
39 NIGHTHUNTER
 
20.07.22
10:32
Сделал так

&НаКлиенте
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    ТекСтрока = Объект.Втулки.Индекс(Объект.Втулки.НайтиПоИдентификатору(Элементы.Втулки.ТекущаяСтрока));
    Если ТекСтрока + 1 = Объект.Втулки.Количество() Тогда
        Если Объект.Втулки[ТекСтрока].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[ТекСтрока + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры
40 NIGHTHUNTER
 
20.07.22
10:33
Или так, сейчас буду проверять, -

&НаКлиенте
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    //ТекСтрока = Объект.Втулки.Индекс(Объект.Втулки.НайтиПоИдентификатору(Элементы.Втулки.ТекущаяСтрока));
    ТекСтрока = Объект.Втулки.Индекс(Элемент.ТекущиеДанные);
    Если ТекСтрока + 1 = Объект.Втулки.Количество() Тогда
        Если Объект.Втулки[ТекСтрока].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[ТекСтрока + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры
41 Kassern
 
20.07.22
10:34
(39) Зачем вы Индекс строки обзываете текущей строкой? Ведь текущая строка подразумевает либо саму строку либо ее идентификатор. А вы так берете и подменяете понятия в коде...
42 Kassern
 
20.07.22
10:35
а потом сами же будете путаться
43 6awkup_true
 
20.07.22
10:35
(40) оба варианта будут работать, но второй чуть быстрее(для пользователя несущественно)
44 6awkup_true
 
20.07.22
10:37
(40) а нет, будет работать только для предпоследней строки ТЧ, а все предыдущие игнорировать
45 NIGHTHUNTER
 
20.07.22
10:39
вот это не работает

ТекСтрока = Объект.Втулки.Индекс(Элемент.ТекущиеДанные);
46 Kassern
 
20.07.22
10:39
(44) ахах)) Пускай это будет сюрпризом)
(43) Тут больше не в скорости дело, а в читаемости кода
47 6awkup_true
 
20.07.22
10:40
(40) условие должно быть Если ТекСтрока + 1 <= Объект.Втулки.Количество() тогда. иначе если в тч будет 10 строк, то при редактировании 1-8 ничего не произойдет
48 6awkup_true
 
20.07.22
10:41
(45) проверил, работает. у тебя какое число возвращается? больше 0?
49 NIGHTHUNTER
 
20.07.22
10:43
(46) У меня было 2 и 3, и шла ошибка, стало если 3 = 3, а по вашему как будет?
50 Kassern
 
20.07.22
10:43
(45) все работает
51 NIGHTHUNTER
 
20.07.22
10:43
(50) Сейчас запускаю, буду проверять. Я в идентификаторе ошибся.
52 6awkup_true
 
20.07.22
10:45
(51) должно быть ТекСтрока = Объект.Втулки.Индекс(Элементы.Втулки.ТекущиеДанные);
53 6awkup_true
 
20.07.22
10:45
(51) у элемента нет текущих данных
54 Kassern
 
20.07.22
10:47
(51) тебе условие нужно поправить по проверке последнего индекса. Если индекс=ТЧ.Количество()-1 тогда следующую строку не трогать, так как ее просто нет
55 6awkup_true
 
20.07.22
10:48
(54) Если ТекСтрока + 1 < Объект.Втулки.Количество()
56 NIGHTHUNTER
 
20.07.22
10:48
Так сделал, это надеюсь в порядке уже?

&НаКлиенте
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    //ТекСтрока = Объект.Втулки.Индекс(Объект.Втулки.НайтиПоИдентификатору(Элементы.Втулки.ТекущаяСтрока));
    ТекСтрока = Объект.Втулки.Индекс(Элементы.Втулки.ТекущиеДанные);
    Если ТекСтрока + 1 <= Объект.Втулки.Количество() Тогда
        Если Объект.Втулки[ТекСтрока].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[ТекСтрока + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры
57 Kassern
 
20.07.22
10:48
(53) еще как есть, если тип у элемента таблица формы. В событии при изменении у ТЧ, как раз такой элемент.
https://disk.yandex.ru/i/x1QYB0l_JhaTKg
58 Kassern
 
20.07.22
10:48
(56) читай (41)
59 NIGHTHUNTER
 
20.07.22
10:49
(56) То есть тут тоже что то не так?
60 6awkup_true
 
20.07.22
10:50
(57) так мы изменяем реквизит тч и в его случае текущих данных нет
61 Kassern
 
20.07.22
10:51
(53) а блин, ТС привязался к событию изменения реквизита, а не ТЧ. Тогда да, элемент не подойдет, так как там будет тип поле формы.
62 Kassern
 
20.07.22
10:51
(60) ага, уже заметил в имени процедуры
63 6awkup_true
 
20.07.22
10:52
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    

    ИндексТекущейСтроки = Объект.Втулки.Индекс(Элементы.Втулки.ТекущиеДанные);
    Если ИндексТекущейСтроки < Объект.Втулки.Количество() - 1 Тогда
        Если Объект.Втулки[ИндексТекущейСтроки ].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[ИндексТекущейСтроки + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры
64 Kassern
 
20.07.22
10:54
(63) а зачем 2 если?)
65 Kassern
 
20.07.22
10:55
Можно так:
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    
    ИндексТекущейСтроки = Объект.Втулки.Индекс(Элементы.Втулки.ТекущиеДанные);
    Если ИндексТекущейСтроки < Объект.Втулки.Количество() - 1
        И Объект.Втулки[ИндексТекущейСтроки ].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
            Объект.Втулки[ИндексТекущейСтроки + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
    КонецЕсли;
КонецПроцедуры
66 NIGHTHUNTER
 
20.07.22
10:57
(65) Ну да, это как самый оптимальный вариант?
(63) (65) Спасибо!
67 Kassern
 
20.07.22
10:59
(65) Или даже так:
Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    
    ДанныеСтроки=Элементы.Втулки.ТекущиеДанные;
    ИндексТекущейСтроки = Объект.Втулки.Индекс(ДанныеСтроки);
    Если ИндексТекущейСтроки < Объект.Втулки.Количество() - 1 И ДанныеСтроки.Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено") Тогда
       Объект.Втулки[ИндексТекущейСтроки + 1].Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу");
    КонецЕсли;
КонецПроцедуры
68 NIGHTHUNTER
 
20.07.22
11:16
(67) наверное это лишнее уже.
69 6awkup_true
 
20.07.22
11:17
(67) а еще можно вот так. в одну строку. Господин ТС, так писать НЕ нужно - это ректальное программирование.

Процедура ВтулкиСостояниеПриИзменении(Элемент)  
    
    ДанныеСтроки=Элементы.Втулки.ТекущиеДанные;
    ИндексТекущейСтроки = Объект.Втулки.Индекс(ДанныеСтроки);
    
    Объект.Втулки[?(ИндексТекущейСтроки < Объект.Втулки.Количество() - 1, ИндексТекущейСтроки + 1, ИндексТекущейСтроки].Состояние =
        ?(ИндексТекущейСтроки < Объект.Втулки.Количество() - 1 И ДанныеСтроки.Состояние = ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.Выполнено"),
        ПредопределенноеЗначение("Перечисление.ХХХ_СостояниеВтулокВПроизводстве.ВыданоВРаботу"),  Объект.Втулки[ИндексТекущейСтроки].Состояние);
  
КонецПроцедуры
70 NIGHTHUNTER
 
20.07.22
11:20
(69) Понятно.