Загрузка таблицы из Excel и создание документов с данными из этой таблицы в 1с
Помогите, пож, исправить ошибки:
Переменная не определена (ТаблицаНаименованиеТовара),Переменная не определена (ТаблицаКолич), Переменная не определена (ТаблицаНаименованиеЦена).
В общем, нужно, чтобы в итоге создавались документы, номера которых 1с брал бы из колонки "№ документа" в экселевском файле. Если в экселевском файле 2, 3 и т. д. документа с одинаковыми номерами, то 1с создавать один документ со всеми товарами из этих эксель-доков
&НаКлиенте
Процедура FaylExcelНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = НСтр("ru=’Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx'");
Диалог.Заголовок = НСтр("ru=’Выберите файл Excel'");
ОповещениеЗавершения = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект, Диалог);
Диалог.Показать(ОповещениеЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
Объект.FaylExcel = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";
темп_файл = ПолучитьИзВременногоХранилища(Адрес);
темп_файл.Записать(темп_Путь);
СписокКолонок = Новый СписокЗначений;
СписокКолонок.Добавить("ФизЛицо");
СписокКолонок.Добавить("НомерЛицевогоСчета");
ТабЛицСчетов = ЗагрузитьЭксель(темп_Путь,СписокКолонок);
Попытка
УдалитьФайлы(темп_Путь);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ЗагрузитьЭксель(Путь, СписокКолонки)
ТЗФайл = Новый ТаблицаЗначений;
Попытка
ex = ПолучитьCOMобъект("","Excel.Application");
Исключение
Сообщить("Prilojeniye Excel ne naydeno!");
Возврат ТЗФайл;
КонецПопытки;
Попытка
ex.workbooks.open(Путь,1);
Исключение
Сообщить("Файл перемещён или удалён!");
Возврат ТЗФайл;
КонецПопытки;
Для каждого Зн Из СписокКолонки Цикл
ТЗФайл.Колонки.Добавить(Зн.Значение);
КонецЦикла;
RCount = ex.ActiveSheet.UsedRange.Rows.Count();
CCount = ex.ActiveSheet.UsedRange.Columns.Count();
Для j = 2 по RCount цикл
Новая = Таблица.Добавить();
Новая.НомерДокумента=СокрЛП(ex.ActiveSheet.Cells(j,1).Value);
Новая.НаименованиеТовара=СокрЛП(ex.ActiveSheet.Cells(j,2).Value);
Новая.Колич=СокрЛП(ex.ActiveSheet.Cells(j,3).Value);
Новая.Цена=СокрЛП(ex.ActiveSheet.Cells(j,4).Value);
КонецЦикла;
ex.workbooks.Close();
ex.quit();
Возврат ТЗФайл;
КонецФункции
&НаКлиенте
Процедура Загрузить(Команда)
Двоичное = Новый ДвоичныеДанные(Объект.FaylExcel);
Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
ЗагрузитьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура СоздДокумНаСервере()
НовыйДок = Документы.РеализацияТоваровИУслуг.СоздатьДокумент();
ТабЧастьДока=НовыйДок.Товары;
НовыйДок.Дата= ТекущаяДата();
НовыйДок.Склад = Справочники.Склады.НайтиПоНаименованию("Основной");
СтокаТабличнойЧасти=НовыйДок.Товары.Добавить();
Для Каждого Стр Из Таблица Цикл
СтокаТабличнойЧасти.Наименование = ТаблицаНаименованиеТовара;
СтокаТабличнойЧасти.Количество = ТаблицаКолич;
СтокаТабличнойЧасти.Цена = ТаблицаЦена;
КонецЦикла;
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
&НаКлиенте
Процедура СоздДокум(Команда)
СоздДокумНаСервере();
КонецПроцедуры
Переменная не определена (ТаблицаНаименованиеТовара),Переменная не определена (ТаблицаКолич), Переменная не определена (ТаблицаНаименованиеЦена).
В общем, нужно, чтобы в итоге создавались документы, номера которых 1с брал бы из колонки "№ документа" в экселевском файле. Если в экселевском файле 2, 3 и т. д. документа с одинаковыми номерами, то 1с создавать один документ со всеми товарами из этих эксель-доков
&НаКлиенте
Процедура FaylExcelНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = НСтр("ru=’Книга Excel 97 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx'");
Диалог.Заголовок = НСтр("ru=’Выберите файл Excel'");
ОповещениеЗавершения = Новый ОписаниеОповещения("ВыборФайлаЗавершение", ЭтотОбъект, Диалог);
Диалог.Показать(ОповещениеЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура ВыборФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
Объект.FaylExcel = ВыбранныеФайлы[0];
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";
темп_файл = ПолучитьИзВременногоХранилища(Адрес);
темп_файл.Записать(темп_Путь);
СписокКолонок = Новый СписокЗначений;
СписокКолонок.Добавить("ФизЛицо");
СписокКолонок.Добавить("НомерЛицевогоСчета");
ТабЛицСчетов = ЗагрузитьЭксель(темп_Путь,СписокКолонок);
Попытка
УдалитьФайлы(темп_Путь);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
&НаСервере
Функция ЗагрузитьЭксель(Путь, СписокКолонки)
ТЗФайл = Новый ТаблицаЗначений;
Попытка
ex = ПолучитьCOMобъект("","Excel.Application");
Исключение
Сообщить("Prilojeniye Excel ne naydeno!");
Возврат ТЗФайл;
КонецПопытки;
Попытка
ex.workbooks.open(Путь,1);
Исключение
Сообщить("Файл перемещён или удалён!");
Возврат ТЗФайл;
КонецПопытки;
Для каждого Зн Из СписокКолонки Цикл
ТЗФайл.Колонки.Добавить(Зн.Значение);
КонецЦикла;
RCount = ex.ActiveSheet.UsedRange.Rows.Count();
CCount = ex.ActiveSheet.UsedRange.Columns.Count();
Для j = 2 по RCount цикл
Новая = Таблица.Добавить();
Новая.НомерДокумента=СокрЛП(ex.ActiveSheet.Cells(j,1).Value);
Новая.НаименованиеТовара=СокрЛП(ex.ActiveSheet.Cells(j,2).Value);
Новая.Колич=СокрЛП(ex.ActiveSheet.Cells(j,3).Value);
Новая.Цена=СокрЛП(ex.ActiveSheet.Cells(j,4).Value);
КонецЦикла;
ex.workbooks.Close();
ex.quit();
Возврат ТЗФайл;
КонецФункции
&НаКлиенте
Процедура Загрузить(Команда)
Двоичное = Новый ДвоичныеДанные(Объект.FaylExcel);
Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
ЗагрузитьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура СоздДокумНаСервере()
НовыйДок = Документы.РеализацияТоваровИУслуг.СоздатьДокумент();
ТабЧастьДока=НовыйДок.Товары;
НовыйДок.Дата= ТекущаяДата();
НовыйДок.Склад = Справочники.Склады.НайтиПоНаименованию("Основной");
СтокаТабличнойЧасти=НовыйДок.Товары.Добавить();
Для Каждого Стр Из Таблица Цикл
СтокаТабличнойЧасти.Наименование = ТаблицаНаименованиеТовара;
СтокаТабличнойЧасти.Количество = ТаблицаКолич;
СтокаТабличнойЧасти.Цена = ТаблицаЦена;
КонецЦикла;
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
&НаКлиенте
Процедура СоздДокум(Команда)
СоздДокумНаСервере();
КонецПроцедуры
Прикрепленные файлы:
По теме из базы знаний
- Загрузка и создание номенклатуры из Excel, и создание документа Поступление товаров и услуг. УТ 11, Розница 2 и ERP Управление предприятием 2
- Загрузка (импорт) из Эксель в 1С: Розница 2 (2.1, 2.2, 2.3) поступлений ТМЦ
- Загрузка из Excel в Розницу 2.3 Приходной накладной
- Шаблон загрузки таблицы из Excel
- Несколько альтернативных универсальных способов подбора ссылок при переносах данных
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Надо так:
&НаСервере
Процедура СоздДокумНаСервере()
НовыйДок = Документы.РеализацияТоваровИУслуг.СоздатьДокумент();
ТабЧастьДока=НовыйДок.Товары;
НовыйДок.Дата= ТекущаяДата();
НовыйДок.Склад = Справочники.Склады.НайтиПоНаименованию("Основной");
СтокаТабличнойЧасти=НовыйДок.Товары.Добавить();
Для Каждого Стр Из Таблица Цикл
СтокаТабличнойЧасти.Наименование = стр.ТаблицаНаименованиеТовара;
СтокаТабличнойЧасти.Количество = стр.ТаблицаКолич;
СтокаТабличнойЧасти.Цена = стр.ТаблицаЦена;
КонецЦикла;
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
Показать
(1)
(3) нет, не верно. Вы обращаетесь к ТаблицаНаименованиеТовара - а надо к НаименованиеТовара. Надо так:
это первое.
Второе: вы создаёте строку ТЧ и в неё в цикле пишите прочитанные строки:
В итоге у вас получится одна последняя строка. Добавлять надо тоже в цикле:
(3) нет, не верно. Вы обращаетесь к ТаблицаНаименованиеТовара - а надо к НаименованиеТовара. Надо так:
Для Каждого Стр Из Таблица Цикл
СтокаТабличнойЧасти.Наименование = Стр.НаименованиеТовара;
СтокаТабличнойЧасти.Количество = Стр.Колич;
СтокаТабличнойЧасти.Цена = Стр.Цена;
КонецЦикла;
это первое.
Второе: вы создаёте строку ТЧ и в неё в цикле пишите прочитанные строки:
СтокаТабличнойЧасти=НовыйДок.Товары.Добавить();
В итоге у вас получится одна последняя строка. Добавлять надо тоже в цикле:
Для Каждого Стр Из Таблица Цикл
СтокаТабличнойЧасти=НовыйДок.Товары.Добавить();
СтокаТабличнойЧасти.Наименование = Стр.НаименованиеТовара;
СтокаТабличнойЧасти.Количество = Стр.Колич;
СтокаТабличнойЧасти.Цена = Стр.Цена;
КонецЦикла;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот