---
title: 3. Загрузка данных в табличную часть
slug: общие-бсп-стандартные-подсистемы-загрузка-данных-из-файла/3-загрузка-данных-в-табличную-часть
---
Полезное:
[Консоль кода](/common/konsol-koda-is.epf)
[Фрагменты кода](/bsp-zagruzka-iz-faila/fragmenty-koda.json)
Подсистема "Загрузка данных из файла" также поддерживает загрузку в табличные части документов и справочников. Для этого нужно:
# Создать макет
Макет создается на уровне объекта и должен обязательно иметь имя, созданное по шаблону **ЗагрузкаИзФайла<ИмяТабличнойЧасти>**. В нем настраиваем вид шапки таблицы **именя ячеек которой должны соответствовать именам реквизитов нужной табличной части**.
>Если табличная часть одна, допускается именовать макет просто **"ЗагрузкаИзФайла"**

# Создать команду на форме
В командной панели нужной ТЧ создаем команду `ЗагрузитьТоварыИзФайла` (имя произвольное), в обработчике которой реализуем заполнение служебной структуры, полученной с помощью метода `ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных` и вызываем непосредственное открытие формы загрузки методом `ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки`.
Пример реализации
```bsl
&НаКлиенте
Процедура ЗагрузитьТоварыИзФайла(Команда)
ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных();
ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПриходнаяНакладная.Товары";
ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка списка товаров из файла'");
// Любые параметры, которые могут понадобиться дальше при
// выполнении метода, указанного в описании оповещения
ДополнительныеПараметры = Новый Структура();
ДополнительныеПараметры.Вставить("Контрагент", Объект.Контрагент);
ДополнительныеПараметры.Вставить("Организация", Объект.Организация);
ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры;
Оповещение = Новый ОписаниеОповещения("ЗагрузитьТоварыИзФайлаЗавершение", ЭтотОбъект);
ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение);
КонецПроцедуры
// Выполняем после завершения работы в стандартной форме загрузки из файла
&НаКлиенте
Процедура ЗагрузитьТоварыИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если АдресЗагруженныхДанных = Неопределено Тогда
Возврат;
КонецЕсли;
// АдресЗагруженныхДанных - адрес ВХ подготовленной ТЗ с загруженными данными
ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных)
ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных);
ТоварыДобавлены = Ложь;
Для каждого СтрокаТаблицы Из ЗагруженныеДанные Цикл
Если Не ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда
Продолжить;
КонецЕсли;
СтрокаТовары = Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрокаТаблицы);
ТоварыДобавлены = Истина;
КонецЦикла;
Если ТоварыДобавлены Тогда
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
```
# В модуле менеджера реализовать методы программного интерфейса
## Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ
Аналогично процедуре `ОпределитьПараметрыЗагрузкиДанныхИзФайла` (см. статью `2. Настраиваемые алгоритмы загрузки в справочники`). Может быть пустой
```bsl
// Переопределяет параметры загрузки данных из файла.
//
// Параметры:
// Параметры - Структура:
// * ИмяМакетаСШаблоном - Строка - наименование макета. Например, "ЗагрузкаИзФайла".
// * ИмяТабличнойЧасти - Строка - полное имя табличной части. Например, "Документ._ДемоСчетНаОплатуПокупателю.ТабличнаяЧасть.Товары"
// * ОбязательныеКолонки - Массив из Строка - наименования обязательных для заполнения колонок.
// * ТипДанныхКолонки - Соответствие из КлючИЗначение:
// * Ключ - Строка - имя колонки;
// * Значение - ОписаниеТипов - тип колонки загружаемых данных.
// * ДополнительныеПараметры - Структура
//
Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ(Параметры) Экспорт
КонецПроцедуры
```
## Процедура СопоставитьЗагружаемыеДанные
В этой процедуре необходимо заполнить таблицу, находящуюся по адресу `АдресТаблицыСопоставления`
```bsl
// АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой
// находятся загруженные данные из файла. Состав колонок:
// * Идентификатор - Число - порядковый номер строки.
// Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла.
// АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений,
// являющейся копией табличной части документа,
// которую необходимо заполнить из таблицы АдресЗагружаемыхДанных.
// СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений:
// * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность.
// * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность.
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
```
|Аргумент|Описание|
|-|-|
|`АдресЗагружаемыхДанных`|По этому адресу расположена таблица значений, заполненная на основании введенных пользователем данных в форме обработки|
|`АдресТаблицыСопоставления`|По этому адресу расположена копия табличной части документа/справочника, которую необходимо заполнить|
|`СписокНеоднозначностей`|Таблица, в которую записываются идентификаторы строк ТЧ, для которых не удалось однозначно определить сопоставляемые данные|
Пример реализации
```bsl
Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт
Товары = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); // ТаблицаЗначений
ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); // ТаблицаЗначений
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ДанныеДляСопоставления.Штрихкод КАК СТРОКА(13)) КАК Штрихкод,
| ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|ПОМЕСТИТЬ ДанныеДляСопоставления
|ИЗ
| &ДанныеДляСопоставления КАК ДанныеДляСопоставления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| _ДемоНоменклатура.Ссылка КАК Ссылка,
| _ДемоНоменклатура.Штрихкод КАК Штрихкод,
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|ПОМЕСТИТЬ СопоставленнаяНоменклатураПоШтрихкоду
|ИЗ
| ДанныеДляСопоставления КАК ДанныеДляСопоставления
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
| ПО (_ДемоНоменклатура.Штрихкод = ДанныеДляСопоставления.Штрихкод)
| И (ДанныеДляСопоставления.Штрихкод <> """")
|
|ИНДЕКСИРОВАТЬ ПО
| Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеДляСопоставления.Номенклатура КАК Номенклатура,
| ДанныеДляСопоставления.Идентификатор КАК Идентификатор
|ПОМЕСТИТЬ ДанныеДляСопоставленияПоНаименованию
|ИЗ
| ДанныеДляСопоставления КАК ДанныеДляСопоставления
| ЛЕВОЕ СОЕДИНЕНИЕ СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
| ПО ДанныеДляСопоставления.Идентификатор = СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор
|ГДЕ СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор ЕСТЬ NULL
|
|ИНДЕКСИРОВАТЬ ПО
| Идентификатор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МАКСИМУМ(_ДемоНоменклатура.Ссылка) КАК Ссылка,
| ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор,
| КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество
|ИЗ
| ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
| ПО (_ДемоНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500))))
|
|СГРУППИРОВАТЬ ПО
| ДанныеДляСопоставленияПоНаименованию.Идентификатор
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| МАКСИМУМ(СопоставленнаяНоменклатураПоШтрихкоду.Ссылка),
| СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор,
| КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор)
|ИЗ
| СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду
|
|СГРУППИРОВАТЬ ПО
| СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор";
Запрос.УстановитьПараметр("ДанныеДляСопоставления", ЗагружаемыеДанные);
РезультатыЗапросов = Запрос.ВыполнитьПакет(); // Массив из РезультатЗапроса
ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить(); // ТаблицаЗначений
ФункциональнаяОпцияХарактеристика = ?(ЗагружаемыеДанные.Колонки.Найти("Характеристика") <> Неопределено, Истина, Ложь);
Для каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл
Товар = Товары.Добавить();
Товар.Идентификатор = СтрокаТаблицы.Идентификатор;
Товар.Количество = СтрокаТаблицы.Количество;
Товар.Цена = СтрокаТаблицы.Цена;
СтрокаНоменклатура = ТаблицаНоменклатура.Найти(СтрокаТаблицы.Идентификатор, "Идентификатор");
Если СтрокаНоменклатура <> Неопределено Тогда
Если СтрокаНоменклатура.Количество = 1 Тогда
Товар.Номенклатура = СтрокаНоменклатура.Ссылка;
Если ФункциональнаяОпцияХарактеристика Тогда
Товар.Характеристика = Справочники._ДемоХарактеристики.НайтиПоНаименованию(СтрокаТаблицы.Характеристика,
Истина,, Товар.Номенклатура);
КонецЕсли;
ИначеЕсли СтрокаНоменклатура.Количество > 1 Тогда
ЗаписьОНеоднозначности = СписокНеоднозначностей.Добавить();
ЗаписьОНеоднозначности.Идентификатор = СтрокаТаблицы.Идентификатор;
ЗаписьОНеоднозначности.Колонка = "Номенклатура";
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПоместитьВоВременноеХранилище(Товары, АдресТаблицыСопоставления);
КонецПроцедуры
```
## ЗаполнитьСписокНеоднозначностей
```bsl
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
//
// Параметры:
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
// ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность.
// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
//
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
```
Пример реализации
// Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки.
//
// Параметры:
// ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные.
// СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными.
// ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность.
// ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность.
// ДополнительныеПараметры - Произвольный - любые дополнительные сведения.
//
Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт
Если ИмяКолонки = "Номенклатура" Тогда
Запрос = Новый Запрос;
ТекстГде = "";
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда
ТекстГде = "ГДЕ _ДемоНоменклатура.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Номенклатура);
КонецЕсли;
Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Штрихкод) Тогда
Если ЗначениеЗаполнено(ТекстГде) Тогда
ТекстГде = ТекстГде + " ИЛИ _ДемоНоменклатура.Штрихкод = &Штрихкод";
Иначе
ТекстГде = "ГДЕ _ДемоНоменклатура.Штрихкод = &Штрихкод";
КонецЕсли;
Запрос.УстановитьПараметр("Штрихкод", ЗагружаемыеЗначенияСтрока.Штрихкод);
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ
| _ДемоНоменклатура.Ссылка
|ИЗ
| Справочник._ДемоНоменклатура КАК _ДемоНоменклатура " + ТекстГде;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры