Добрый день!
Решаю задачи по книжке Конфигурирование для подготовки к спецу. Есть задача: при открытии/создании формы документа РеализацияТоваров и добавлении новой строки в Табличную часть ТОВАРЫ показать на форме документа остатки по выбранным товарам.
Код в форме документа:

А теперь проблемы:
1. При открытии/создании документа ЕСЛИ нет строки в табличной части, то срабатывает ТоварыПриАктивизацииСтроки (вообще не пойму в связи с чем, пару дней назад такого не было - проверял):
{Документ.РеализацияТоваров.Форма.ФормаДокумента.Форма(34)}: Значение не является значением объектного типа (Номенклатура) Строка = Элементы.Товары.ТекущиеДанные.Номенклатура;
2. При добавлении новой строки в ТОВАРЫ остатки считаются только если создать новую строку и вернуться к редактированию предыдущей, получается что активизация тупо не срабатывает (фото прикладываю).

Подскажите в чем косяк?
Платформа 8.3.13, конфа Каркасная для экзамена.
---
Интересная трактовка. Никогда так не трактовал.

В любом случае решение поставленной задачи не верное.
При активизации строки остатки вычислять не нужно.

Нужно:
1 - при изменении номенклатуры заполнять остатки в этой строке
2 - при создании на сервере для каждой строки ТЧ заполнить остатки
3 - после записи на сервере заново заполнять остатки в строках ТЧ, если это реквизиты формы.
---
Активизация строки это событие, которое вызывается, собственно, при активизации строки.
При открытии пустого документа, когда табличная часть пустая, тоже оно вызывается - пытается активизировать первую строку, даже если ее нет. В этом случае событие все равно выполнится, но в ТекущиеДанные будет Неопределено.

Активизация строки - это когда вы делаете строку ТЧ текущей, то есть активной.
Если вы в этой же строке что-то меняете, это событие снова для этой строки не вызывается.
---
По первому вопросу: Вы неверно осуществляете проверку наличия активной строки. Вы получаете номенклатуру из текущей строки, а следует сперва проверить саму строку на значение Неопределено:

```1c
    &НаКлиенте
    Процедура ТоварыПриАктивизацииСтроки(Элемент)
    Строка = Элементы.Товары.ТекущиеДанные;
    Если Строка <> Неопределено Тогда
    //задаем функцию для чтения нужных остатков
    Остатки = ОпределениеОстаткаТовара(Строка.Номенклатура,Объект.Склад,Объект.Дата,Объект.Ссылка);
    КонецЕсли;
    КонецПроцедуры
```

По второму вопросу. Не очень понятно, в чем именно проблема. При добавлении новой строки очевидно остатков не будет, т.к. и номенклатура еще не указана. Следовательно необходимо определять не только обработчик активизации строки, но и обработчик изменения номенклатуры.
---
Вопрос в том, почему проверка происходит при открытии документа, а не при активизации ТЧ? А разве в условии я не проверил строку на Неопределено, или я чего-то не понял?

В том и дело, что при добавлении новой строки я выбираю номенклатуру, а после перехода в ячейку Количество он должен найти остаток в регистре, но это не происходит. Он считает остаток после повторной активизации позиции.
---
Активизация строки это событие, которое вызывается, собственно, при активизации строки.
При открытии пустого документа, когда табличная часть пустая, тоже оно вызывается - пытается активизировать первую строку, даже если ее нет. В этом случае событие все равно выполнится, но в ТекущиеДанные будет Неопределено.

Активизация строки - это когда вы делаете строку ТЧ текущей, то есть активной.
Если вы в этой же строке что-то меняете, это событие снова для этой строки не вызывается.
---
Спасибо за пояснение, в литературе нет этой инфы. Теперь мне все ясно.

Вопрос можно считать закрытым! Спасибо всем за участие!
---
Вообще проблема изначально в другом.
В При активизации строки нельзя вызывать серверные методы.

ТаблицаФормы (FormTable)
ПриАктивизацииСтроки (OnActivateRow)
Синтаксис:

ПриАктивизацииСтроки()
Описание:

Вызывается при активизации строки таблицы.
Примечание:

В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере.

Нужно запускать обработчик ожидания с задержкой, например в 0.3 секунды и уже в обработчике ожидания для текущей строки вызывать серверную процедуру.

Ну и конечно нужно добавить проверку, что текущая строка <> неопределено.
---
Нельзя вызывать серверные процедуры с директивой &НаСервере. С директивой &НаСервереБезКонтекста вызывать процедуры можно.
---
Интересная трактовка. Никогда так не трактовал.

В любом случае решение поставленной задачи не верное.
При активизации строки остатки вычислять не нужно.

Нужно:
1 - при изменении номенклатуры заполнять остатки в этой строке
2 - при создании на сервере для каждой строки ТЧ заполнить остатки
3 - после записи на сервере заново заполнять остатки в строках ТЧ, если это реквизиты формы.
---
Да, действительно, событие активизации строки в этой задаче совсем не при чем. Слона-то я и не заметил. :-)
---
Задача написана в курсе конфигурирования, я пытаюсь ее реализовать как написано. Смысл не вписать весь остаток, а просто показать сколько осталось вне ТЧ. Задача нацелена на понимание работы самого механизма Активизация-Чтение-Возврат. Но все равно Ваш вариант я себе помечу, очень продуктивный))
---
Я конечно на спеца не сдавал, но сделал эту задачу сейчас вот так. Может и неправильно, но все срабатывает.

```1c
    &НаКлиенте
    Процедура ТоварыПриАктивизацииСтроки(Элемент)
    Стр = Элементы.Товары.ТекущиеДанные;
    КолВО = ПолучитьОстатки(Стр.Номенклатура, Объект.Ссылка);
    Стр.ОстатокНаСкладе = КолВО;
    КонецПроцедуры

    &НаСервере
    Функция ПолучитьОстатки(Номенклатура, Документ)
    Запрос = НОВый запрос;
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Ссылка", Документ);
    Запрос.Текст = "ВЫБРАТЬ
    | РеализацияТовары.Номенклатура КАК Номенклатура,
    | СУММА(РеализацияТовары.Количество) КАК Количество
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    | Документ.Реализация.Товары КАК РеализацияТовары
    |ГДЕ
    | РеализацияТовары.Номенклатура = &Номенклатура
    | И РеализацияТовары.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | РеализацияТовары.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК ОстатокНаСкладе,
    | ВТ.Номенклатура КАК Номенклатура,
    | ВТ.Количество КАК Количество
    |ИЗ
    | ВТ КАК ВТ
    | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
    | ,
    | Номенклатура В
    | (ВЫБРАТЬ
    | ВТ.Номенклатура КАК Номенклатура
    | ИЗ
    | ВТ КАК ВТ)) КАК ОстаткиТоваровОстатки
    | ПО ВТ.Номенклатура = ОстаткиТоваровОстатки.Номенклатура";

    ТЗ = Запрос.Выполнить().Выгрузить();
    Возврат ТЗ.Итог("ОстатокНаСкладе");
    КонецФункции

    &НаКлиенте
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
    Стр = Элементы.Товары.ТекущиеДанные;
    КолВО = ПолучитьОстатки(Стр.Номенклатура, Объект.Ссылка);
    Стр.ОстатокНаСкладе = КолВО;
    КонецПроцедуры
```
---
Думаю, Вы плохо тестировали. :) Для нового документа реализации, еще не записанного, остаток будет нулевым, т.к. временная таблица в запросе окажется пустой.
---
Не тестировал толком. Так конечно проще. Я смотрел будут ли у меня такие же ошибки как у автора.
---
В итоге что-то похожее на это должно получиться.

```1c
    &НаСервереБезКонтекста
    Функция ПолучитьОстатки(Номенклатура)
    Если Номенклатура = Справочники.Номенклатура.ПустаяСсылка() тогда
    Возврат 0;
    иначе
    Запрос = НОВый запрос;
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.Текст = "ВЫБРАТЬ
    | ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0) КАК ОстатокНаСкладе,
    | ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров.Остатки(, номенклатура = &Номенклатура) КАК ОстаткиТоваровОстатки";

    ТЗ = Запрос.Выполнить().Выгрузить();

    Возврат ТЗ.Итог("ОстатокНаСкладе");
    КонецЕсли;
    КонецФункции

    &НаКлиенте
    Процедура ТоварыНоменклатураПриИзменении(Элемент)
    Стр = Элементы.Товары.ТекущиеДанные;
    Если стр <> Неопределено тогда
    КолВО = ПолучитьОстатки(Стр.Номенклатура);
    Стр.ОстатокНаСкладе = КолВО;
    КонецЕсли;
    КонецПроцедуры
```