|   |   | 
| 
 | Программное сохранение табл документа в Excel с ячейками в формате Текстовый | ☑ | ||
|---|---|---|---|---|
| 0
    
        Мимохожий Однако 21.03.19✎ 16:32 | 
        Программно сохраняю прайс или отчет в формате XLSX методом табличного документа. Когда открываю файл, у него формат Общий. Это клиентов не устраивает. Поэтому и вопрос: Как сохранить табличный документ с форматом ячеек Тестовый?     | |||
| 1
    
        СтарПом 21.03.19✎ 16:39 | ||||
| 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 тыс шт) Для себя мы эту тему закрыли. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |