Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 сен 2024, 03:56

Как выгрузить инфу в ТЧ Документа из Excel

Автор Nosferatu112, 30 янв 2023, 16:19

0 Пользователей и 1 гость просматривают эту тему.

Nosferatu112

Суть задачи создать внешнюю обработку которая будет создавать новый документ считывать инфу с excel и записывать эту инфу в ТЧ созданого документа. Вопрос, сделал всё что нужно было но не понимаю как записать инфу в ТЧ документа 
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Проводник = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Проводник.Заголовок = "Выберите файл с данными";

Если Объект.ФорматФайла = "TXT" Тогда
фильтр = "Текстовый документ (*.txt)|*.txt";
ИначеЕсли Объект.ФорматФайла = "CSV" Тогда
фильтр = "Текстовый документ (*.csv)|*.csv";
ИначеЕсли Объект.ФорматФайла = "XLSX" Тогда
фильтр = "Файл Excel (*.xlsx)|*.xlsx";
ИначеЕсли Объект.ФорматФайла = "XLS" Тогда
фильтр = "Файл Excel (*.xls)|*.xls";
ИначеЕсли Объект.ФорматФайла = "DBF" Тогда
фильтр = "Таблица DBF (*.dbf)|*.dbf";
ИначеЕсли Объект.ФорматФайла = "XML" Тогда
фильтр = "XML-Файл (*.xml)|*.xml";
Иначе
Возврат;
КонецЕсли;

Проводник.Фильтр = Фильтр;

Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
Проводник.Показать(Оповещение);

КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(ВыбраныеФайлы, ДополнительныеПараметры) Экспорт

Если ВыбраныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;

Объект.ПутьКФайлу = ВыбраныеФайлы[0];

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

&НаКлиенте
Процедура ПрочитатьФайл(Команда)

Объект.ДанныеФайла.Очистить();
Если Объект.ФорматФайла = "XLSX" Тогда
ПрочитатьФайл_XLSX();
КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьФайл_XLSX()

ДанныеФайла = Новый ДвоичныеДанные(Объект.ПутьКФайлу);
АдресДанных = ПоместитьВоВременноеХранилище(ДанныеФайла);
ПрочитатьФайл_XLSX_НаСервере(АдресДанных);

КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайл_XLSX_НаСервере(АдресДанных) Экспорт

ТабДок = Новый ТабличныйДокумент;

Данные = ПолучитьИзВременногоХранилища(АдресДанных);
ПутьКФайлуНаСервере = ПолучитьИмяВременногоФайла("xlsx");
Данные.Записать(ПутьКФайлуНаСервере);

Попытка
ТабДок.Прочитать(ПутьКФайлуНаСервере, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось прочитать указаный файл по причине: " + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;

КонецПопытки;

КоличествоСтрок = ТабДок.ВысотаТаблицы;

Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтрокаДанных = Объект.ДанныеФайла.Добавить();
СтрокаДанных.Номенклатура = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 1).ТекущаяОбласть.Текст;
СтрокаДанных.Количество = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 2).ТекущаяОбласть.Текст;
СтрокаДанных.ЕдИзмерения = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 3).ТекущаяОбласть.Текст;
СтрокаДанных.Цена = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 4).ТекущаяОбласть.Текст;
КонецЦикла;

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


&НаКлиенте
Процедура СоздатьДокумент(Команда)
СоздатьДокументНаСервере();
ОткрытьЗначение(СоздатьДокументНаСервере());
КонецПроцедуры
&НаСервере
Функция СоздатьДокументНаСервере()


Попытка
НовыйДокумент = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();

НовыйДокумент.Организация = Объект.Организация;
НовыйДокумент.Контрагент = Объект.Поставщик;
НовыйДокумент.Договор = Объект.Договор;
НовыйДокумент.Склад = Объект.Склад;
    НовыйДокумент.Дата = ТекущаяДата();

НовыйДокумент.Записать();
Сообщить("Документ по успешно создан");
Возврат НовыйДокумент.Ссылка;
   
Исключение
Сообщить("Не удалось создать документ  ");
КонецПопытки;

КонецФункции


Максим75

Nosferatu112, я так понимаю, что вот это

