Помощь - Поиск - Пользователи - Календарь
Полная версия: Выгрузка в excel
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 7.7" > (7.7) Форум по общим вопросам "1С:Предприятие 7.7"
Stud
Добрый день.

Я сам не программер вот и поэтому пришел на Ваш форум надеясь на помощь.
Есть несколько вопросов, но начну с того который меня больше всего интересует.
Мне как-то писали модуль прайса выгрузки данных с 1с 7.7 ТС в excel.
Проблема в том что при выгрузке Наименования групп и подгрупп не выгружаются в excel, а ячейки просто остаются пустыми.
Хотелось бы как то это поправить и чтобы групы и подгруппы были залиты разным цветом.

Зараннее спасибо! Надеюсь на Вашу помощь
WaRDeR
Начнем с этого: /index.php?act=announce&id=8
Цитата
Я сам не программер

если и не планируется им быть, то рекомендую сразу заказать доработку и не нагружать мозг (за 2 дня 1С не освоишь.... да и за 2 недели тоже)
Потом, хотелось бы видеть хоть кусочек кода который не работает.
Цитата
и чтобы групы и подгруппы были залиты разным цветом

Для этого просто нужно записать макрос в Экселе, а потом используя его код дописать обработку 1С.
Stud

Предупреждение!!


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



Код
Процедура СформироватьЭксель()

// хоть одна цена в списке цен должна быть выбрана (но не более одной)
ВыбТипЦен = 0;
счетчик = 0;

Для СчетчикЦикла = 1 По ТипыЦен.РазмерСписка() Цикл
Если ТипыЦен.Пометка(СчетчикЦикла) = 1 Тогда
ВыбТипЦен = ТипыЦен.ПолучитьЗначение(СчетчикЦикла);
счетчик = счетчик + 1;
КонецЕсли;
КонецЦикла;

Если ПустоеЗначение(ВыбТипЦен) = 1 Тогда
Предупреждение("Не выбрано ни одного типа цены", 60);
Возврат;
КонецЕсли;

Если счетчик > 1 Тогда
Предупреждение("Выбрано более одного типа цен.");
Возврат;
КонецЕсли;

Расшифровка = СоздатьОбъект("СписокЗначений");

// Все настройки помещаем в список
Расшифровка.Установить("ДатаОтчета", ДатаОтчета);
Расшифровка.Установить("ВыбТМЦ", ВыбТМЦ);
Расшифровка.Установить("ПоНаличию" , ПоНаличию);
Расшифровка.Установить("ВидРазделителя", ВидРазделителя);
Расшифровка.Установить("ВыбРазделитель1", ВыбРазделитель1);
Расшифровка.Установить("ВыбРазделитель2", ВыбРазделитель2);
Расшифровка.Установить("ВыбРазделитель3", ВыбРазделитель3);
Расшифровка.Установить("Склад", Склад);
Расшифровка.Установить("ВариантВключенияВпрайс", ВариантВключенияВпрайс);
Расшифровка.Установить("ТипыЦен", СформироватьСписокПомеченных());

глПриСменеСтрокиТаблицыМФ(1,ТекСтрокаВТаблице,Контекст); // записываем изменения если они были

// Запомним МФ только если он задан
Если глМножественныйФильтрЗадан(ТаблицаМФ) = 1 Тогда
Расшифровка.Установить("ТаблицаМФ", ТаблицаМФ);
КонецЕсли;

ЦенаРассчитывается = ВыбТипЦен.Рассчитывается;
БазовыйТипЦен = ВыбТипЦен.БазовыйТипЦен;
ФильтрТипаЦен = ?(ЦенаРассчитывается = 1, БазовыйТипЦен, ВыбТипЦен);

// текст запроса по выбранным ценам
ТекстЗапроса = "//{{ЗАПРОС(ОтборЦен)
|Период с ДатаОтчета по ДатаОтчета;
|Номенклатура = Справочник.Цены.Владелец;
|Цена = Справочник.Цены.ТекущийЭлемент;
|ЦенаСумма = Справочник.Цены.Цена;
|Валюта = Справочник.Цены.Валюта;
|Тип = Справочник.Цены.ТипЦен;
|Условие(Тип = ФильтрТипаЦен);
|Группировка Номенклатура Упорядочить По Номенклатура.Наименование;
|Группировка ЦенаСумма;
|Группировка Валюта;
|Группировка Тип;
|Без Итогов;
|";

Если ПоНаличию = 1 Тогда
ТекстЗапросаОстатков = "
|Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура;
|Количество = Регистр.ОстаткиТМЦ.Количество;
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура Без Групп;";

