|
Предыдущие и последующие строки ТЧ документа | ☑ | ||
---|---|---|---|---|
0
Morikama
08.12.23
✎
04:07
|
Друзья, привет! Не могу решить простейшую задачу )
В таб. части документа бывает всего от 1 до 8 строк. Строки отражают состояние выполнения операции Истина/ложь, важна последовательность, то есть, не должно быть пропусков. Однако программа понимает только первую и последнюю строку Код в Модуле, в процедуре "ПередЗаписью" Если Строка.НомерСтроки =1 ... или Строка.НомерСтроки = КоличествоСтрокТабЧасти(); - так работает, но ПредыдущаяСтрока = ТабЧасть.Получить(Строка.НомерСтроки-1); Если ПредыдущаяСтрока.Выполнено = Истина Тогда ... Никак не хочет работать. Может, кто-нить подскажет, в чём загвоздка? |
|||
1
Donkey_hot
08.12.23
✎
04:40
|
(0) Индекс и НомерСтроки это не совсем одно и то же. Оперируйте индексами, номер строки - это для пользователей.
|
|||
2
Morikama
08.12.23
✎
04:51
|
Ещё бы я знал, как оперировать индексом ))
|
|||
3
Donkey_hot
08.12.23
✎
04:56
|
Если я правильно понял задачу (в ТЧ не должно быть значения ЛОЖЬ раньше, чем встречается хотя бы одна ИСТИНА), то можно запросом:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.НомерСтроки КАК НомерСтроки, | ТЗ.Результат КАК Результат |ПОМЕСТИТЬ ВТ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | 1 КАК Поле1 |ИЗ | ВТ КАК ВТ | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1 | ПО ВТ.НомерСтроки < ВТ1.НомерСтроки | И (НЕ ВТ.Результат) | И (ВТ1.Результат)"; Запрос.УстановитьПараметр("ТЗ", Объект.Операции.Выгрузить()); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда // Что-нибудь говорим юзеру Отказ = Истина; КонецЕсли; |
|||
4
Donkey_hot
08.12.23
✎
04:57
|
(2) Почитайте, это самая база. Индексирование коллекций в 1С начинается с нуля, а нумерация строк - с единицы.
|
|||
5
Morikama
08.12.23
✎
05:12
|
Бог мой... Голова кругом. Я не программист ) ТЗ, насколько я понимаю, - это вирт. таблица значений, а у меня обычная таблица в документе. Или необходимо сделать эту таблицу значений?
Код я понимаю весьма простой Если Строка.НомерСтроки = КолВоСтрокПолетногоЗадания Тогда ПредыдущаяСтрока = ДвижениеПоМаршруту.Получить(Строка.НомерСтроки-1); Если ПредыдущаяСтрока.Выполнено = Истина Тогда Строка.Ввоздухе = Истина; Строка.Выполнено = Ложь; КонецЕсли; КонецЕсли; |
|||
6
Donkey_hot
08.12.23
✎
05:22
|
(5) Сформулируйте полностью задачу. И какие колонки в Вашей таблице.
|
|||
7
Morikama
08.12.23
✎
05:43
|
Есть последовательность выполнения рейсов - это цепь
Колонки, которые нужны - их две - номер плеча - это цифровое обозначение порядка в цикле рейсов, и оно же совпадает с номером строки. И есть колонка "в воздухе" - булево и колонка выполнено или нет - тоже булево. То есть, если предыдущий сегмент полета не выполнен, в следующем по порядку плече не может быть булево "в воздухе истина", поскольку самолет в воздухе ещё на предыдущем рейсе. Тривиальная задача. Вероятно, нужно привязываться даже не к номеру строки, а к порядковому номеру. Даже не знаю. |
|||
8
Donkey_hot
08.12.23
✎
05:52
|
(7) Это все очень здорово, но в чем задача? Сделать нужно что? Выполнить проверку и если то, чего "не может быть", все-таки имеет место быть, отказаться от записи? Либо автоматически что-то дозаполнять?
В любом случае, используйте цикл: Если МояТаблица.Количество() > 1 Тогда Для Индекс = 1 По МояТаблица.Количество() - 1 Цикл ТекущаяСтрока = МояТаблица[Индекс]; ПредыдущаяСтрока = МояТаблица[Индекс - 1]; // Дальше делаем с ними что хотим КонецЦикла; КонецЕсли; Нулевой индекс не берем, т.к. у первой строки нет предыдущей. |
|||
9
Morikama
08.12.23
✎
06:26
|
Там по-хитрому, не от записи отказываться, а при записи автоматом исправлять состояние по условию. Хорошо, попробую ваш метод в сообщ 8. Отпишусь.
|
|||
10
Morikama
08.12.23
✎
07:37
|
Спасибо, добрый человек! Всё работает как часы! )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |