---
title: 3. Загрузка данных в табличную часть
slug: общие-загрузка-данных-из-файла/3-загрузка-данных-в-табличную-часть
---

Полезное:
[Консоль кода](/common/konsol-koda-is.epf)
[Фрагменты кода](/bsp-zagruzka-iz-faila/fragmenty-koda.json)

Подсистема "Загрузка данных из файла" также поддерживает загрузку в табличные части документов и справочников. Для этого нужно:

# Создать макет

Макет создается на уровне объекта и должен обязательно иметь имя, созданное по шаблону **ЗагрузкаИзФайла<ИмяТабличнойЧасти>**. 
> Если табличная часть одна, допускается именовать макет просто **"ЗагрузкаИзФайла"**
> 
В нем настраиваем вид шапки таблицы **именя ячеек которой должны соответствовать именам реквизитов нужной табличной части**. 

![Изображение](/bsp-zagruzka-iz-faila/5.png)

Если имя ячейки характеризует реквизит целевого реквизита (например `Номенклатура.Артикул`), то также нужно запонять **параметры расшифровки**. Например, для `Номенклатура.Артикул` имя ячейки - `Артикул`, а параметр расшифровки - `Номенклатура`

![Изображение](/bsp-zagruzka-iz-faila/20.png)

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Подробнее</summary>

Если в макете есть колонки, которые являются реквизитами какой-то колонки целевой **табличной части**, то нужно для ячеек указывать **параметры расшифровки**. Например, есть макет с именами колонок:
- **Артикул**
- **Наименование**
- ...
- ...

По которым мы пытаемся подобрать значение реквизита ТЧ `Номенклатура`:

```bsl
СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");

Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт

...

Если СтрокаНоменклатуры <> Неопределено Тогда
            
    Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда
        СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура;

    // ТУТ ПОЯВИЛАСЬ НЕДОНОЗНАЧНОСТЬ
    ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда
        СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
        СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
        СтрокаНеоднозначности.Колонка = "Номенклатура"; // ИМЯ КОЛОНКИ ТАБЛИЧНОЙ ЧАСТИ, НЕ ТАБ.ДОК
    КонецЕсли;

КонецЕсли;

...

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

```

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

Если не указать параметры расшифровки для колонок, то при попытке считать их из аргумента `ЗагружаемыеЗначенияСтрока` будет сыпаться ошибка.

```bsl
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт

...

Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
    ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование";
    Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование);
КонецЕсли;
        
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда
    Если ПустаяСтрока(ТекстГде) Тогда
        ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул";
    Иначе
        ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул";
    КонецЕсли;
            
    Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул);
КонецЕсли;

...

```
</details>

# Создать команду на форме

В командной панели нужной ТЧ создаем команду `ЗагрузитьТоварыИзФайла` (имя произвольное), в обработчике которой реализуем заполнение служебной структуры, полученной с помощью метода `ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных` и вызываем непосредственное открытие формы загрузки методом `ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки`.

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>

```bsl
&НаКлиенте
Процедура ЗагрузитьТоварыИзФайла(Команда)
    
    
    ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
    ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПриходнаяНакладная.Товары";
    ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка списка товаров из файла'");

    // Любые параметры, которые могут понадобиться дальше при 
    // выполнении метода, указанного в описании оповещения
    ДополнительныеПараметры = Новый Структура();
    ДополнительныеПараметры.Вставить("Контрагент", Объект.Контрагент);
    ДополнительныеПараметры.Вставить("Организация", Объект.Организация);
    
    ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;

    Оповещение = Новый ОписаниеОповещения("ЗагрузитьТоварыИзФайлаЗавершение", ЭтотОбъект);
    ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);

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

// Выполняем после завершения работы в стандартной форме загрузки из файла
&НаКлиенте
Процедура ЗагрузитьТоварыИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
    
    Если АдресЗагруженныхДанных = Неопределено Тогда 
        Возврат;
    КонецЕсли;
    
    // АдресЗагруженныхДанных - адрес ВХ подготовленной ТЗ с загруженными данными
    ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных);
    
КонецПроцедуры

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

```

 </details>