Если ВидРазделителя = 2 Тогда
Если ПустоеЗначение(ВыбРазделитель1) = 0 Тогда
// нужен фильтр по фирме
ТекстЗапросаОстатков = "Фирма = Регистр.ОстаткиТМЦ.Фирма;" +
ТекстЗапросаОстатков +
"Условие(Фирма = ВыбРазделитель1);";
КонецЕсли;
ИначеЕсли ВидРазделителя = 3 Тогда
Если ПустоеЗначение(ВыбРазделитель2) = 0 Тогда
// нужен фильтр по ЮрЛицу фирмы
ТекстЗапросаОстатков = "ЮрЛицо = Регистр.ОстаткиТМЦ.Фирма.ЮрЛицо;" +
ТекстЗапросаОстатков +
"Условие(ЮрЛицо = ВыбРазделитель2);";
КонецЕсли;
ИначеЕсли ВидРазделителя = 4 Тогда
Если ПустоеЗначение(ВыбРазделитель3) = 0 Тогда
// нужен фильтр по УпрАналитике фирмы
ТекстЗапросаОстатков = "УпрАналитика = Регистр.ОстаткиТМЦ.Фирма.УпрАналитика;" +
ТекстЗапросаОстатков +
"Условие(УпрАналитика = ВыбРазделитель3);";
КонецЕсли;
КонецЕсли;

Если ПустоеЗначение(Склад) = 0 Тогда
// нужен фильтр по складу
ТекстЗапросаОстатков = "Скл = Регистр.ОстаткиТМЦ.Склад;" +
ТекстЗапросаОстатков +
"Условие(Скл = Склад);";
КонецЕсли;

ЗапросПоОстаткам = СоздатьОбъект("Запрос");

Если ЗапросПоОстаткам.Выполнить(ТекстЗапросаОстатков) = 0 Тогда
Возврат;
КонецЕсли;

СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
Пока ЗапросПоОстаткам.Группировка(1) = 1 Цикл
Если ЗапросПоОстаткам.КоличествоКонОст > 0 Тогда
СписокНоменклатуры.ДобавитьЗначение(ЗапросПоОстаткам.Номенклатура);
КонецЕсли;
КонецЦикла;

// Добавим услуги и работы в список номенклатуры
ВидыУслуг = СоздатьОбъект("СписокЗначений");
ВидыУслуг.ДобавитьЗначение(Перечисление.ВидыНоменклатуры.Услуга);
ВидыУслуг.ДобавитьЗначение(Перечисление.ВидыНоменклатуры.Работа);

ТекстЗапросаУслуг = "
|Номенклатура = Справочник.Цены.Владелец;
|Группировка Номенклатура;
|Условие (Номенклатура.ВидНоменклатуры в ВидыУслуг);";

ЗапросПоУслугам = СоздатьОбъект("Запрос");
Если ЗапросПоУслугам.Выполнить(ТекстЗапросаУслуг) = 0 Тогда
Возврат;
КонецЕсли;

Пока ЗапросПоУслугам.Группировка(1) = 1 Цикл
СписокНоменклатуры.ДобавитьЗначение(ЗапросПоУслугам.Номенклатура);
КонецЦикла;

Если СписокНоменклатуры.РазмерСписка() = 0 Тогда
Предупреждение("Заданным условиям фильтра не удовлетворяет ни одна позиция номенклатуры.",60);
Возврат;
КонецЕсли;

ТекстЗапроса = ТекстЗапроса + "Условие(Номенклатура в СписокНоменклатуры);"
КонецЕсли;

// Добавим отбор по флагу включения в прайс
Если ВариантВключенияВпрайс > 1 Тогда
ТекстЗапроса = ТекстЗапроса + "НеВключатьВпрайс = Справочник.Цены.Владелец.НеВключатьВпрайс;";

Если ВариантВключенияВпрайс = 2 Тогда
ТекстЗапроса = ТекстЗапроса + "Условие(НеВключатьВпрайс = 0);";
Иначе
ТекстЗапроса = ТекстЗапроса + "Условие(НеВключатьВпрайс = 1);";
КонецЕсли;

КонецЕсли;

НетОш = 1; // нет ошибок при наложении фильтров
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Номенклатура", ВыбТМЦ, "ВыбТМЦ", ТекстЗапроса, , "СвойстваНоменклатуры");
Запрос = СоздатьОбъект("Запрос");

Если НетОш = 0 Тогда
Возврат;
КонецЕсли;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

Процент = ВыбТипЦен.Процент;
ПорядокОкругления = ВыбТипЦен.ПорядокОкругления;
Валюта = ВыбТипЦен.Валюта;
Путь = "";
ИмяФайла = "";
РасположениеФайла(Путь, ИмяФайла);
ФайлОтчета = Путь + ИмяФайла;
ШаблонЭкселя = Лев(ФайлОтчета, СтрДлина(ФайлОтчета) - 3) + "xls";
ФайлЭкселя = Путь + "Прайс.xls";
ФС.КопироватьФайл(Путь + "ПечатьПрайсаЭксель.xls", ФайлЭкселя, 0);
Эксель = СоздатьОбъект("Excel.Application");
Книга = Эксель.Workbooks.Open(ФайлЭкселя);
Лист = Книга.Sheets(1);
спрОписание = СоздатьОбъект("Справочник.Описание");

//получим оформление группы
номстр = 10;

Пока номстр > 0 Цикл

Если ПустоеЗначение(Лист.Cells(номстр, 2).Value) = 1 Тогда
номстр = номстр - 1;
Иначе
прервать;
КонецЕсли;

КонецЦикла;

ЯчейкаНоменклатуры = Лист.Cells(номстр, 2);
Шрифт = ЯчейкаНоменклатуры.Font;
сзШрифт = СоздатьОбъект("СписокЗначений");
сзШрифт.Установить("Size", Шрифт.Size);
сзШрифт.Установить("Name", Шрифт.Name);
сзШрифт.Установить("FontStyle", Шрифт.FontStyle);
тз = 0;
Запрос.Выгрузить(тз);

Если ПустоеЗначение(тз) = 1 Тогда
Предупреждение("Нет данных.");
Возврат;
КонецЕсли;

Цена = 0;
тз.ВыбратьСтроки();
тз.ПолучитьСтроку();

Пока тз.ПолучитьСтроку() = 1 Цикл
ТекЭлем = тз.Номенклатура;
Наименование = СокрЛП(ТекЭлем.ПолнНаименование);
ЯчейкаНоменклатуры = Лист.Cells(номстр, 2);
ЯчейкаНоменклатуры.Value = Наименование;
ЭтоГруппа = ТекЭлем.ЭтоГруппа();

Если ЭтоГруппа = 0 Тогда

Если ЦенаРассчитывается = 1 Тогда
глВернутьЦену(ТекЭлем, ВыбТипЦен, ДатаОтчета, Цена, , Валюта);
Иначе
Цена = тз.ЦенаСумма;
КонецЕсли;

Цена = глОкруглить(Цена, ПорядокОкругления);
Цена = глФРМ(Цена, Валюта);
спрОписание.ИспользоватьВладельца(ТекЭлем);
спрОписание.ВыбратьЭлементы();
Комментарий = ТекЭлем.Комментарий;

Если ПустоеЗначение(Комментарий) = 0 Тогда
ЯчейкаНоменклатуры.AddComment();
ЯчейкаНоменклатуры.Comment.Text(Комментарий);
КонецЕсли;

Лист.Cells(номстр, 3).Value = Цена;
Лист.Cells(номстр, 4).Value = ТекЭлем.Код;

Если спрОписание.ПолучитьЭлемент() = 1 Тогда
Лист.Cells(номстр, 5).Value = спрОписание.1;
Лист.Cells(номстр, 6).Value = спрОписание.2;
Лист.Cells(номстр, 7).Value = спрОписание.3;
Лист.Cells(номстр, 8).Value = спрОписание.4;
Лист.Cells(номстр, 9).Value = спрОписание.5;
КонецЕсли;

Иначе
Шрифт = ЯчейкаНоменклатуры.Font;
Шрифт.Size = сзШрифт.Получить("Size");
Шрифт.Name = сзШрифт.Получить("Name");
Шрифт.FontStyle = сзШрифт.Получить("FontStyle");
КонецЕсли;

номстр = номстр + 1;
КонецЦикла;

WaRDeR
Цитата
Проблема в том что при выгрузке Наименования групп и подгрупп не выгружаются в excel, а ячейки просто остаются пустыми.

Проблема скорее всего в этой строке:
Код
Наименование = СокрЛП(ТекЭлем.ПолнНаименование);

Проверяйте отладчиком.

По второму вопросу уже отвечал.
Stud
Цитата(WaRDeR @ 2.2.2009, 20:01) *

Проблема скорее всего в этой строке:
Код
Наименование = СокрЛП(ТекЭлем.ПолнНаименование);


Проверяйте отладчиком.

По второму вопросу уже отвечал.


Спасибо за оперативный ответ. Буду пробовать
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.