Имя: Пароль:
1C
1С v8
Предыдущие и последующие строки ТЧ документа
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
Спасибо, добрый человек! Всё работает как часы! )