Публикации

БСП
Разработки

Найдено результатов: 8


Записать текстовый файл без BOM

Для тех кому нужно записать текстовый файл без BOM-раздела. Основная суть в записи через файловый поток
ПутьФайла = ПолучитьИмяВременногоФайла();

СтрокаТекста = "текст";

ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(СтрокаТекста);		
ТекстовыйФайл.Записать(ПутьФайла, КодировкаТекста.UTF8, Символы.ПС);

ФайловыйПоток = Новый ФайловыйПоток(ПутьФайла,РежимОткрытияФайла.Создать);
ТекстовыйФайл.Записать(ФайловыйПоток,КодировкаТекста.UTF8, Символы.ПС, Ложь);

ФайловыйПоток.Закрыть();

ЗаписатьФайлПротоколаОшибкиИЗавершитьРаботу

Записывает в каталог скрипта файл-маркер ошибки.
ОбщийМодуль.ОбновлениеКонфигурацииКлиент
Автор: 1С
// Записывает в каталог скрипта файл-маркер ошибки.
//
Процедура ЗаписатьФайлПротоколаОшибкиИЗавершитьРаботу(КаталогСкрипта, ПодробноеПредставлениеОшибки) Экспорт
	
#Если Не ВебКлиент Тогда
	ФайлРегистрации = Новый ЗаписьТекста(КаталогСкрипта + "error.txt");
	ФайлРегистрации.Закрыть();
	
	ФайлЛога = Новый ЗаписьТекста(КаталогСкрипта + "templog.txt", КодировкаТекста.Системная);
	ФайлЛога.Записать(ПодробноеПредставлениеОшибки);
	ФайлЛога.Закрыть();
	
	ПрекратитьРаботуСистемы();
#КонецЕсли
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ЗавершитьПолучениеОбновления

