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

```1c
    ВыделенныеСтр = Элементы.СписокМатериалы.ВыделенныеСтроки;
    Для каждого ТекСтрока Из ВыделенныеСтр Цикл
    // Для каждого СтрокаТЧ из СписокМатериалы Цикл
    ТЧСпецификация = Элементы.СписокМатериалы.ДанныеСтроки(ТекСтрока).Спецификация.МатериалыИУслуги;
    Для каждого СтрТЧ Из ТЧСпецификация Цикл
    СтрТаб = НовыйДок.Товары.Добавить();
    СтрТаб.Номенклатура = СтрТЧ.Номенклатура;
    СтрТаб.Количество = СтрТЧ.КоличествоУпаковок;
    СтрТаб.КоличествоУпаковок = СтрТЧ.КоличествоУпаковок;
    КонецЦикла;
    // КонецЦикла;
    КонецЦикла;
```
---
из клиентской процедуры нужно получить нужную ссылку

```1c
    Ссылка=Элементы.СписокМатериалов.ТекущиеДанные.Спецификация
```

и передать серверную функцию

```1c
    &НаСервере
    Функция ЗаказыМатериаловВПроизводствоНаСервере(Ссылка)
```
---
Выкладываю полный код, который дал мне необходимый результат.
Спасибо всем огромное, вы мне очень помогли

```1c
    &НаСервере
    Функция ЗаказыМатериаловВПроизводствоНаСервере(СсылкаНаСпецификацию)
    НовыйДок = Документы.ЗаказМатериаловВПроизводство.СоздатьДокумент();
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Подразделение = Элементы.Подразделение;
    ДанныеЗаполнения = Новый Структура();
    ДанныеЗаполнения.Вставить("Статус", Перечисления.СтатусыЗаказовМатериаловВПроизводство.КОбеспечению);
    ДанныеЗаполнения.Вставить("ХозяйственнаяОперация", Перечисления.ХозяйственныеОперации.ПередачаМатериаловВКладовую);

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

    НовыйДок.Заполнить(ДанныеЗаполнения);

    НовыйДок.Записать();
    СсылкаНаДок = НовыйДок.Ссылка;
    Возврат СсылкаНаДок;

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

    &НаКлиенте
    Процедура ЗаполнитьЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

    //***
    СсылкаНаСпецификацию = Элементы.СписокМатериалы.ТекущиеДанные.Спецификация;
    //***

    Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
    СсылкаНаДок = ЗаказыМатериаловВПроизводствоНаСервере(СсылкаНаСпецификацию);
    ПоказатьЗначение(,СсылкаНаДок);
    КонецЕсли;

    Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
    Возврат
    КонецЕсли;

    Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
    Возврат
    КонецЕсли;

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

    &НаКлиенте
    Процедура ЗаказыМатериаловВПроизводство(Команда)
    ПоказатьВопрос(Новый ОписаниеОповещения("ЗаполнитьЗавершение", ЭтотОбъект), "Создать заказ?",
    РежимДиалогаВопрос.ДаНетОтмена, 60, КодВозвратаДиалога.Нет);
    КонецПроцедуры
```
---
из клиентской процедуры нужно получить нужную ссылку

```1c
    Ссылка=Элементы.СписокМатериалов.ТекущиеДанные.Спецификация
```

и передать серверную функцию

```1c
    &НаСервере
    Функция ЗаказыМатериаловВПроизводствоНаСервере(Ссылка)
```
---
есть текущая строка
ТекущиеДанные.Спецификация.ТЧСпецификации - вот вам и то что нужно
главное, чтобы ТекущиеДанные.Спецификация было заполнено

ЗЫ если, конечно, правильно понял суть вопроса
---
Документ создаю на сервере через функцию для предварительного открытия документа для просмотра на правильность заполнения или корректировки, предопределенных реквизитов у формы обработки нет, все созданы с помощью кнопки "Добавить колонку реквизита".

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

    Для каждого ТекущаяСтрока Из Элементы.СписокМатериалы.ВыделенныеСтроки Цикл

    СтрТаб = НовыйДок.Товары.Добавить();

    // ******** ВОТ здесь нужно указать заполнение табличной части из "Спецификации"

    КонецЦикла;

    НовыйДок.Заполнить(ДанныеЗаполнения);

    НовыйДок.Записать();
    СсылкаНаДок = НовыйДок.Ссылка;
    Возврат СсылкаНаДок;

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

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

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

```1c
    НовыйДок.УстановитьСсылкуНового(Документы.ЗаказМатериаловВПроизводство.ПолучитьСсылку(Новый УникальныйИдентификатор));
```
Это для чего? 1С и без программиста присвоит ссылку в ходе записи.

```1c
    ДанныеЗаполнения = Новый Структура();
    ДанныеЗаполнения.Вставить("Статус", Перечисления.СтатусыЗаказовМатериаловВПроизводство.КОбеспечению);
    НовыйДок.Заполнить(ДанныеЗаполнения);
```
Почему нельзя просто присваивать реквизитам значения?

```1c
    НовыйДок.Статус = Перечисления.СтатусыЗаказовМатериаловВПроизводство.КОбеспечению;
```
---
НовыйДок.УстановитьСсылкуНового(Документы.ЗаказМатериаловВПроизводство.ПолучитьСсылку(Новый УникальныйИдентификатор));

Если судить по описанию, то "Устанавливает значение для нового (созданного и еще не записанного) объекта, которое будет назначено при записи в качестве ссылки. ", но, наверное, уберу, т.к. я уже копировал из другой обработки и не обратил внимания.

```1c
    НовыйДок.Статус = Перечисления.СтатусыЗаказовМатериаловВПроизводство.КОбеспечению;
```

Можно и так, но через конструкцию "НовыйДок.Заполнить(ДанныеЗаполнения);" заполняются реквизиты, которые невидимы.
---
может так?

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

Включил бы отладчик что ли для начала - увидел бы, что там содержится... Глядишь - и сам бы до чего додумался бы.
---
а так

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

На клиенте будет работать (кроме получения табличной части из Спецификации)
---
ну вы сначала НаКлиенте получите массив Спецификаций по выделенным строчкам
и передайте его НаСервер для формирования документа
---
Как же он получит массив спецификаций на клиенте, если вы ему неправильный программный код даёте? А сам он думать не умеет ещё пока...
---
Если вы пришли сыпать оскорблениями то я попрошу Вас покинуть данный вопрос, если не затруднит.
---
Ну, попроси. Думаешь, задача быстрее решиться?

Вот вместо того, чтобы

а) Посмотреть в СП, что свойство ВыбранныеСтроки содержит массив идентификаторов строк таблицы ( а не сами строки)
б) Посмотреть в СП, что в метод ДанныеСтроки() необходимо передавать строку таблицы (а не идентификаторы этих строк)

то может ты бы и додумался, что наверное где-то как-то по идентификатору строки необходимо получить доступ к самой строке.

Но ты думать не хочешь, читать СП не хочешь, вместо этого просишь меня уйти.

ОК, оставайся с теми, кто тоже ни хрена не понимает в корректности использования свойств и методов управляемых форм в части работы с таблицами.

PS. Я ж один фиг не уйду.
---
Не помню, чтобы мы переходили на "ты", ну да ладно. И да, я с удовольствием останусь с теми, кто хочет мне помочь, а не оскорбить или обвинить в нежелании думать.
А, если Вам так хочется остаться, то это Ваше право. На этом с Вами мое общение закончено. Всего наилучшего. ))
---
Правда думаешь, что мне нужно твоё согласие для перехода на "ты"? Смешно...

Но ты не останавливайся - продолжай пятиминутную задачу решать ещё несколько дней. Ты справишься!
---
странно у меня на клиенте так работает
лкСпец = Элементы.СписокМатериалы.ДанныеСтроки(ТекСтрока).Спецификация;

//ТекСтрока - это из обхода выделенных - индекс
---
Я посмотрел, у меня в одном из динамических списков такая конструкция работает, как вы и написали на клиенте.
---
Выкладываю полный код, который дал мне необходимый результат.
Спасибо всем огромное, вы мне очень помогли

```1c
    &НаСервере
    Функция ЗаказыМатериаловВПроизводствоНаСервере(СсылкаНаСпецификацию)
    НовыйДок = Документы.ЗаказМатериаловВПроизводство.СоздатьДокумент();
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Подразделение = Элементы.Подразделение;
    ДанныеЗаполнения = Новый Структура();
    ДанныеЗаполнения.Вставить("Статус", Перечисления.СтатусыЗаказовМатериаловВПроизводство.КОбеспечению);
    ДанныеЗаполнения.Вставить("ХозяйственнаяОперация", Перечисления.ХозяйственныеОперации.ПередачаМатериаловВКладовую);

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

    НовыйДок.Заполнить(ДанныеЗаполнения);

    НовыйДок.Записать();
    СсылкаНаДок = НовыйДок.Ссылка;
    Возврат СсылкаНаДок;

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

    &НаКлиенте
    Процедура ЗаполнитьЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

    //***
    СсылкаНаСпецификацию = Элементы.СписокМатериалы.ТекущиеДанные.Спецификация;
    //***

    Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
    СсылкаНаДок = ЗаказыМатериаловВПроизводствоНаСервере(СсылкаНаСпецификацию);
    ПоказатьЗначение(,СсылкаНаДок);
    КонецЕсли;

    Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
    Возврат
    КонецЕсли;

    Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
    Возврат
    КонецЕсли;

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

    &НаКлиенте
    Процедура ЗаказыМатериаловВПроизводство(Команда)
    ПоказатьВопрос(Новый ОписаниеОповещения("ЗаполнитьЗавершение", ЭтотОбъект), "Создать заказ?",
    РежимДиалогаВопрос.ДаНетОтмена, 60, КодВозвратаДиалога.Нет);
    КонецПроцедуры
```
---
Ну и где ты здесь ВыделенныеСтроки используешь? Просто опять лишний цикл, лишь поиграться?