Имя: Пароль:
1C
1С v8
Сохранить данные из 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 данными из ТЗ    
    ТекстCSV = ТекстCSV + СтрокаТЗ.ТипСтроки + СимволРазделителя +
    ТекСтрока.СтрокаНо  + СимволРазделителя +
    СтрокаТЗ.ТоварНо + СимволРазделителя + Символы.ПС;        
КонецЦикла;


Это некорректный код создания 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);
    
    Если АдресХранилища = Неопределено Тогда
        ПоказатьПредупреждение( , "При сохранение файла возникла ошибка");
        Возврат;
    КонецЕсли;
        
    Попытка
        ПолучитьФайл(АдресХранилища, нИмяФайла, Истина);
    Исключение                
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Не удалось записать файл. Возможно, недостаточно места на диске, диск защищен от записи или не подключено расширение для работы с файлами.";
        Сообщение.Сообщить();
    КонецПопытки;

КонецПроцедуры // СохранениеТабличногоДокументаВФайл()

&НаСервере
Функция ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, Расширение) Экспорт
    
    АдресХранилища    = Неопределено;
    ИмяФайла        = ПолучитьИмяВременногоФайла(Расширение);
    
    Попытка
        ТекстовыйДокумент.Записать(ИмяФайла);
        АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
    Исключение
        ВызватьИсключение;
    КонецПопытки;
    
    Возврат АдресХранилища;
    
КонецФункции // ПоместитьТабличныйДокументВоВременноеХранилищеНаСервере()


У меня основная проблема была, что передать в виде параметров в процедуру
Функция ПоместитьТекстовыйДокументВоВременноеХранилищеНаСервере(ТекстовыйДокумент, Расширение)

Всем спасибо вдруг кому-то пригодится.