ОбщийМодуль.ПолучениеОбновленийПрограммыКлиентСервер
Автор: 1С
Процедура ЗавершитьПолучениеОбновления(Обновление, Контекст) Экспорт
	
	// Извлечение дистрибутива.
	Если Обновление.ФорматФайлаОбновления = "zip" Тогда
		
		// Извлечение из архива.
		Попытка
			ЧтениеZIP = Новый ЧтениеZipФайла(Обновление.ИмяПолученногоФайла);
			ЧтениеZIP.ИзвлечьВсе(Обновление.КаталогДистрибутива,
				РежимВосстановленияПутейФайловZIP.Восстанавливать);
		Исключение
			
			СообщениеЖурнала =
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Ошибка при извлечении файлов архива (%1) в каталог %2.'"),
					Обновление.ИмяПолученногоФайла,
					Обновление.КаталогДистрибутива)
				+ Символы.ПС
				+ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			
			ПолучениеОбновленийПрограммыВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(СообщениеЖурнала);
			
			Контекст.ИмяОшибки          = "ОшибкаИзвлеченияДанныхИзФайла";
			Контекст.ИнформацияОбОшибке = СообщениеЖурнала;
			Контекст.Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось извлечь файлы дистрибутива. %1'"),
				КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			Возврат;
			
		КонецПопытки;
		
		ЧтениеZIP.Закрыть();
		
		// Проверка существования cfu-файла в полученном дистрибутиве.
		Если Не ФайлСуществует(Обновление.ПолноеИмяCFUФайлаВКаталогеДистрибутивов, Ложь) Тогда
			
			Контекст.ИмяОшибки          = "ОшибкаДистрибутиваКонфигурации";
			Контекст.ИнформацияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Некорректный файл дистрибутива %1. Отсутствует файл обновления конфигурации %2.'"),
				Обновление.URLФайлаОбновления,
				Обновление.ОтносительныйПутьCFUФайла);
			ПолучениеОбновленийПрограммыВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(Контекст.ИнформацияОбОшибке);
			Контекст.Сообщение = НСтр("ru = 'Дистрибутив не содержит файл обновления конфигурации.'");
			Возврат;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если Обновление.ФорматФайлаОбновления = "zip" Тогда
		Попытка
			УдалитьФайлы(Обновление.ИмяПолученногоФайла);
		Исключение
			ПолучениеОбновленийПрограммыВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
	КонецЕсли;
	
	
	// Запись индексного файла.
	Попытка
		
		ПолноеИмяИндексногоФайла = Контекст.КаталогИндексаФайлов + Обновление.ИмяИндексногоФайла;
		ОписательФайлаОбновления = Новый Файл(Обновление.ПолноеИмяCFUФайлаВКаталогеДистрибутивов);
		
		ЗаписьТекста = Новый ЗаписьТекста(ПолноеИмяИндексногоФайла);
		ЗаписьТекста.ЗаписатьСтроку(Обновление.ПолноеИмяCFUФайлаВКаталогеДистрибутивов);
		ЗаписьТекста.ЗаписатьСтроку(Обновление.КонтрольнаяСумма);
		ЗаписьТекста.ЗаписатьСтроку(Строка(ОписательФайлаОбновления.Размер()));
		ЗаписьТекста.ЗаписатьСтроку(Строка(ОписательФайлаОбновления.ПолучитьУниверсальноеВремяИзменения()));
		ЗаписьТекста.Закрыть();
		
	Исключение
		ПолучениеОбновленийПрограммыВызовСервера.ЗаписатьОшибкуВЖурналРегистрации(
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ЗаписатьПробныйФайл

Записывает тестовый файл на диск, возвращая его имя и размер.
ОбщийМодуль.РаботаВМоделиСервиса
Автор: 1С
// Записывает тестовый файл на диск, возвращая его имя и размер.
// Файл должна удалять вызывающая сторона.
//
// Возвращаемое значение:
//   Строка - имя пробного файла без пути.
//
Функция ЗаписатьПробныйФайл() Экспорт
	
	НовыйИД = Новый УникальныйИдентификатор;
	СвойстваФайла = Новый Файл(ПолучитьОбщийКаталогВременныхФайлов() + НовыйИД + ".tmp");
	
	Текст = Новый ЗаписьТекста(СвойстваФайла.ПолноеИмя, КодировкаТекста.ANSI);
	Текст.Записать(НовыйИД);
	Текст.Закрыть();
	
	Возврат СвойстваФайла.Имя;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ИнициализироватьВедениеПротоколаОбмена

Создает объект для записи протокола обмена и помещает его в КомпонентыОбмена.
ОбщийМодуль.ОбменДаннымиXDTOСервер
Автор: 1С
// Создает объект для записи протокола обмена и помещает его в КомпонентыОбмена.
//
// Параметры:
//  КомпонентыОбмена        - Структура - содержит все правила и параметры обмена.
//  ИмяФайлаПротоколаОбмена - Строка - содержит полное имя файла протокола.
//
Процедура ИнициализироватьВедениеПротоколаОбмена(КомпонентыОбмена, ИмяФайлаПротоколаОбмена) Экспорт
	
	КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных = Неопределено;
	Если Не ПустаяСтрока(ИмяФайлаПротоколаОбмена) Тогда
		
		// Попытка записи в файл протокола обмена.
		Попытка
			КомпонентыОбмена.ВедениеПротоколаДанных.ФайлПротоколаДанных = Новый ЗаписьТекста(
				ИмяФайлаПротоколаОбмена,
				КодировкаТекста.UTF8,
				,
				КомпонентыОбмена.ВедениеПротоколаДанных.ДописыватьДанныеВПротоколОбмена);
		Исключение
			
			СтрокаСообщения = НСтр("ru = 'Ошибка при попытке записи в файл протокола данных: %1. Описание ошибки: %2'",
				ОбщегоНазначения.КодОсновногоЯзыка());
			СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, ИмяФайлаПротоколаОбмена, ОписаниеОшибки());
			
			ЗаписьЖурналаРегистрацииОбменДанными(СтрокаСообщения, КомпонентыОбмена, УровеньЖурналаРегистрации.Предупреждение);
			
		КонецПопытки;
		
	КонецЕсли;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ИзвлечьТекстВерсии

Извлекает текст из файла на диске на клиенте и помещает результат на сервер.
ОбщийМодуль.РаботаСФайламиСлужебныйКлиент
Автор: 1С
// Извлекает текст из файла на диске на клиенте и помещает результат на сервер.
Процедура ИзвлечьТекстВерсии(ФайлИлиВерсияФайла,
                             АдресФайла,
                             Расширение,
                             УникальныйИдентификатор,
                             Кодировка = Неопределено) Экспорт

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

КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ЗапуститьПрограмму

Устарела. Следует использовать ФайловаяСистемаКлиент.ЗапуститьПрограмму или ФайловаяСистема.ЗапуститьПрограмму
ОбщийМодуль.ОбщегоНазначенияКлиентСервер
Автор: 1С
// Устарела. Следует использовать ФайловаяСистемаКлиент.ЗапуститьПрограмму или ФайловаяСистема.ЗапуститьПрограмму
// Запускает внешнюю программу в соответствии с параметрами запуска.
// Не доступно в веб-клиенте. 
//
// Параметры:
//  КомандаЗапуска - Строка, Массив - Командная строка для запуска программы.
//      Если Массив, то: первый элемент массива - путь к исполняемому приложению, остальные - передаваемые параметры,
//      массив соответствует тому, который получит вызываемая программа в argv.
//  ПараметрыЗапускаПрограммы - Структура - см. функцию ПараметрыЗапускаПрограммы.
//
// Возвращаемое значение:
//  Структура - Результат работы программы.
//      КодВозврата - Число  - код возврата программы.
//      ПотокВывода - Строка - результат работы программы, направленный в поток stdout.
//      ПотокОшибок - Строка - ошибки исполнения программы, направленные в поток stderr.
//
// Пример:
//	ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму("calc");
//	
//	ПараметрыЗапускаПрограммы = ОбщегоНазначенияКлиентСервер.ПараметрыЗапускаПрограммы();
//	ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами = Истина;
//	ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму("C:\Program Files\1cv8\common\1cestart.exe", 
//		ПараметрыЗапускаПрограммы);
//	
//	ПараметрыЗапускаПрограммы = ОбщегоНазначенияКлиентСервер.ПараметрыЗапускаПрограммы();
//	ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
//	Результат = ОбщегоНазначенияКлиентСервер.ЗапуститьПрограмму("ping 127.0.0.1 -n 5", ПараметрыЗапускаПрограммы);
//
Функция ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт 
	
#Если ВебКлиент ИЛИ МобильныйКлиент Тогда
	ВызватьИсключение НСтр("ru = 'Запуск программ недоступен в веб-клиенте.'");
#Иначе
	
	СтрокаКоманды = ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска);
	
	Если ПараметрыЗапускаПрограммы = Неопределено Тогда 
		ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы();
	КонецЕсли;
	
	ТекущийКаталог              = ПараметрыЗапускаПрограммы.ТекущийКаталог;
	ДождатьсяЗавершения         = ПараметрыЗапускаПрограммы.ДождатьсяЗавершения;
	ПолучитьПотокВывода         = ПараметрыЗапускаПрограммы.ПолучитьПотокВывода;
	ПолучитьПотокОшибок         = ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок;
	ВыполнитьСНаивысшимиПравами = ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами;
	Кодировка                   = ПараметрыЗапускаПрограммы.Кодировка;
	
	Если ВыполнитьСНаивысшимиПравами Тогда 
#Если ВнешнееСоединение Тогда
		ВызватьИсключение 
			НСтр("ru = 'Недопустимое значение параметра ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами.
			           |Повешение привилегий системы не доступно из внешнего соединения.'");
#КонецЕсли
		
#Если Сервер Тогда
		ВызватьИсключение 
			НСтр("ru = 'Недопустимое значение параметра ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами.
			           |Повешение привилегий системы не доступно на сервере.'");
#КонецЕсли
		
	КонецЕсли;
	
	СистемнаяИнформация = Новый СистемнаяИнформация();
	Если (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86) 
		Или (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64) Тогда
	
		Если Не ПустаяСтрока(Кодировка) Тогда
			СтрокаКоманды = "chcp " + Кодировка + " | " + СтрокаКоманды;
		КонецЕсли;
	
	КонецЕсли;
	
	Если ДождатьсяЗавершения Тогда 
		
		Если ПолучитьПотокВывода Тогда 
			ФайлПотокаВывода = ПолучитьИмяВременногоФайла("stdout.tmp");
			СтрокаКоманды = СтрокаКоманды + " > """ + ФайлПотокаВывода + """";
		КонецЕсли;
		
		Если ПолучитьПотокОшибок Тогда 
			ФайлПотокаОшибок = ПолучитьИмяВременногоФайла("stderr.tmp");
			СтрокаКоманды = СтрокаКоманды + " 2>""" + ФайлПотокаОшибок + """";
		КонецЕсли;
		
	КонецЕсли;
	
	КодВозврата = Неопределено;
	
	Если (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86)
		Или (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64) Тогда
		
		// Из-за запуска через shell перенаправление каталога требуется сделать командой.
		Если Не ПустаяСтрока(ТекущийКаталог) Тогда 
			СтрокаКоманды = "cd /D """ + ТекущийКаталог + """ && " + СтрокаКоманды;
		КонецЕсли;
		
		// Выполняется запуск через cmd.exe (для перенаправления stdout и stderr).
		СтрокаКоманды = "cmd /S /C "" " + СтрокаКоманды + " """;
		
#Если Сервер Тогда
		
		Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
			// В файловой информационной базе показывать окно консоли не следует и в серверном контексте.
			Оболочка = Новый COMОбъект("Wscript.Shell");
			КодВозврата = Оболочка.Run(СтрокаКоманды, 0, ДождатьсяЗавершения);
			Оболочка = Неопределено;
		Иначе 
			ЗапуститьПриложение(СтрокаКоманды,, ДождатьсяЗавершения, КодВозврата);
		КонецЕсли;
		
#Иначе
		
		Если ВыполнитьСНаивысшимиПравами Тогда
			
			Если ДождатьсяЗавершения Тогда
				ВызватьИсключение 
					НСтр("ru = 'Недопустимо одновременно устанавливать параметры 
					           | - ПараметрыЗапускаПрограммы.ДождатьсяЗавершения и
					           | - ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами:
					           |Операционная система не позволяет отслеживать от имени пользователя процессы,
					           |запущенные администратором.'");
			КонецЕсли;
			
			// После начала исполнения файла команды отследить статус процесса будет невозможно,
			// Потому удалять batch файл следует последней строкой команды в самом batch файле.
			// Асинхронно удалять нельзя, иначе может наступить коллизия, 
			// когда идет попытка удаления, а запуск еще не состоялся.
			
			ФайлКоманды = ПолучитьИмяВременногоФайла("runas.bat");
			ЗаписьКоманды = Новый ЗаписьТекста(ФайлКоманды, КодировкаТекста.OEM);
			ЗаписьКоманды.ЗаписатьСтроку(СтрокаКоманды);
			ЗаписьКоманды.ЗаписатьСтроку("del /f /q """ + ФайлКоманды + """");
			ЗаписьКоманды.Закрыть();
			
			Оболочка = Новый COMОбъект("Shell.Application");
			// Запуск с передачей глагола действия - повышения привилегий.
			Оболочка.ShellExecute("cmd", "/c """ + ФайлКоманды + """",, "runas", 0);
			Оболочка = Неопределено;
			
		Иначе 
			Оболочка = Новый COMОбъект("Wscript.Shell");
			КодВозврата = Оболочка.Run(СтрокаКоманды, 0, ДождатьсяЗавершения);
			Оболочка = Неопределено;
		КонецЕсли;
#КонецЕсли
		
	ИначеЕсли (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86) 
		Или (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64) Тогда
		
		Если ВыполнитьСНаивысшимиПравами Тогда
			
			ШаблонКоманды = "pkexec env DISPLAY=[DISPLAY] XAUTHORITY=[XAUTHORITY] [СтрокаКоманды]";
			
			ПараметрыШаблона = Новый Структура;
			ПараметрыШаблона.Вставить("СтрокаКоманды", СтрокаКоманды);
			
			ПараметрыЗапускаПодпрограммы = ПараметрыЗапускаПрограммы();
			ПараметрыЗапускаПодпрограммы.ДождатьсяЗавершения = Истина;
			ПараметрыЗапускаПодпрограммы.ПолучитьПотокВывода = Истина;
			
			Результат = ЗапуститьПрограмму("echo $DISPLAY", ПараметрыЗапускаПодпрограммы);
			ПараметрыШаблона.Вставить("DISPLAY", Результат.ПотокВывода);
			
			Результат = ЗапуститьПрограмму("echo $XAUTHORITY", ПараметрыЗапускаПодпрограммы);
			ПараметрыШаблона.Вставить("XAUTHORITY", Результат.ПотокВывода);
			
			СтрокаКоманды = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(ШаблонКоманды, ПараметрыШаблона);
			ДождатьсяЗавершения = Истина;
			
		КонецЕсли;
		
		ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата);
		
	Иначе
		
		// Для MacOS просто запускаем команду.
		// Параметр ПараметрыЗапускаПрограммы.ВыполнитьСНаивысшимиПравами игнорируется.
		ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата);
		
	КонецЕсли;
	
	// Переопределение возвращенного оболочной значения.
	Если КодВозврата = Неопределено Тогда 
		КодВозврата = 0;
	КонецЕсли;
	
	ПотокВывода = "";
	ПотокОшибок = "";
	
	Если ДождатьсяЗавершения Тогда 
		
		Если ПолучитьПотокВывода Тогда
			
			ФайлИнфо = Новый Файл(ФайлПотокаВывода);
			Если ФайлИнфо.Существует() Тогда 
				ЧтениеПотокаВывода = Новый ЧтениеТекста(ФайлПотокаВывода, КодировкаСтандартныхПотоков()); 
				ПотокВывода = ЧтениеПотокаВывода.Прочитать();
				ЧтениеПотокаВывода.Закрыть();
				УдалитьВременныйФайл(ФайлПотокаВывода);
			КонецЕсли;
			
			Если ПотокВывода = Неопределено Тогда 
				ПотокВывода = "";
			КонецЕсли;
			
		КонецЕсли;
		
		Если ПолучитьПотокОшибок Тогда 
			
			ФайлИнфо = Новый Файл(ФайлПотокаОшибок);
			Если ФайлИнфо.Существует() Тогда 
				ЧтениеПотокаОшибок = Новый ЧтениеТекста(ФайлПотокаОшибок, КодировкаСтандартныхПотоков());
				ПотокОшибок = ЧтениеПотокаОшибок.Прочитать();
				ЧтениеПотокаОшибок.Закрыть();
				УдалитьВременныйФайл(ФайлПотокаОшибок);
			КонецЕсли;
			
			Если ПотокОшибок = Неопределено Тогда 
				ПотокОшибок = "";
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("КодВозврата", КодВозврата);
	Результат.Вставить("ПотокВывода", ПотокВывода);
	Результат.Вставить("ПотокОшибок", ПотокОшибок);
	
	Возврат Результат;
	
#КонецЕсли
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Формирование файла CSV с записью в файл на клиенте

buketoff 30 5

&НаКлиенте
Процедура СформироватьCsvФайл(Команда)
	
	ПутьККаталогу = ОткрытьДиалогВыбораФайла();
	Текст = ВыгрузитьВCSV(ПутьККаталогу.ПолноеИмяФайла);
	
	Кодировка = КодировкаТекста.ANSI;
	ТекстовыйФайлЗапись = Новый ЗаписьТекста(ПутьККаталогу.ПолноеИмяФайла,Кодировка);
	ТекстовыйФайлЗапись.ЗаписатьСтроку(Текст);
	ТекстовыйФайлЗапись.Закрыть();
	
КонецПроцедуры

&НаКлиенте
Функция ОткрытьДиалогВыбораФайла(НачальныйКаталог = Неопределено, МножественныйВыбор = Ложь, Фильтр = Неопределено) экспорт
	СтандартнаяОбработка = Ложь;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогОткрытияФайла.Расширение = "csv";
	Фильтр = "csv|*.csv";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.Каталог    = НачальныйКаталог;
	ДиалогОткрытияФайла.Заголовок  = "Выберите каталог...";
	ДиалогОткрытияФайла.МножественныйВыбор          = Ложь;
	ДиалогОткрытияФайла.ПроверятьСуществованиеФайла = Истина;
	ДиалогОткрытияФайла.ПредварительныйПросмотр     = Истина;
	
	Если Не ДиалогОткрытияФайла.Выбрать() Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат ДиалогОткрытияФайла;
	
КонецФункции

Функция ВыгрузитьВCSV(имяФайлаCSV);
	Текст = СоздатьДанныеCSV(ТаблицаДокументов,Разделитель);
	Возврат Текст;
КонецФункции

Функция СоздатьДанныеCSV(ТаблицаДокументов, Разделитель)
	Текст = "";
	Для Каждого Запись из ТаблицаДокументов Цикл
		Если Текст = "" тогда
			Текст = СоздатьЗаголовкиCSV(ТаблицаДокументов, Разделитель) + Символы.ПС;   	
		КонецЕсли;  
		Текст = Текст + Запись.snils + Разделитель + Запись.surname
		+ Разделитель + Запись.name + Разделитель + Запись.patronymic + Разделитель 
		+ Запись.oid + Разделитель + Запись.compaignId + Разделитель + Формат(Запись.dateOfBirth, "ДЛФ=Д") + Разделитель + Запись.citizenship + Разделитель 
		+ Запись.specialty + Разделитель + Запись.financingType + Разделитель + Запись.applicationDate + Разделитель + Запись.targetReception 
		+ Разделитель + Запись.testResultType + Разделитель + Запись.testResultOrganization + Разделитель + Запись.testResultYear + Символы.ПС;         	
	КонецЦикла;
	Возврат Текст;
КонецФункции

// Создаем строку загоовков для CSV-файла
Функция СоздатьЗаголовкиCSV(ТаблицаДокументов, Разделитель)
	НоваяТаблица = ТаблицаДокументов.Выгрузить();
	КолонкиТЗ = НоваяТаблица.Колонки;
	Для каждого Колонка Из КолонкиТЗ Цикл  
		СтрКолонки = "" + СтрКолонки + Колонка.Имя + Разделитель;
	КонецЦикла; 
	Возврат СтрКолонки;
КонецФункции