Skip to content

3. Загрузка данных в табличную часть

Полезное: Консоль кода Фрагменты кода

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

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

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

Если табличная часть одна, допускается именовать макет просто “ЗагрузкаИзФайла”

В нем настраиваем вид шапки таблицы именя ячеек которой должны соответствовать именам реквизитов нужной табличной части.

Изображение

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

Изображение

Подробнее

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

  • Артикул
  • Наименование

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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