# В модуле менеджера реализовать методы программного интерфейса

## Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ

Аналогично процедуре `ОпределитьПараметрыЗагрузкиДанныхИзФайла` (см. статью `2. Настраиваемые алгоритмы загрузки в справочники`). Может быть пустой

```bsl
// Переопределяет параметры загрузки данных из файла.
//
// Параметры:
//  Параметры - Структура:
//   * ИмяМакетаСШаблоном - Строка - наименование макета. Например, "ЗагрузкаИзФайла".
//   * ИмяТабличнойЧасти - Строка - полное имя табличной части. Например, "Документ._ДемоСчетНаОплатуПокупателю.ТабличнаяЧасть.Товары"
//   * ОбязательныеКолонки - Массив из Строка - наименования обязательных для заполнения колонок.
//   * ТипДанныхКолонки - Соответствие из КлючИЗначение:
//      * Ключ - Строка - имя колонки;
//      * Значение - ОписаниеТипов - тип колонки загружаемых данных.
//   * ДополнительныеПараметры - Структура
//
Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ(Параметры) Экспорт
    
КонецПроцедуры
```

## Процедура СопоставитьЗагружаемыеДанные

В этой процедуре необходимо заполнить таблицу, находящуюся по адресу `АдресТаблицыСопоставления`

```bsl
//   АдресЗагружаемыхДанных    - Строка - адрес временного хранилища с таблицей значений, в которой
//                                        находятся загруженные данные из файла. Состав колонок:
//     * Идентификатор - Число - порядковый номер строки.
//       Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла.
//   АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
//                                        являющейся копией табличной части документа, 
//                                        которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
//   СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений:
//     * Колонка       - Строка - имя колонки, в которой была обнаружена неоднозначность.
//     * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность.
//   ПолноеИмяТабличнойЧасти   - Строка - полное имя табличной части, в которую загружаются данные.
//   ДополнительныеПараметры   - Произвольный - любые дополнительные сведения.
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
```

|Аргумент|Описание|
|-|-|
|`АдресЗагружаемыхДанных`|По этому адресу расположена таблица значений, заполненная на основании введенных пользователем данных в форме обработки|
|`АдресТаблицыСопоставления`|По этому адресу расположена копия табличной части документа/справочника, которую необходимо заполнить|
|`СписокНеоднозначностей`|Таблица, в которую записываются идентификаторы строк ТЧ, для которых не удалось однозначно определить сопоставляемые данные|

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>

