Как сформировать отчет СКД без проверки прав (в привилегированном режиме)? Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав!
Особенно если настроен RLS
Есть несколько способов как это сделать: 1. Установить привилегированный режим в модуле отчета
Форма отчета должна быть Управляемой, далее в модуле отчета процедура обработчика «При компоновке результата»:
Код 1C v 8.3
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
УстановитьПривилегированныйРежим( Истина ) ;
СформироватьОтчет( ДокументРезультат, ДанныеРасшифровки) ;
УстановитьПривилегированныйРежим( Ложь ) ;
КонецПроцедуры
2. Формирование в п ривилегированном режиме через Общий модуль с галкой Привелигерованный
Создаем общий модуль
так же как в пункте 1 в обработчике «При компоновке результата» пишем:
Код 1C v 8.3
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
МЕ_ДляОтчетаСКД_ПривелРежим. СформироватьОтчетПривРеж( ДокументРезультат, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) ;
КонецПроцедуры
В общем модуле МЕ_ДляОтчетаСКД_ПривелРежим код:
Код 1C v 8.3 Процедура СформироватьОтчетПривРеж(ТабличныйДокумент, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) Экспорт
ТабличныйДокумент. Очистить( ) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета. Выполнить( СхемаКомпоновкиДанных, КомпоновщикНастроек. Настройки, ДанныеРасшифровки, , , Ложь ) ;
ВнешниеНаборыДанных = Новый Структура;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ТабличныйДокумент) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных) ;
КонецПроцедуры
3. Если включен режим Использовать ограничение на уровне прав доступа - RLS
Часто используется в типовых. Тут в модуле для текущего пользователя можно на время формирования отчету установить параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей в Ложь и RLS не сработает.
Код 1C v 8.3 ПараметрыСеанса. ИспользоватьОграниченияПравДоступаНаУровнеЗаписей= Ложь ;
После завершения формирования, не забудьте включить rls обратно установив = Истина
4. Если в запросе используется конструкция вида регистратор.дата и это поле не отображается в полях отчета СКД
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
Код 1C v 8.3
ВЫРАЗИТЬ( ДокументыОплаты. Регистратор КАК Документ. ПлатежноеПоручениеВходящее) . СуммаДокумента
ВЫБОР
КОГДА РАЗНОСТЬДАТ( ВЫРАЗИТЬ( ВзаиморасчетыПоДокументам. ДокументРасчетовСКонтрагентом КАК Документ. ПоступлениеТоваровУслуг) . Дата, КонецПериода, ДЕНЬ) > ВзаиморасчетыПоДокументам. ДоговорКонтрагента. ДопустимоеЧислоДнейЗадолженности
ТОГДА ДОБАВИТЬКДАТЕ( ВЫРАЗИТЬ( ВзаиморасчетыПоДокументам. ДокументРасчетовСКонтрагентом КАК Документ. ПоступлениеТоваровУслуг) . Дата, ДЕНЬ, ВзаиморасчетыПоДокументам. ДоговорКонтрагента. ДопустимоеЧислоДнейЗадолженности)
ИНАЧЕ ДАТАВРЕМЯ( 1 , 1 , 1 )
КОНЕЦ КАК ДеньВозникновенияЗадолженности
В дополнении у пункту 1, код процедуры сформировать отчет(). Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах:
Код 1C v 8.3
Процедура СформироватьОтчет(ТабличныйДокумент, ДанныеРасшифровки)
УстановитьПривилегированныйРежим( Истина ) ;
ВосстановитьНастройкиВыводаЗаголовка( ) ;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ТабличныйДокумент. Очистить( ) ;
УстановитьПараметрыОтчета( ) ;
СохранитьНастройкиВыводаЗаголовка( ) ;
ВыводитьЗаголовок = ВыводитьЗаголовокОтчета( ) ;
Если ВыводитьЗаголовок Тогда
ПрисоединитьЗаголовокОтчетаКТабличномуДокументу( ТабличныйДокумент, ПолучитьТекстЗаголовкаОтчета( ) ) ;
НайденнаяНастройкаВыводаЗаголовка = КомпоновщикНастроек. Настройки. ПараметрыВывода. Элементы. Найти( "ВыводитьЗаголовок" ) ;
НайденнаяНастройкаВыводаЗаголовка. Значение = ТипВыводаТекстаКомпоновкиДанных. НеВыводить;
НайденнаяНастройкаВыводаЗаголовка. Использование = Истина ;
КонецЕсли ;
КопияДополнительныхНастроек = УстановитьДополнительныеНастройкиДляРасшифровки( ) ;
МакетКомпоновкиДанных = КомпоновщикМакета. Выполнить( СхемаКомпоновкиДанных, КомпоновщикНастроек. Настройки, ДанныеРасшифровки) ;
ВнешниеНаборыДанных = Новый Структура;
ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных( ) ;
ВнешниеНаборыДанных. Вставить( "ТаблицаВнешнегоНабораДанных" , ТаблицаВнешнегоНабораДанных) ;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки) ;
ВывестиРезультатКомпоновкиСАвтофиксациейСтрок( ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки. Элементы, , , КоличествоФиксируемыхСтолбцов) ;
ДополнительнаяОбработкаРезультатаОтчета( ТабличныйДокумент) ;
Если ВыводитьЗаголовок Тогда
ВосстановитьНастройкиВыводаЗаголовка( ) ;
КонецЕсли ;
Для Каждого ЭлементСтруктуры Из КопияДополнительныхНастроек Цикл
КомпоновщикНастроек. Настройки. ДополнительныеСвойства. Вставить( ЭлементСтруктуры. Ключ, ЭлементСтруктуры. Значение) ;
КонецЦикла ;
ОчиститьСохраненныеНастройкиВыводаЗаголовка( ) ;
УстановитьВидимостьЗаголовкаОтчета( ТабличныйДокумент) ;
УстановитьВидимостьПараметровОтчета( ТабличныйДокумент) ;
УстановитьПривилегированныйРежим( Ложь ) ;
КонецПроцедуры
Категория:
Схема Компоновки Данных СКД Внешний источник данных, грузим из ТЗ и далее получаем остатки на каждый документ Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который используюет в себе вложенные запросы и объединения внутренние и полные и т.д. - в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение...
Решения возможны следующие:
Изменить запрос в СКД Сформировать запрос обычным способом и подставить эти данные в СКД как внешние Рассмотрим последний вариант:
Внешний источник данных, грузим из ТЗ Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах.
В модуле объекта уже есть функция
Код 1C v 8.2 УП Функция ПолучитьТаблицуВнешнегоНабораДанных()
Возврат Новый ТаблицаЗначений;
КонецФункции
установим в ней наш запрос, получается примерно так:
Код 1C v 8.2 УП
Функция ПолучитьТаблицуВнешнегоНабораДанных()
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ВложенныйЗапрос.Регистратор КАК ДокРеал,
| ВложенныйЗапрос.Регистратор.Доставка КАК ДокДоставка
|ПОМЕСТИТЬ ОплаченнаяРеализация
|ИЗ
| (ВЫБРАТЬ
| ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОбороты.Регистратор КАК Регистратор
/////// Огромный запрос .......
| СГРУППИРОВАТЬ ПО
| ДоставкаПромежуточнаяНакладная.Ссылка,
| ДоставкаПромежуточнаяНакладная.Ссылка.Счет,
| ДоставкаПромежуточнаяНакладная.Ссылка.ВыставленоКлиенту,
| ИздержкиРаспределенныеНеНаОП.РаспределеннаяИздержка,
| ДоставкаПромежуточнаяНакладная.Ссылка.СтоимостьПрайс + ДоставкаПромежуточнаяНакладная.Ссылка.ЗатратыПриДоставке) КАК ДанныеПоДоставкам
| ПО ДанныеПоРеализации.ДокументПродажи.Доставка = ДанныеПоДоставкам.ДокДоставка" ;
Запрос. УстановитьПараметр( "КонецПериода" , НастройкаПериода. ДатаОкончания) ;
Запрос. УстановитьПараметр( "НачалоПериода" , НастройкаПериода. ДатаНачала) ;
Запрос. УстановитьПараметр( "НачалоПериодаМинусГод" , НастройкаПериода. ДатаНачала- ( 86400 * 365 ) ) ;
Результат = Запрос. Выполнить( ) ;
Выборка = Результат. Выгрузить( ) ;
Возврат Выборка;
КонецФункции
Ниже в коде происходит установка внешних данных из нашей ТЗ с именем ТаблицаВнешнегоНабораДанных
Код 1C v 8.2 УП
ВнешниеНаборыДанных = Новый Структура;
ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных( ) ;
ВнешниеНаборыДанных. Вставить( "ТаблицаВнешнегоНабораДанных" , ТаблицаВнешнегоНабораДанных) ;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки) ;
ВывестиРезультатКомпоновкиСАвтофиксациейСтрок( ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки. Элементы, , , КоличествоФиксируемыхСтолбцов) ;
В самой компоновке добавляем набор Объект с именем ТаблицаВнешнегоНабораДанных и перечисляем поля, которые будут использоваться в отчете:
Как я уже говорил выше, далее нам необходимо получить остатки взаиморасчетов на дату документа:
Получение остатков на документ в СКД Набор данных Запрос - назвали его Остатки:
Теперь установим связи Запроса и Объекта
Остатки нужно получать на дату документа и по контрагенту
Далее, если нужно, задайте вычисляемые поля, ресурсы, параметры и Настройте Список вывода...
Пример результата отчета:
Категория:
Схема Компоновки Данных Табличное поле ~ Расчет суммы при вводе количества и цены В событии ПриИзменении столбцов Цены и Количества автоматически рассчитывается Сумма, используя следующий код:
Код 1C v 8.х ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Сумма =
ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Цена * ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Количество;
А при изменении Суммы меняется Цена:
Код 1C v 8.х ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Цена = ? ( ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Количество> 0 ,
ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Сумма/ ЭтаФорма. ЭлементыФормы. Поступление. ТекущиеДанные. Количество, 0 ) ;
Категория:
Работа с Формой (Диалог) и её элементами Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х // Загрузка данных из Excel файла в ТаблицуЗначений
// Возвращает ТаблицуЗначений с данными
// ПутьДоExcel - путь до Excel файла
// НомерСтраницы - Номер страницы в Excel
// ПерСтрокаЗаголовок - первая строка Excel содержит имена столбцов
// ФормаИндикатора - Стандартная форма прогресса работы
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект(ПутьДоExcel);
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
ЗакрытьФормуИндиктаора = Ложь;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина;
ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.Открыть();
КонецЕсли;
ФормаИндикатора.КомментарийЗначения = "Загрузка данных из Excel...";
ТЗ = Новый ТаблицаЗначений();
Страница = Док.Sheets(НомерСтраницы);
МакСтрок = Страница.UsedRange.Rows.Count; // макс. колич. строк
МакСтолб = Страница.UsedRange.Columns.Count; // макс. колич. столбцов
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница.Cells(1,Столбец).Value;
ИмяСтолбца = СокрЛП(ИмяСтолбца);
ИмяСтолбца = СтрЗаменить(ИмяСтолбца," ","_");
КонецЕсли;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
НачальнаяСтрока = 1;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2;
КонецЕсли;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = НомСтрока/МакСтрок * 100;
КонецЦикла;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора.Закрыть();
КонецЕсли;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. НаименованиеОбработкиДанных = "Загрузка данных..." ;
ФормаИндикатора. Открыть( ) ;
ТЗ = ИзExcelВТаблицу( ФайлExcel, 1 , Истина , ФормаИндикатора) ;
Если ТЗ = Неопределено тогда
ФормаИндикатора. Закрыть( ) ;
Возврат ;
КонецЕсли ;
ФормаИндикатора. Закрыть( ) ;
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу( ФайлExcel) ;
Если ТЗ = Неопределено тогда
Возврат ;
КонецЕсли ;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
Функция ЭлементСправочника(ИмяСправочника = "" ,ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить( "Укажите имя спрачоника - ЭлементСправочника()" ) ;
Возврат Неопределено ;
КонецЕсли ;
Если ПустаяСтрока( ИмяЭлемента) тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = Неопределено ;
Если ИмяРодителя < > Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника]. ПустаяСсылка( ) ;
Пока НЕ ПустаяСтрока( ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти( ОбрабатИмяРодителя, "\\" ) ;
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред( ОбрабатИмяРодителя, 1 , ПозРазделителя- 1 ) ;
ОбрабатИмяРодителя = Сред( ОбрабатИмяРодителя, ПозРазделителя+ 2 ) ;
КонецЕсли ;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник." + ИмяСправочника+ " КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа" ;
ЗапросРодителя = Новый Запрос( ТексЗапроса) ;
ЗапросРодителя. УстановитьПараметр( "Родитель" , РодительГруппы) ;
ЗапросРодителя. УстановитьПараметр( "Наименование" , ИмяГруппы) ;
РезультатРодителя = ЗапросРодителя. Выполнить( ) . Выгрузить( ) ;
Если РезультатРодителя. Количество( ) < > 0 тогда
РодительГруппы = РезультатРодителя[0 ]. Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника]. СоздатьГруппу( ) ;
ОбъектРодитель. Родитель = РодительГруппы;
ОбъектРодитель. Наименование = ИмяГруппы;
ОбъектРодитель. Записать( ) ;
РодительГруппы = ОбъектРодитель. Ссылка;
КонецЕсли ;
КонецЦикла ;
Родитель = РодительГруппы;
КонецЕсли ;
Элемент = Справочники[ИмяСправочника]. НайтиПоНаименованию( ИмяЭлемента) ;
ОбъектЭлемент = Неопределено ;
Если Элемент. Пустая( ) тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника]. СоздатьЭлемент( ) ;
ОбъектЭлемент. Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли ;
Иначе
ОбъектЭлемент = Элемент. ПолучитьОбъект( ) ;
КонецЕсли ;
Если ОбъектЭлемент < > Неопределено тогда
Если Параметры < > Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр. Ключ] = СтрПараметр. Значение;
КонецЦикла ;
КонецЕсли ;
Если Родитель < > Неопределено тогда
ОбъектЭлемент. Родитель = Родитель;
КонецЕсли ;
ОбъектЭлемент. Записать( ) ;
Элемент = ОбъектЭлемент. Ссылка;
КонецЕсли ;
Возврат Элемент;
КонецФункции
Автор:
borismor Категория:
Работа с Microsoft Office и OpenOffice Значение параметра Extended Properties для разных версий MS Excel Параметр
Extended Properties=""Excel 8.0;" обозначает версию в котором сохранен файл
* 1997 год — Excel 97(8) — Microsoft Office 97
* 1999 год — Excel 2000 (9) — Microsoft Office 2000
* 2001 год — Excel 2002 (10) — Microsoft Office XP
* 2003 год — Excel 2003 (11) — Microsoft Office 2003
* 2007 год — Excel 2007 (12) — Microsoft Office 2007
* 2010 год — Excel 2010 (13) — Microsoft Office 2010
Примеры
Код 1C v 8.х
Conn= Новый COMОбъект( "ADODB.Connection" ) ;
Conn. ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Параметры. ИмяФайла+ ";
|Extended Properties="" Excel 8.0;" + ? ( Параметры. ЗаголовкиКолонокИменаСтолбцовExcel, "HDR=NO;" , "" ) + "IMEX=1;"" " ;
Conn. Open( ) ;
ТекстЗапроса= "S_elect
| *
|FROM [Лист1$]
// |INNER JOIN
// | ON
// |WHERE
// |GROUP BY
// | ORDER BY
|" ;
Результат= Conn. Execute( ТекстЗапроса) ;
Ссылки по теме:
V8 1С8.1 и Excel 2007 Категория:
Работа с Microsoft Office и OpenOffice Отправка отчетов из 1С по электронной почте (E-Mail) Автоматическая генерация отчета "Анализ заказов поставщикам"
Отчет анализ заказов является штатным отчетом конфигурации 1С Управление производственным предприятием. Обработка для генерации отчета, рассматриваемая в данной статье, позволяет программно создать и настроить форму отчета, запустить его выполнение. Полученный результат сохраняется в файл Microsoft Excel (XLS, XLSX) и может быть отправлен по электронной почте.
Предлагаемое решение состоит из трех файлов: Скачивать файлы может только зарегистрированный пользователь!
service.vbs служит для запуска 1С предприятия и генерации отчета;
emailer.vbs - VBS скрипт предназначен для отправки результатов выполнения запроса отчета на указанный при настройке адрес электронной почты;
rep_email.epf - сама внешняя обработка для генерации отчета, выполняющая настройки отображаемых показателей, группировок строк и
столбцов , установки требуемых отборов отчета, обеспечивает выполнение запроса и формирования табличного документа по макету отчета и сохранение сформированного отчета в XLS файл.
Запуск отчета выполняется посредством VBS файла (vbscript) при помощи "Назначенных заданий". VBS программа обеспечивает запуск приложения 1С, устанавливает соединение с сервером 1С и передает управление внешней обработке через экспортную функцию ReportNow(), размещенную в общем модуле обработки по генерации отчета. Пример VBS Script для выполнения внешней обработки 1С из командной строки:
Код VBS
Set v81 = CreateObject ("V81.Application" )
res = v81.Connect("Srvr=Server1C;Ref = db1C;Usr=User1C;Pwd=Password1C" )
res = v81.ExternalDataProcessors.Create("C:\1C\Service\rep_email.epf" ).ThisObject.Report()
v81.Exit (false )
WScript.Sleep(5000 )
Dim WshShell
Set WshShell = WScript.CreateObject ("WScript.Shell" )
WshShell.Run "C:\1C\ Service\emailer.vbs"
VBS E-Mail скрипт для отправки готового отчета в формате Excel создает новое электронное письмо на заданный адрес, в теле письма указывает пояснение к отчету, а в качестве вложения прикрепляет файл, создание и наполнение информацией которого была произведена при запуске service.vbs
Код VBS
Const cdoSendUsingPickup = 1
Const cdoSendUsingPort = 2
Const cdoAnonymous = 0
Const cdoBasic = 1
Const cdoNTLM = 2
Set objMessage = CreateObject ("CDO.Message" )
objMessage.Subject = "Ежедневный отчет Анализ заказов поставщикам"
objMessage.From = "" "Генератор отчетов" " "
objMessage.To = "email@domain.org; recv@domain.net; last@domain.ru"
objMessage.TextBody = "JSC AUTO SERVICE. Please find Orders reporting in attachment." & vbCRLF & _
"------------------------------------------" & vbCRLF & _
"Best regards, Auto report service" & vbCRLF & _
"Support line: it@domian.ru" & vbCRLF
objMessage.AddAttachment "C:\1C\Service\ЗаказыПоставщику.xls"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing" ) = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver" ) = "mail.domain.ru"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ) = cdoBasic
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername" ) = "report@domain.ru"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword" ) = "youpassword"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport" ) = 25
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl" ) = False
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout" ) = 60
objMessage.Configuration.Fields.Update
objMessage.Send
Внешняя обработка по запуску отчета "Анализ заказов поставщику" состоит из двух процедур. Первая - "ReportNow() Экспорт" служит для определения входной точки передачи управления от VBS к 1С. Вторая - "ОткрытьОтчетПоИмени()" - выполняет действия по настройке критериев отбора отчета, группировке строк и
столбцов , определению состава количественных показателей. Данный способ вызова отчетов стандартной конфигурации широко применяется в различных формах 1С, и по мере развития конфигурации может быть позаимствован как минимум из нескольких форм списка справочников (Контрагенты, Номенклатура и т.д.). Исходный код первой функции: >
Код 1C v 8.х Процедура ReportNow() Экспорт
ОткрытьОтчетПоИмени( "АнализЗаказовПоставщикам" ) ;
КонецПроцедуры
Сохранение отчета из 1С в Excel
Процедура формирования формы отчета принимает в качестве параметра название объекта метаданных конфигурации, в данном случае - "АнализЗаказовПоставщикам". Очевидно, что в зависимости от типа отчета процедура будет меняться пропорционально используемым реквизитам. В рассматриваемом примере добавляется отбор по контрагенту. Для своего ключевого поставщика заменить значение искомого наименования на нужное.
Код 1C v 8.х Процедура ОткрытьОтчетПоИмени(НазваниеОтчета) Экспорт
Отчет = Отчеты[НазваниеОтчета]. Создать( ) ;
Форма = Отчет. ПолучитьФорму( , , ) ;
Форма. Открыть( ) ;
Отчет. УстановитьНачальныеНастройки( ) ;
ТекОтбор = Отчет. УниверсальныйОтчет. ПостроительОтчета. Отбор. ДоговорКонтрагентаВладелец;
ТекОтбор. Использование = Истина ;
ТекОтбор. Значение = Справочники. Контрагенты. НайтиПоНаименованию( "Поставщик" ) ;
ТекОтбор. ВидСравнения = ВидСравнения. Равно;
Отчет. УниверсальныйОтчет. ПостроительОтчета. Отбор. Добавить( "ОсталосьОтгрузитьЕдиницОтчетов" ) ;
ТекОтбор1 = ОтчетОстатки. УниверсальныйОтчет. ПостроительОтчета. Отбор. ОсталосьОтгрузитьЕдиницОтчетов;
ТекОтбор1 . Использование = Истина ;
ТекОтбор1 . Значение = 0 ;
ТекОтбор1 . ВидСравнения = ВидСравнения. Больше;
Отчет. СостояниеОтгрузкиПоЗаказу = истина ;
Отчет. НеОтгружено = Истина ;
Отчет. ОтгруженоЧастично = Истина ;
Отчет. СформироватьОтчет( ФормаОтчета. ЭлементыФормы. ПолеТабличногоДокументаРезультат) ;
мПутьШаблон= "C:\1C\Service" ;
мФайлШаблон= "ЗаказыПоставщику.xls" ;
ИмяФайла = мПутьШаблон + "\" + мФайлШаблон;
Если Не ИмяФайла = Неопределено Тогда
Форма. ЭлементыФормы. ПолеТабличногоДокументаРезультат. СохранятьСвойстваОтображения = Истина ;
Форма. ЭлементыФормы. ПолеТабличногоДокументаРезультат. Записать( ИмяФайла, ТипФайлаТабличногоДокумента. XLS97) ;
КонецЕсли ;
ФормаОтчета. Закрыть( ) ;
КонецПроцедуры
Для того, чтобы отладить обработку в режиме 1С:Предприятие, запущенного из конфигуратора можно создать экранную форму обработки и разместить в ней следующую процедур автоматического запуска отлаживаемого отчета:
Код 1C v 8.х Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Отказ = истина ;
ОткрытьОтчетПоИмени( "АнализЗаказовПоставщикам" ) ;
КонецПроцедуры
Надеемся, что успешная комбинация внешней обработки для запуска отчета по расписанию и vbscript поможет в автоматизации бизнеса вашего предприятия. Данная редакция настроек больше ориентирована на менеджера поставщика для вашей компании, что отслеживать взаимное движение товаров и документов.
Источник
Руководство компании, хочет получать оперативную сводку продаж по фирме Категория:
Работа с Интернет, Почтой (Mail), FTP Табличное поле ~ Как зафиксировать колонки в табличном поле? Вопрос:
Можно ли зафиксировать несколько колонок в таблице так, чтобы при горизонтальной прокрутке они всегда были на экране, а прокручивались только остальные колонки?
Ответ:
Для этого у табличного поля существует свойство
Фиксация слева . В нем можно указать количество колонок в начале таблицы, которые не будут прокручиваться.
Также есть свойство
Фиксация справа, которое работает аналогичным образом.
Код 1C v 8.х //Установить программно фиксацию колонок для Табличного Поля, Части
ЭлементыФормы.ИмяТабличнойЧасти.ФиксацияСлева = 3; // 3 -количесво столбцов ;
// или
ЭлементыФормы.ИмяТабличнойЧасти.ФиксацияСправа = 3;
Категория:
Работа с Формой (Диалог) и её элементами Создание документа Word без использования макетов и пример создания таблицы и её оформление. Кроме прочего в статье присутствует пример создания таблицы с любым количеством колонок и
столбцов . Несколько строк с форматированием текста и таблицы. Создание "объединенных" ячеек.
В качестве примера использования можно указать вот такую ситуацию: в зависимости от типа клиента (договора, документа и т.п) формируются разные тексты договоров с разным количеством таблиц. В реальности, конечно должены использоваться и макет и описанные здесь динамические механизмы.
В моем примере я заранее создал новый пустой документ.
Тестировалось на Office 2007.
Исп. переменные: "ПутьКФайлу" - строка. Полное имя файла в формате MSWord.
"Ссылка" - ДокументСсылка (в моем случае - счет).
Вот текст модуля:
Код 1C v 8.х Процедура ВыполнитьОбработку() Экспорт
Попытка
Объект = ПолучитьCOMОбъект( ПутьКФайлу) ;
Объект. Application. Visible = 1 ;
Word = Объект. Application;
Doc = Объект. Application. Documents( 1 ) ;
Doc. Activate( ) ;
Text = Word. S_election;
Text. WholeStory( ) ;
Text. Delete( 1 , 1 ) ;
Text. TypeText( Символы. ВК) ;
Text. TypeText( Символы. ВК) ;
Text. TypeParagraph( ) ;
Text. TypeText( "Обычный текст, набранный первую очередь" ) ;
Text. HomeKey( , 1 ) ;
Text. Font. Bold = 9999998 ;
Text. Font. Size = 14 ;
Text. Font. Name = "Verdana" ;
Text. MoveUp( , 2 ) ;
Text. HomeKey( , 1 ) ;
Text. TypeText( "Обычный текст, набранный во вторую очередь" ) ;
Text. MoveDown( , 1 ) ;
Text. EndKey( ) ;
Text. TypeParagraph( ) ;
Text. ClearFormatting( ) ;
Position = Text. Range( ) ;
Table = Doc. Tables. Add( Position, 1 , 6 , 1 , 2 ) ;
Table. Columns( 1 ) . PreferredWidth= 10 ;
Table. Columns( 2 ) . PreferredWidth= 50 ;
Table. Columns( 3 ) . PreferredWidth= 10 ;
Table. Columns( 4 ) . PreferredWidth= 10 ;
Table. Columns( 5 ) . PreferredWidth= 10 ;
Table. Columns( 6 ) . PreferredWidth= 10 ;
Row1= Table. Rows( 1 ) ;
Row1. Cells( 1 ) . Range. Text= "№ п/п" ;
Row1. Cells( 2 ) . Range. Text= "Наименование" ;
Row1. Cells( 4 ) . Range. Text= "Кол-во" ;
Row1. Cells( 3 ) . Range. Text= "Ед. изм." ;
Row1. Cells( 5 ) . Range. Text= "Цена,руб." ;
Row1. Cells( 6 ) . Range. Text= "Сумма,руб." ;
НомерСтроки = 1 ;
Для каждого СтрокаТовары Из Ссылка. Товары Цикл
Row= Table. Rows. Add( ) ;
Row. Cells( 1 ) . Range. Text= НомерСтроки;
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 2 ) . Range. Text= СтрокаТовары. Номенклатура. Наименование
+ ? ( ЗначениеЗаполнено( СтрокаТовары. ХарактеристикаНоменклатуры) ,
" (" + СтрокаТовары. ХарактеристикаНоменклатуры+ ")" , "" ) ;
Row. Cells( 4 ) . Range. Text= Строка( СтрокаТовары. Количество) ;
Row. Cells( 4 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 3 ) . Range. Text= ? ( ЗначениеЗаполнено( СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения)
, СтрокаТовары. Номенклатура. БазоваяЕдиницаИзмерения. Наименование, "-" ) ;
Row. Cells( 3 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 5 ) . Range. Text= Формат( СтрокаТовары. Цена, "ЧДЦ=2" ) ;
Row. Cells( 5 ) . Range. ParagraphFormat. Alignment = 1 ;
Row. Cells( 6 ) . Range. Text= Формат( СтрокаТовары. Сумма, "ЧДЦ=2" ) ;
Row. Cells( 6 ) . Range. ParagraphFormat. Alignment = 1 ;
НомерСтроки= НомерСтроки+ 1 ;
КонецЦикла ;
Row1. Range. Font. Bold = 9999998 ;
Row1. Range. Font. Size = 14 ;
Row1. Range. Font. Name = "Verdana" ;
Row1. Range. ParagraphFormat. Alignment = 1 ;
Row = Table. Rows. Add( ) ;
Row. Range. Font. Bold = 9999998 ;
Row. Cells( 1 ) . Range. Text= "Итого:" ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
Попытка
Table. cell( НомерСтроки+ 1 , 1 ) . Merge( Table. cell( НомерСтроки+ 1 , 5 ) ) ;
Исключение
КонецПопытки ;
Попытка
Row. Cells( 1 ) . Range. ParagraphFormat. Alignment = 3 ;
Row. Cells( 2 ) . Range. Text= Формат( Ссылка. Товары. Итог( "Сумма" ) , "ЧДЦ=2" ) ;
Row. Cells( 2 ) . Range. ParagraphFormat. Alignment = 1 ;
Doc. Save( ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
Исключение
Doc. Save( ) ;
Сообщить( ОписаниеОшибки( ) ) ;
Объект. Application. Quit( ) ;
Объект = Неопределено ;
КонецПопытки ;
КонецПроцедуры
Написал Nikola23 - http://infostart.ru/public/67727/ Категория:
Работа с Microsoft Office и OpenOffice Чтение RTF файлов через OpenOffice. Для 8.х заменить СоздатьОбъект( на Новый COMОбъект(
Код 1C v 7.x
ServiceManager = СоздатьОбъект( "com.sun.star.ServiceManager" ) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
script = СоздатьОбъект( "ScriptControl" ) ;
script. Language = "vbs" ;
script. AddCode
(
"Dim Parameters()
|
|Sub InitParameters(Size)
|
| Erase Parameters
|
| If Size > 0 Then
| Redim Parameters(Size - 1)
| End If
|
|End Sub
|
|Sub SetParameter(ServiceManager, Name, Value, Index)
|
| Set PropertyValue = ServiceManager.Bridge_GetStruct("" com.sun.star.beans.PropertyValue"" )
| PropertyValue.Name = Name
| PropertyValue.Value = Value
|
| Set Parameters(Index) = PropertyValue
|
|End Sub
|
|Sub SetBooleanParameter(ServiceManager, Name, Value, Index)
|
| SetParameter ServiceManager, Name, Cbool(Value), Index
|
|End Sub
|
|Function LoadDocument(ComponentLoader, URL, TargetFrameName, SearchFlags)
|
| Set LoadDocument = ComponentLoader.loadComponentFromURL(URL, TargetFrameName, SearchFlags, Parameters)
|
|End Function
|
|Sub CloseDocument(Document)
|
| Document.Close True
|
|End Sub"
) ;
script. Run( "InitParameters" , 2 ) ;
script. Run( "SetBooleanParameter" , ServiceManager, "ReadOnly" , 1 , 0 ) ;
script. Run( "SetBooleanParameter" , ServiceManager, "Hidden" , 1 , 1 ) ;
URL = ПреобразоватьВURL( КаталогПриказов + НомерПриказа + ".rtf" ) ;
Документ = script. Run( "LoadDocument" , Desktop, URL, "_blank" , 0 ) ;
Таблица = Документ. TextTables. getByIndex( 0 ) ;
ВсегоСтрок = Таблица. getRows( ) . getCount( ) ;
ВсегоСтолбцов = Таблица. getColumns( ) . getCount( ) ;
Для ИндексСтроки = 1 По ( ВсегоСтрок - 1 ) Цикл
Для ИндексСтолбца = 0 По ( ВсегоСтолбцов - 1 ) Цикл
Ячейка = Таблица. getCellByPosition( ИндексСтолбца, ИндексСтроки) ;
ТекстЯчейки = Ячейка. getString( ) ;
КонецЦикла ;
КонецЦикла ;
script. Run( "CloseDocument" , Документ) ;
Категория:
Работа с Microsoft Office и OpenOffice Загрузка данных из таблицы Excel в ТЗ (Таблицу значений) Код для 7 версии, при использовании в 8-ой - заменить E=СоздатьОбъект("Excel.Application");
на
E=Новый COMОбъект("Excel.Application");
Код 1C v 7.x Функция глОткрытьФайл(Маска="" ) Экспорт
Перем ИмяФайла, ИмяКаталога;
Маска_= "Файлы " + Маска+ "|*." + Маска;
Если СокрЛП( Маска) = "" Тогда
Маска_= "Все файлы |*.*"
КонецЕсли ;
Если ФС. ВыбратьФайл( 0 , ИмяФайла, ИмяКаталога, "Открыть файл" , Маска_) = 1 Тогда
Возврат ИмяКаталога+ ИмяФайла;
Иначе
Возврат "" ;
КонецЕсли ;
КонецФункции
Функция ReadExcel(ИмяФайла,Лист=1) Экспорт
Попытка
E= СоздатьОбъект( "Excel.Application" ) ;
Исключение
Предупреждение( "Excel на компьютере не установлен!" ) ;
Возврат ПолучитьПустоеЗначение( ) ;
КонецПопытки ;
E. Workbooks. Open( Сокрлп( ИмяФайла) ) ;
Строк= E. Sheets( Лист) . Cells. SpecialCells( 11 ) . Row;
Столбцов= E. Sheets( Лист) . Cells. SpecialCells( 11 ) . Column;
фТЗ= СоздатьОбъект( "ТаблицаЗначений" ) ;
Для А= 1 По Столбцов Цикл
фТЗ. НоваяКолонка( ) ;
КонецЦикла ;
Для Стр= 1 По Строк Цикл
Состояние( "Обработано " + Строка( Стр) + " строк из " + Строка( Строк) ) ;
фТЗ. НоваяСтрока( Стр) ;
Для Столб= 1 По Столбцов Цикл
фТЗ. УстановитьЗначение( Стр, Столб, СокрЛП( E. Sheets( Лист) . Cells( Стр, Столб) . Value) ) ;
КонецЦикла ;
КонецЦикла ;
E. Workbooks. Close( ) ;
Возврат фТЗ;
КонецФункции
Процедура Сформировать()
ИмяФайла= глОткрытьФайл( "xls" ) ;
Если СокрЛП( ИмяФайла) = "" Тогда Возврат ; КонецЕсли ;
ТЗ. Загрузить( ReadExcel( ИмяФайла, 1 ) ) ;
КонецПроцедуры
Подсказал Abadonna.
Категория:
Работа с Microsoft Office и OpenOffice Как выгрузиться в EXCEL со сводными таблицами Пошаговый рабочий алгоритм выгрузки в EXCEL на примере выгрузки отчетов производства за смену(Автор статьи:
Funny ):
(1) Нарисовать форму обработки и к кнопке запуска прицепить процедуру:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПроверкаДат( ) Тогда
Состояние( "Запущена выгрузка данных" ) ;
ПолучитьДанныеВТаблице( ) ;
Если чОтчетов< > 0 Тогда
СортироватьТаблицу( ) ;
ВыгрузитьТаблицуВФайл( ) ;
ЗакрытьСистему( ) ;
Состояние( "Выгрузка завершена" ) ;
Иначе
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
(2) Создадим функцию ПроверкаДат() корректного указания дат обработки
(3) Создадим процедуру ПолучитьДанныеВТаблице() выборки требуемых данных из документов в таблицу значений
(4) Создадим процедуру СортироватьТаблицу() для сортировки таблицы значений как нам нужно
(5) Создадим процедуру ВыгрузитьТаблицуВФайл() выгрузки ТЗ в Excel-файл:
Код 1C v 8.х Процедура ВыгрузитьТаблицуВФайл()
Если FileOfReports = Неопределено Тогда
Попытка
FileOfReports = Новый COMОбъект( "Excel.Application" ) ;
MyBook= FileOfReports. WorkBooks. Add( истина ) ;
FirstSheet= MyBook. Worksheets( 1 ) ;
FirstSheet. Name = ОпределитьДату( НачПериода) + "-" + ОпределитьДату( КонПериода) ;
FirstSheet. Activate( ) ;
MyBook. SaveAs( КаталогDBF+ "ОтчетыПроизводства.xls" ) ;
Исключение
Сообщить( "ОШИБКА ЗАПИСИ В EXCEL-ФАЙЛ:" + ОписаниеОшибки( ) ) ;
Сообщить( "Совет: Возможно файл, в который должна быть произведена запись, Вами открыт для просмотра" ) ;
Сообщить( "Если это так, то закройте файл и запустите данную обработку повторно!" ) ;
КонецПопытки ;
FileOfReports. Visible = 0 ;
Иначе
FileOfReports. Visible = 0 ;
КонецЕсли ;
чОтчетов = ТаблицаОтчетов. Количество( ) ;
ЭлементыФормы. ИндикаторЗагрузки. МинимальноеЗначение = 0 ;
ЭлементыФормы. ИндикаторЗагрузки. МаксимальноеЗначение = чОтчетов;
ЭлементыФормы. Logo. Заголовок = "Выгружаю документы" ;
лСчетчикИндикатора = 0 ;
ВыгрузитьЗаголовокТаблицы( 26 ) ;
фСтарт= истина ;
чОт= 2 ;
Пока чОтчетов > = 1 Цикл
чОтчетов = чОтчетов - 1 ;
СтрокаОтчетов = ТаблицаОтчетов. Получить( чОтчетов) ;
Если ( СтрокаОтчетов. ДатаВыпуска= ДатаВыпускаПред)
И ( СтрокаОтчетов. Принадлежность= ПринадлежностьПред)
И ( СтрокаОтчетов. Типоразмер= ТипоразмерПред)
И ( СтрокаОтчетов. ТипОсновы= ТипОсновыПред)
Тогда
Иначе
ДатаВыпускаПред= СтрокаОтчетов. ДатаВыпуска;
ПринадлежностьПред= СтрокаОтчетов. Принадлежность;
ТипоразмерПред= СтрокаОтчетов. Типоразмер;
ТипОсновыПред= СтрокаОтчетов. ТипОсновы;
Если фСтарт Тогда
фСтарт = ложь ;
Иначе
чДо= глСчетчикСтрок;
ВыгрузитьСтрокуИтог( чОт, чДо, 26 ) ;
КонецЕсли ;
чОт= глСчетчикСтрок;
КонецЕсли ;
ВыгрузитьСтрокуОтчетовВФайл( СтрокаОтчетов, 26 ) ;
лСчетчикИндикатора = лСчетчикИндикатора + 1 ;
ЭлементыФормы. ИндикаторЗагрузки. Значение = лСчетчикИндикатора;
ОбработкаПрерыванияПользователя( ) ;
КонецЦикла ;
чДо= глСчетчикСтрок;
ВыгрузитьСтрокуИтог( чОт, чДо, 26 ) ;
Состояние( "Данные файла выгружены" ) ;
libСообщитьНК1 ( "ИНФО: ШАГ 1 ВЫПОЛНЕН. Данные файла Отчеты.DBF успешно считаны" , 1 ) ;
ЭлементыФормы. Logo. Заголовок = "Создание сводных таблиц" ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "наим" , "Дата" , "Наим" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "ЮВ" , "Дата" , "Наим,Каркас,Вид" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "В пр(2)" , "Дата" , "Наим,Каркас,Основа" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "В пр" , "Дата" , "Каркас,Основа" , "" , "К" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Основа" , "Дата" , "Основа" , "" , "кг основы" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Напыление" , "" , "Напылен" , "" , "кг напылен" ) ;
СоздатьТаблицуЛист( MyBook. Worksheets( 1 ) . Name, "Клей" , "" , "Дата" , "" , "кг клея" ) ;
КонецПроцедуры
Процедура СоздатьТаблицуЛист(стрДанные,стрСводнаяТаблица,стрПоле1,стрПоле2,стрПоле3,стрПоле4) ;
лПоля. Очистить( ) ;
стрПоля= стрПоле2 ;
i= 1 ;
Пока Найти( стрПоля, "," ) < > 0 Цикл
n= Найти( стрПоля, "," ) ;
лПоля. Добавить( Сред( стрПоля, 1 , n- 1 ) ) ;
стрПоля= Сред( стрПоля, n+ 1 ) ;
i= i+ 1 ;
КонецЦикла ;
лПоля. Добавить( стрПоля) ;
FirstSheet. Activate( ) ;
дДиапазонДанных= FirstSheet. UsedRange. Address;
ДиапазонДанных= FirstSheet. Name+ "!" + Строка( дДиапазонДанных) ;
SourceType = xlDatabase;
SourceData = ДиапазонДанных;
Cache = MyBook. PivotCaches( ) . Add( SourceType, SourceData) ;
TableDestination= "" ;
TableName= стрСводнаяТаблица;
Cache. CreatePivotTable( TableDestination, TableName) ;
Если СокрЛП( стрПоле1 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле1 ) . Orientation = 3 ;
КонецЕсли ;
чНомер= 0 ;
Пока чНомер< i Цикл
Если СокрЛП( лПоля[чНомер]. Значение) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( лПоля[чНомер]. Значение) . Orientation = 1 ;
КонецЕсли ;
чНомер = чНомер + 1 ;
КонецЦикла ;
Если СокрЛП( стрПоле3 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле3 ) . Orientation = 2 ;
КонецЕсли ;
Если СокрЛП( стрПоле4 ) < > "" Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( стрПоле4 ) . Orientation = 4 ;
КонецЕсли ;
чНомер= 0 ;
Пока чНомер< i Цикл
Если СокрЛП( лПоля[чНомер]. Значение) < > "" Тогда
Если IfPivotItemExists( TableName, лПоля[чНомер]. Значение, "(пусто)" ) Тогда
MyBook. ActiveSheet. PivotTables( TableName) . PivotFields( лПоля[чНомер]. Значение) . PivotItems( "(пусто)" ) . Visible = False;
КонецЕсли ;
КонецЕсли ;
чНомер = чНомер + 1 ;
КонецЦикла ;
MyBook. ShowPivotTableFieldList = False;
FileOfReports. CommandBars( "PivotTable" ) . Visible = False;
MyBook. ActiveSheet. Name = стрСводнаяТаблица;
MyBook. Save( ) ;
КонецПроцедуры
Функция IfPivotItemExists(strTableName,strFieldName,strItemName)
nItems = MyBook. ActiveSheet. PivotTables( strTableName) . PivotFields( strFieldName) . PivotItems( ) . Count;
i = 1 ;
Пока i < = nItems Цикл
Если strItemName= MyBook. ActiveSheet. PivotTables( strTableName) . PivotFields( strFieldName) . PivotItems( i) . Name Тогда
Возврат True;
КонецЕсли ;
i= i+ 1 ;
КонецЦикла ;
Возврат False;
КонецФункции
Код 1C v 7.x РабочаяКнига = СоздатьОбъект("Excel.Application");
РабочаяКнига.SheetsInNewWorkbook = 1;
РабочаяКнига.Caption = "Отчет по договорам отгрузки";
NewBook = РабочаяКнига.Workbooks;
List = NewBook.Add;
СписокСтолбцов = СоздатьОбъект("СписокЗначений");
СписокСтолбцов.ДобавитьЗначение("Модель");
СписокСтолбцов.ДобавитьЗначение("Разнорядка");
СписокСтолбцов.ДобавитьЗначение("По договору");
СписокСтолбцов.ДобавитьЗначение("Отгрузили");
СписокСтолбцов.ДобавитьЗначение("Осталось");
//Заполним наименование столбцов : Модель, Разнорядка, Количество
Для Столбец = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(1,Столбец);
Ячейка.Value = СписокСтолбцов.ПолучитьЗначение(Столбец);
КонецЦикла;
//Формируем запрос по регистру
// //Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНач по ДатаКон;
|Разнорядка = Регистр.УчетДоговоров.Разнорядка;
|Модель = Регистр.УчетДоговоров.Модель.Группа;
|Колво = Регистр.УчетДоговоров.Количество;
|Функция КолвоПриход = Приход(Колво);
|Функция КолвоРасход = Расход(Колво);
|Функция КолвоОст = КонОст(Колво);
|Группировка Разнорядка;
|Группировка Модель;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
НомерСтроки = 1;
Пока Запрос.Группировка("Разнорядка") = 1 Цикл
Пока Запрос.Группировка("Модель") = 1 Цикл
Модель = Запрос.Модель;
Разнорядка = Запрос.Разнорядка;
КолПоДоговору = Запрос.КолвоПриход;
КолОтгрузили = Запрос.КолвоРасход;
КолОсталось = Запрос.КолвоОст;
НомерСтроки = НомерСтроки + 1;
//Организум заполнение ячеек Excel
Для Ст = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(НомерСтроки,Ст);
Если Ст = 1 Тогда
Ячейка.Value = Модель;
ИначеЕсли Ст = 2 Тогда
Ячейка.Value = Строка(Разнорядка);
ИначеЕсли Ст = 3 Тогда
Ячейка.Value = КолПоДоговору;
ИначеЕсли Ст = 4 Тогда
Ячейка.Value = КолОтгрузили;
ИначеЕсли Ст = 5 Тогда
Ячейка.Value = КолОсталось;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СводнаяТаблица = РабочаяКнига.ActiveSheet.PivotTableWizard;
//Метод СводнаяТаблица.Name возвращает имя сводной таблицы
//Можно задать имя таблицы СводнаяТаблица.Name = "МояТаблица"
СводнаяТаблица.SmallGrid = 0;
//Разворачивает макет сводной таблицы
//Обращение к ячейкам сводной таблицы возможно по номеру
//Например, СводнаяТаблица.PivotFields(1).Value
//возвращает значение "Модель"
//Попробуем с другого конца
//1 - Row
//2 - Column
//3 - Page
//4 - Data
СводнаяТаблица.PivotFields(1).Orientation = 1; //Модель
СводнаяТаблица.PivotFields(2).Orientation = 3; //Разнорядка
СводнаяТаблица.PivotFields(3).Orientation = 4; //По договору
СводнаяТаблица.PivotFields(4).Orientation = 4; //Отгрузили
СводнаяТаблица.PivotFields(5).Orientation = 4; //Осталось
//Пройдемся по форме отчета
СводнаяТаблица.Format(1);
//Попробуем закрыть панель инструментов сводной таблицы
РабочаяКнига.CommandBars("PivotTable").Visible = 0;
РабочаяКнига.Visible = 1;
Категория:
Работа с Microsoft Office и OpenOffice Функция открывает таблицу в MS Excel Код 1C v 7.x Код
//Функция открывает таблицу в MS Excel
//Таблица - печатная форма 1С
//ИмяЛиста - имя, которое будет присвоено листу книги MS Excel (если не задано, то остается "Sheet1")
//ОтображатьЯрлычки - показывать/скрыть ярлычки листов в MS Excel
//ОтображатьСетку - показывать/скрыть линии сетки в MS Excel
//УдалитьСтроки - позволяет удалить указанное количество верхних строк таблицы
//УдалитьСтроки - позволяет удалить указанное количество левых столбцов таблицы
Функция глОткрытьТаблицуВExcel(Таблица, ИмяЛиста = "", ОтображатьЯрлычки = 1, ОтображатьСетку = 1, УдалитьСтроки = 0, УдалитьСтолбцы = 0) Экспорт
Перем Excel, ExcelWB, ExcelSh, ExcelPS, ИмяФайла, Рез, Зн, Зн1;
Если ТипЗначенияСтр(Таблица) <> "Таблица" Тогда
Возврат 0;
КонецЕсли;
Попытка
Excel = СоздатьОбъект("Excel.Application")
Исключение
Сообщить("Не удалось открыть MS Excel","!");
Возврат 0;
КонецПопытки;
Пока 1=1 Цикл
//Подберем уникальное имя для временного файла
ИмяФайла = КаталогВременныхФайлов() + "1c" + СтрЗаменить(ТекущееВремя(), ":", "");
Если (ФС.СуществуетФайл(ИмяФайла+".tmp") = 1) или (ФС.СуществуетФайл(ИмяФайла+".xls") = 1) Тогда
ФС.УдалитьФайл(ИмяФайла+".tmp");
ФС.УдалитьФайл(ИмяФайла+".xls")
Иначе
Прервать;
КонецЕсли
КонецЦикла;
Таблица.Записать(ИмяФайла+".tmp", "XLS");
Если ФС.СуществуетФайл(ИмяФайла+".tmp") = 0 Тогда
Сообщить("Ошибка записи файла """ + ИмяФайла + "tmp""","!");
Excel = "";
Возврат 0;
КонецЕсли;
Рез = 1;
Попытка
ExcelWB = Excel.Workbooks.Add(ИмяФайла+".tmp"); //Откроем временный файл в Excel в режиме шаблона (чтобы не блокировать файл)
Попытка //Если на клиентской машине не установлен принтер, обращение к настройкам страницы вызывает ошибку. Поэтому работаем в "Попытка ... КонецПопытки"
ExcelPS = ExcelWB.Sheets(1).PageSetup; //Исправим спецсимволы в колонтитулах
Зн = ExcelPS.LeftHeader; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.LeftHeader = Зн1 КонецЕсли;
Зн = ExcelPS.CenterHeader; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.CenterHeader = Зн1 КонецЕсли;
Зн = ExcelPS.RightHeader; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.RightHeader = Зн1 КонецЕсли;
Зн = ExcelPS.LeftFooter; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.LeftFooter = Зн1 КонецЕсли;
Зн = ExcelPS.CenterFooter; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.CenterFooter = Зн1 КонецЕсли;
Зн = ExcelPS.RightFooter; Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.RightFooter = Зн1 КонецЕсли;
Исключение
КонецПопытки;
ExcelWB.SaveAs(ИмяФайла+".xls", -4143); //Сохраним, чтобы обновить формат файла до текущего (xlNormal = -4143)
ExcelWB.Close(0); //Закроем книгу ...
ExcelWB = Excel.Workbooks.Add(ИмяФайла+".xls"); //... и вновь откроем в режиме шаблона
Попытка
ExcelSh = ExcelWB.Sheets(1);
Если ПустаяСтрока(ИмяЛиста) = 0 Тогда //Зададим имя ярлычка
ExcelSh.Name = ИмяЛиста
КонецЕсли;
Если ОтображатьЯрлычки = 1 Тогда //Сделаем видимыми ярлычки листов
ExcelWB.Windows(1).DisplayWorkbookTabs = 1;
ExcelWB.Windows(1).TabRatio = 0.6 //... и отодвинем горизонтальную полосу прокрутки от левого края
КонецЕсли;
Если ОтображатьСетку = 0 Тогда //Скроем линии сетки
ExcelWB.Windows(1).DisplayGridlines = 0
КонецЕсли;
Если УдалитьСтроки > 0 Тогда //Удалим верхние строки
ExcelSh.Range(ExcelSh.Rows(1), ExcelSh.Rows(УдалитьСтроки)).Delete()
КонецЕсли;
Если УдалитьСтолбцы > 0 Тогда //Удалим левые столбцы
ExcelSh.Range(ExcelSh.Columns(1), ExcelSh.Columns(УдалитьСтолбцы)).Delete()
КонецЕсли;
Исключение
КонецПопытки;
ExcelWB.Saved = 0;
Исключение
Сообщить("Ошибка открытия файла в MS Excel","!"); Рез = 0
КонецПопытки;
Попытка
Excel.Visible = 1
Исключение
КонецПопытки;
ExcelWB = ""; ExcelSh = ""; ExcelPS = ""; Excel = "";
ФС.УдалитьФайл(ИмяФайла+".tmp");
ФС.УдалитьФайл(ИмяФайла+".xls");
Возврат Рез
КонецФункции //глОткрытьТаблицуВExcel
Автор неизвестен, если код ваш, напишите в комментариях Категория:
Работа с Microsoft Office и OpenOffice