Добрый день, 1С 8.3 КА 2.4
На форме есть ТЧ "Товары", при выделение строки необходимо выделить строку динамического списка "Список" с той же номенклатурой... казалось бы задача не сложная, но у меня трудности =(
Нашел нужный метод, но что туда передать??

Номенклатура здесь

```1c
    Элементы.Товары.ТекущиеДанные.Номенклатура
```

```1c
    Элементы.Список.ВыделенныеСтроки.Добавить( ....
```
---
да легко:

```1c
    ВыбранныеСтроки = Элементы.Список.ВыделенныеСтроки;
    к=0;
    Пока Истина Цикл
    к = к + 1;
    ТекущаяСтрока = Элементы.Список.ДанныеСтроки(к);
    Если ТекущаяСтрока = Неопределено Тогда
    Прервать;
    КонецЕсли;
    Если ТекущаяСтрока.Номенклатура = Номенклатура Тогда
    ВыбранныеСтроки.Добавить(к);
    КонецЕсли;
    КонецЦикла;
```
---
Выделить или сделать текущей строку в ДС проблематично. Можно наложить отбор

```1c
    &НаКлиенте
    Процедура ТабличнаяЧасть1ПриАктивизацииСтроки(Элемент)
    ПодключитьОбработчикОжидания("ОбработатьАктивизациюСтрокиСписка", 0.2, Истина);
    КонецПроцедуры

    &НаКлиенте
    Процедура ОбработатьАктивизациюСтрокиСписка()

    ТекущаяСтрока = Элементы.ТабличнаяЧасть1.ТекущиеДанные;
    Если Не ТекущаяСтрока = Неопределено Тогда

    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, "Ссылка", ТекущаяСтрока.Реквизит1, ВидСравненияКомпоновкиДанных.Равно,, ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);

    Иначе
    ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, "Ссылка", ТекущаяСтрока.Реквизит1, ВидСравненияКомпоновкиДанных.Равно,,Ложь ,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
    КонецЕсли;

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

Элементы.Реквизит2.ТекущаяСтрока = Элементы.Реквизит1.ТекущиеДанные.Реквизит1;

С учетом того, что ТекущиеДанные.Реквизит1 есть ссылка на ссылку основной таблицы.

выделить строки:

Тип: Массив.
Содержит массив идентификаторов выделенных строк.

Как вы собираетесь искать идентификаторы строк динамического списка?

нужно Элементы.Реквизит2.ВыделенныеСтроки.Добавить(Число);

Где число это номер строки ДС.

Поэтому проблематично :)

UP: Я попробовал. Можно и ссылки добавлять в массив, если указана основная таблица. Вопрос снимается.
---
Сделать строку текущей: Только если есть основная таблица. Тогда да. Достаточно
Динамические списки без основной таблицы - это исключение, а не правило. ТС вроде ничего такого не упоминал. И вы тоже. Просто сказали, что это мол "в ДС проблематично". Нехило так обобщив и вводя людей в заблуждение. Ну и кто после этого словоблуд?
С выделенными строками аналогично. Если у ДС есть основная таблица - то там ссылки. Это описано в справке по расширению таблицы формы для динамического списка и это проверено в (10) на практике.
---
в (20) было уточнение, что ДС без основной таблицы.
---
Кстати, раз уж затронули вопрос.
Кто-нибудь мне объяснит смысл использования динамического списка без основной таблицы? Ведь никакой "динамичности" в этом случае уже не будет (порционное считывание невозможно, будет его эмуляция) и все другие плюшки ДС с основной таблицей тоже теряются. Получаем тормозящий на больших объемах список, из плюсов только то, что он не тянется весь на клиента, а пересчитывается на сервере. Что на практике очень сомнительное преимущество, так как тормоза - обратная сторона этой плюшки.
Ну, то есть в отличие от динамического списка с основной таблицей юзабельность будет сохранятся только при определенных условиях и с ростом объема данных легко может потеряться.
Или я ошибаюсь?
(26) В (20), насколько я понял, основная таблица очищалась только в качестве эксперимента.
ЗЫ. Хотя, я вообще не понял, зачем в (20) такой запрос динамического списка. Если для ТЧ - то вообще не нужен динамический список.
---
"если заполнено свойство Основная таблица - выходит ошибка "Основная таблица динамического списка задано не верно". " Наоборот. Пробовалось установить.
Да и основная таблица не факт, что Номенклатура была бы.

Основная таблица для ДС нужна только для возможности изменения.
Не всегда можно указать основную таблицу при сложном соединении. Т.к. не будет возможности вносить изменения, а без этого основная таблица не отрабатывает.
---
Основная таблица для ДС нужна только для возможности изменения.
Не только.
Или объясните дураку, как вы организуете порционное/динамическое считывание данных при скроллинге с использованием абсолютно произвольного запроса.
---
насколько помню, все данные получаются сразу из БД и сохраняются в серверном кеше. И уже из него порциями показываются.
---
Фига себе. То есть другими словами, если я открою таблицу проводок без привязки к основной таблице то в серверный кэш загонится копия всей таблицы проводок? :) В любом случае вы сами же себя опровергаете. Потому что если вы откроете таблицу проводок с установленной основной таблицей, то все будет совсем не так печально. И значит, основная таблица для ДС нужна не только для возможности изменения.
---
возможно, если установлена основная таблица и указан флаг "динамическое считывание", и основная таблица имеет индекс, и нет соединений, тогда возможно и получение данных из БД порциями. Точно не скажу. Но должны соблюдаться все эти перечисленные условия.
Вот голове отложилась цифра в 1000. Возможно порция размеров в 1000. Но не уверен :)
Когда-то читал про это. Там несколько раз переделывали механику.
---
Естественно, я про динамическое считывание данных. Основная таблица всегда имеет ключ. А соединения не мешают, если не плодят строки.
---
да. Вот что в 1С сказано:

Динамическое считывание данных включено (рекомендуется). Используются запросы, выбирающие записи в количестве приблизительно соответствующем количеству видимых строк в таблице;
Динамическое считывание данных выключено, задана не виртуальная основная таблица или одна из следующих таблиц: СрезПервых, СрезПоследних, ЗадачиПоИсполнителю, КритерииОтбора, ДвижениеСубконто. Используются запросы, выбирающие по 1000 записей в буфер на сервере, по мере необходимости данные передаются на клиент. Менее эффективно, чем динамическое считывание;
Динамическое считывание данных выключено, основная таблица не задана. Запрос выполняется «как есть». В буфере накапливаются данные, начиная с 1000 записей. Чем ближе к концу списка, тем больше записей. Можно использовать только для заведомо маленьких выборок.
Но там еще про соединения и сортировку. Динамическое считывание может быть выключено при определенных настройках сортировки и выборки.
---
Вот вообще непонятно, зачем может понадобиться режим с основной таблицей и отключенным динамическим считыванием. Подозреваю, что исключительно для некоторых из перечисленных таблиц, где включить динамическое считывание попросту невозможно.
---
зачем может понадобиться режим с основной таблицей и отключенным динамическим считыванием
Еще для списков, которые будут часто листать. Если будет динамическое считывание, то будет чаще обращаться к СУБД.
---
Спорный аргумент.
(38) Я в курсе. И это как бы логично.
---
необходимо выделить строку динамического списка "Список"
выделить, в смысле прямо программно выбрать-множественным выбором, типа как мышкой в журналах, для распечатывания ?
или выделить, в смысле оформить визуально (подсветить там, пожирнее сделать, или фон строки изменить) ?
---
да легко:

```1c
    ВыбранныеСтроки = Элементы.Список.ВыделенныеСтроки;
    к=0;
    Пока Истина Цикл
    к = к + 1;
    ТекущаяСтрока = Элементы.Список.ДанныеСтроки(к);
    Если ТекущаяСтрока = Неопределено Тогда
    Прервать;
    КонецЕсли;
    Если ТекущаяСтрока.Номенклатура = Номенклатура Тогда
    ВыбранныеСтроки.Добавить(к);
    КонецЕсли;
    КонецЦикла;
```
---
В рамках постпвленной задачи - отлично, но выделяете вы все же не сущности, а строки, которые удовлетворяют задаче в рамках текущей сортировки. Впрочем, каков вопрос - таков ответ.
---
а при ручном выделении будет абсолютно тоже самое. Нет данных для привязки.
---
Есть только свойство ВыделенныйТекст. А ВыделенныеСтроки почему-то отсутствуют. Может, от версии платформы зависит? У меня 8.3.15
---
Проблема все еще не решена?
---
да, сейчас пробую через таблицу значений, вместо динамического списка.
---
Тема интересная. Мне кажется что можно решить. Если не получится напишите.
---
В качестве значений для свойств ТекущаяСтрока, ТекущийРодитель и элемента коллекции, содержащейся в свойстве ВыделенныеСтроки, используются значения ссылок на объекты, которые содержит главная таблица динамического списка.
ЗЫ. Короче просто пишешь в свойство "ТекущаяСтрока" таблицы формы динамического списка ссылку на нужную номенклатуру.
---
Судя по справке:

Добавить в выделенное нельзя, почему выделил жирным.
---
Не пробовал, но подозреваю что добавлять можно.
Так часто пишут в СП для свойств-коллекций.
ДРУГУЮ коллекцию присвоить свойству нельзя, но менять содержимое часто можно.
---
другой справки нет.
Как пишут так и будет работает!
Иначе не документированная функциональность / баг, нужное подчеркнуть!
---
Нельзя сделать так:
...ВыделенныеСтроки = Новый Массив();
А в массив, который содержится в ВыделенныеСтроки можно добавлять.
---
Да подчеркивай, что хочешь. Я просто сообщаю о том, что в справке пометку "Только чтение" имеют ВСЕ свойства-коллекции, которые нельзя перезаписывать. Независимо от того, можно менять содержимое коллекций или нет. Поступай с этой информацией как тебе угодно.
---
в примере показали, что там таблица формы. И то что я написал в справке.
Редактировали массив, который был в выделенных строках. Массив конечно редактировать можно.

(9) ВыделенныеСтрокиТабличногоПоля нет там все как по справке. Что-то тоже путаете!
---
Да, можно. И добавлять и удалять, только желательно через ПодключитьОбработчикОжидания
Пример:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НоваяСтрока = Товары.Добавить();
    НоваяСтрока.Реквизит1 = "Кабель";

    НоваяСтрока = Товары.Добавить();
    НоваяСтрока.Реквизит1 = "Щебень";

    НоваяСтрока = Товары.Добавить();
    НоваяСтрока.Реквизит1 = "Пруток";
    КонецПроцедуры

    &НаКлиенте
    Процедура ТоварыПриАктивизацииСтроки(Элемент)
    ПодключитьОбработчикОжидания("ВыделитьСтроки", 0.1, Истина);
    КонецПроцедуры

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

    &НаСервереБезКонтекста
    Функция ПолучитьСсылки(ПодстрокаПоиска)
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Наименование ПОДОБНО &Наименование");
    Запрос.УстановитьПараметр("Наименование", "%" + ПодстрокаПоиска + "%");
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(0)
    КонецФункции
```
---
Спасибо за подробный код, номенклатура попадает в Элементы.СписокИсходящихЗаявок.ВыделенныеСтроки, но строка не выделяется. Я так думаю туда должна попадать вся строка или поле Номенклатура должна быть как то выделена в динамическом списке (типа "Ведущее") чтобы по нему срабатывал данный код ?

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

```1c
    ВЫБРАТЬ
    СВХ_ИсходящийЗаказТовары.Ссылка КАК Ссылка,
    СВХ_ИсходящийЗаказТовары.Ссылка.Статус КАК Статус,
    СВХ_ИсходящийЗаказТовары.Номенклатура КАК Номенклатура,
    СВХ_ИсходящийЗаказТовары.Количество КАК Количество,
    СВХ_ИсходящийЗаказТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    СВХ_ИсходящийЗаказТовары.СрокПоставки КАК СрокПоставки,
    СВХ_ИсходящийЗаказТовары.Цена КАК Цена,
    СВХ_ИсходящийЗаказТовары.Сумма КАК Сумма,
    СВХ_ИсходящийЗаказТовары.Валюта КАК Валюта,
    СВХ_ИсходящийЗаказТовары.КодЗаказа КАК КодЗаказа
    ИЗ
    Документ.СВХ_ИсходящийЗаказ.Товары КАК СВХ_ИсходящийЗаказТовары
    ГДЕ
    СВХ_ИсходящийЗаказТовары.КодЗаказа = &КодЗаказа
    И СВХ_ИсходящийЗаказТовары.Ссылка.Проведен
```
---
Возможно стоит отказаться от динамического списка в пользу таблицы значений, заполняемой программно при активации строки ТЧ.
---
Внешка с текущей строкой.
Почему не сможете выделить ответил в 22
---
Вот смотрю я конструкторе, там динамическое считывание стоит и основная таблица тоже. Но при этом не работает ни (10) ни (23) способ, а всё из-за произвольного запроса.
---
потому что основная таблица не Номенклатура, а в (10) передается массив номенклатуры.
Если все же используется основная таблица, то нужно искать не номенклатуру, а документы, в которых используется номенклатура, и уже ссылки на документы передавать.
Или как в (25) в цикле находить строки и уже передавать строки вместо номера.
---
(42) потому что основная таблица не Номенклатура, а в (10) передается массив номенклатуры.
Если все же используется основная таблица, то нужно искать не номенклатуру, а документы, в которых используется номенклатура, и уже ссылки на документы передавать.
Пробовал передать ссылку на документ основной таблицы - не сработало. Ссылка попадает в Элементы.СписокИсходящихЗаявок.ВыделенныеСтроки, но выделения при этом нет.
 Или как в (25) в цикле находить строки и уже передавать строки вместо номера.
Попробую
---
Работает! (25)
Только
```1c
    ВыбранныеСтроки.Очистить();
```
 добавил и всё.
---
Можно отбор наложить, вот такое вполне реально!
---
Да и ДС без основной таблицы и динамического считывания лично я тоже никогда не использую. Да и в типовых не видел (но тут не поручусь).
Потому что вот вот это вот "В буфере накапливаются данные, начиная с 1000 записей. Чем ближе к концу списка, тем больше записей." дает непрогнозируемую масштабируемость. А "для заведомо маленьких выборок" сплошь и рядом выгоднее и удобнее вычитывать полностью в ТЗ, гарантировав бизнес-процессом ограниченность объема вычитываемых данных.
---
ДС без основной таблицы и динамического считывания лично я тоже никогда не использую. Да и в типовых не видел (но тут не поручусь).
А динамическое считывание без основной таблицы физически невозможно включить.
---
```1c
    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    Для Каждого Строка Из Настройки.Структура Цикл
    ВыбранноеПолеКомпоновкиДанных = Строка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    // Инициализируем созданное поле
    ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
    ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
    КонецЦикла;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
```

Получилось добавить вывод колонки, которую скрыли программно.
Далее перебираем строки по отбору. И полученный массив обходим:

```1c
    Элементы.Список.ВыделенныеСтроки.Очистить();
    ...
    Для Каждого Элемент Из Массив Цикл

    Элементы.Список.ВыделенныеСтроки.Добавить(Элемент);

    КонецЦикла;
```
---
Круто, только автор упустил:
Первый блок выполняется на сервере, и результатом его выполнения будет таблица значений.
Второй блок выполняется на клиенте, и он обрабатывает готовый массив. Теоретически это должен быть массив идентификаторов.
Для полноты картины было правильно указать, что сделали с ТЗ на сервере, чтобы получить нужный массив на клиенте.
---
спасибо за комментарий в той задаче это было чисто для примера сейчас аналогичная задача, можете указать 4 часа работы:

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

    Элементы.Список.ВыделенныеСтроки.Очистить();

    МассивСсылок = ПолучитьМассивСсылок();

    Для Каждого Элемент Из МассивСсылок Цикл

    Элементы.Список.ВыделенныеСтроки.Добавить(Элемент);

    КонецЦикла;

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

    &НаСервере
    Функция ПолучитьМассивСсылок()

    Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
    Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();

    Для Каждого Строка Из Настройки.Структура Цикл
    ВыбранноеПолеКомпоновкиДанных = Строка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    // Инициализируем созданное поле
    ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
    ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
    КонецЦикла;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

    ТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    МассивСсылок = ТЗ.ВыгрузитьКолонку("Ссылка");

    Возврат МассивСсылок;

    КонецФункции
```
---
там где... Это и выполняется. Кому нужно решение этого достаточно.
---
Решал похожу задачу.
На мобильной платформе не получилось использовать настройки СКД, пришлось просто запросом все ссылки получить, а при работе отборов они сами отбраковываются.

```1c
    &НаСервере
    Функция ПолучитьМассивСсылок()

    МассивСсылок = Новый Массив;

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    | ЖурналДокументов_Общий.Ссылка КАК Ссылка
    |ИЗ
    | ЖурналДокументов.ЖурналДокументов_Общий КАК ЖурналДокументов_Общий";

    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл

    МассивСсылок.Добавить(Выборка.Ссылка);

    КонецЦикла;

    Возврат МассивСсылок;

    КонецФункции
```