Доброго времени суток, ребята!

Подскажите пожалуйста, вот если есть документ, в нем есть табличная часть, содержащая несколько строк, можно ли как-то сделать так, чтобы при нажатии кнопки пользователю предоставлялась возможность выбрать 1 конкретную строку?

Сделать это нужно именно через интерактивный выбор, вариант поставить галочку на нужной строке (вполне адекватный и подходящий, по моему мнению) не подходит.
---
Если Вам необходимо показать диалог выбора пользователю, то самый простой на мой взгляд подход, это воспользоваться выбором из списка:

```1c
    &НаКлиенте
    Процедура ВыполнитьКоманду(Команда)

    СписокВыбора = Новый СписокЗначений;

    Для каждого СтрокаТЧ Из Объект.ТабличнаяЧасть Цикл
    СписокВыбора.Добавить(СтрокаТЧ.НомерСтроки, "Некое представление i-ой строки таблицы");
    КонецЦикла;

    Обработчик = Новый ОписаниеОповещения("ПослеВыбораСтрокиТаблицы", ЭтотОбъект);

    СписокВыбора.ПоказатьВыборЭлемента(Обработчик, "Выберите строку");

    КонецПроцедуры

    &НаКлиенте
    Процедура ПослеВыбораСтрокиТаблицы(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

    Если ВыбранныйЭлемент <> Неопределено Тогда

    ИндексСтроки = ВыбранныйЭлемент.Значение - 1;
    ВыбраннаяСтрокаТаблицы = Объект.ТабличнаяЧасть[ИндексСтроки];

    // Обработка выбранной строки

    КонецЕсли;

    КонецПроцедуры
```
---
Создать форму выбора "ФормаВыбораПункта" с произвольным запросом, включающим табличную часть. Без основной таблицы.
В форме выбора сделать свою команду "Выбрать1" и свою кнопку для этой команды.

```1c
    &НаКлиенте
    Процедура Выбрать1(Команда)
    Значение=Элементы.Список.ТекущиеДанные;
    Если Значение=Неопределено Тогда
    Предупреждение("Не выбрана строка");
    Возврат;
    КонецЕсли;
    Если Не РазрешенВыборПапки И Значение.ЭтоПапка Тогда
    Предупреждение("Пункт "+Значение.Номер+" является изделием или разделом, содержащим подразделы (работы)."
    +" Запрещен выбор таких пунктов.");
    Возврат;
    КонецЕсли;
    ОповеститьОВыборе(Новый Структура("График,КлючСтроки",Значение.Ссылка,Значение.КлючСтроки));
    КонецПроцедуры

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    Выбрать1(Неопределено);
    КонецПроцедуры
```

Использование, ВыбранноеЗначение содержит График, КлючСтроки:

```1c
    &НаКлиенте
    Процедура ПланПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
    Отказ=Истина;
    Если Объект.График.Пустая() Тогда
    Сообщить("Задайте график.");
    Возврат;
    КонецЕсли;
    Подр=ПредопределенноеЗначение("Справочник.ПодразделенияОрганизаций.ПустаяСсылка");
    П=Новый Структура("График,Подразделение,РазрешенВыборПапки,РазрешенВыборВыполненных",
    Объект.График,Подр,Истина,Ложь);
    ОткрытьФормуМодально("РегистрСведений.ГрафикАктуальный.Форма.ФормаВыбораПункта",П,ЭтаФорма);
    КонецПроцедуры

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

```1c
    &НаКлиенте
    Процедура ВыполнитьКоманду(Команда)

    СписокВыбора = Новый СписокЗначений;

    Для каждого СтрокаТЧ Из Объект.ТабличнаяЧасть Цикл
    СписокВыбора.Добавить(СтрокаТЧ.НомерСтроки, "Некое представление i-ой строки таблицы");
    КонецЦикла;

    Обработчик = Новый ОписаниеОповещения("ПослеВыбораСтрокиТаблицы", ЭтотОбъект);

    СписокВыбора.ПоказатьВыборЭлемента(Обработчик, "Выберите строку");

    КонецПроцедуры

    &НаКлиенте
    Процедура ПослеВыбораСтрокиТаблицы(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

    Если ВыбранныйЭлемент <> Неопределено Тогда

    ИндексСтроки = ВыбранныйЭлемент.Значение - 1;
    ВыбраннаяСтрокаТаблицы = Объект.ТабличнаяЧасть[ИндексСтроки];

    // Обработка выбранной строки

    КонецЕсли;

    КонецПроцедуры
```
---
А где мы передаем "ВыбранныйЭлемент" в обработчик "ПослеВыбораСтрокиТаблицы"?
---
Этот параметр процедуры соответствует выбранному пользователем элементу списка.
---
А "ЭтотОбъект" это имеется ввиду "Объект"?
Зачем он?
---
Нет, это форма. Раньше использовалась конструкция "ЭтаФорма", ныне она считается устаревшей, и рекомендуется писать вместо нее "ЭтотОбъект".
---
Ругается, что переменная "ЭтотОбъект" не определена
---
А где выполняется код? И вообще, речь про обычные или управляемые формы?
---
Управляемые формы, код выполняется как вы и написали На клиенте
---
И код ровно такой, как у меня в примере? Если код в клиентском контексте формы, то переменная обязательно должна быть определена. Быть может опечатка? Попробуйте набрать заново.
---
Если указать "ЭтаФорма", то все нормально проходит. Спасибо!
---
что значит выбрать? сделать доступной для редактирования? сделать активной?
вообще обычно пользователь на нее просто нажимает и работает
---
Ему предлогается список строк и он 2-м щелчком выбирает нужную, из которой потом берется нужная информация (в коде)
---
Пользователь не может сначала выделить строку и только потом нажать на кнопку?
---
Если получится так сделать сразу на нескольких вкладках (в нескольких табличных частей), то да, но 1С ведь наверное забудет выбранную строку после переключения на другую табл часть
---
Создать форму выбора "ФормаВыбораПункта" с произвольным запросом, включающим табличную часть. Без основной таблицы.
В форме выбора сделать свою команду "Выбрать1" и свою кнопку для этой команды.

```1c
    &НаКлиенте
    Процедура Выбрать1(Команда)
    Значение=Элементы.Список.ТекущиеДанные;
    Если Значение=Неопределено Тогда
    Предупреждение("Не выбрана строка");
    Возврат;
    КонецЕсли;
    Если Не РазрешенВыборПапки И Значение.ЭтоПапка Тогда
    Предупреждение("Пункт "+Значение.Номер+" является изделием или разделом, содержащим подразделы (работы)."
    +" Запрещен выбор таких пунктов.");
    Возврат;
    КонецЕсли;
    ОповеститьОВыборе(Новый Структура("График,КлючСтроки",Значение.Ссылка,Значение.КлючСтроки));
    КонецПроцедуры

    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    Выбрать1(Неопределено);
    КонецПроцедуры
```

Использование, ВыбранноеЗначение содержит График, КлючСтроки:

```1c
    &НаКлиенте
    Процедура ПланПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
    Отказ=Истина;
    Если Объект.График.Пустая() Тогда
    Сообщить("Задайте график.");
    Возврат;
    КонецЕсли;
    Подр=ПредопределенноеЗначение("Справочник.ПодразделенияОрганизаций.ПустаяСсылка");
    П=Новый Структура("График,Подразделение,РазрешенВыборПапки,РазрешенВыборВыполненных",
    Объект.График,Подр,Истина,Ложь);
    ОткрытьФормуМодально("РегистрСведений.ГрафикАктуальный.Форма.ФормаВыбораПункта",П,ЭтаФорма);
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Строки=Объект.План.НайтиСтроки(Новый Структура("КлючСтроки",ВыбранноеЗначение.КлючСтроки));
    Если Строки.Количество()>0 Тогда
    ПоказатьПредупреждение(,"Выбранный пункт уже есть в документе.");
    Возврат;
    КонецЕсли;
    Если ДобавитьСтрПланаСервер(ВыбранноеЗначение.КлючСтроки) Тогда
    Модифицированность=Истина;
    КонецЕсли;
    КонецПроцедуры
```
---
Создать форму выбора "ФормаВыбораПункта" с произвольным запросом, включающим табличную часть. Без основной таблицы.
В форме выбора сделать свою команду "Выбрать1" и свою кнопку для этой команды.

Где эту форму нужно создать и как её можно вызвать?
---
"есть документ, в нем есть табличная часть" - создавайте в этом документе с именем, например, ФормаВыбораСтроки.
---
с произвольным запросом

Этот запрос должен подгружать нужные нам данные при открытии?
---
В форме выбора есть реквизит Список, в свойствах которого нужно включить флаг "Произвольный запрос". Открыть "Настройка списка" и сделать запрос, включающий табличную часть.
---
сделать запрос, включающий табличную часть.

А как в этот запрос передать Объект документа (ссылку) для установления параметра запроса (для отбора)?
---
Без основной таблицы.

Что значит без основной таблицы?
А с какой таблицей нужно?
---
Ни с какой. Может не получиться задать основную таблицу, т.к. в выборке будет дублироваться поле ссылка из-за соединения с табличной частью.
---
А подскажите пожалуйста ещё, как мне передать ссылку из строки, которая была выбрана обратно в модуль формы, из которой данная форма открывалась?
---
Все понял, нужно было создать обработчик в основной форме, и при открытии формы выбора, как Вы и писали передать в качестве владельца формы "ЭтаФорма".

Спасибо ещё раз!
---
Для передачи параметров в модуль основной формы прописываю обработчик, который должен реагировать на процедуру ОповещениеОВыборе в ФормеВыбора и назначаю его на событие ОбработкаВыбора, но он не срабатывает

```1c
    &НаКлиенте
    Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

    ДанныеСтроки = Новый Структура("ДатаНачала, ДатаОкончания"); //имя заполняемого реквизита
    ВыбранныйПериодИТС=ВыбранноеЗначение;
    Модифицированность = Истина;

    КонецПроцедуры
```

хотя процедура ОповеститьОВыборе на форме выбора срабатывает
---
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка=Ложь;
    Выбрать1(Неопределено);
КонецПроцедуры

Для чего нам нужнаданная Процедура и какому событию её нужно назначить?
---
СписокВыбор назначена событию Выбор (двойной щелчок мыши) элемента Список.
---
В процедурах ОткрытьФормуМодально, ОткрытьФорму второй параметр это Параметры - структура. Можно предать все, что угодно.
В форме в процедуре ПриСозданииНаСервере доступ к эти параметрам через Параметры. В моем примере в модуле формы ФормаВыбораПункта

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Список.Параметры.УстановитьЗначениеПараметра("График",Параметры.График);
    Список.Параметры.УстановитьЗначениеПараметра("Подразделение",Параметры.Подразделение);
    Если Параметры.Свойство("РазрешенВыборПапки") Тогда
    РазрешенВыборПапки=Параметры.РазрешенВыборПапки;
    КонецЕсли;
    РазрешенВыборВыполненных=Ложь;
    Если Параметры.Свойство("РазрешенВыборВыполненных") Тогда
    РазрешенВыборВыполненных=Параметры.РазрешенВыборВыполненных;
    КонецЕсли;
    Список.Параметры.УстановитьЗначениеПараметра("РазрешенВыборВыполненных",РазрешенВыборВыполненных);
    Если Не РазрешенВыборВыполненных Тогда
    Элементы.Выполнено.Видимость=Ложь;
    КонецЕсли;
    КонецПроцедуры
```
---
В процедурах ОткрытьФормуМодально, ОткрытьФорму второй параметр это Параметры - структура. Можно предать все, что угодно.

То что пишу в модуле основной формы:

```1c
    &НаКлиенте
    Процедура ЗаполнитьРеквизитыДиалог(Команда)

    ПараметрыЗапроса=Новый Структура("Ссылка", Объект.Ссылка);

    //ОткрытьФорму("Документ.рбсДоговор.Форма.ФормаВыбора",ПараметрыЗапроса);
    ОткрытьФормуМодально("Документ.рбсДоговор.Форма.ФормаВыбора",ПараметрыЗапроса);

    КонецПроцедуры
```

То что пишу в модуле открываемой формы:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("Ссылка") Тогда
    СписокПериодов.Параметры.УстановитьЗначениеПараметра("Ссылка",Параметры.Ссылка);
    КонецЕсли;
    КонецПроцедуры
```

Это запрос для списка формы выбора:

```1c
    ВЫБРАТЬ
    ДоговорПодписка.ДатаНачала,
    ДоговорПодписка.ДатаОкончания,

    ИЗ
    Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
    ГДЕ
    рбсДоговорПодпискаИТС.Ссылка = &Ссылка
```

Форма открывается, но данные не подгружаются. Смотрю через отладчик управление на функцию ПриСозданииНаСервере даже не передается.

Подскажите пожалуйста, где, что я пропустил?
---
Для начала нужно добиться, чтобы заработал отладчик.
Процедура ПриСозданииНаСервере всегда выполняется при открытии формы. Отладчик должен в нее заходить. Попробуйте в конфигураторе Сервис- Параметры - Запуск 1С:Предприятия - Параметр запуска: = РежимОтладки.
Сервер 1С тоже должен запускаться с ключом -debug.

Потом посмотреть, что происходит при открытии формы.
На форму точно СписокПериодов выводится? Может какой-нибудь другой список.
---
Вот, когда я ставил точку остановы на процедуру "ПриСозданииНаСервере", она туда не заходила, поэтому решил, что эта процедура вообще не запускается, а сейчас попробовал тчк остановы у "СоздатьФормуМодально" и от туда она зашла, параметр установила, но динамический список не прогрузился.
Попробовал просто выгрузить записи справочника Контрагенты - получилось,
установил параметр - ссылку на контрагента, получилось

```1c
    ВЫБРАТЬ
    Контрагенты.Наименование
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.Ссылка = &Ссылка
```

А вот так уже не работает:

```1c
    ВЫБРАТЬ
    рбсДоговорПодпискаИТС.ДатаНачала
    ИЗ
    Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
    ГДЕ
    рбсДоговорПодпискаИТС.Ссылка = &Ссылка
```

И ещё заходит вот сюда:
ДокументооборотСКОКлиент.ПредупредитьОКонфликтеКриптопровайдеров()

Может это иза того, что мы хотим выгрузить табличную часть документа?
---
Потом посмотреть, что происходит при открытии формы.
На форму точно СписокПериодов выводится? Может какой-нибудь другой список.
Ну я перетаскиваю с левой части на правую созданный реквизит и в св-ве ПутьКДанным у него прописано имя реквизита - ДинамическогоСписка.

Попробовал будут ли данные подгружаться без отображения на форму - просто запрос в процедуре ПриСозданииНаСервере - запросом они прогружаются:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | рбсДоговорПодпискаИТС.ДатаНачала,
    | рбсДоговорПодпискаИТС.ДатаОкончания
    |ИЗ
    | Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
    |ГДЕ
    | рбсДоговорПодпискаИТС.Ссылка = &Документ";

    Запрос.УстановитьПараметр("Документ",Параметры.Ссылка);
    Результат=Запрос.Выполнить();
    Выборка=Результат.Выбрать();

    Пока Выборка.Следующий() Цикл
    а=Выборка.ДатаНачала; //Данные есть
    КонецЦикла;

    Если Параметры.Свойство("Ссылка") Тогда
    СписокПериодовИТС.Параметры.УстановитьЗначениеПараметра("Ссылка",Параметры.Ссылка);
    КонецЕсли;
    КонецПроцедуры
```
---
Нашёл!!! Я создавал произвольный запрос после того как сперва указывал основную таблицу для этого реквизита, когда ещё галочка "Произвольный запрос" не стояла, а потом уже ставил данную галочку и создавал запрос. После того как я поменял последовательность все начало отображаться.
Спасибо!
---
Сообщение было скрыто модератором.