```bsl
//   АдресЗагружаемыхДанных    - Строка - адрес временного хранилища с таблицей значений, в которой
//                                        находятся загруженные данные из файла. Состав колонок:
//     * Идентификатор - Число - порядковый номер строки.
//       Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла.
//   АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
//                                        являющейся копией табличной части документа,
//                                        которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
//   СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений:
//     * Колонка       - Строка - имя колонки, в которой была обнаружена неоднозначность.
//     * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность.
//   ПолноеИмяТабличнойЧасти   - Строка - полное имя табличной части, в которую загружаются данные.
//   ДополнительныеПараметры   - Произвольный - любые дополнительные сведения.
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт


    ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных);
    ТабличнаяЧасть = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления);

    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВЫРАЗИТЬ(ДанныеДляСопоставления.Артикул КАК СТРОКА(50)) КАК Артикул,
    |	ВЫРАЗИТЬ(ДанныеДляСопоставления.ЕдиницаИзмерения КАК СТРОКА(30)) КАК ЕдиницаИзмерения,
    |	ВЫРАЗИТЬ(ДанныеДляСопоставления.Номенклатура КАК СТРОКА(300)) КАК Номенклатура,
    |	ДанныеДляСопоставления.Идентификатор КАК Идентификатор
    |ПОМЕСТИТЬ ВТДанныеДляСопоставления
    |ИЗ
    |	&ЗагружаемыеДанные КАК ДанныеДляСопоставления
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	СправочникНоменклатура.Ссылка КАК Номенклатура,
    |	СправочникНоменклатура.Артикул КАК Артикул,
    |	ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор
    |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоАртикулу
    |ИЗ
    |	ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |		ПО ВТДанныеДляСопоставления.Артикул = СправочникНоменклатура.Артикул
    |			И (ВТДанныеДляСопоставления.Артикул <> """")
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТДанныеДляСопоставления.Номенклатура КАК Номенклатура,
    |	ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор
    |ПОМЕСТИТЬ ВТДанныеДляСопоставленияПоНаименованию
    |ИЗ
    |	ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
    |		ЛЕВОЕ СОЕДИНЕНИЕ ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу
    |		ПО ВТДанныеДляСопоставления.Идентификатор = ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор
    |ГДЕ
    |	ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор ЕСТЬ NULL
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	СправочникНоменклатура.Ссылка КАК Номенклатура,
    |	ВТДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор
    |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоНаименованию
    |ИЗ
    |	ВТДанныеДляСопоставленияПоНаименованию КАК ВТДанныеДляСопоставленияПоНаименованию
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |		ПО ВТДанныеДляСопоставленияПоНаименованию.Номенклатура = СправочникНоменклатура.Наименование
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	МАКСИМУМ(СопоставленнаяНоменклатура.Номенклатура) КАК Номенклатура,
    |	СопоставленнаяНоменклатура.Идентификатор КАК Идентификатор,
    |	СУММА(СопоставленнаяНоменклатура.КоличествоСтрок) КАК КоличествоСтрок
    |ИЗ
    |	(ВЫБРАТЬ
    |		ВТСопоставленнаяНоменклатураПоАртикулу.Номенклатура КАК Номенклатура,
    |		ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор КАК Идентификатор,
    |		1 КАК КоличествоСтрок
    |	ИЗ
    |		ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу
    |	
    |	ОБЪЕДИНИТЬ ВСЕ
    |	
    |	ВЫБРАТЬ
    |		ВТСопоставленнаяНоменклатураПоНаименованию.Номенклатура,
    |		ВТСопоставленнаяНоменклатураПоНаименованию.Идентификатор,
    |		1
    |	ИЗ
    |		ВТСопоставленнаяНоменклатураПоНаименованию КАК ВТСопоставленнаяНоменклатураПоНаименованию) КАК СопоставленнаяНоменклатура
    |
    |СГРУППИРОВАТЬ ПО
    |	СопоставленнаяНоменклатура.Идентификатор
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор,
    |	КОЛИЧЕСТВО(ВТДанныеДляСопоставления.ЕдиницаИзмерения) КАК КоличествоСтрок,
    |	МАКСИМУМ(УпаковкиЕдиницыИзмерения.Ссылка) КАК ЕдиницаИзмерения
    |ИЗ
    |	ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
    |		ПО ВТДанныеДляСопоставления.ЕдиницаИзмерения = УпаковкиЕдиницыИзмерения.Наименование
    |
    |СГРУППИРОВАТЬ ПО
    |	ВТДанныеДляСопоставления.Идентификатор";
    
    Запрос.УстановитьПараметр("ЗагружаемыеДанные", ЗагружаемыеДанные);
    
    РезультатыЗапроса = Запрос.ВыполнитьПакет();
    
    ТаблицаНоменклатуры = РезультатыЗапроса.Получить(4).Выгрузить();
    ТаблицаЕдиницИзмерения = РезультатыЗапроса.Получить(5).Выгрузить();
    
    Для Каждого СтрокаЗагружаемыхДанных Из ЗагружаемыеДанные Цикл
        
        СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить();
        СтрокаТабличнойЧасти.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
        СтрокаТабличнойЧасти.Цена = СтрокаЗагружаемыхДанных.Цена;
        
        СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");
        
        Если СтрокаНоменклатуры <> Неопределено Тогда
            
            Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда
                СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура;
            ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда
                СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
                СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
                
                // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК
                СтрокаНеоднозначности.Колонка = "Номенклатура";
            КонецЕсли;
            
        КонецЕсли;
        
        СтрокаЕдиницыИзмерения = ТаблицаЕдиницИзмерения.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор");
        
        Если СтрокаЕдиницыИзмерения <> Неопределено Тогда
            
            Если СтрокаЕдиницыИзмерения.КоличествоСтрок = 1 Тогда
                СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтрокаЕдиницыИзмерения.ЕдиницаИзмерения;
            ИначеЕсли СтрокаЕдиницыИзмерения.КоличествоСтрок > 1 Тогда
                СтрокаНеоднозначности = СписокНеоднозначностей.Добавить();
                СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор;
                
                // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК
                СтрокаНеоднозначности.Колонка = "ЕдиницаИзмерения";
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    ПоместитьВоВременноеХранилище(ТабличнаяЧасть, АдресТаблицыСопоставления);
    
КонецПроцедуры
```

</details>

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример реализации из БСП</summary>
  
 ```bsl
 Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
    
    
    Товары = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); // ТаблицаЗначений
    ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); // ТаблицаЗначений
    
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ВЫРАЗИТЬ(ДанныеДляСопоставления.Штрихкод КАК СТРОКА(13)) КАК Штрихкод,
        |	ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
        |	ДанныеДляСопоставления.Идентификатор КАК Идентификатор
        |ПОМЕСТИТЬ ДанныеДляСопоставления
        |ИЗ
        |	&ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |	_ДемоНоменклатура.Ссылка КАК Ссылка,
        |	_ДемоНоменклатура.Штрихкод КАК Штрихкод,
        |	ДанныеДляСопоставления.Идентификатор КАК Идентификатор
        |ПОМЕСТИТЬ СопоставленнаяНоменклатураПоШтрихкоду
        |ИЗ
        |	ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
        |		ПО (_ДемоНоменклатура.Штрихкод = ДанныеДляСопоставления.Штрихкод)
        |			И (ДанныеДляСопоставления.Штрихкод <> """")
        |
        |ИНДЕКСИРОВАТЬ ПО
        |	Идентификатор
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |	ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
        |	ДанныеДляСопоставления.Идентификатор КАК Идентификатор
        |ПОМЕСТИТЬ ДанныеДляСопоставленияПоНаименованию
        |ИЗ
        |	ДанныеДляСопоставления КАК ДанныеДляСопоставления
        |		ЛЕВОЕ СОЕДИНЕНИЕ СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
        |		ПО ДанныеДляСопоставления.Идентификатор = СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор
        |ГДЕ СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор ЕСТЬ NULL
        |
        |ИНДЕКСИРОВАТЬ ПО
        |	Идентификатор
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |	МАКСИМУМ(_ДемоНоменклатура.Ссылка) КАК Ссылка,
        |	ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор,
        |	КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество
        |ИЗ
        |	ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию
        |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
        |		ПО (_ДемоНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500))))
        |
        |СГРУППИРОВАТЬ ПО
        |	ДанныеДляСопоставленияПоНаименованию.Идентификатор
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |	МАКСИМУМ(СопоставленнаяНоменклатураПоШтрихкоду.Ссылка),
        |	СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
        |	КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор)
        |ИЗ
        |	СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
        |
        |СГРУППИРОВАТЬ ПО
        |	СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор";

    Запрос.УстановитьПараметр("ДанныеДляСопоставления", ЗагружаемыеДанные);
    РезультатыЗапросов = Запрос.ВыполнитьПакет(); // Массив из РезультатЗапроса
    
    ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить(); // ТаблицаЗначений
    ФункциональнаяОпцияХарактеристика = ?(ЗагружаемыеДанные.Колонки.Найти("Характеристика") <> Неопределено, Истина, Ложь);
    Для каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл
        
        Товар = Товары.Добавить();
        Товар.Идентификатор = СтрокаТаблицы.Идентификатор;
        Товар.Количество = СтрокаТаблицы.Количество;
        Товар.Цена = СтрокаТаблицы.Цена;
        
        СтрокаНоменклатура = ТаблицаНоменклатура.Найти(СтрокаТаблицы.Идентификатор, "Идентификатор");
        Если СтрокаНоменклатура <> Неопределено Тогда 
            Если СтрокаНоменклатура.Количество = 1 Тогда 
                Товар.Номенклатура = СтрокаНоменклатура.Ссылка; 
                Если ФункциональнаяОпцияХарактеристика Тогда
                    Товар.Характеристика = Справочники._ДемоХарактеристики.НайтиПоНаименованию(СтрокаТаблицы.Характеристика, 
                        Истина,, Товар.Номенклатура);
                КонецЕсли;
            ИначеЕсли СтрокаНоменклатура.Количество > 1 Тогда
                ЗаписьОНеоднозначности = СписокНеоднозначностей.Добавить();
                ЗаписьОНеоднозначности.Идентификатор = СтрокаТаблицы.Идентификатор;
                ЗаписьОНеоднозначности.Колонка = "Номенклатура";
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    ПоместитьВоВременноеХранилище(Товары, АдресТаблицыСопоставления);
    
КонецПроцедуры
 ```

 </details>


