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