--- title: 3. Загрузка данных в табличную часть slug: общие-бсп-стандартные-подсистемы-загрузка-данных-из-файла/3-загрузка-данных-в-табличную-часть --- Полезное: [Консоль кода](/common/konsol-koda-is.epf) [Фрагменты кода](/bsp-zagruzka-iz-faila/fragmenty-koda.json) Подсистема "Загрузка данных из файла" также поддерживает загрузку в табличные части документов и справочников. Для этого нужно: # Создать макет Макет создается на уровне объекта и должен обязательно иметь имя, созданное по шаблону **ЗагрузкаИзФайла<ИмяТабличнойЧасти>**. В нем настраиваем вид шапки таблицы **именя ячеек которой должны соответствовать именам реквизитов нужной табличной части**. ## ВАЖНО ![Изображение](/bsp-zagruzka-iz-faila/11.png) Если в макете есть колонки, которые являются реквизитами какой-то колонки целевой **табличной части**, то нужно для ячеек указывать **параметры расшифровки**. Например, есть макет с именами колонок: - **Артикул** - **Наименование** - ... - ... По которым мы пытаемся подобрать значение реквизита ТЧ `Номенклатура`: ```bsl СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт ... Если СтрокаНоменклатуры <> Неопределено Тогда Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура; // ТУТ ПОЯВИЛАСЬ НЕДОНОЗНАЧНОСТЬ ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; СтрокаНеоднозначности.Колонка = "Номенклатура"; // ИМЯ КОЛОНКИ ТАБЛИЧНОЙ ЧАСТИ, НЕ ТАБ.ДОК КонецЕсли; КонецЕсли; ... КонецПроцедуры ``` Для того, чтобы в аргументе `ЗагружаемыеЗначенияСтрока` процедуры `ЗаполнитьСписокНеоднозначностей` были добавлены значения колонок `Артикул` и `Наименование` таб.док нужно для них указать расшифровку, что эти колонки относятся именно к номенклатуре. Если не указать параметры расшифровки для колонок, то при попытке считать их из аргумента `ЗагружаемыеЗначенияСтрока` будет сыпаться ошибка. ```bsl Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт ... Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование); КонецЕсли; Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда Если ПустаяСтрока(ТекстГде) Тогда ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул"; Иначе ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул"; КонецЕсли; Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул); КонецЕсли; ... ``` >Если табличная часть одна, допускается именовать макет просто **"ЗагрузкаИзФайла"** ![Изображение](/bsp-zagruzka-iz-faila/5.png) # Создать команду на форме В командной панели нужной ТЧ создаем команду `ЗагрузитьТоварыИзФайла` (имя произвольное), в обработчике которой реализуем заполнение служебной структуры, полученной с помощью метода `ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных` и вызываем непосредственное открытие формы загрузки методом `ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки`.
Пример реализации ```bsl &НаКлиенте Процедура ЗагрузитьТоварыИзФайла(Команда) ПараметрыЗагрузки = ЗагрузкаДанныхИзФайлаКлиент.ПараметрыЗагрузкиДанных(); ПараметрыЗагрузки.ПолноеИмяТабличнойЧасти = "ПриходнаяНакладная.Товары"; ПараметрыЗагрузки.Заголовок = НСтр("ru = 'Загрузка списка товаров из файла'"); // Любые параметры, которые могут понадобиться дальше при // выполнении метода, указанного в описании оповещения ДополнительныеПараметры = Новый Структура(); ДополнительныеПараметры.Вставить("Контрагент", Объект.Контрагент); ДополнительныеПараметры.Вставить("Организация", Объект.Организация); ПараметрыЗагрузки.ДополнительныеПараметры = ДополнительныеПараметры; Оповещение = Новый ОписаниеОповещения("ЗагрузитьТоварыИзФайлаЗавершение", ЭтотОбъект); ЗагрузкаДанныхИзФайлаКлиент.ПоказатьФормуЗагрузки(ПараметрыЗагрузки, Оповещение); КонецПроцедуры // Выполняем после завершения работы в стандартной форме загрузки из файла &НаКлиенте Процедура ЗагрузитьТоварыИзФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт Если АдресЗагруженныхДанных = Неопределено Тогда Возврат; КонецЕсли; // АдресЗагруженныхДанных - адрес ВХ подготовленной ТЗ с загруженными данными ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных); КонецПроцедуры &НаСервере Процедура ЗагрузитьТоварыИзФайлаНаСервере(АдресЗагруженныхДанных) ЗагруженныеДанные = ПолучитьИзВременногоХранилища(АдресЗагруженныхДанных); ТоварыДобавлены = Ложь; Для каждого СтрокаТаблицы Из ЗагруженныеДанные Цикл Если Не ЗначениеЗаполнено(СтрокаТаблицы.Номенклатура) Тогда Продолжить; КонецЕсли; СтрокаТовары = Объект.Товары.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрокаТаблицы); ТоварыДобавлены = Истина; КонецЦикла; Если ТоварыДобавлены Тогда Модифицированность = Истина; КонецЕсли; КонецПроцедуры ```
# В модуле менеджера реализовать методы программного интерфейса ## Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ Аналогично процедуре `ОпределитьПараметрыЗагрузкиДанныхИзФайла` (см. статью `2. Настраиваемые алгоритмы загрузки в справочники`). Может быть пустой ```bsl // Переопределяет параметры загрузки данных из файла. // // Параметры: // Параметры - Структура: // * ИмяМакетаСШаблоном - Строка - наименование макета. Например, "ЗагрузкаИзФайла". // * ИмяТабличнойЧасти - Строка - полное имя табличной части. Например, "Документ._ДемоСчетНаОплатуПокупателю.ТабличнаяЧасть.Товары" // * ОбязательныеКолонки - Массив из Строка - наименования обязательных для заполнения колонок. // * ТипДанныхКолонки - Соответствие из КлючИЗначение: // * Ключ - Строка - имя колонки; // * Значение - ОписаниеТипов - тип колонки загружаемых данных. // * ДополнительныеПараметры - Структура // Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ(Параметры) Экспорт КонецПроцедуры ``` ## Процедура СопоставитьЗагружаемыеДанные В этой процедуре необходимо заполнить таблицу, находящуюся по адресу `АдресТаблицыСопоставления` ```bsl // АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой // находятся загруженные данные из файла. Состав колонок: // * Идентификатор - Число - порядковый номер строки. // Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла. // АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений, // являющейся копией табличной части документа, // которую необходимо заполнить из таблицы АдресЗагружаемыхДанных. // СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений: // * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность. // * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность. // ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. // ДополнительныеПараметры - Произвольный - любые дополнительные сведения. Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт ``` |Аргумент|Описание| |-|-| |`АдресЗагружаемыхДанных`|По этому адресу расположена таблица значений, заполненная на основании введенных пользователем данных в форме обработки| |`АдресТаблицыСопоставления`|По этому адресу расположена копия табличной части документа/справочника, которую необходимо заполнить| |`СписокНеоднозначностей`|Таблица, в которую записываются идентификаторы строк ТЧ, для которых не удалось однозначно определить сопоставляемые данные|
Пример реализации ```bsl // АдресЗагружаемыхДанных - Строка - адрес временного хранилища с таблицей значений, в которой // находятся загруженные данные из файла. Состав колонок: // * Идентификатор - Число - порядковый номер строки. // Остальные колонки соответствуют колонкам макета ЗагрузкаИзФайла. // АдресТаблицыСопоставления - Строка - адрес временного хранилища с пустой таблицей значений, // являющейся копией табличной части документа, // которую необходимо заполнить из таблицы АдресЗагружаемыхДанных. // СписокНеоднозначностей - ТаблицаЗначений - список неоднозначных значений: // * Колонка - Строка - имя колонки, в которой была обнаружена неоднозначность. // * Идентификатор - Число - идентификатор строки, в которой была обнаружена неоднозначность. // ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. // ДополнительныеПараметры - Произвольный - любые дополнительные сведения. Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); ТабличнаяЧасть = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(ДанныеДляСопоставления.Артикул КАК СТРОКА(50)) КАК Артикул, | ВЫРАЗИТЬ(ДанныеДляСопоставления.ЕдиницаИзмерения КАК СТРОКА(30)) КАК ЕдиницаИзмерения, | ВЫРАЗИТЬ(ДанныеДляСопоставления.Номенклатура КАК СТРОКА(300)) КАК Номенклатура, | ДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ВТДанныеДляСопоставления |ИЗ | &ЗагружаемыеДанные КАК ДанныеДляСопоставления |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Номенклатура, | СправочникНоменклатура.Артикул КАК Артикул, | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоАртикулу |ИЗ | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура | ПО ВТДанныеДляСопоставления.Артикул = СправочникНоменклатура.Артикул | И (ВТДанныеДляСопоставления.Артикул <> """") |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТДанныеДляСопоставления.Номенклатура КАК Номенклатура, | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ВТДанныеДляСопоставленияПоНаименованию |ИЗ | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления | ЛЕВОЕ СОЕДИНЕНИЕ ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу | ПО ВТДанныеДляСопоставления.Идентификатор = ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор |ГДЕ | ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор ЕСТЬ NULL |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Номенклатура, | ВТДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ВТСопоставленнаяНоменклатураПоНаименованию |ИЗ | ВТДанныеДляСопоставленияПоНаименованию КАК ВТДанныеДляСопоставленияПоНаименованию | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура | ПО ВТДанныеДляСопоставленияПоНаименованию.Номенклатура = СправочникНоменклатура.Наименование |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | МАКСИМУМ(СопоставленнаяНоменклатура.Номенклатура) КАК Номенклатура, | СопоставленнаяНоменклатура.Идентификатор КАК Идентификатор, | СУММА(СопоставленнаяНоменклатура.КоличествоСтрок) КАК КоличествоСтрок |ИЗ | (ВЫБРАТЬ | ВТСопоставленнаяНоменклатураПоАртикулу.Номенклатура КАК Номенклатура, | ВТСопоставленнаяНоменклатураПоАртикулу.Идентификатор КАК Идентификатор, | 1 КАК КоличествоСтрок | ИЗ | ВТСопоставленнаяНоменклатураПоАртикулу КАК ВТСопоставленнаяНоменклатураПоАртикулу | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВТСопоставленнаяНоменклатураПоНаименованию.Номенклатура, | ВТСопоставленнаяНоменклатураПоНаименованию.Идентификатор, | 1 | ИЗ | ВТСопоставленнаяНоменклатураПоНаименованию КАК ВТСопоставленнаяНоменклатураПоНаименованию) КАК СопоставленнаяНоменклатура | |СГРУППИРОВАТЬ ПО | СопоставленнаяНоменклатура.Идентификатор |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТДанныеДляСопоставления.Идентификатор КАК Идентификатор, | КОЛИЧЕСТВО(ВТДанныеДляСопоставления.ЕдиницаИзмерения) КАК КоличествоСтрок, | МАКСИМУМ(УпаковкиЕдиницыИзмерения.Ссылка) КАК ЕдиницаИзмерения |ИЗ | ВТДанныеДляСопоставления КАК ВТДанныеДляСопоставления | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения | ПО ВТДанныеДляСопоставления.ЕдиницаИзмерения = УпаковкиЕдиницыИзмерения.Наименование | |СГРУППИРОВАТЬ ПО | ВТДанныеДляСопоставления.Идентификатор"; Запрос.УстановитьПараметр("ЗагружаемыеДанные", ЗагружаемыеДанные); РезультатыЗапроса = Запрос.ВыполнитьПакет(); ТаблицаНоменклатуры = РезультатыЗапроса.Получить(4).Выгрузить(); ТаблицаЕдиницИзмерения = РезультатыЗапроса.Получить(5).Выгрузить(); Для Каждого СтрокаЗагружаемыхДанных Из ЗагружаемыеДанные Цикл СтрокаТабличнойЧасти = ТабличнаяЧасть.Добавить(); СтрокаТабличнойЧасти.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; СтрокаТабличнойЧасти.Цена = СтрокаЗагружаемыхДанных.Цена; СтрокаНоменклатуры = ТаблицаНоменклатуры.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); Если СтрокаНоменклатуры <> Неопределено Тогда Если СтрокаНоменклатуры.КоличествоСтрок = 1 Тогда СтрокаТабличнойЧасти.Номенклатура = СтрокаНоменклатуры.Номенклатура; ИначеЕсли СтрокаНоменклатуры.КоличествоСтрок > 1 Тогда СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК СтрокаНеоднозначности.Колонка = "Номенклатура"; КонецЕсли; КонецЕсли; СтрокаЕдиницыИзмерения = ТаблицаЕдиницИзмерения.Найти(СтрокаЗагружаемыхДанных.Идентификатор, "Идентификатор"); Если СтрокаЕдиницыИзмерения <> Неопределено Тогда Если СтрокаЕдиницыИзмерения.КоличествоСтрок = 1 Тогда СтрокаТабличнойЧасти.ЕдиницаИзмерения = СтрокаЕдиницыИзмерения.ЕдиницаИзмерения; ИначеЕсли СтрокаЕдиницыИзмерения.КоличествоСтрок > 1 Тогда СтрокаНеоднозначности = СписокНеоднозначностей.Добавить(); СтрокаНеоднозначности.Идентификатор = СтрокаЗагружаемыхДанных.Идентификатор; // ИМЯ РЕКВИЗИТА ТАБЛИЧНОЙ ЧАСТИ, НЕ ИМЯ ЯЧЕЙКИ ТАБ.ДОК СтрокаНеоднозначности.Колонка = "ЕдиницаИзмерения"; КонецЕсли; КонецЕсли; КонецЦикла; ПоместитьВоВременноеХранилище(ТабличнаяЧасть, АдресТаблицыСопоставления); КонецПроцедуры ```
Пример реализации из БСП ```bsl Процедура СопоставитьЗагружаемыеДанные(АдресЗагружаемыхДанных, АдресТаблицыСопоставления, СписокНеоднозначностей, ПолноеИмяТабличнойЧасти, ДополнительныеПараметры) Экспорт Товары = ПолучитьИзВременногоХранилища(АдресТаблицыСопоставления); // ТаблицаЗначений ЗагружаемыеДанные = ПолучитьИзВременногоХранилища(АдресЗагружаемыхДанных); // ТаблицаЗначений МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(ДанныеДляСопоставления.Штрихкод КАК СТРОКА(13)) КАК Штрихкод, | ДанныеДляСопоставления.Номенклатура КАК Номенклатура, | ДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ДанныеДляСопоставления |ИЗ | &ДанныеДляСопоставления КАК ДанныеДляСопоставления |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | _ДемоНоменклатура.Ссылка КАК Ссылка, | _ДемоНоменклатура.Штрихкод КАК Штрихкод, | ДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ СопоставленнаяНоменклатураПоШтрихкоду |ИЗ | ДанныеДляСопоставления КАК ДанныеДляСопоставления | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура | ПО (_ДемоНоменклатура.Штрихкод = ДанныеДляСопоставления.Штрихкод) | И (ДанныеДляСопоставления.Штрихкод <> """") | |ИНДЕКСИРОВАТЬ ПО | Идентификатор |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеДляСопоставления.Номенклатура КАК Номенклатура, | ДанныеДляСопоставления.Идентификатор КАК Идентификатор |ПОМЕСТИТЬ ДанныеДляСопоставленияПоНаименованию |ИЗ | ДанныеДляСопоставления КАК ДанныеДляСопоставления | ЛЕВОЕ СОЕДИНЕНИЕ СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду | ПО ДанныеДляСопоставления.Идентификатор = СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор |ГДЕ СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор ЕСТЬ NULL | |ИНДЕКСИРОВАТЬ ПО | Идентификатор |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | МАКСИМУМ(_ДемоНоменклатура.Ссылка) КАК Ссылка, | ДанныеДляСопоставленияПоНаименованию.Идентификатор КАК Идентификатор, | КОЛИЧЕСТВО(ДанныеДляСопоставленияПоНаименованию.Идентификатор) КАК Количество |ИЗ | ДанныеДляСопоставленияПоНаименованию КАК ДанныеДляСопоставленияПоНаименованию | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоНоменклатура КАК _ДемоНоменклатура | ПО (_ДемоНоменклатура.Наименование = (ВЫРАЗИТЬ(ДанныеДляСопоставленияПоНаименованию.Номенклатура КАК СТРОКА(500)))) | |СГРУППИРОВАТЬ ПО | ДанныеДляСопоставленияПоНаименованию.Идентификатор | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | МАКСИМУМ(СопоставленнаяНоменклатураПоШтрихкоду.Ссылка), | СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор, | КОЛИЧЕСТВО(СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор) |ИЗ | СопоставленнаяНоменклатураПоШтрихкоду КАК СопоставленнаяНоменклатураПоШтрихкоду | |СГРУППИРОВАТЬ ПО | СопоставленнаяНоменклатураПоШтрихкоду.Идентификатор"; Запрос.УстановитьПараметр("ДанныеДляСопоставления", ЗагружаемыеДанные); РезультатыЗапросов = Запрос.ВыполнитьПакет(); // Массив из РезультатЗапроса ТаблицаНоменклатура = РезультатыЗапросов[3].Выгрузить(); // ТаблицаЗначений ФункциональнаяОпцияХарактеристика = ?(ЗагружаемыеДанные.Колонки.Найти("Характеристика") <> Неопределено, Истина, Ложь); Для каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл Товар = Товары.Добавить(); Товар.Идентификатор = СтрокаТаблицы.Идентификатор; Товар.Количество = СтрокаТаблицы.Количество; Товар.Цена = СтрокаТаблицы.Цена; СтрокаНоменклатура = ТаблицаНоменклатура.Найти(СтрокаТаблицы.Идентификатор, "Идентификатор"); Если СтрокаНоменклатура <> Неопределено Тогда Если СтрокаНоменклатура.Количество = 1 Тогда Товар.Номенклатура = СтрокаНоменклатура.Ссылка; Если ФункциональнаяОпцияХарактеристика Тогда Товар.Характеристика = Справочники._ДемоХарактеристики.НайтиПоНаименованию(СтрокаТаблицы.Характеристика, Истина,, Товар.Номенклатура); КонецЕсли; ИначеЕсли СтрокаНоменклатура.Количество > 1 Тогда ЗаписьОНеоднозначности = СписокНеоднозначностей.Добавить(); ЗаписьОНеоднозначности.Идентификатор = СтрокаТаблицы.Идентификатор; ЗаписьОНеоднозначности.Колонка = "Номенклатура"; КонецЕсли; КонецЕсли; КонецЦикла; ПоместитьВоВременноеХранилище(Товары, АдресТаблицыСопоставления); КонецПроцедуры ```
## ЗаполнитьСписокНеоднозначностей ```bsl // Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. // // Параметры: // ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. // СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными. // ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность. // ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность. // ДополнительныеПараметры - Произвольный - любые дополнительные сведения. // Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт ```
Пример реализации ```bsl // Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. // // Параметры: // ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. // СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными. // ИмяКолонки - Строка - имя колонки <ТАБЛИЧНОЙ ЧАСТИ>, в который возникла неоднозначность. // ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность. // ДополнительныеПараметры - Произвольный - любые дополнительные сведения. // Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт // ВАЖНО // В ЗагружаемыеЗначенияСтрока попадают только значения, где Имя или ПараметрРасшифровки = ИмяКолонки Запрос = Новый Запрос; Если ИмяКолонки = "Номенклатура" Тогда ТекстГде = ""; Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда ТекстГде = " ГДЕ СправочникНоменклатура.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Наименование); КонецЕсли; Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Артикул) Тогда Если ПустаяСтрока(ТекстГде) Тогда ТекстГде = " ГДЕ СправочникНоменклатура.Артикул = &Артикул"; Иначе ТекстГде = ТекстГде + " ИЛИ СправочникНоменклатура.Артикул = &Артикул"; КонецЕсли; Запрос.УстановитьПараметр("Артикул", ЗагружаемыеЗначенияСтрока.Артикул); КонецЕсли; Запрос.Текст = "ВЫБРАТЬ | СправочникНоменклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК СправочникНоменклатура " + ТекстГде; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СписокНеоднозначностей.Добавить(Выборка.Ссылка); КонецЦикла; КонецЕсли; Если ИмяКолонки = "ЕдиницаИзмерения" Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | УпаковкиЕдиницыИзмерения.Ссылка КАК Ссылка |ИЗ | Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения |ГДЕ | НЕ УпаковкиЕдиницыИзмерения.ПометкаУдаления | И УпаковкиЕдиницыИзмерения.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", СокрЛП(ЗагружаемыеЗначенияСтрока.ЕдиницаИзмерения)); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл СписокНеоднозначностей.Добавить(Выборка.Ссылка); КонецЦикла; КонецЕсли; КонецПроцедуры ```
Пример реализации из БСП ```bsl // Возвращает список подходящих объектов ИБ для неоднозначного значения ячейки. // // Параметры: // ПолноеИмяТабличнойЧасти - Строка - полное имя табличной части, в которую загружаются данные. // СписокНеоднозначностей - Массив из СправочникСсылка._ДемоНоменклатура - массив для заполнения с неоднозначными данными. // ИмяКолонки - Строка - имя колонки, в который возникла неоднозначность. // ЗагружаемыеЗначенияСтрока - Строка - загружаемые данные на основании которых возникла неоднозначность. // ДополнительныеПараметры - Произвольный - любые дополнительные сведения. // Процедура ЗаполнитьСписокНеоднозначностей(ПолноеИмяТабличнойЧасти, СписокНеоднозначностей, ИмяКолонки, ЗагружаемыеЗначенияСтрока, ДополнительныеПараметры) Экспорт Если ИмяКолонки = "Номенклатура" Тогда Запрос = Новый Запрос; ТекстГде = ""; Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Номенклатура) Тогда ТекстГде = "ГДЕ _ДемоНоменклатура.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", ЗагружаемыеЗначенияСтрока.Номенклатура); КонецЕсли; Если ЗначениеЗаполнено(ЗагружаемыеЗначенияСтрока.Штрихкод) Тогда Если ЗначениеЗаполнено(ТекстГде) Тогда ТекстГде = ТекстГде + " ИЛИ _ДемоНоменклатура.Штрихкод = &Штрихкод"; Иначе ТекстГде = "ГДЕ _ДемоНоменклатура.Штрихкод = &Штрихкод"; КонецЕсли; Запрос.УстановитьПараметр("Штрихкод", ЗагружаемыеЗначенияСтрока.Штрихкод); КонецЕсли; Запрос.Текст = "ВЫБРАТЬ | _ДемоНоменклатура.Ссылка |ИЗ | Справочник._ДемоНоменклатура КАК _ДемоНоменклатура " + ТекстГде; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл СписокНеоднозначностей.Добавить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; КонецЕсли; КонецПроцедуры ```