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

Загрузка данные из excel в ТЗ

Автор maxxi, 05 авг 2024, 20:31

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

maxxi

Максим75, у меня тзБонусы ТЗ.

maxxi

Цитата: Максим75 от 06 авг 2024, 08:26maxxi, смотрите, Вы же в тзБонусы добавляете строки из файла.
выгрузите из тзБонусы в таблицу значений и передайте эту таблицу значений в качестве параметра ТЧ в запрос, главное с типами разберитесь, чтобы запрос скушал.
у Вас же тзБонусы - скорее всего на форме табличная часть или что-то в этом роде.

Думаю в предпоследьной фото я так и сделал.

Максим75

maxxi, смотрите, Вы когда файл эксель загружаете, то заполняете эту тзБонусы, а потом ее же еще раз загружаете, но уже результатом запроса.
Вы читайте файл, загрузите данные файла в таблицу значений, передайте эту таблицу значений в параметр запроса, потом уже обработайте запрос.

maxxi

Максим75, сделал как вы написали

maxxi

Максим75, заработал код  спасибо большое.
Теперь другая проблема:
{(50, 42)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
ПО вт_Продажи.ТоварРодитель.Наименование <<?>>= вт_Excel.Категория

Максим75

maxxi, давайте сам текст запроса.
и что в вт_Excel.Категория хранится? что за тип данных?

maxxi

Максим75,
/////////////////////Запрос////////////////////////////////////////////////////////

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

&НаСервере
Процедура СформироватьНаСервере()

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Сотрудник КАК Сотрудник,
| Продажи.Товар.Родитель КАК ТоварРодитель,
| СУММА(ВЫБОР
| КОГДА Продажи.Товар.Измерение.Наименование = ""Кг""
| ТОГДА Продажи.Количество / Продажи.Товар.УпкКоличество
| ИНАЧЕ Продажи.Количество
| КОНЕЦ) КАК Количество,
| Продажи.Товар.УпкКоличество КАК ТоварУпкКоличество,
| Продажи.Товар.Измерение КАК ТоварИзмерение
|ПОМЕСТИТЬ вт_Продажи
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор ССЫЛКА Документ.Расход_В_МногоВалюта
| И Продажи.Регистратор.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Нач, ДЕНЬ) И КОНЕЦПЕРИОДА(&Кон, ДЕНЬ)
| И Продажи.Филиал = &Филиал
| И Продажи.Товар В ИЕРАРХИИ(&Товар)
|
|СГРУППИРОВАТЬ ПО
| Продажи.Сотрудник,
| Продажи.Товар.Родитель,
| Продажи.Товар.УпкКоличество,
| Продажи.Товар.Измерение
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТЧ.Категория КАК Категория,
| ТЧ.Plan1 КАК Plan1,
| ТЧ.Plan2 КАК Plan2,
| ТЧ.BonusSumma КАК BonusSumma
|ПОМЕСТИТЬ вт_Excel
|ИЗ
| &ТЧ КАК ТЧ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| вт_Продажи.Сотрудник КАК Сотрудник,
| вт_Продажи.ТоварРодитель  КАК ТоварРодитель,
| СУММА(вт_Продажи.Количество) КАК Количество,
| вт_Excel.Plan1 КАК Plan1,
| вт_Excel.Plan2 КАК Plan2,
| вт_Excel.BonusSumma КАК BonusSumma
|ПОМЕСТИТЬ вт_ПродажиExcel
|ИЗ
| вт_Продажи КАК вт_Продажи
| ЛЕВОЕ СОЕДИНЕНИЕ вт_Excel КАК вт_Excel
| ПО вт_Продажи.ТоварРодитель.Наименование = вт_Excel.Категория
|
|СГРУППИРОВАТЬ ПО
| вт_Продажи.Сотрудник,
| вт_Продажи.ТоварРодитель,
| вт_Excel.Plan1,
| вт_Excel.Plan2,
| вт_Excel.BonusSumma
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| вт_ПродажиExcel.Сотрудник КАК Сотрудник,
| вт_ПродажиExcel.ТоварРодитель КАК ТоварРодитель,
| СУММА(вт_ПродажиExcel.Количество) КАК Количество,
| вт_ПродажиExcel.Plan1 КАК Plan1,
| вт_ПродажиExcel.Plan2 КАК Plan2,
| вт_ПродажиExcel.BonusSumma КАК BonusSumma,
| СУММА(вт_ПродажиExcel.Plan2 - вт_ПродажиExcel.Plan1) КАК сто_процент,
| СУММА(вт_ПродажиExcel.Количество - вт_ПродажиExcel.Plan1) КАК ПланПродажи
|ПОМЕСТИТЬ вт_ПродажиExcel1
|ИЗ
| вт_ПродажиExcel КАК вт_ПродажиExcel
|
|СГРУППИРОВАТЬ ПО
| вт_ПродажиExcel.Сотрудник,
| вт_ПродажиExcel.ТоварРодитель,
| вт_ПродажиExcel.Plan1,
| вт_ПродажиExcel.Plan2,
| вт_ПродажиExcel.BonusSumma
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| вт_ПродажиExcel1.Сотрудник КАК Сотрудник,
| вт_ПродажиExcel1.ТоварРодитель КАК ТоварРодитель,
| СУММА(вт_ПродажиExcel1.Количество) КАК Количество,
| вт_ПродажиExcel1.Plan1 КАК Plan1,
| вт_ПродажиExcel1.Plan2 КАК Plan2,
| вт_ПродажиExcel1.BonusSumma КАК BonusSumma,
| СУММА(вт_ПродажиExcel1.сто_процент) КАК сто_процент,
| СУММА(ВЫРАЗИТЬ(вт_ПродажиExcel1.ПланПродажи КАК ЧИСЛО(15, 0))) КАК ПланПродажи,
| СУММА(вт_ПродажиExcel1.ПланПродажи * 100 / вт_ПродажиExcel1.сто_процент) КАК Процент
|ПОМЕСТИТЬ вт_ПродажиExcel2
|ИЗ
| вт_ПродажиExcel1 КАК вт_ПродажиExcel1
|
|СГРУППИРОВАТЬ ПО
| вт_ПродажиExcel1.Сотрудник,
| вт_ПродажиExcel1.ТоварРодитель,
| вт_ПродажиExcel1.Plan1,
| вт_ПродажиExcel1.Plan2,
| вт_ПродажиExcel1.BonusSumma
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| вт_ПродажиExcel2.Сотрудник КАК Сотрудниклар,
| вт_ПродажиExcel2.ТоварРодитель КАК Категория,
| СУММА(ВЫРАЗИТЬ(вт_ПродажиExcel2.Количество КАК ЧИСЛО(15, 0))) КАК СотувКоличество,
| вт_ПродажиExcel2.Plan1 КАК Plan1,
| вт_ПродажиExcel2.Plan2 КАК Plan2,
| вт_ПродажиExcel2.BonusSumma КАК BonusSumma,
| вт_ПродажиExcel2.сто_процент КАК сто_процент,
| вт_ПродажиExcel2.ПланПродажи КАК ПланПродажи,
| ВЫРАЗИТЬ(вт_ПродажиExcel2.Процент КАК ЧИСЛО(15, 1)) КАК Процент,
| СУММА(ВЫРАЗИТЬ(вт_ПродажиExcel2.Процент * вт_ПродажиExcel2.BonusSumma / 100 КАК ЧИСЛО(15, 0))) КАК Bonus
|ИЗ
| вт_ПродажиExcel2 КАК вт_ПродажиExcel2
|
|СГРУППИРОВАТЬ ПО
| вт_ПродажиExcel2.Сотрудник,
| вт_ПродажиExcel2.ТоварРодитель,
| вт_ПродажиExcel2.Plan1,
| вт_ПродажиExcel2.Plan2,
| вт_ПродажиExcel2.BonusSumma,
| вт_ПродажиExcel2.Процент,
| вт_ПродажиExcel2.ПланПродажи,
| вт_ПродажиExcel2.сто_процент
|ИТОГИ ПО
| Сотрудниклар";
///////////////////////////////////////////////////////////////////////

