Как сохранить любой табличный документ 1с в excel так, что бы дата была датой, а не строкой?
Я заинтересовался этим вопросом по долгу службы. Выяснилось, что никак.))) Все, можно расходиться. Но есть лайфхаки и самый из них, по моему скромному мнению, удачный это:
- Сохраняем отчет стандартным способом в excel.
- Открываем файл и видим. что дата хранится в формате строки:
- Жмем заменить (при условии что дата разделена «.» (точкой)) и меняем «.» на «.» везде.
- Все готово. Вы только что не меняя файл изменили его.)))
Если дата у вас разделена «\» (слешем), нет проблем проведите замену «\» на «\»
Если же ваши пользователи такие же требовательные, как и мои, то тоже не вижу проблемы.
- Создаем отдельную команду в форме отчета.
- В коде этой команды добавляем диалог выбора файла, далее его сохранение в формате excel.
&НаКлиенте
Процедура ВыгрузитьВЁксель(Команда)
ВыгрузитьВЁксельОбщая(Результат, "Имя_Отчета_");
КонецПроцедуры
&НаКлиенте
Асинх Процедура ВыгрузитьВЁксельОбщая(аРезультат, аИмяФайлаБаза) Экспорт
лДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
лДиалог.Фильтр="Файлы Excel(2007-2010)|*.xlsx";
лДиалог.МножественныйВыбор = Ложь;
лДиалог.ПолноеИмяФайла = аИмяФайлаБаза;
лОтвет = Ждать лДиалог.ВыбратьАсинх();
Если лОтвет=Неопределено Тогда
Возврат;
КонецЕсли;
лИмяФайла = лОтвет[0];
лСрРаПараметры = Новый Структура;
лСрРаПараметры.Вставить("ТекРезультат", аРезультат);
лСрРаПараметры.Вставить("ИмяФайла",лИмяФайла);
лОповещениеЗавершение = Новый ОписаниеОповещения("ВыборФайлаДляСохраненияЗавершение", ЭтотОбъект, лСрРаПараметры);
аРезультат.НачатьЗапись(лОповещениеЗавершение, лИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
КонецПроцедуры
После этого программно открываем, только что созданный файл и программно меняем в нем «.» (точку) на «.» (точку) или соответственно «\» на «\»
Для этого к каждой области применяем:
Replace(".", ".", 2) или Replace("\", "\", 2)
После чего сохраняем и закрываем этот файл.
&НаКлиенте
Процедура ВыборФайлаДляСохраненияЗавершение(аЗаписьУспешна, аДопПараметры) Экспорт
Если Не аЗаписьУспешна Тогда
Сообщить(СтрШаблон("File isn'n saved! %1", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецЕсли;
лИмяФайла = аДопПараметры.ИмяФайла;
лРезультат = аДопПараметры.ТекРезультат;
лСтрок = лРезультат.ВысотаТаблицы;
ПоследняяКолонка = лРезультат.ШиринаТаблицы;
Попытка
лЕксель = Новый COMОбъект("Excel.Application");
лЕксель.DisplayAlerts = 0;
Исключение
Сообщить(СтрШаблон("Excel error: %1", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
Возврат;
КонецПопытки;
лЕксельКнига = лЕксель.WorkBooks.Open(лИмяФайла);
лЕксельЛист = лЕксельКнига.Worksheets(1);
Для лчТекНомерКолонки = 1 По ПоследняяКолонка Цикл
лЕксельОбласть = лЕксельЛист.Range(лЕксельЛист.Cells(1,лчТекНомерКолонки), лЕксельЛист.Cells(лСтрок+1,лчТекНомерКолонки));
лЕксельОбласть.Replace(".", ".", 2);
КонецЦикла;
Попытка
лЕксельКнига.SaveAs(лИмяФайла,51);
Исключение
Сообщить(СтрШаблон("File isn'n saved! %1", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
лЕксель.Quit();
Возврат;
КонецПопытки;
Сообщить(СтрШаблон("File saved: %1", лИмяФайла));
лЕксель.Quit();
КонецПроцедуры
Все готово.
Если лень все это писать, скачивайте мой код в виде расширения.
Он состоит:
1. Общий модуль "Ёкс_Отчеты_Клиент" - основной код
2. Картинка - для кнопочки выгрузки в excel
3. Форма одного из отчетов для примера:
В форме добавлена команда и ее код и кнопка для отображения на форме.
Тестировал на платформе 8.3 (8.3.21.1709).