ПриАктивацииСтроки номер строки выходит за рамки массива

1. Mastershi 01.04.19 11:41 Сейчас в теме
Имею форму отбора заявок для последующей генерации всякой отчётной информации...
На форме две табличных части: Список заявок и Список сотрудников, упомянутых в этих заявках.
При изменении текущей строки в списке заявок, в списке сотрудников отображается список тех сотрудников, которые есть в этой заявке.
Имею вот такой код:
&НаСервере
Процедура ПеречитатьИсходныеДанные()
	Запрос=Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
	             |	тгкЗаявкаРСФЛСписокСотрудников.Ссылка
// ............................................................................................................	
	             |ГДЕ
	             |	тгкЗаявкаРСФЛ.Проведен"
				 ;
	Объект.Заявки.Очистить();
	Запрос.УстановитьПараметр("Организация",Организация);
	Запрос.УстановитьПараметр("ДатаЗапроса",ДатаЗапроса);
	Рез=Запрос.Выполнить().Выбрать();
	Если Рез.Количество()>0 Тогда
		Пока Рез.Следующий() Цикл
			Нов=Объект.Заявки.Добавить();
			ЗаполнитьЗначенияСвойств(Нов,Рез);
		КонецЦикла;
	КонецЕсли;	
	
	// заполним табличную часть ВсеСотрудники, чтобы из неё потом такать данные для списка сотрудников из заявки, чтобы не обращаться на сервер
	// при событии ПриАктивацииСтроки в списке заявок
	Запрос.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
	             |	тгкЗаявкаРСФЛСписокСотрудников.ТабельныйНомер,
	             |	тгкЗаявкаРСФЛСписокСотрудников.Сотрудник,
	             |	тгкЗаявкаРСФЛСписокСотрудников.Ссылка КАК ИзЗаявки,
	             |	тгкЗаявкаРСФЛСписокСотрудников.Сумма КАК СуммаПеревода
	             |ИЗ
	             |	Документ.тгкЗаявкаРСФЛ.СписокСотрудников КАК тгкЗаявкаРСФЛСписокСотрудников
	             |ГДЕ
	             |	НЕ тгкЗаявкаРСФЛСписокСотрудников.Принят
	             |	И тгкЗаявкаРСФЛСписокСотрудников.Ссылка.Организация = &Организация
	             |	И тгкЗаявкаРСФЛСписокСотрудников.Ссылка.Дата <= &ДатаЗапроса
	             |	И тгкЗаявкаРСФЛСписокСотрудников.Ссылка.Проведен"
				 ;
	ВсеСотрудники.Очистить();
	Запрос.УстановитьПараметр("Организация",Организация);
	Запрос.УстановитьПараметр("ДатаЗапроса",ДатаЗапроса);
	Рез=Запрос.Выполнить().Выбрать();
	Если Рез.Количество()>0 Тогда
		Пока Рез.Следующий() Цикл
			Нов=ВсеСотрудники.Добавить();
			ЗаполнитьЗначенияСвойств(Нов,Рез);
		КонецЦикла;
	КонецЕсли;	
КонецПроцедуры

&НаСервере
Процедура ПриОткрытииНаСервере()
	ПеречитатьИсходныеДанные();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПриОткрытииНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСписокСотрудников(ТекСтр)
	Если ТекСтр=Неопределено Тогда
		Возврат;
	КонецЕсли;
	Док=Объект.Заявки[ТекСтр].Документ;
	СписокСотрудников.Очистить();
	Для каждого Элем из ВсеСотрудники Цикл
		Если Элем.ИзЗаявки=Док Тогда
			Нов=СписокСотрудников.Добавить();
			ЗаполнитьЗначенияСвойств(Нов,Элем);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ЗаявкиПриАктивизацииСтроки(Элемент)
	ОбновитьСписокСотрудников(ЭтаФорма.Элементы.Заявки.ТекущаяСтрока);
	ЭтаФорма.Элементы.СписокСотрудниковСумма.ТекстПодвала=Формат(СписокСотрудников.Итог("СуммаПеревода"),"ЧН=;ЧДЦ=2");
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСписок(Команда)
	ПеречитатьИсходныеДанные()
КонецПроцедуры
Показать

В ТЗ оговорено обновление списка заявок (см. процедуру ОбновитьСписок(Команда))
Только она вылетает по ошибке "Индекс выходит за границы массива" в процедуре ОбновитьСписокСотрудников(ТекСтр). ТекСтр оказывается равной количеству строк в списке заявок...
Откуда берётся такое значение? Управление в ОбновитьСписокСотрудников передаётся только из ПриАктивацииСтроки...
И ещё... При открытии формы событие ПриАктивацииСтроки срабатывет дважды... Почему?
Найденные решения
3. dhurricane 01.04.19 12:08 Сейчас в теме
(1) Вы некорректно используете текущую строку таблицы формы.

Если Вам нужны данные активной строки (значения ячеек), то следует использовать ТекущиеДанные. Это свойство ссылается на выделенную строку. Если никакая строка не выделена, свойство равно Неопределено:
ТекСтр = Элементы.Заявки.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
   Возврат;
КонецЕсли;
Док = ТекСтр.Документ;

ТекущаяСтрока - это идентификатор строки. Т.к. для табличной части он имеет числовой тип, многие в моей практике его путают с индексом строки таблицы, но это не индекс! Это именно идентификатор, которой зачастую, но не всегда совпадает с индексом строки. Если известен идентификатор, данные строки можно получить так:
ТекСтр = Элементы.Заявки.ТекущаяСтрока;
ТекДанные = Объект.Заявки.НайтиПоИдентификатору(ТекСтр);
Если ТекДанные = Неопределено Тогда
   Возврат;
КонецЕсли;
Док = ТекДанные.Документ;
inanity; Ingraf; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. dhurricane 01.04.19 12:08 Сейчас в теме
(1) Вы некорректно используете текущую строку таблицы формы.

Если Вам нужны данные активной строки (значения ячеек), то следует использовать ТекущиеДанные. Это свойство ссылается на выделенную строку. Если никакая строка не выделена, свойство равно Неопределено:
ТекСтр = Элементы.Заявки.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
   Возврат;
КонецЕсли;
Док = ТекСтр.Документ;

ТекущаяСтрока - это идентификатор строки. Т.к. для табличной части он имеет числовой тип, многие в моей практике его путают с индексом строки таблицы, но это не индекс! Это именно идентификатор, которой зачастую, но не всегда совпадает с индексом строки. Если известен идентификатор, данные строки можно получить так:
ТекСтр = Элементы.Заявки.ТекущаяСтрока;
ТекДанные = Объект.Заявки.НайтиПоИдентификатору(ТекСтр);
Если ТекДанные = Неопределено Тогда
   Возврат;
КонецЕсли;
Док = ТекДанные.Документ;
inanity; Ingraf; +2 Ответить
6. Mastershi 01.04.19 12:18 Сейчас в теме
(3) Спасибо. Особенно важно про идентификатор!... На будущее... :)
5. dhurricane 01.04.19 12:10 Сейчас в теме
(1)
При открытии формы событие ПриАктивацииСтроки срабатывет дважды... Почему?

Потому что Вы используете контекстный вызов сервера в обработчике "ПриОткрытии". Т.о. первый раз событие срабатывает после создания формы и начале ее открытия, а второй - при возвращении контекста на клиент по окончании процедуры "ПриОткрытииНаСервере".
2. SedovSU@mail.ru 298 01.04.19 12:00 Сейчас в теме
у вас ошибка в этом месте Док=Объект.Заявки[ТекСтр].Документ. Если процедура вызывается при активации строки таблицы Заявки и вы получаете текущую строку, зачем вы затем делаете вот это Док=Объект.Заявки[ТекСтр].Документ. вы можете ведь написать просто

Док = ТекСтр.Документ;
4. Mastershi 01.04.19 12:09 Сейчас в теме
(2) Я могу ошибаться, но ЭтаФорма.Элементы.Заявки.ТекущаяСтрока - это число, и взять Документ из числа ну никак не получится...
7. Ingraf 757 13.06.23 20:48 Сейчас в теме
(3) спасибо, помог! Как тебе отсыпать стартмани?)
8. dhurricane 13.06.23 21:12 Сейчас в теме
(7) Пользуйтесь на здоровье. Как делиться стармани - не знаю. :-)
9. user1852218 13.06.23 21:22 Сейчас в теме
(7)
Как тебе отсыпать стартмани?)
Выдать вознаграждение может только автор ветки! Соответственно, вы можете добавить вознаграждение в свою тему (или обсуждение публикации), получатель в ней что-то напишет, а вы - выдадите.

Или можете добавить стартмани в ветку получателя, а он их выдаст самому себе... ну, может мал-мал поделится с тем, кто посоветовал. ;-)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот