Товарищи опытные программисты выручайте :)
Впервые столкнулся с программированием в 1с 7.7, до имел дело только с 8.
Нужно вывести в расчетный листок часы отработаботаные сотрудником по тарификации, от предыдущего программиста остался код:

```1c
    Перем ТаблицаБазовыхЧасов;
    Перем СлужебТ;

    Процедура СформироватьТаблицуБазовыхЧасов()
    ТаблицаБазовыхЧасов.УдалитьСтроки();
    Тариф = СоздатьОбъект("Документ.Тарификация");
    Тариф.ВыбратьДокументы(НачМесяца(рд_Дата1), КонМесяца(рд_Дата2));
    Пока Тариф.ПолучитьДокумент() = 1 Цикл
    Если Тариф.Проведен() = 0 Тогда
    Продолжить;
    КонецЕсли;
    ТарифНач = Тариф.ВидНачисления.Начисление;
    Тариф.ВыбратьСтроки();
    Пока Тариф.ПолучитьСтроку() = 1 Цикл
    Если ((Тариф.НачалоДействия = Дата(0)) или (Тариф.НачалоДействия <= рд_Дата2)) и
    ((Тариф.КонецДействия = Дата(0)) или (Тариф.КонецДействия >= рд_Дата1)) Тогда
    Иначе
    Продолжить;
    КонецЕсли;
    Если Тариф.Нач + Тариф.Сред + Тариф.Старш > 0 Тогда
    ТаблицаБазовыхЧасов.НоваяСтрока();
    ТаблицаБазовыхЧасов.Сотрудник = Тариф.Сотрудник;
    ТаблицаБазовыхЧасов.Начисление = ТарифНач;
    ТаблицаБазовыхЧасов.КолЧасов = Тариф.Нач + Тариф.Сред + Тариф.Старш;
    Конецесли;

    конеццикла;
    конеццикла;
    ТаблицаБазовыхЧасов.Свернуть("Сотрудник, Начисление", "КолЧасов");
    ТаблицаБазовыхЧасов.Сортировать("Сотрудник, Начисление");
    конецпроцедуры
```

затем в выводе на печать:

```1c
    Колон = 1;
    Стро = 0;
    колстрок = 0;
    СлужебТ.Очистить();
    Если ТаблицаБазовыхЧасов.НайтиЗначение(м_Сотрудник, Стро, Колон) = 1 тогда
    колстрок = 1;
    пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник цикл
    колстрок = колстрок + 1;
    конеццикла;
    ТаблицаБазовыхЧасов.Выгрузить(СлужебТ,Стро, Стро + колстрок);
    Колон = 2;
    Стро = 0;
    Если СлужебТ.НайтиЗначение(м_Начисление,Стро,Колон) = 1 тогда
    л_ПериодСтр =л_ПериодСтр + " " + Строка(СлужебТ.ПолучитьЗначение(Стро, 3)) + " час.";
    КонецЕсли;
    конецесли;
```

в итоге при выводе на печать ругается
пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник цикл
{D:\ZPL2\EXTFORMS\RASLIST_CH.ERT(933)}: Номер за пределами значения!

Я хочу посмотреть что там в таблице путем вычисления выражения, но там пусто, до:

```1c
    ТаблицаБазовыхЧасов.Сортировать("Сотрудник, Начисление");
```
 Тут еще есть данные но после

```1c
    ТаблицаБазовыхЧасов.Свернуть("Сотрудник, Начисление", "КолЧасов");
```

таблица пустая.

Ну и когда в 8 заполняешь таблицу можно посмотреть что в ней в данный момент а тут при вычислении такие данные:
https://yadi.sk/i/pPi6Z_Ix3D6few
Как увидеть всю таблицу?
---
Можно, например, проверку вставить в цикле в конце: Мысль правильная, но реализация ошибочная: Стро+колстрок на момент срабатывания проверки уже вылезет за пределы таблицы, что вызовет ту же ошибку.

Надо так:

```1c
    Пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник Цикл
    колстрок = колстрок + 1;
    Если Стро+колстрок > ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    колстрок = колстрок - 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
```

Или так:

```1c
    Пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник Цикл
    Если Стро+колстрок = ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    Прервать;
    КонецЕсли;
    колстрок = колстрок + 1;
    КонецЦикла;
```
---
Что бы просмотреть таблицу значений вставьте в код в нужных местах ТаблицаБазовыхЧасов.ВыбратьСтроку();
Можно аналогичную строку в табло в отладчике. Но, главное, не запутаться. Таблица покажется в Предприятии, отладчик будет "висеть", пока в предприятии не нажмёшь ОК. После этого строку из табло нужно убрать, иначе модальное окно в предприятии будет выскакивать по каждому чиху отладчика.
---
```1c
    пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник цикл
    колстрок = колстрок + 1;
    конеццикла;
```

Здесь ошибка. На последней строке ТаблицаБазовыхЧасов получим Стро + колстрок = ТаблицаБазовыхЧасов.КоличествоСтрок() + 1. после чего происходит еще один вызов ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) в цикле, который и приводит к ошибке.
А по поводу посмотреть таблицу, то (3) прав. ТаблицаБазовыхЧасов.ВыбратьСтроку(). Но необязательно вставлять в код, можно просто по брейкпойнту в отладчике остановиться, а потом вычислить это выражение, в режиме предприятия отобразится диалог с таблицей.
---
Спасибо получилось выбрать и да так и получается что в таблице 156 строк но как вы и говорите ошибка из-за того что в цикл попадает 157 строка на ней и выходит ошибка потому что ее нет. Подскажите пожалуйста как тут правильно сделать, не соображу сам т.к. не знаю синтаксис еще.
---
```1c
    Если ТаблицаБазовыхЧасов.НайтиЗначение(м_Сотрудник, Стро, Колон) = 1 тогда
    колстрок = 1;
    пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник цикл
    колстрок = колстрок + 1;
    конеццикла;
```

что получается? если нашли значение (стро=1), то проверяем следующую строку (стро=стро+1), пока в следующей строке мы получаем сотрудника, увеличиваем номер строки... но! если в таблице всего одна строка, то как вы можете получить значение строки с номером 2?
---
проверить номер строки на непревышение количества строк таблицы, я именно об этом и писал в (2)... цикл у вас берет номер на единицу больший, чем есть в таблице...

```1c
    пока (ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник) И ((Стро+колстрок)<=ТаблицаБазовыхЧасов.КоличествоСтрок()) цикл
```
---
У сотрудника в таблице 2 строки оклад и разовые часы.
---
Странно но все равно попадает в цикл, количество строк в таблице 156, но
```1c
    пока (ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник) И ((Стро+колстрок)<=ТаблицаБазовыхЧасов.КоличествоСтрок()) цикл
    колстрок = колстрок + 1;
    конеццикла;
```

Все равно пишет ту же ошибку.
---
И правильно пишет. Потому что все равно вычисляется выражение в условии цикла с некорректным индексом
---
ну да... туплю с утра немного... (Стро+колстрок) ... надо просто колстрок
---
И правильно пишет. Потому что все равно вычисляется выражение в условии цикла с некорректным индексом
А как сделать чтобы вычислялось правильно?
---
Можно, например, проверку вставить в цикле в конце:

```1c
    Если Стро+колстрок > ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    Прервать;
    КонецЕсли;
```
---
Можно, например, проверку вставить в цикле в конце: Мысль правильная, но реализация ошибочная: Стро+колстрок на момент срабатывания проверки уже вылезет за пределы таблицы, что вызовет ту же ошибку.

Надо так:

```1c
    Пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник Цикл
    колстрок = колстрок + 1;
    Если Стро+колстрок > ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    колстрок = колстрок - 1;
    Прервать;
    КонецЕсли;
    КонецЦикла;
```

Или так:

```1c
    Пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник Цикл
    Если Стро+колстрок = ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    Прервать;
    КонецЕсли;
    колстрок = колстрок + 1;
    КонецЦикла;
```
---
Большое Вам спасибо!
---
Спасибо за спасибо (и не только), но я заметил в коде еще одну логическую ошибку, которая может редко, но проявляться: если м_Сотрудник будет найден в последней строке ТаблицаБазовыхЧасов, т.е. окажется Стро = ТаблицаБазовыхЧасов.КоличествоСтрок(), то снова вылезет точно такая же ошибка, ведь Стро+1 опять будет указывать на строку за пределами таблицы.

Чтобы это предотвратить, надо еще немного модифицировать код, и тогда вариант из (12) оказывается правильным:

```1c
    Если ТаблицаБазовыхЧасов.НайтиЗначение(м_Сотрудник, Стро, Колон) = 1 тогда
    // колстрок = 1; вот это нужно удалить!
    пока ТаблицаБазовыхЧасов.ПолучитьЗначение(Стро + колстрок, колон) = м_Сотрудник цикл
    колстрок = колстрок + 1;
    Если Стро+колстрок > ТаблицаБазовыхЧасов.КоличествоСтрок() Тогда
    Прервать;
    КонецЕсли;
    конеццикла;
    ТаблицаБазовыхЧасов.Выгрузить(СлужебТ,Стро, Стро + колстрок);
    Колон = 2;
    Стро = 0;
    Если СлужебТ.НайтиЗначение(м_Начисление,Стро,Колон) = 1 тогда
    л_ПериодСтр =л_ПериодСтр + " " + Строка(СлужебТ.ПолучитьЗначение(Стро, 3)) + " час.";
    КонецЕсли;
    конецесли;
```
---
Понял спасибо еще раз!