СтрокаДанных = Объект.ДанныеФайла.Добавить();
означает, что на у обработки есть табличная часть ДанныеФайла? И туда из екселя что-то пишется.
Так?

Если Так, то в цикле обойти ДанныеФайла и запихнуть нужные значения в табличную часть документа.
Вот перед НовыйДокумент.Записать(); еще необходимо

Для каждого СтрДанных из Объект.ДанныеФайла цикл
     СтрокаДока = НовыйДокумент.Имя табличной части.Добавить();

     ну и здесь СтрокаДока.Товар = СтрДанных.Товар;
     и т.д. все что нужно добавить в строку
     

КонецЦикла;

Nosferatu112

Максим75, Да Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтрокаДанных = Объект.ДанныеФайла.Добавить();
СтрокаДанных.Номенклатура = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 1).ТекущаяОбласть.Текст;
СтрокаДанных.Количество = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 2).ТекущаяОбласть.Текст;
СтрокаДанных.ЕдИзмерения = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 3).ТекущаяОбласть.Текст;
СтрокаДанных.Цена = ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки, "ЧГ=0") + "C" + 4).ТекущаяОбласть.Текст;
КонецЦикла;
Сюдысь из экселя пишеться инфа
Вот это то что вы мне посоветовали
Для каждого СтрДанных из Объект.ДанныеФайла цикл
      СтрокаДок = НовыйДокумент.ДанныеФайла.Добавить();
СтрокаДок.Номенклатура = СтрДанных.Номенклатура;
СтрокаДок.Количество = СтрДанных.Количество;
СтрокаДок.ЕдИзмерения = СтрДанных.ЕдИзмерения;
СтрокаДок.Цена = СтрДанных.Цена;
КонецЦикла;
Но проблема в том что в табличной части документа например у номенклатуры тип ссылка у количества число а в этом коде всё приравниваеться к строке и соответствено не записываетсья в ТЧ документа так как строка <> ссылка и.т.д я поэтому голову и сижу ломаю как это решить

Максим75

Nosferatu112,

Для каждого СтрДанных из Объект.ДанныеФайла цикл
            СтрокаДок = НовыйДокумент.ДанныеФайла.Добавить();
            СтрокаДок.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(СтрДанных.Номенклатура));
            СтрокаДок.Количество = Число(СтрДанных.Количество);
            СтрокаДок.ЕдИзмерения = СтрДанных.ЕдИзмерения;
            СтрокаДок.Цена = Число(СтрДанных.Цена);
        КонецЦикла;

В Номенклатуру ищем в справочнике Номенклатура по наименованию
Количество преобразовываем в число
Цену - туда же
С единицей измерения тоже смотрим, что можно сделать. Обычно справочник единиц измерения подчинен Номенклатуре, тогда ищем по наименованию в подчиненном справочнике, ведь номенклатура будет уже получена.

Максим75

Nosferatu112, хотя лучше всего при загрузке из внешних файлов каких-либо справочников изначально использовать числовые ключи для связи, не текстовые поля типа наименования. ну это так, пожелание.

Afinogen

а почему вы не подключаетесь к экселу?

Максим75

Цитата: Afinogen от 30 янв 2023, 17:07а почему вы не подключаетесь к экселу?
в смысле? как раньше в 7-ке было через создание объекта?
зачем подключаться, можно сразу в табличный документ считать лист ексель и уже с табличным документом работать.
как раз теперь подключаться не обязательно.

Nosferatu112

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

Максим75

Nosferatu112,

Для каждого ЭлементКоллекции из Объект.ДанныеФайла цикл
            СтрокаДок = ЭлементКоллекции.Значение;
            СтрокаДок.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ЭлементКоллекции.Номенклатура));
            СтрокаДок.Количество = Число(ЭлементКоллекции.Количество);
            СтрокаДок.ЕдИзмерения = ЭлементКоллекции.ЕдИзмерения;
            СтрокаДок.Цена = Число(ЭлементКоллекции.Цена);
        КонецЦикла;


что такое СтрокаДок = ЭлементКоллекции.Значение;
его надо заменить на вот это:
СтрокаДок = НовыйДокумент.ДанныеФайла.Добавить();
строку в табличную часть то надо добавить каким-то образом.

Afinogen


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск