Имя: Пароль:
1C
 
СКД в Excel с готовыми формулами
0 programmistochka
 
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 Новенький_2009
 
04.08.10
17:46
а откуда ексель то узнает, что ты в ячейку ему формулу то пишешь? А не строковое? Алё чтоль? =)
3 Новенький_2009
 
04.08.10
17:48
2 варианта:
1. оставить все как есть, открывать файл екселя и приводить значения нужных колонок к нужному формату.
2. писать напрямую по кому в ексель и там уже форматировать колонки как тебе нужно.
4 Zeldan
 
04.08.10
18:40
без фотки не взлетит..
5 programmistochka
 
05.08.10
09:21
СКД - красивый отчет делает - цветастенький)) все как бухгалтерия хочет
6 programmistochka
 
05.08.10
09:23
Спасибо, меня тоже мой вариант смущает
7 Cube
 
05.08.10
09:32
(4) +1 А фотки в профиле-то нет... :)
8 programmistochka
 
05.08.10
14:40
нет))) а зачем?
9 Zeldan
 
05.08.10
14:58
(8)без фотки не помогут...
10 programmistochka
 
05.08.10
15:05
мужики блин, программисты)))
11 GedKo
 
05.08.10
15:05
(8) это аналог бус у местных папуасов
12 programmistochka
 
05.08.10
15:21
а как ПРОГРАММНО вызвать: меню 1с - Файл - сохранить копию (формат *.xls)?:-[
13 programmistochka
 
05.08.10
15:22
это для того, чтоб обработать сохраненный средствами 1С файл эксель
14 Лефмихалыч
 
05.08.10
15:26
(12) ДиалогВыбораФайла
15 mythos
 
05.08.10
15:27
Метод Записать у табличного документа в который выводится отчет, это чтобы в эксель сохранить.

ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)
16 mythos
 
05.08.10
15:29
После сохранения его можно открыть средствами COM, и там проставить одной ячейке формулу, а потом программно "растянуть" эту формулу на колонку.
17 mythos
 
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 mythos
 
05.08.10
15:35
Количество строк в экселе можно получить так:

КоличествоСтрокВЭкселе = Excel.Cells.SpecialCells(11).Row;
19 programmistochka
 
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 programmistochka
 
05.08.10
15:58
а если ручками сохранять - файл - сохранить копию - *.exl - то прекрасно сохраняется все - с группировками и цветастенько
21 programmistochka
 
05.08.10
16:06
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Синтаксис:
Записать(<Имя файла>, <Тип файла таблицы>)

Записывает табличный документ в файл.
Примечание:
При работе на сервере или через com-соединение использует только файлы форматов mxl и txt.
22 mythos
 
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 mythos
 
05.08.10
16:19
ЭлементыФормы.Результат.Записать(Файл, ТипФайлаТабличногоДокумента.XLS97);
24 programmistochka
 
05.08.10
16:24
урраааа)))) работает))) тра-ля-пам-пам))))) Спасибо,  mythos ;*
25 mythos
 
05.08.10
16:28
а как же формулы? сохранить-то полдела....
26 Zeldan
 
05.08.10
17:10
(25)я же говорил фото решает....
27 programmistochka
 
06.08.10
10:16
Сохранять - самое важное было)) формулы работают
28 programmistochka
 
06.08.10
10:17
Zeldan, ты бы лучше помогал, а не фото разглядывал)))
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.