Запрос.УстановитьПараметр("Нач", Нач);
Запрос.УстановитьПараметр("Кон", КонецДня(Кон));
Запрос.УстановитьПараметр("Булинма",Булинма);
Запрос.УстановитьПараметр("Филиал",Филиал);
Запрос.УстановитьПараметр("ТЧ", тз.Бонусы.Выгрузить());
Запрос.УстановитьПараметр("Товар", Товар);

///////////////////////////////////////////////////////////////////////

РезультатЗапроса = Запрос.Выполнить();

Выборка= РезультатЗапроса.Выбрать();

тз.Бонусы.Очистить();

Пока Выборка.Следующий() Цикл

ТабЗнач=тз.Бонусы.Добавить();

ТабЗнач.Сотрудниклар=Выборка.Сотрудниклар;

ТабЗнач.Категория=Выборка.Категория;

ТабЗнач.Plan1=Выборка.Plan1;

ТабЗнач.Plan2=Выборка.Plan2;

ТабЗнач.BonusSumma=Выборка.BonusSumma;

КонецЦикла;

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

/////////////////////Файлни укиш///////////////////////////////////////////////////

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

тз.Бонусы.Очистить();

Если ФорматФайла="XLSX" Тогда

ПрочитатьФайл_XLS();

КонецЕсли;

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

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

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

Данные= ПолучитьИзВременногоХранилища(АдресДанных);

ПутьКФайлуНаСервере=ПолучитьИмяВременногоФайла("xlsx");

Данные.Записать(ПутьКФайлуНаСервере);

Попытка

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

Исключение

Сообщение= Новый СообщениеПользователю;

Сообщение.Текст="Файл не найден" + ОписаниеОшибки();

Сообщение.Сообщить();

Возврат;

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

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

Для НомерСтроки=1 По КоличествоСтрок Цикл

СтрокаДанных=тз.Бонусы.Добавить();

//СтрокаДанных.Сотрудник=Справочники.Сотрудники.НайтиПоНаименованию(ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки,"ЧГ=0") + "C"+1).ТекущаяОбласть.Текст);

СтрокаДанных.Категория=ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки,"ЧГ=0") + "C"+2).ТекущаяОбласть.Текст;

СтрокаДанных.Plan1=ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки,"ЧГ=0") + "C"+3).ТекущаяОбласть.Текст;

СтрокаДанных.Plan2=ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки,"ЧГ=0") + "C"+4).ТекущаяОбласть.Текст;

СтрокаДанных.BonusSumma=ТабДок.ПолучитьОбласть("R" + Формат(НомерСтроки,"ЧГ=0") + "C"+5).ТекущаяОбласть.Текст;

КонецЦикла;

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


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

ДанныеФайла= Новый ДвоичныеДанные(ПутьКФайлам);

АдресДанных=ПоместитьВоВременноеХранилище(ДанныеФайла,УникальныйИдентификатор);

ПрочитатьФайл_XLS_НаСервере(АдресДанных);

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

/////////////////////////Файлни очиш//////////////////////////////////////////////

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

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

Проводник.Заголовок="Файлни танланг:";

Если ФорматФайла="XLSX" Тогда

Фильтр="Файл Excel (*.xlsx)| *.xlsx";

Иначе

Возврат;

КонецЕсли;

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

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

Проводник.Показать(Оповещение);

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

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

Если ВыбранныеФайлы = Неопределено  Тогда

Возврат;

КонецЕсли;

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

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

//////////////////////////////////////////////////////////////////////////////////

Максим75

maxxi, так Вы вначале запрос выполняете, а потом файлы читаете. конечно у Вас сразу тз.Бонусы.Выгрузить() выгружает хрен знает что.

ну и в самом тз.Бонусы посмотрите, какой тип у Категории, чтобы там строка неопределенной длины не была.
и у ТоварРодитель.Наименование какой тип, чтобы тоже не была строка неопределенной длины.

Теги:

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

Рейтинг@Mail.ru

Поиск