## ЗаполнитьСписокНеоднозначностей

```bsl
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
// 
// Параметры:
//   ПолноеИмяТабличнойЧасти   - Строка - полное имя табличной части, в которую загружаются данные.
//   СписокНеоднозначностей    - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
//   ИмяКолонки                - Строка - имя колонки, в который возникла неоднозначность.
//   ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
//   ДополнительныеПараметры   - Произвольный - любые дополнительные сведения.
//
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт

```

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример реализации</summary>

```bsl

// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
// 
// Параметры:
//   ПолноеИмяТабличнойЧасти   - Строка - полное имя табличной части, в которую загружаются данные.
//   СписокНеоднозначностей    - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
//   ИмяКолонки                - Строка - имя колонки <ТАБЛИЧНОЙ ЧАСТИ>, в который возникла неоднозначность.
//   ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
//   ДополнительныеПараметры   - Произвольный - любые дополнительные сведения.
//
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт

    // ВАЖНО
    // В ЗагружаемыеЗначенияСтрока попадают только значения, где Имя или ПараметрРасшифровки = ИмяКолонки

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

```

</details>

<details style="margin: 1em 0; padding: 0.5em; border: 1px solid #ccc; border-radius: 6px;">
<summary style="font-weight: bold; cursor: pointer;">Пример реализации из БСП</summary>

```bsl
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
// 
// Параметры:
//   ПолноеИмяТабличнойЧасти   - Строка - полное имя табличной части, в которую загружаются данные.
//   СписокНеоднозначностей    - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
//   ИмяКолонки                - Строка - имя колонки, в который возникла неоднозначность.
//   ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
//   ДополнительныеПараметры   - Произвольный - любые дополнительные сведения.
//
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
    
    Если ИмяКолонки = "Номенклатура" Тогда
        Запрос = Новый Запрос;
        
        ТекстГде = "";
        Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
            ТекстГде = "ГДЕ _ДемоНоменклатура.Наименование = &Наименование";
            Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Номенклатура);
        КонецЕсли;
            
        Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Штрихкод) Тогда
            Если ЗначениеЗаполнено(ТекстГде) Тогда
                ТекстГде = ТекстГде + " ИЛИ _ДемоНоменклатура.Штрихкод = &Штрихкод";
            Иначе
                ТекстГде = "ГДЕ _ДемоНоменклатура.Штрихкод = &Штрихкод";
            КонецЕсли;
            Запрос.УстановитьПараметр("Штрихкод", ЗагружаемыеЗначенияСтрока.Штрихкод);
        КонецЕсли;
        
        Запрос.Текст = "ВЫБРАТЬ
            |	_ДемоНоменклатура.Ссылка
            |ИЗ
            |	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура " + ТекстГде;
        
        РезультатЗапроса = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

```

 </details>