|
Сохранить данные из 1С в csv-файл из web-приложения 1С -какой тип файла у csv? | ☑ | ||
---|---|---|---|---|
0
DenYuliya
20.04.23
✎
12:57
|
Всем привет!
Подскажите пожалуйста, как алгоритм ниже переделать под сохранение файла в формате csv из web-приложения 1С? Если сущность ТабДока я понимаю, то с csv откровенно проблемы, признаюсь - как-то не доводилось раньше сталкиваться близко. Это вариант под выгрузку в Excel, он работает, тут мне все понятно: &НаКлиенте Процедура СохранениеТабличногоДокументаВФайл(ТабличныйДокумент, нИмяФайла) АдресХранилища = ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, "xlsx", ТипФайлаТабличногоДокумента.XLSX); КонецПроцедуры &НаСервере Функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, Расширение, ТипФайла) Экспорт АдресХранилища = Неопределено; ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); ТабличныйДокумент.Записать(ИмяФайла, ТипФайла); АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла)); Возврат АдресХранилища; КонецФункции А если аналогичное делать под csv? Основной затык у меня с параметром "ТипФайла" для csv. Сам вайл csv у меня ранее (в варианте, который работает на сервере, но не работает в web-приложении) создается следующей конструкцией: ФайлCSV = СокрЛП(ПутьИмяФайла) + ".csv"; ТЗ = РезультатЗапроса; Для Каждого СтрокаТЗ Из ТЗ Цикл ////заполняем csv данными из ТЗ ТекстCSV = ТекстCSV + СтрокаТЗ.ТипСтроки + СимволРазделителя + ТекСтрока.СтрокаНо + СимволРазделителя + СтрокаТЗ.ТоварНо + СимволРазделителя + Символы.ПС; КонецЦикла; КодANSI = КодировкаТекста.ANSI; ТекстовыйФайлЗапись = Новый ЗаписьТекста(ФайлCSV, КодANSI); ТекстовыйФайлЗапись.ЗаписатьСтроку(ТекстCSV); ТекстовыйФайлЗапись.Закрыть(); Ну так вот.... Как же тогда должна выглядеть функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере() в варианте под csv, что использовать вместо "ТипФайлаТабличногоДокумента.XLSX" (передаваемый параметр ТипФайла) Что-то вроде такого, наверное, в итоге должно быть? &НаКлиенте Процедура СохранениеТекстовогоДокументаВФайл(ТекстовыйДокумент, нИмяФайла) АдресХранилища = ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, "csv", ????? ); КонецПроцедуры |
|||
1
Garykom
19.04.23
✎
19:20
|
посмотреть что внутри ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере()
|
|||
2
Garykom
19.04.23
✎
19:21
|
ТабличныйДокумент.Записать(ИмяФайла, ТипФайла);
что такое тип файла и нужен ли он вам если у вас текстовый документ с расширением csv ? |
|||
3
DenYuliya
19.04.23
✎
19:28
|
(1) видимо, я вопрос не поняла.
Внутри процедуры ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере() следующий код: &НаСервере Функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, Расширение, ТипФайла) Экспорт АдресХранилища = Неопределено; ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); ТабличныйДокумент.Записать(ИмяФайла, ТипФайла); АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла)); Возврат АдресХранилища; КонецФункции |
|||
4
DenYuliya
19.04.23
✎
19:30
|
(2) в продолжение к (3)
"что такое тип файла" - ну видимо это описание типа файла). Да, очень нужен, я же хочу свой файл csv сохранить). Для Excel передаваемые параметры выглядят так: АдресХранилища = ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, "xlsx", ТипФайлаТабличногоДокумента.XLSX); А вот как это под csv переделать, не могу сообразить. |
|||
5
DenYuliya
19.04.23
✎
19:32
|
(2) Если брать из СП определение "ТипФайлаТабличногоДокумента" - "Содержит варианты форматов файлов для сохранения табличного документа. Используется для определения параметра <ТипФайлаТаблицы> метода Записать". Ну вот мне надо что-то подобное, но для csv.
|
|||
6
Garykom
19.04.23
✎
19:36
|
(5) Не надо вам ничего
ТабДок имеет несколько форматов в которые можно его Записать() Поэтому передается ТипФайла Для ЗаписьТекста формат один |
|||
7
Garykom
19.04.23
✎
19:40
|
(6)+ Можете кодировку передавать ))
|
|||
8
DenYuliya
19.04.23
✎
19:44
|
(6) то есть под такую задачу процедуры будут выглядеть как-то так? Просто убрать параметр "ТипФайла" и вместо него передавать кодировку? А расширение надо, или оно уже в "МояРанееСозданнаяЗаписьТекста" (которая ТекстовыйФайлЗапись) будет и этого достаточно?
&НаКлиенте Процедура СохранениеТекстовогоДокументаВФайл(МояРанееСозданнаяЗаписьТекста, нИмяФайла) АдресХранилища = ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(МояРанееСозданнаяЗаписьТекста, "csv", КодANSI ); КонецПроцедуры &НаСервере Функция ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, Расширение, Кодировка) Экспорт АдресХранилища = Неопределено; ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); мояРанееСозданнаяЗаписьТекста.Записать(ИмяФайла, КодANSI); АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла)); Возврат АдресХранилища; КонецФункции |
|||
9
DenYuliya
19.04.23
✎
19:46
|
(7) это просто комбо какое-то того, в чем я "плаваю" и терпеть не могу: web, ВременноеХранилище, еще и csv этот дурацкий... И не отладишь никак, потому что на сервере все работает, а в web-приложении нет отладки.
|
|||
10
Сияющий Асинхраль
19.04.23
✎
23:54
|
(9) Ну чем Вам csv дурацкий? Вам же сказали, что csv это обычный текстовый файл. Его можно с тем же успехом записать с расширением txt. Он прочтется любым текстовым редактором, даже блокнотом. Если так будет понятней, то делаете абсолютно стандартный текстовый файл, но сохраняете его с расширением csv. Разница, только в том, что у всех строк csv формат одинаковый, а в обычном txt строки могут быть какие угодно...
|
|||
11
DenYuliya
20.04.23
✎
12:09
|
(10) "Ну чем Вам csv дурацкий" - тем, что я не умею его готовить, однако)))).
да я понимаю, что "csv это обычный текстовый файл". Только плаваю в работе с ним через 1С. Хотите сказать, что все команды, примеры и т.д., применимые к txt - можно применить и к csv? |
|||
12
Волшебник
20.04.23
✎
12:10
|
(11) >> Хотите сказать, что все команды, примеры и т.д., применимые к txt - можно применить и к csv?
Разумеется. |
|||
13
DenYuliya
20.04.23
✎
12:11
|
(12) спасибо, попробую. Думаю, примеров по txt все-таки сильно больше, чем по csv
|
|||
14
Garykom
20.04.23
✎
12:14
|
Это некорректный код создания CSV файла Правильный должен строковые поля в некоторых случаях в кавычки и удвоение их в строке https://ru.wikipedia.org/wiki/CSV "Спецификация Каждая строка файла — это одна строка таблицы. Разделителем (англ. delimiter) значений колонок является символ запятой (,). Однако на практике часто используются другие разделители, то есть формат путают с DSVruen и TSV (см. ниже). Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками ("). Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд." |
|||
15
DenYuliya
20.04.23
✎
12:51
|
(14) дернуто с просторов инфостарта и частично вот отсюда Выгрузка в CSV
Честно говоря, я не совсем поняла, что именно подразумевается под "некорректно"- каноническая идеальность и чистота кода? Потому как выгруженный файл формируется, данными он заполнен, данные с виду верные верные, в базу-приемник (не 1С) загружается. Но спасибо, поразмышляю над информацией. А пример строки выгрузки, который предоставил постановщик задачи, вообще выглядит как-то так: 101$NashaOrganizacia$01,19.00,2022-05-09,2022-06-05 Но вообще вопрос не в том был, как сформировать файл csv, а в том, как его выгрузить на локальный ПК из web-версии |
|||
16
Garykom
20.04.23
✎
13:00
|
(15) Допустим у тебя "$NashaOrganizacia$"="Просто пример "Названия" с "," внутри и ";", да такое тоже бывает"
В итоге твоя строка CSV будет: 101Просто пример "Названия" с "," внутри и ";", да такое тоже бывает01,19.00,2022-05-09,2022-06-05 Вместо правильной: "101Просто пример ""Названия"" с "","" внутри и "";"", да такое тоже бывает01",19.00,2022-05-09,2022-06-05 |
|||
17
Garykom
20.04.23
✎
13:03
|
(16)+ И кривая строка CSV не будет корректно парситься - запятые лишние не взятые в "", кавычки внутри не удвоены
|
|||
18
DenYuliya
20.04.23
✎
13:09
|
(17)
Конкретно в этой ситуации никаких лишних ";" и ",", потому как это наименование организации, к счастью, такого бардака в базе еще нет, чтобы в наименование организации случайно ";" приписали. А остальные колонки - это числа. Но в целом, возьму на заметку, спасибо. Как все, что надо, заработает - посмотрю, что можно в части проверок допилить. Еще вот такая проверка там есть у меня, но так как вопрос не в том, как текст CSV запилить, я не стала полностью полностью листинг приводить. Если ТекстCSV = "" Тогда СтрокаКол = ""; КолонкиТЗ = ТЗ.Колонки; Для Каждого Колонка Из КолонкиТЗ Цикл СтрокаКол = "" + СтрокаКол + Колонка.Имя + СимволРазделителя; КонецЦикла; ТекстCSV = СтрокаКол + Символы.ПС; КонецЕсли; |
|||
19
Garykom
20.04.23
✎
13:12
|
(18) Нет запрета в названии Организаций или Контрагентов не иметь кавычки, запятые или другие символы.
Вы понимаете что ХХПшите? |
|||
20
Garykom
20.04.23
✎
13:13
|
(19)+ Причем уже на простейшей по сути задаче.
Хуже чем студент в контрольной. Что будет когда реальные сложные задачи пойдут, а не вот эта простейшая штука? |
|||
21
DenYuliya
20.04.23
✎
13:26
|
(19) да, я понимаю, что пишу. "Нет запрета в названии Организаций или Контрагентов не иметь кавычки, запятые или другие символы" - запрет есть (маска при создании) и я точно могу сказать, что в наших базах нет ссылок на условную "номенклатуру", содержащую в наименовании такие символы. Там строгая цифро-буквенная комбинация. Спасибо за информацию, приму к сведению на будущее и изучу этот вопрос детальнее. Но В ДАННЫЙ МОМЕНТ И В ДАННОЙ ТЕМЕ вопрос о другом.
|
|||
22
Смотрящий
20.04.23
✎
13:59
|
АдресХранилища = ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере(ТабличныйДокумент, "csv", ТипФайлаТабличногоДокумента.ANSITXT) - не ?
|
|||
23
DenYuliya
20.04.23
✎
17:56
|
(22) возможно, блин, я теперь не понимаю, что мне туда передавать.
У меня есть ТекстовыйФайлЗапись, но я же не могу его в Табличный документ засунуть(((. Как мне в ТабличныйДокумент засунуть csv, если csv- это ЗаписьТекста? ТЗ = РезультатЗапроса; Для Каждого СтрокаТЗ Из ТЗ Цикл ////заполняем csv данными из ТЗ ТекстCSV = ТекстCSV + СтрокаТЗ.ТипСтроки + СимволРазделителя + ТекСтрока.СтрокаНо + СимволРазделителя + СтрокаТЗ.ТоварНо + СимволРазделителя + Символы.ПС; КонецЦикла; КодANSI = КодировкаТекста.ANSI; ТекстовыйФайлЗапись = Новый ЗаписьТекста(ФайлCSV, КодANSI); ТекстовыйФайлЗапись.ЗаписатьСтроку(ТекстCSV); ТекстовыйФайлЗапись.Закрыть(); Жесть какая-то, я просто застряла с этим моментом выгрузки csv из web-версии. Может быть создать макет с видом Текстовый документ, в него как-то записывать текст csv? |
|||
24
DenYuliya
20.04.23
✎
18:58
|
(22) к (23).
Вопрос закрыт. Сделала создание csv не через "Новый ЗаписьТекста", а через "Новый ТекстовыйДокумент": &НаКлиенте ///Кнопка на форме обработки Процедура нДвижения(Команда) ТекстДок = нДвиженияНаСервере(); ///получаю текст док нИмяФайла = ПолучитьИмяФайла(); ВыгрузитьТекстовыйДокументВФайл(ТекстДок, ИмяФайла); ///передаю текст док и имя файла ТекстДок.Показать(); //это так, посмотреть, что получается КонецПроцедуры &НаСервере Функция нДвиженияНаСервере() ТЗ = ПолучитьРезультатЗапроса(); ///тут результат запроса СимволРазделителя = ","; Кодировка = КодировкаТекста.ANSI; ТекстCSV = СоздатьДанныеCSV(ТЗ,СимволРазделителя); ////тут создаю текст для дальнейшей загрузки в файл в формате "Строка" ТекстДок = Новый ТекстовыйДокумент; ТекстДок.УстановитьТипФайла(Кодировка); ТекстДок.УстановитьТекст(ТекстCSV); ////записываю в текст док ранее сформированный текст Возврат ТекстДок; ///передаю текстДок КонецФункции Дальше все это дело обрабатывается и выгружается: &НаКлиенте Процедура ВыгрузитьТекстовыйДокументВФайл(ТекстовыйДокумент, ИмяФайла) Экспорт // Формируем для передачи данных между процедурами нИмяФайла = СокрЛП(ИмяФайла) + ".csv"; ПараметрыТекстовогоДокумента = Новый Структура("ТекстовыйДокумент , ИмяФайла", ТекстовыйДокумент, нИмяФайла); #Если ВебКлиент Тогда ОповещениеПодключенияРасширения = Новый ОписаниеОповещения( "ЗавершитьПодключениеРасширенияРаботыСФайлами_csv", ЭтаФорма, ПараметрыТекстовогоДокумента); НачатьПодключениеРасширенияРаботыСФайлами(ОповещениеПодключенияРасширения); Возврат; #КонецЕсли СохранениеТекстовогоДокументаВФайл(ТекстовыйДокумент, нИмяФайла); КонецПроцедуры // ВыгрузитьТабличныйДокументВФайл() &НаКлиенте Процедура ЗавершитьПодключениеРасширенияРаботыСФайлами_csv(Подключено, ДополнительныеПараметры) Экспорт Если Подключено Тогда ТекстовыйДокумент = ДополнительныеПараметры.ТекстовыйДокумент; ИмяФайла = ДополнительныеПараметры.ИмяФайла; СохранениеТекстовогоДокументаВФайл(ТекстовыйДокумент, ИмяФайла); Иначе ПоказатьПредупреждение(,"Выполните операцию еще раз после установки расширения работы с файлами"); НачатьУстановкуРасширенияРаботыСФайлами(); КонецЕсли; КонецПроцедуры // ЗавершитьПодключениеРасширенияРаботыСФайлами() &НаКлиенте Процедура СохранениеТекстовогоДокументаВФайл(ТекстовыйДокумент, нИмяФайла) АдресХранилища = ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, ".csv"); // ТипФайлаТабличногоДокумента.TXT); Если АдресХранилища = Неопределено Тогда ПоказатьПредупреждение( , "При сохранение файла возникла ошибка"); Возврат; КонецЕсли; Попытка ПолучитьФайл(АдресХранилища, нИмяФайла, Истина); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не удалось записать файл. Возможно, недостаточно места на диске, диск защищен от записи или не подключено расширение для работы с файлами."; Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры // СохранениеТабличногоДокументаВФайл() &НаСервере Функция ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, Расширение) Экспорт АдресХранилища = Неопределено; ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); Попытка ТекстовыйДокумент.Записать(ИмяФайла); АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла)); Исключение ВызватьИсключение; КонецПопытки; Возврат АдресХранилища; КонецФункции // ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере() У меня основная проблема была, что передать в виде параметров в процедуру Функция ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, Расширение) Всем спасибо вдруг кому-то пригодится. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |