Таблицу значений формы заполняю данными из файла Excel.И эта таблица заполняется артикулами. Как в базе найти по этим артикулам номенклатуры и подставить в колонку номенклатура?
Сделал запрос по поиску номенклатуры по артикулу,но не понимаю,как в качестве параметра к этому параметру подставить артикулы из файла Excel.

```1c
    Запрос=Новый Запрос;
    Запрос.Текст= "ВЫБРАТЬ
    | ДанныеИзФайла.НомерСтроки,
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла
    |ГДЕ
    | ДанныеИзФайла.Артикул <> ""
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_ДанныеИзФайла.НомерСтроки,
    | ТаблицаДляПоиска.Ссылка КАК Номенклатура
    |ИЗ
    | ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
    | ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул");
```

```1c
    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    ПЗ.ЗаполнитьНастройки();

    ПЗ.Выполнить();

    тз_= ПЗ.Результат.Выгрузить();
    Для каждого СтрокаТЗ Из тз_ Цикл
    СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
    СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;

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

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

    &НаСервере
    Процедура ЗаполнитьНаСервере()
    // И тут-то и происходят все твои действия по заполнению и тп и тд.....
    //Типа
    ЭтаФорма.БазовыеЦены.Очистить(); // ну очищать конечно не надо , это я пошутил.....
    КонецПроцедуры
```

Ты заполняешь свою таблицу значений на клиенте, а потом делаешь с ней что угодно &НаСервере...
ЭтаФорма.БазовыеЦены
---
Спасибо YannikAlx!
В итоге получилось вот так:

```1c
    &НаСервере
    Процедура РаспознаваниеНоменклатуры()

    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";

    Если ДиалогВыбораФайла.Выбрать() Тогда

    Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда

    мНомерЕдиницыИзмерения = 0;
    КонецЕсли;

    ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;

    Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда

    ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);

    КонецЕсли;

    КонецЕсли;

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    ПЗ.ЗаполнитьНастройки();

    ПЗ.Выполнить();

    ТЗ1= ПЗ.Результат.Выгрузить();
    тз_=Новый ТаблицаЗначений;
    тз_.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80)));
    тз_.Колонки.Добавить("БазоваяЦена", Новый ОписаниеТипов("Число"));
    тз_.Колонки.Добавить("АктуальнаяЦена", Новый ОписаниеТипов("Число"));

    Для Каждого Стр Из ТЗ1 Цикл
    ЗаполнитьЗначенияСвойств(тз_.Добавить(), Стр);

    КонецЦикла;

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

    Для каждого СтрокаТЗ Из РезультатЗапроса Цикл
    СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
    СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;
    СтрокаТЗ_БазовыеЦены.Номенклатура=СтрокаТЗ.Ссылка;
    КонецЦикла;
```

Может потом кому-то пригодится
---
Вы по-прежнему используете 2 таблицы ? Одну Объект.ТаблицаЦен и вторая как реквизит формы?
---
где две таблицы? сможете показать в коде таблицы, про которых вы говорите?
---
Вы должны использовать таблицу Объект.ТаблицаЦен, вытащив ее на форму и именно ее заполнять изначально.
Вы же как я понял создали какой-то реквизит Формы, заполняете его из Экселя ... Нет ?
---
я заполняю таблицу БазовыеЦены, которая находится на форме документа
---
Вы на форму вытащили НЕ ТУ таблицу!

вы же зачем-то создали вручную свой реквизит ТаблицаЦен и заполняете его не понятно зачем...
вы создаете себе трудности , а потом не знаете как с ними бороться!

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

Или это вообще не обработка...
короче мало данных
---
есть файл excel . В котором две колонки: Артикул и Цена. В чем задача?:Нужно артикулы выгрузить в колонку "Артикул" и по этим артикулам искать номенклатуры в базе и эти номенклатуры загрузить в в колонку "номенклатура" . Колонка "Цена" в табице "Базовые цены" должна заполняться колонкой из файла Excel "Цены". Надеюсь теперь понятно)
На данном этапе, по артикулам из файла Excel, нужно найти номенклатуры в базе и заполнить этими найденными номенклатурами колонку "Номенклатура" ,таблицы "БазовыеЦены"
---
Возможно Вам помогут сервисы, которые я использовал для решения подобных задач. Первое, обратите внимание на обработку "Обработка Загрузка данных из табличного документа 1С 8.3 (управляемые формы)", примеры использования легко найти в интернете. Вы копируете из Excel данные в табличный документ, а затем используете алгоритмы обработки для загрузки данных в базу. Если же у Вас конфигурация на базе УТ, обратите внимание на обработку конфигурации "Загрузка цен поставщиков". Возможно, это Вам поможет, в плане готовых уже решений.
---
в ДанныеФайла артикул типа число, а в спр номенклатуры - строка, даю зуб
---
Я тоже делаю ставку на это!) На скриншоте видно, у артикула по умолчанию разделитель групп есть, значит скорее всего это число. А в номенклатуре я еще не встречал, чтобы артикул был НЕ строковым. Сделайте тип значения Артикула в таблице значений таким же как и у реквизита "Артикул" в справочнике Номенклатура.
Да, и при загрузке данных из Excel сделайте для артикула СокрЛП(), а то может не соединить с номенклатурой.
---
все-таки не понял, как найти номенклатуры по артикулам и файла excel и заполнить колонку номенклатура
---
В запросе вы пытаетесь делать объединение двух таблиц по полю "артикул". Но это поле, возможно, имеет разный тип данных в этих таблицах, например "строка" и "число". Никогда строка "123" не будет равнятся числу 123. Необходимо сравнивать значения с одинаковыми типами. Посмотрите, может быть проблема в этом.
---
у таблицы "БазовыеЦены" артикул имеет тип строка и реквизит справочника номенклатура тоже имеет тип строка. Проблема в том,что не знаю, что и как подставить в параметр запроса
---
```1c
    Запрос=Новый Запрос;
    Запрос.Текст= "ВЫБРАТЬ
    | ДанныеИзФайла.НомерСтроки,
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла
    |ГДЕ
    | ДанныеИзФайла.Артикул <> ""
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ВТ_ДанныеИзФайла.НомерСтроки,
    | ТаблицаДляПоиска.Ссылка КАК Номенклатура
    |ИЗ
    | ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
    | ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул");
    Запрос.УстановитьПараметр("ДанныеИзФайла", // вот сюда, как подставить арктикулы из файла Excel?);
```
---
А, сорян, не понял сразу. Ну видимо так:

```1c
    Запрос.УстановитьПараметр("ДанныеИзФайла", БазовыеЦены.Выгрузить())
```
---
т.е. параметру запроса "ДанныеИзФайла" надо присвоить значение с типом "ТаблицаЗначений"
---
Вот мы и пришли к обсуждению "Зачем &НаСервере" ;-)
Потому что запросы к базе данных возможно выполнить только на сервере...
---
правильно разбивать процедуры загрузки данных из файла и обработки данных на разные процедуры которые будут выполняться в необходимом контексте. И вы сами себе противоречите: как вы откроете файл на сервере для считывания, если он лежит на клиенте?
Во многих ваших ответах вы занимаетесь переворачиванием информации и отвечаете не по сути вопроса.
---
Я не противоречу себе уж точно!
Вы путаете понятия &НаСервере &НаКлиенте с реальными клиентами и серверами!

Файл лежит на клиенте , форма открывается на клиенте, НО в модуле формы существуют процедуры &НаСервере, которые будут выполняться на стороне 1С сервера.
Рекомендую все же подтянуть образование в части 1С программирования 8.3
---
Вы очень глубоко заблуждаетесь и вводите в заблуждение других

