04.08.10 — 17:32
I need help, товарисчи… Задача такая — получить список номенклатуры с ценой и выгрузить в эксель — для передачи файла покупателю. Покупатель в свою очередь проставляет в экселевском файле количество товара, а сумма должна автоматически посчитаться — т.е. ячейка Сумма должна содержать формулу (= введенное количество*цену товара).
Как 1с экспортирует отчет в Эксель, полученный с помощью СКД — устраивает, дабы чтоб упростить себе работу и не выгружать «ручками» весь отчет я заполняю колонку «СУММА» в СКД формулой, полученной из VB (ActiveCell.FormulaR1C1 = «=RC[-2]*RC[-1]»). Пример запроса для СКД:
ВЫБРАТЬ
спрНоменклатура.Родитель КАК Группа,
спрНоменклатура.Артикул КАК Артикул,
спрНоменклатура.Ссылка КАК Номенклатура,
0 КАК ЗаказШт,
ЦеныНоменклатурыСрезПоследних.Цена КАК БазоваяЦенаРуб,
«=RC[-2]*RC[-1]» КАК Сумма
ИЗ
Справочник.Номенклатура КАК спрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка
И (ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦены)
ГДЕ
спрНоменклатура.ПометкаУдаления = ЛОЖЬ
И спрНоменклатура.ЭтоГруппа = ЛОЖЬ
Результат: формула передается как символы, но если в ячейке сумма нажать энтр))) — то считает %))))
Есть ли нормальный способ передать формулу?
1 — 04.08.10 — 17:37
во-первых, на кой куй вам скд?
2 — 04.08.10 — 17:46
а откуда ексель то узнает, что ты в ячейку ему формулу то пишешь? А не строковое? Алё чтоль? =)
3 — 04.08.10 — 17:48
2 варианта:
1. оставить все как есть, открывать файл екселя и приводить значения нужных колонок к нужному формату.
2. писать напрямую по кому в ексель и там уже форматировать колонки как тебе нужно.
4 — 04.08.10 — 18:40
без фотки не взлетит..
5 — 05.08.10 — 09:21
СКД — красивый отчет делает — цветастенький)) все как бухгалтерия хочет
6 — 05.08.10 — 09:23
Спасибо, меня тоже мой вариант смущает
7 — 05.08.10 — 09:32
(4) +1 А фотки в профиле-то нет…
8 — 05.08.10 — 14:40
нет))) а зачем?
9 — 05.08.10 — 14:58
(8)без фотки не помогут…
10 — 05.08.10 — 15:05
мужики блин, программисты)))
11 — 05.08.10 — 15:05
(8) это аналог бус у местных папуасов
12 — 05.08.10 — 15:21
а как ПРОГРАММНО вызвать: меню 1с — Файл — сохранить копию (формат *.xls)?:-[
13 — 05.08.10 — 15:22
это для того, чтоб обработать сохраненный средствами 1С файл эксель
14 — 05.08.10 — 15:26
(12) ДиалогВыбораФайла
15 — 05.08.10 — 15:27
Метод Записать у табличного документа в который выводится отчет, это чтобы в эксель сохранить.
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
16 — 05.08.10 — 15:29
После сохранения его можно открыть средствами COM, и там проставить одной ячейке формулу, а потом программно «растянуть» эту формулу на колонку.
17 — 05.08.10 — 15:34
Excel = Новый COMОбъект(«Excel.Application»);
Excel.Workbooks.Open(ИмяФайлаОбработки);
Excel.Range(«AD» + КоличествоСтрокВЭкселе).Select();
Excel.Application.ActiveCell.FormulaR1C1 = «=RC[-2]*RC[-1]»;
Excel.Application.Selection.AutoFill(Excel.Range(«AD» + ПерваяСтрока + «:AD» + КоличествоСтрокВЭкселе), 0);
Здесь AD — буквенный номер столбца с формулой
18 — 05.08.10 — 15:35
Количество строк в экселе можно получить так:
КоличествоСтрокВЭкселе = Excel.Cells.SpecialCells(11).Row;
19 — 05.08.10 — 15:57
не получается….
в форму — в «Результат» — выводится результат СКД, ниже поле выбора файла для сохранения:
Процедура ФайлНачалоВыбора(Элемент, СтандартнаяОбработка)
// Выделим имя каталога из имени файла
ИмяКаталога = Файл;
ДлинаСтроки = СтрДлина( Файл );
Для Пц = 1 По ДлинаСтроки Цикл
Симв = сред(Файл, ДлинаСтроки — Пц + 1, 1);
Если Симв = «» Тогда
ИмяКаталога = Лев(Файл, ДлинаСтроки — Пц);
Прервать;
КонецЕсли;
КонецЦикла;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Каталог = ИмяКаталога;
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогСохраненияФайла.ПолноеИмяФайла = «»;
Фильтр = «Лист Excel97(*.xls)|*.xls»;
ДиалогСохраненияФайла.Фильтр = Фильтр;
Если ДиалогСохраненияФайла.Выбрать() = Истина Тогда
Файл = ДиалогСохраненияФайла.ВыбранныеФайлы.Получить(0);
КонецЕсли;
ЭлементыФормы.Результат.Записать(Файл );
КонецПроцедуры
Файл эксель — абракадабра получается, а если большой список в отчете (без отборов — весь справочник Номенклатура), то эксель ругается что файл загружен не полностью:
Это сообщение может появиться, если:
Попытка открыть файл, содержащий более 65 536 строк или 256 столбцов. Чтобы устранить это затруднение, откройте исходный файл в текстовом редакторе, например Microsoft Word. Сохраните исходный файл, разделив его на несколько меньших файлов, удовлетворяющих ограничениям на число строк и столбцов, а затем откройте эти меньшие файлы в приложении Excel. Если не удается открыть исходный файл в текстовом редакторе, попробуйте импортировать данные в Microsoft Access, а затем экспортировать подмножества данных из Access в Excel.
Попытка вставить данные, разделенные знаком табуляции, в слишком маленькую область. Чтобы устранить это затруднение, выделите в таблице область, в которой могут поместиться все элементы с разделением.
Примечания.>
Настройка приложения Excel на превышение предела в 65 536 строк и 256 столбцов не предусмотрена.
По умолчанию книга Excel состоит из трех листов. Каждый лист может содержать до 65 536 строк и 256 столбцов данных, книги могут состоять из более чем трех листов; при этом у компьютера должен быть достаточный объем оперативной памяти для работы с дополнительными данными.
20 — 05.08.10 — 15:58
а если ручками сохранять — файл — сохранить копию — *.exl — то прекрасно сохраняется все — с группировками и цветастенько
21 — 05.08.10 — 16:06
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
22 — 05.08.10 — 16:19
Здесь:
ЭлементыФормы.Результат.Записать(Файл );
Надо указывать тип файла
ТипФайлаТабличногоДокумента (SpreadsheetDocumentFileType)
Значения
HTML (HTML)
HTML3 (HTML3)
HTML4 (HTML4)
MXL (MXL)
MXL7 (MXL7)
TXT (TXT)
XLS (XLS)
XLS95 (XLS95)
XLS97 (XLS97)
23 — 05.08.10 — 16:19
ЭлементыФормы.Результат.Записать(Файл, ТипФайлаТабличногоДокумента.XLS97);
24 — 05.08.10 — 16:24
урраааа)))) работает))) тра-ля-пам-пам))))) Спасибо, mythos ;*
25 — 05.08.10 — 16:28
а как же формулы? сохранить-то полдела….
26 — 05.08.10 — 17:10
(25)я же говорил фото решает….
27 — 06.08.10 — 10:16
Сохранять — самое важное было)) формулы работают
programmistochka
28 — 06.08.10 — 10:17
Zeldan, ты бы лучше помогал, а не фото разглядывал)))
yakov |
|
||
---|---|---|---|
Как с помощью регламентного задания выгрузить результат отчета на СКД в файл Excel? Заранее спасибо!) |
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
Через скд формируй результат в табличный документ и сохраняй его в xls, вот на эту тему: Пример программного вызова СКД отчета Программный вывод отчета СКД примерный код: Код 1C v 8.х
|
Подсказка: Для быстрого поиска ответов — используйте ‘Поиск’ |
med 0 — 31.07.2012 — 08:44 |
УПП Создан дополнительный отчет создается таблица значений — она передается в СКД как сделать выгрузку в Excell, что бы получилось так же как сохранение в Excell из самой СКД? Т.е. с группировками, заголовками и т.д. ? |
|
med 1 — 31.07.2012 — 09:19 |
Вопрос снят это оказывается так элементарно… ЭлементыФормы.Результат.Записать(«c:proba.xls»,»x ls»); Где «Результат» — Поле табличного документа куда собственно и выводится СКД |
|
Гость 2 — 31.07.2012 — 14:16 |
(1) забавно, не знал, спасибо
|
|
Гость 3 — 03.08.2012 — 10:54 |
Интересно как сохранить несколько отчетов отдельными листами в один файл Екселя?
|
|
Uho 4 — 03.08.2012 — 11:04 |
OLE
|
|
Гость 5 — 03.08.2012 — 11:11 |
Штатно. Через OLE работать с каждым полем слишком примитивно и трудоемко.
|
|
Uho 6 — 03.08.2012 — 11:21 |
5-kerm > зачем с каждым полем?
|
|
med 7 — 03.08.2012 — 13:46 |
Ну или без элемента формы
|
|
Uho 8 — 03.08.2012 — 14:17 |
7-med > что за чушь?
|
|
med 9 — 03.08.2012 — 14:24 |
8-Uho > не нравится — не ешь
|
|
Uho 10 — 03.08.2012 — 14:34 |
9-med > я не про почту (ибо в данной теме про почту никто не говорил), а про вот это:
ТабДокН = Новый ТабличныйДокумент; |
|
med 11 — 06.08.2012 — 06:47 |
10-Uho >
|
|
Гость 12 — 06.08.2012 — 07:18 |
КаталогВременныхФайлов()
|
|
med 13 — 07.08.2012 — 14:30 |
12-Удар копытом > Спасибо, попробую…
|
16.05.2017
Перерыв весь интернет не смог найти простого способа сохранить отчет с большим числом строк в формате Excel. Везде предлагалось писать процедуры построчной записи, ADO, COMSafeArray и прочее.
Метод же, используемый во всех найденный публикациях «Результат.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX)», не работает при большом числе строк.
Публикация http://infostart.ru/public/77128/ натолкнула на простую идею, которую и реализовал.
Для того чтобы сохранить результат любого отчета (главное чтобы результат выводился в ТабличноеПоле) в формате Excel с большим числом строк (типовая 1с ругается при превышении их числа в 65535),
используется следующий простой метод.
1. Сначала сохраняем табличное поле как файл формата «Документ HTML4» (//infostart.ru/public/77128/).
2. Полученный файл программно открываем и пересохраняем в нужном формате Excel.
Для реализации — в реквизиты формы отчета добавляем «ПутьКФайлу» — тип строка, к которому добавим функцию «ПутьКФайлуНачалоВыбора»
&НаКлиенте Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; РежимДиалога = РежимДиалогаВыбораФайла.Сохранение; ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога); ДиалогВыбораФайла.МножественныйВыбор = Ложь; ДиалогВыбораФайла.Заголовок = "Укажите путь выгрузки файла..."; ДиалогВыбораФайла.ПолноеИмяФайла = ПутьКФайлу; ДиалогВыбораФайла.Фильтр = "Excel(2007)(*.xlsx)|*.xlsx"; Если ДиалогВыбораФайла.Выбрать() Тогда ПутьКФайлу = ДиалогВыбораФайла.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры
Также на форму выводим кнопку «ФормаКнопкаСохранитьВЭксель», с командой «СохранитьВЭксель»
&НаКлиенте Процедура СохранитьВЭксель(Команда)
ИмяФайлаHTML4 = СтрЗаменить(ПутьКФайлу,"xlsx","htm");
Результат.Записать(ИмяФайлаHTML4,ТипФайлаТабличногоДокумента.HTML4); Попытка ЭксельОбъект = Новый COMОбъект("Excel.Application"); ЭксельОбъект.Application.Visible = Ложь; Книга = ЭксельОбъект.Application.Workbooks.Open(ИмяФайлаHTML4); Книга.Windows(1).Visible = Истина; Книга.Application.DisplayAlerts = False; Книга.SaveAs(ПутьКФайлу,51); Книга.Close(); ЭксельОбъект.Application.Quit(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; КонецПроцедуры
Дополнительно.
Для того чтобы не было потери информации (особенно в части чисел), рекомендуется использовать в 1С, при выводе числовых показателей, следующий формат сумм:
ЧЦ=15; ЧДЦ=2; ЧРД=,; ЧГ=0
P.S. Исправлена строчка кода (приводила к невозможности в некоторых случаях увидеть полученный результат), новая строка выглядит так:
Книга.Windows(1).Visible = Истина;
Выгрузка отчета в таблицу/дерево значений
Использование нескольких схем компоновки данных в одном отчете
СКД. Вывод информации табличной части в одну ячейку.
Недавно появилась задачка, необходимо создать отчет, который требуется выгружать в Excel. Написал запрос, создал схему компоновки данных и отчет готов, результат компоновки выводится в табличный документ. Приступил к реализации вывода отчетных данных в Excel и призадумался, а как же это лучше сделать?
Оказывается, результат компоновки данных можно выводить в таблицу значений или дерево значений для последующей программной обработки. Для этого предназначен объект языка программирования ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. У этого объекта имеется метод УстановитьОбъект(), который является аналогом метода УстановитьДокумент() объекта ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.
Привожу пример вывода результата компоновки в таблицу значений:
Функция СкомпоноватьРезультатВКоллекциюЗначений() Экспорт
тзКомпоновщикМакет = Новый КомпоновщикМакетаКомпоновкиДанных;
тзМакетКомпоновкиДанных = тзКомпоновщикМакет.Выполнить(
СхемаКомпоновкиДанных,
КомпоновщикНастроек.ПолучитьНастройки(),
,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
тзПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
тзПроцессорКомпоновкиДанных.Инициализировать(тзМакетКомпоновкиДанных);
тзРезультат = Новый ТаблицаЗначений;
тзПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
тзПроцессорВывода.УстановитьОбъект(тзРезультат);
тзПроцессорВывода.Вывести(тзПроцессорКомпоновкиДанных);
Возврат тзРезультат;
КонецФункции // СкомпоноватьРезультатВКоллекциюЗначений()
Эту функцию я поместил в модуль отчета, что бы можно было вызывать её как из обычной так и из управляемой формы. Далее я успешно обхожу все строки таблицы значений в цикле и вывожу их в Excel.
При выводе результата компоновки в таблицу или дерево значений существуют следующие ограничения:
- в настройках должны присутствовать только группировки и детальные записи. Использование таблиц, диаграмм и вложенных отчетов не допускается;
- все папки, указанные в выбранных полях, игнорируются;
- не используется условное оформление, а также оформление для поля, указанное в схеме компоновки данных;
- из параметров вывода используются только следующие: расположение общих итогов по вертикали; тип заголовка полей; количество записей; процент записей;
- предопределенные макеты не используются.