7.7 Выгрузка в excel

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем Stud, 2 фев 2009.

  1. TopicStarter Overlay
    Stud
    Offline

    Stud

    Регистрация:
    2 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Добрый день.

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

    Зараннее спасибо! Надеюсь на Вашу помощь
  2. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Начнем с этого: http://www.1c-pro.ru/index.php?act=announce&id=8
    если и не планируется им быть, то рекомендую сразу заказать доработку и не нагружать мозг (за 2 дня 1С не освоишь.... да и за 2 недели тоже)
    Потом, хотелось бы видеть хоть кусочек кода который не работает.
    Для этого просто нужно записать макрос в Экселе, а потом используя его код дописать обработку 1С.
  3. TopicStarter Overlay
    Stud
    Offline

    Stud

    Регистрация:
    2 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    [warn="Предупреждение!!"]
    Во-первых, пользуемся тегами, уважаем других форумчан, которые пытаются вам помочь.
    Во-вторых, не думаю, что у кого-то есть желание читать эту кучу кода.... конкретнее пожалуйста.
    [/warn]

    Код:
    Процедура СформироватьЭксель()
    
    // хоть одна цена в списке цен должна быть выбрана (но не более одной)
    ВыбТипЦен = 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;
    КонецЦикла;
    
    
  4. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Проблема скорее всего в этой строке:
    Код:
    Наименование = СокрЛП(ТекЭлем.ПолнНаименование);
    
    Проверяйте отладчиком.

    По второму вопросу уже отвечал.
  5. TopicStarter Overlay
    Stud
    Offline

    Stud

    Регистрация:
    2 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Спасибо за оперативный ответ. Буду пробовать

Поделиться этой страницей