```1c
    Вы путаете понятия &НаСервере &НаКлиенте с реальными клиентами и серверами!
```

Это одно и тоже. В этом и суть!

```1c
    Файл лежит на клиенте , форма открывается на клиенте, НО в модуле формы существуют процедуры &НаСервере, которые будут выполняться на стороне 1С сервера.
```

Положите файл на свой клиентский комп, напишите обработку считывания файла (типа D:\МойФайл) в процедуре &НаСервере. И ОПА!, а его там нет, какое разочарование.

```1c
    При указании директивы &НаСервере выполнение кода будет происходить на сервере.
```
---
Это одно и тоже. В этом и суть!
Однако все запущено!

Где Открывается форма документа?
Надеюсь у вас не хватит смелости сказать На сервере!
Правильно - на клиенте...

И как выполнить в модуле этой формы код с запросом к базе данных?
вы можете без &НаСервере - значит вы чудесник!

Положите файл на свой клиентский комп, напишите обработку считывания файла (типа D:\МойФайл) в процедуре &НаСервере. И ОПА!, а его там нет, какое разочарование.
Покажите мне дурака, кто будет делать такое?
Во первых процедура с диалогом открытия файла выпоняется ТОЛКО &НаКлиенте, ибо нужна реакция живого пользователя.

А вот если у вас прописан в коде конкретный полный путь к файлу на сервере , то можно открыть и в процедуре &НаСервере

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

Давайте все же будем миролюбивы и постараемся разобраться в смысловых разногласиях.
(я все же надеюсь мы правильно понимаем суть , но неверно трактуем слова друг друга)
---
Специально для Вас, ибо вы видимо вообще заблудились, основа основ - клиент-серверный вариант работы 1с:
https://v8.1c.ru/overview/Term_000000033.htm
Ну и пару статеек от инфостарта:
https://infostart.ru/public/891857/
https://infostart.ru/public/682305/
---
Вышепредложенный способ - прост и нагляден.
Второй способ несколько перекликается с вашими наработками.
Но тоже требует Табличных частей в Объекте....
Вы заполняете эту же ТЧ из екселя, но без поиска номенклатуры в базе сразу.
Потом выгружаете в таблицу значений
ДанныеИзФайла = Объект.БазовыеЦены.Выгрузить(,);
И уже дальше так как вы делаете в (27)

Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФайла );
---
вот вы и уперлись в то о чем я говорил...
Ваша задача по человечески решается немного по другому...
В обработке Объект не должен быть документом а должен быть Обработкой и в Объект делаете Табличную часть БазовыеЦены.

Потом табличную часть БазовыеЦены вытаскиваете на форму и начинаете заполнять из файла.
И на каждом шаге добавления строки - ищете в базе номеклатуру и цену по артикулу и присваиваете нужным колонкам,
Все эти действия выполняются &НаСервере.
 Это просто...
То что вы сделали и пытаетесь домучить - не очень оптимально...
---
я не обработку делаю, а в форму документа добавляю
---
А может проще все же сделать обюработку и подключив ее добавить выполнение в виде кнопки ?
Если у вас типовая конфа, то менять формы - вообще почти криминал...
А внешняя обработка ничего не изменит в конфе...

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

ДанныеИзФайла = БазовыеЦены.Выгрузить(,);

Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФайла );
---
у сервере у меня почему-то недоступно.Доступно НаСервереБезКонтексте и выдает ошибку:
{Документ.УстановкаБазовыхЦен.Форма.ФормаДокумента.Форма(119,43)}: Переменная не определена (БазовыеЦены)
Запрос.УстановитьПараметр("ДанныеИзФайла",<<?>>БазовыеЦены.Выгрузить());
---
я тебе разве так написал, как ты пытаешься ?
Где
ДанныеИзФайла = БазовыеЦены.Выгрузить(,);
---
я сейчас уже запутался.сможешь на примере показать , как нужно сделать?)
---
у меня не толстый клиент
---
Покажи целиком твою процедуру с запросом , в который нужно установить параметр
---
полный код:

```1c
    &НаКлиенте
    Процедура ФайлДляЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";

    Если ДиалогВыбораФайла.Выбрать() Тогда

    Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда

    мНомерЕдиницыИзмерения = 0;
    КонецЕсли;

    ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;

    //ЗагрузитьСодержимоеExcel();
    Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда

    ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);

    Если ФайлНаДиске.Существует() Тогда

    Попытка

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    //вывод в таблицу значений

    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    ПЗ.ЗаполнитьНастройки();

    ПЗ.Выполнить();

    //БазовыеЦены = ПЗ.Результат.Выгрузить();

    тз_= ПЗ.Результат.Выгрузить();
    Для каждого СтрокаТЗ Из тз_ Цикл
    СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
    СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;

    КонецЦикла;
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Иначе
    Сообщить("Файл "" + ФайлДляЗагрузки + "" не существует!");
    КонецЕсли;

    КонецЕсли;

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

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

```1c
    &НаКлиенте
    Процедура ФайлДляЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";

    Если ДиалогВыбораФайла.Выбрать() Тогда

    Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда

    мНомерЕдиницыИзмерения = 0;
    КонецЕсли;

    ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;

    //ЗагрузитьСодержимоеExcel();
    Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда

    ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);

    Если ФайлНаДиске.Существует() Тогда

    Попытка

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    //вывод в таблицу значений

    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    ПЗ.ЗаполнитьНастройки();

    ПЗ.Выполнить();

    тз_= ПЗ.Результат.Выгрузить();
    Для каждого СтрокаТЗ Из тз_ Цикл
    СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
    СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;

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

    Иначе
    Сообщить("Файл "" + ФайлДляЗагрузки + "" не существует!");
    КонецЕсли;

    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры
```
---
Мне код ваш совершенно ни к чему....
У вашего Объекта есть ТаблицаЦен ? Вы явно его хотите заполнить в итоге...
Так вот и возникает вопрос - зачем вам тот реквизит формы ТаблицаЦен , который не является конечной целью?
Вы заполняете зачем-то дубль...
---
Вы же не пишете какой объект разрабатываете.
Даете какой-то огрызок информации, и по этой информации вам дают рекомендации...
Они порой могут быть совершенно бестолковыми... И все у вас начинает работать тоже бестолково...

Вы бы изначальную задачу описывали, поясняли как вы ее решаете и что не получается...
Вам бы давали советы и по глобальной методике и по путям ее исправления
---
да, с одним дополнением , выгруженную ТЗ нужно будет передать на сервер через хранилище
---
отрежь запрос и засунь его в отдельную процедуру и все...
а в конце

```1c
    ДанныеИзФ=ЭтаФорма.БазовыеЦены.Выгрузить()
    Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФ);
    Запрос.Выполнить();
    /// ну и все что ты там хочешь дальше....

    КонецПроцедуры
```
---
сделал так, как вы сказали. Как должна работать таблица значений в качестве параметра?
Запрос с таким параметром пустой
---
ТЗ работает как и любой параметр.
Если в ней нету ничего перед запросом, то и запрос ясно будет пустой.

"Чтобы что-то ненужное продать , нужно сначала что-то ненужное купить..." (кот Матроскин)

Если же на картинке именно ваша ТЗ, то запрос видимо так составили , что он возвращает Пустоту.
Ну смотрите сами чудес же не бывает!
Сначала в отладке Уберите все ГДЕ из запроса и посмотрите , что вернет

И Учитесь пользоваться отладкой - без нее вы никогда не станете никаким программистом.
В отладке всегда видно что, где и как.... Остается только немного подумать и станет ясно - Почему...
---
отладчиком конечно посмотрел. ТЗ заполнен
---
Уточнил запрос...
---
без условий тоже возвращает пустоту. видимо запрос нужно по нормальному переписать
---
Ну а дальше?
Вы что не можете выполнить запрос и проверить?

ВЫБРАТЬ
ДанныеИзФайла.*
Поместить ВТ_ТЗ
ИЗ
&ДанныеИзФайла КАК ДанныеИзФайла
---
Пришли запрос сюда
---
который без параметров , но пустой
---
```1c
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТаблицаДляПоиска.Ссылка КАК Номенклатура
    |ИЗ
    | ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
    | ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул";

    Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФ);
