Обход выбора из списка

Рейтинг: 0Ответов: 1Опубликовано: 14.02.2023

в чём заключается вопрос. Созданы документ и справочник, документ заполняется данными из экселя в табличную часть, одна из колонок должна быть связана с справочником. ну естественно я сделал тип этого столбца ссылкой на справочник, но, в чем загвоздка, все данные вводятся правильно(у которых строчный тип), а столбец с ссылочным типом не заполняется никак. пытался во время заполнения(загрузки из экселя) сразу же создавать новые значения в справочнике, но они всё равно не подставляются в ячейки, необходимо выбирать из списка(ссылающегося на справочник), но ,я думаю, сами понимаете что при загрузке таблицы в 100+ сток выбирать для каждой строки выбирать наименование из списка...немного не хорошо. ну так и в чем вопрос, есть возможность напрямую "кодово" вписывать значения в ссылочную ячейку при загрузке данных из эксель? Один вариант подсказали, вместо одной колонки,в которую вносятся данные и она же ссылается на справочник из-за которого проблемы с вводом. А разбить на 2, в одну вносить данные,как во все остальные колонки,а вторую сделать ссылочную и написать код присвоения(что б в ссылочный столбец) присваивались данные с колонки в которую данные уже ввели(параллельно создавало запись в справочнике и проверяло на уникальность), но как по мне, это лишнее действия(та и реализовать не знаю как).

 &НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    НомерПервойСтроки = 5;
    НомерПервойКолонки = 1;
    КоличествоСтрокВЭксель = 0;
    КоличествоКолонокВЭксель = 0;
    
    ИмяФайла = ОткрытьExcelФайл();
    //Книга = Эксель.WorkBooks.Open(ИмяФайла);   
    //ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".xls"); 
    //ДвоичныеДанные = ПолучитьМакетНаСервере();
    //ДвоичныеДанные.Записать(ИмяВременногоФайла);
    //ДвоичныеДанные = Объект.ПолучитьМакет("Макет");
    //ДвоичныеДанные.Записать(ИмяВременногоФайла);  
    
    
    //Подключаемся к Эксель
    Попытка
        Эксель = Новый COMОбъект("Excel.Application");
        Эксель.WorkBooks.Open(ИмяФайла);
        Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка 
        //Открываем необходимый лист
        Эксель.Sheets(1).Select();  // лист 1, по умолчанию  
    Исключение
        //Закрываем Excel
        Эксель.ActiveWorkbook.Close();  
        Эксель = 0;
        Сообщить("Файл "+Строка(Объект.ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        Возврат;
    КонецПопытки;
    
    //Получим количество строк и колонок.       
    КоличествоСтрокВЭксель = Эксель.Cells.SpecialCells(11).Row;
    КоличествоКолонокВЭксель = Эксель.Cells.SpecialCells(11).Column;
    
    // Выделяем область на листе Эксель.
    Область = Эксель.Range(Эксель.Cells(НомерПервойСтроки,НомерПервойКолонки), Эксель.Cells(КоличествоСтрокВЭксель,КоличествоКолонокВЭксель));
    
    // Выгружаем область Эксель в двумерный массив.
    Данные = Область.Value.Выгрузить();     
    
    //Отключаемся от Excel 
    Попытка
        Эксель.DisplayAlerts = 0;
        Эксель.ActiveWorkbook.Close();
        Эксель.DisplayAlerts = 1;
        Эксель.Quit(); 
        Эксель = Неопределено;        
    Исключение
        Сообщить("Не удалось отключиться от Excel - " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    //Далее обрабатываем на сервере полученные из Эксель данные.
    ОбработатьДанныеИзЭксельНаСервере(Данные);
            
КонецПроцедуры


 &НаСервере
Процедура ОбработатьДанныеИзЭксельНаСервере(Данные)
        
    Счетчик = 1;
    
    Для Индекс = 1 По Данные[0].Количество()-1 Цикл
        
        // Заполняем таблицу значений из массива.
        СтрокаТаблицаЗначенийИзЭксель = Объект.Таблица1.Добавить();
        СтрокаТаблицаЗначенийИзЭксель.ОписаниеКатегории                     = СокрЛП(Данные[0][Счетчик]);
        СтрокаТаблицаЗначенийИзЭксель.ОбщаяЗаявленнаяСтоимость              = СокрЛП(Данные[5][Счетчик]);  
        СтрокаТаблицаЗначенийИзЭксель.СредстваАНОИРИ                        = СокрЛП(Данные[6][Счетчик]);
        СтрокаТаблицаЗначенийИзЭксель.ПривлекаемыеСредства                  = СокрЛП(Данные[7][Счетчик]);   
        Счетчик = Счетчик + 1;
        
    КонецЦикла;
    ТаблицаЗначенийИзЭксель = Неопределено;
            
    Сообщить("Загрузка завершена"); 
    
    

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


&НаКлиенте
Функция ОткрытьExcelФайл()
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайла.Фильтр = "Файл Excel (*.xls?)|*.xls?";
    ДиалогВыбораФайла.Заголовок = "Выберите файл Excel";
    ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
    //ДиалогВыбораФайла.Расширение = "json";
    ДиалогВыбораФайла.ИндексФильтра = 0;
    Если ДиалогВыбораФайла.Выбрать()Тогда
        Возврат ДиалогВыбораФайла.ПолноеИмяФайла;   
    КонецЕсли   
КонецФункции


Функция ПолучитьМакетНаСервере()
        
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    
    НовыйМакет = ОбработкаОбъект.ПолучитьМакет("Макет");
    Возврат НовыйМакет;
КонецФункции

Ответы

▲ 2Принят
&НаСервере
Процедура ОбработатьТаблЧасть()
  // Предварительно записали всё что надо из Экселя в ТЧ в виде строк;
  //  теперь пробежим по ТЧ и преобразуем в значения ссылочных типов
  Для Каждого Стр из ИмяТаблЧасти* Цикл
     НаименованиеЭлементаСпр = Стр.ТоварСтр; // в ТоварСтр записали из экселя строку
     Эл = Справочники.Товары.НайтиПоНаименованию(НаименованиеЭлементаСпр, Истина);
     Если Эл <> Неопределено Тогда
        // Нашли
        Стр.Товар = Эл;
     Иначе
        // Создаем элемент справочника
        НовыйЭлемент = Справочники.Товары.СоздатьЭлемент();
        НовыйЭлемент.Наименование = НаименованиеЭлементаСпр;
        НовыйЭлемент.Записать();
        Стр.Товар = НовыйЭлемент;
     КонецЕсли;
  КонецЦикла
КонецПроцедуры