Имя: Пароль:
1C
1С v8
Программное сохранение табл документа в Excel с ячейками в формате Текстовый
0 Мимохожий Однако
 
21.03.19
16:32
Программно сохраняю прайс или отчет в формате XLSX методом табличного документа. Когда открываю файл, у него формат Общий. Это клиентов не устраивает. Поэтому и вопрос: Как сохранить табличный документ с форматом ячеек Тестовый?
1 СтарПом
 
21.03.19
16:39
v8: Табличный документ. Формат ячеек
(22) и далее
пысы: сам не пробовал
2 СтарПом
 
21.03.19
16:48
(1) отбой, не то
3 СтарПом
 
21.03.19
17:01
Похоже, только если формировать печатную форму через Excel.Application и с установкой у ячеек NumberFormat = "@"
4 Мимохожий Однако
 
21.03.19
17:06
(3) Я не хочу запускать Excel. В этом ограничение.
5 Мимохожий Однако
 
21.03.19
17:07
Приведенный пример только с использованием Excel
6 СтарПом
 
21.03.19
17:09
ВК из соседней ветки?
Сохраняем mxl в Excel 2007
7 Мимохожий Однако
 
21.03.19
17:21
(6) Там немного другое и для 8-ки пока не сделано
8 sqr4
 
21.03.19
17:56
(7) Прижми в право или влево не помню
9 Мимохожий Однако
 
21.03.19
18:44
(8) Это не помогает после сохранения в Excel
10 d4rkmesa
 
21.03.19
19:11
11 ProxyInspector
 
21.03.19
19:21
(10) Не плохо. Осталось только к СКД прикрутить.
12 Мимохожий Однако
 
21.03.19
19:29
У меня прайс формируется в СКД. Как применить это из ссылки (10) ?
13 Мимохожий Однако
 
21.03.19
19:31
Обрабатываю полученный табличный документ кодом
МассивБулево = Новый Массив;
    МассивБулево.Добавить(Тип("Строка"));
    ОписаниеТиповСтрока = Новый ОписаниеТипов(МассивБулево);
    НомерКолонки=0;
    Для а = 1 по Результат.ВысотаТаблицы Цикл
        Для б=1 По Результат.ШиринаТаблицы Цикл
            ТекстЯчейки=""+Результат.Область(а,б,а,б).Текст;
            Результат.Область(а,б,а,б).СодержитЗначение=Истина;
            Результат.Область(а,б,а,б).ТипЗначения=ОписаниеТиповСтрока;
            Результат.Область(а,б,а,б).Значение=ТекстЯчейки;
            //Результат.Область(а,б,а,б).ФорматРедактирования="";
            //Результат.Область(а,б,а,б).Формат="строка";
        КонецЦикла;
    КонецЦикла;
Но это не помогает
14 d4rkmesa
 
21.03.19
21:38
(12) (13) Одно не исключает другого. Правда, я подобное в шаблон типового отчета для ОФ добавлял(давно это было), там проще получилось. Пример:

ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета);
ОбластьЗаголовка = Результат.Области.Найти("Заголовок");
ОбластьРезультата = Результат.Область(?(ОбластьЗаголовка <> Неопределено, ОбластьЗаголовка.Низ + 3, 1), 1, Результат.ВысотаТаблицы, Результат.ШиринаТаблицы);
ОбластьРезультата.СодержитЗначение = Истина;
ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов("Строка");
15 Мимохожий Однако
 
21.03.19
22:22
В результате сделал через Excel, хотя не хотелось...
Excel = Новый COMОбъект("Excel.Application");
            Excel.WorkBooks.Open(ИмяФайла);
            Excel.Visible = 0;
            Excel.ActiveWindow.DisplayWorkbookTabs = 1;
            Excel.ActiveWindow.TabRatio = 0.6;    
            Excel.Cells.Select();
            Excel.Selection.NumberFormat = "@";
            //FullName = Excel.ActiveWorkbook.FullName;            
            Excel.DisplayAlerts = false;
            Если Расширение="XLSX" Тогда
                Excel.ActiveWorkbook.SaveAs(ИмяФайла, 51); // 18 - xls 97-2003; 51 - xlsx 2007-2013
            Иначе
                Excel.ActiveWorkbook.SaveAs(ИмяФайла, 18); // 18 - xls 97-2003; 51 - xlsx 2007-2013
            КонецЕсли;
            Excel.Application.Quit();// завершаем процесс Excel
            Excel = Неопределено;
16 ProxyInspector
 
22.03.19
07:17
(15)  Это не кошерно. Но (10) и (14) наконец-то дают надежду победить этот косяк Exell
17 Йохохо
 
22.03.19
07:29
апостроф в начало пробовали добавлять? '
18 Мимохожий Однако
 
22.03.19
07:29
(16) Я этим путём проходил. см (13). Но после сохранения табличного документа в Excel формат остаётся Общим. при этом в исходном файле mxl  в каждой ячейке прописано значение как текст и свойство ячейки как и задумывалось было:
бластьРезультата.СодержитЗначение = Истина;
ОбластьРезультата.ТипЗначения = Новый ОписаниеТипов("Строка");
..
19 Мимохожий Однако
 
22.03.19
07:29
(17) я с этого начинал )
20 Мимохожий Однако
 
22.03.19
07:30
(17) Но не всем клиентам этот апостроф понравился. У них роботы обрабатывают файл и лезут глюки. Пришлось отказаться.
21 Мимохожий Однако
 
22.03.19
07:32
Единственно, что я еще не испытал, это использование макетов в СКД. У меня прайсы формируются через СКД. Потом сохраняются из полученного табличного документа в различные форматы средствами 1С.
22 Йохохо
 
22.03.19
07:36
(21) тогда, вероятно, если скопировать скдшный вывод в новый табдок, как в (13), то (10) заработает
23 Мимохожий Однако
 
22.03.19
07:44
(22) Пример кода или ссылка есть, как в СКД в макете установить вариант (10) ?
24 Йохохо
 
22.03.19
07:50
(23) НовыйТабличныйДокумент.Область(а,б,а,б).Текст = "" + Результат.Область(а,б,а,б).Текст
25 Дмитрий
 
22.03.19
08:22
(0) в макете в параметрах ячейки содержит значение = истина, тип значения = строка
26 Мимохожий Однако
 
22.03.19
08:51
(24) (25) Мужики,я ЭТО делал. Попробуйте ПРОГРАММНО сохранить полученный табличный документ в Excel. А потом откройте. И увидите, что там формат Общий, а не Текстовый
27 sqr4
 
22.03.19
09:06
(26) наверно только открывать экселькой файл после сохранения и проставлять
28 Мимохожий Однако
 
22.03.19
09:12
(27) От этого я хотел уйти, но пока остановился на этом варианте. При массовом формировании прайсов ожидаю сбоев. Ну, ладно. Посмотрю, что будет на практике.
29 ProxyInspector
 
22.03.19
15:53
Попробовал ручками в табличном документе,  поставить в ячейке, которая содержит значение 00001,  
.СодержитЗначение = Истина;
.Тип = Строка
Потом сохранил в формате Exell и у ячейки получился вполне нормальное значение "00001"
И это радует. Правда не понятно как это сделать в СКД, но хотя бы появился свет в конце туннеля.
30 СтарПом
 
22.03.19
15:58
(29) задача другая
ТСу (а точнее его заказчикам) нужно (зачем? - хз) чтобы формат ячейки в экселе был не Общий, и Текстовый...
про СодержитЗначение и Тип=Строка я еще в (1) ссылку приводил
31 Garykom
 
гуру
22.03.19
16:02
(29) Программно в ТабДок это проставить можно и все ОК?
32 Дмитрий
 
22.03.19
16:21
(26) А если программно сразу в Excel писать ?
33 ProxyInspector
 
22.03.19
16:49
Текстовый - понятно почему. Если в отчете 1с значение в ячейке табличного документа 0001, то при команде сохранить как Exell значение в ячейке Exell получается 1, с каким то левым форматом типа "00000000". Когда люди делают импорт из Exell, то и получают значение 1 вместо "0001".  Это проблема Exell, с которой народ бьется уже лет 10.
   Программно в ТабДок ставить можно, но это как-то не кошерно. Хочется в Построителе и в СКД как-то указать для ячейки .СодержитЗначение = Истина не анализируя сам ТабДок
34 Сияющий в темноте
 
22.03.19
17:36
Сохраняйте через Ado,тат тип ячейки можно точно задать.
35 mistеr
 
22.03.19
18:37
(33) Свой макет поля должен помочь.

P.S. А еще длинные цифровые коды (типа номеров банковских счетов) превращаются в непотребство типа "1.24Е18". Это к вопросу "зачем".
36 ad205
 
28.03.19
17:41
На самом деле всё проще. В свойствах нужной ячейки в шаблоне поставьте признак "Содержит значение" и тип строка. Тогда при сохранении в Excel, ячейке сразу будет присваиваться тип строка.
37 Мимохожий Однако
 
28.03.19
19:00
(36) Приведи пример кода программной установки в табличный документ при формировании в СКД. Тут уже раза три спрашивал. Сам такого кода не смог родить.
Через использование Excel  у меня получилось. Но желание обойтись без него окаянного не прошло.)
38 ProxyInspector
 
08.04.19
15:38
Попробовал на своей базе, все прекрасно получилось. В СКД формируется ТабличныйДокумент.
Перед сохранением ТабличногоДокумента в Exell Выполняется код:

    ТипСтрока = Новый ОписаниеТипов("Строка");
    Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
            Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
            ТекТекст = Ячейка.Текст;
            Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
                                //Первый символ "0" или строка содержит "e" и числа ( для  "1.24Е18")
                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
            КонецЕСли;
        КонецЦикла;
    КонецЦикла;

Вполне возможно этот код выполнять просто после формирования ТабличногоДокумента, но до вывода на эеран. Тогда корректно работать
  "Сохранить как"
39 Мимохожий Однако
 
08.04.19
15:41
(38) В какую процедуру ты разместил этот код?
40 ProxyInspector
 
08.04.19
15:44
Пока перед сохранением файла. У нас кнопочка сделана "Сохранить в Exell" когда сформирован табличныйДокумент
И еще добавил в Рассылку отчетов, опять же перед сохранением во временный файл
41 Мимохожий Однако
 
08.04.19
15:47
(40) У меня формирование идёт в режиме фонового задания.   В интерактивном режиме этой проблемы нет. Меня интересует только программное сохранение. Приведенный код не работает на сервере. У меня не работает. Всё что предлагалось - интерактив. Или я не понял?
42 ProxyInspector
 
08.04.19
15:49
У меня тоже рассылка идет в Фоновом режиме.
43 Мимохожий Однако
 
08.04.19
15:50
(42) А формирование файла вручную?
44 Мимохожий Однако
 
08.04.19
15:52
У меня платформа 8.3.9. Может быть, из-за этого?
45 ProxyInspector
 
08.04.19
15:53
Я правда не проверил еще в Фоновом режиме :) Но мне кажется должно работать. Там такой-же ТабличныйДокумент и команда ТабличныйДокумент.Записать(...)
У меня 8.3.8.2197
46 ProxyInspector
 
08.04.19
15:54
Формирование файла происходит так
табличныйДокумент.Записать(..)
47 ProxyInspector
 
08.04.19
15:55
Перед этим прохожу по ячейкам Табличного документа и где надо ставлю
                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
48 Мимохожий Однако
 
08.04.19
15:56
(45) С кода, который ты привёл, я начинал до сабжа, но у меня при этом формат оставался общим.
49 Мимохожий Однако
 
08.04.19
15:57
+ см(13)
50 ProxyInspector
 
08.04.19
15:59
Так там хитро, формат остается "общий", но значение не конвертируется в число. Т.е если без преобразования делаешь, то из "0000001" получается  формат = "000000000" значение = 1
а с преобразованием получается
формат = "общий"   значение = "0000001"
51 ProxyInspector
 
08.04.19
16:04
Тоже самое с "1000e10"
без преобразования получается формат "общий"  значение 1.00e10
c преобразованием  формат "общий"  значение "1000e10"
52 ProxyInspector
 
08.04.19
16:06
При этом Exell говорит на "0000001" что данная ячейка содержит значение в виде строка, и предлагает изменить его на число
53 Мимохожий Однако
 
08.04.19
16:13
У меня последняя задача была поставлена, чтобы не только значение было строка, но и формат  Текстовый. Из-за этого копья ломались )) Через 1С не удалось, поэтому пока работает режим вызова Excel/
54 ProxyInspector
 
11.04.19
10:02
Продолжили тестирование, обнаружились некоторые странности. На некоторых артикулах типа "0AA-1BB23456" не корректно переносилось в Excell, судя по всему в 1С начудили. Пришлось добавить строку в код "   Ячейка.Текст = ТекТекст;" и получилось так.

ТипСтрока = Новый ОписаниеТипов("Строка");
    Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
        ДЛя НомерСтолбца = 1 ПО ТабличныйДокумент.ШиринаТаблицы Цикл
            Ячейка = ТабличныйДокумент.Область(НомерСтроки, НомерСтолбца, НомерСтроки, НомерСтолбца);
            ТекТекст = Ячейка.Текст;
            Если ТребуетсяПреобразованиеСтрока(ТекТекст) Тогда
                                //Первый символ "0" или строка содержит "e" и числа ( для  "1.24Е18")
                Ячейка.СодержитЗначение = Истина;
                Ячейка.ТипЗначения = ТипСтрока;
                Ячейка.Текст = ТекТекст;
            КонецЕСли;
        КонецЦикла;
    КонецЦикла;

    И это работает нормально, для нашего полного набора артикулов автозапчастей  (где-то в районе 100 тыс шт)
Для себя мы эту тему закрыли.