```
---
Вот запрос БЕЗ параметров, а то что вы пытаетесь запросить - ясно может давать пустоту...

```1c
    ВЫБРАТЬ
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла
    |;
    |
    |////////////////////////////////////////////////////////////­­////////////////////
    |ВЫБРАТЬ
    | ТаблицаДляПоиска.Ссылка КАК Номенклатура
    |ИЗ
    | ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ТаблицаДляПоиска
    | ПО ВТ_ДанныеИзФайла.Артикул = ТаблицаДляПоиска.Артикул
```
---
тоже возвращает пустое значение
---
Запрос изначально был таким

```1c
    ПолеНеограниченнойДлины = ПолеПоискаВТаблице = "НаименованиеНоменклатурыКонтрагента";

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

    Запрос.УстановитьПараметр("ДанныеИзФайла", ДанныеДляЗагрузки.Выгрузить( , "НомерСтроки, " + ПолеПоиска + ?(ПолеСвязиПоВладельцу <> ", ", " + ПолеСвязиПоВладельцу,")));

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

    Пока Выборка.Следующий() Цикл
```
---
```1c
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла";

    Запрос.УстановитьПараметр("ДанныеИзФайла",ДанныеИзФ);
```

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

А когда вы изначально наваяли скажем 3 км текста и потом пытаетесь понять почему оно не работает, то это непрофессионально!
---
почему этот запрос возвращает пустое значение?

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

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

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

```1c
    ВЫБРАТЬ
    | ДанныеИзФайла.Артикул
    |ПОМЕСТИТЬ ВТ_ДанныеИзФайла
    |ИЗ
    | &ДанныеИзФайла КАК ДанныеИзФайла
    |;
    |
    |////////////////////////////////////////////////////////////­­­­////////////////////
    |ВЫБРАТЬ
    | ДанныеИзФайла.Артикул КАК АртикулНоменклатуры
    |ИЗ
    | ВТ_ДанныеИзФайла КАК ВТ_ДанныеИзФайла
    |
```
---
смысл понял, но выдает ошибки. Даже этот запрос выдает ошибку
---
сделал так.Запрос возвращает только артикул из таблицы ТЗ

```1c
    Запрос.Текст="ВЫБРАТЬ
    | ТЗ.Артикул
    |ПОМЕСТИТЬ ТЗ
    |ИЗ
    | &ТЗ КАК ТЗ
    |;
    |
    |////////////////////////////////////////////////////////////­////////////////////
    |ВЫБРАТЬ
    | ТЗ.Артикул,
    | Номенклатура.Наименование
    |ИЗ
    | ТЗ КАК ТЗ
    | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
    | ПО ТЗ.Артикул = Номенклатура.Артикул";
```
---
понял почему возвращает пустое значение в (85) )) В таблице значений ДанныеИзФ В Артикуле имеются пробелы. чтобы убрать пробелы,нужно выгрузить эту колонку и убрать пробелы?
---
Спасибо YannikAlx!
В итоге получилось вот так:

```1c
    &НаСервере
    Процедура РаспознаваниеНоменклатуры()

    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    ДиалогВыбораФайла.Заголовок = "Прочитать табличный документ из файла";
    ДиалогВыбораФайла.Фильтр = "Лист Excel (*.xls; *.xlsx)|*.xls; *.xlsx|";

    Если ДиалогВыбораФайла.Выбрать() Тогда

    Если ФайлДляЗагрузки <> ДиалогВыбораФайла.ПолноеИмяФайла Тогда

    мНомерЕдиницыИзмерения = 0;
    КонецЕсли;

    ФайлДляЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;

    Если ЗначениеЗаполнено(ФайлДляЗагрузки) Тогда

    ФайлНаДиске = Новый Файл(ФайлДляЗагрузки);

    КонецЕсли;

    КонецЕсли;

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабличныйДокумент.Прочитать(ФайлДляЗагрузки, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    ПЗ = Новый ПостроительЗапроса;

    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());

    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

    ПЗ.ЗаполнитьНастройки();

    ПЗ.Выполнить();

    ТЗ1= ПЗ.Результат.Выгрузить();
    тз_=Новый ТаблицаЗначений;
    тз_.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(80)));
    тз_.Колонки.Добавить("БазоваяЦена", Новый ОписаниеТипов("Число"));
    тз_.Колонки.Добавить("АктуальнаяЦена", Новый ОписаниеТипов("Число"));

    Для Каждого Стр Из ТЗ1 Цикл
    ЗаполнитьЗначенияСвойств(тз_.Добавить(), Стр);

    КонецЦикла;

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

    Для каждого СтрокаТЗ Из РезультатЗапроса Цикл
    СтрокаТЗ_БазовыеЦены = БазовыеЦены .Добавить();
    ЗаполнитьЗначенияСвойств(СтрокаТЗ_БазовыеЦены , СтрокаТЗ );
    СтрокаТЗ_БазовыеЦены.Цена=СтрокаТЗ.БазоваяЦена;
    СтрокаТЗ_БазовыеЦены.Номенклатура=СтрокаТЗ.Ссылка;
    КонецЦикла;
```

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

Помнишь я тебе предлагал сделать не по "продвинутому" а по простому - при каждом добавлении строки в таблицу значений на форме искать в Номенклатуре по артикулу?
Попробуй так, может у тебя лучше так получится...
---
да, имеются пробелы). Как лучше убрать эти пробелы?)
Сможете показать на примере, как сделать по простому?)
---
Пытайся как угодно - это элементарная задача....
Способов несколько...
Ну ведь ты же должен хоть что-то элементарное сам делать?
Или полностью надеешься только на сайт? ;-)
---
сам то сделаю. но хочу узнать как лучше сделать
---
как сам сделаешь - так и лучше!
главное чтоб работало...
---
выгрузил результат запроса в таблицу значений. Как передать результат запроса на клиент?
---
На клиенте нужны только ожидалки реакций пользователя... Ибо форма перед ним.
А все действия проще делать на сервере...
---
Вы вообще умеете пользоваться поиском или только спрашивать?
https://yandex.ru/yandsearch?&clid=2186620&text=1%D1%81%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%­D0%B0%D1%87%D0%B0%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%­8B%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D1%­81%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20%D0%BD%D0%­B0%20%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82&lr=10719
---
поисковиком да, но там через дополнительные функции делают
---
вы сначала должны четко представлять - а вам оно вообще надо тащить на клиент что-то?
---
Вот только зачем на клиент передавать его?
Не проще все делать на сервере?
Ну в смысле те , которые связаны с информацией из базы данных...
---
я делаю в процедуре выбора файла Excel, а там доступны только НаКлиенте и НаСервереБезКонтекста. Для этого не создавать же кнопку,при нажатии на которой будет заполняться таблица?
---
стандартная схема

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

    &НаСервере
    Процедура ЗаполнитьНаСервере()
    // И тут-то и происходят все твои действия по заполнению и тп и тд.....
    //Типа
    ЭтаФорма.БазовыеЦены.Очистить(); // ну очищать конечно не надо , это я пошутил.....
    КонецПроцедуры
```

Ты заполняешь свою таблицу значений на клиенте, а потом делаешь с ней что угодно &НаСервере...
ЭтаФорма.БазовыеЦены