wakadakawaka 70ac5be186 edit
2025-07-27 21:48:38 +05:00

24 KiB
Raw Blame History

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

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

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

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

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

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

Изображение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример реализации

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

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

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