ПолучитьУникальноеИмяСПутем (БСП)

Автор: 1С
ОбщийМодуль.РаботаСФайламиСлужебныйКлиентСервер
БСП

Получить уникальное имя путем. Получить уникальное имя файла в рабочем каталоге.

// Получить уникальное имя файла в рабочем каталоге.
//  Если есть совпадения - будет имя подобное "A1\Приказ.doc".
//
Функция ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла) Экспорт
	
	ИтоговыйПуть = "";
	
	Счетчик = 0;
	ЦиклНомер = 0;
	Успешно = Ложь;
	КодБукваA = КодСимвола("A", 1);
	
	ГенераторСлучая = Неопределено;
	
#Если Не ВебКлиент Тогда
	ГенераторСлучая = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
#КонецЕсли

	КоличествоСлучайныхВариантов = 26;
	
	Пока НЕ Успешно И ЦиклНомер < 100 Цикл
		НомерКаталога = 0;
		
#Если Не ВебКлиент Тогда
		НомерКаталога = ГенераторСлучая.СлучайноеЧисло(0, КоличествоСлучайныхВариантов - 1);
#Иначе
		НомерКаталога = ТекущаяУниверсальнаяДатаВМиллисекундах() % КоличествоСлучайныхВариантов;
#КонецЕсли

		Если Счетчик > 1 И КоличествоСлучайныхВариантов < 26 * 26 * 26 * 26 * 26 Тогда
			КоличествоСлучайныхВариантов = КоличествоСлучайныхВариантов * 26;
		КонецЕсли;
		
		БуквыКаталога = "";
		КодБукваA = КодСимвола("A", 1);
		
		Пока Истина Цикл
			НомерБуквы = НомерКаталога % 26;
			НомерКаталога = Цел(НомерКаталога / 26);
			
			КодКаталога = КодБукваA + НомерБуквы;
			
			БуквыКаталога = БуквыКаталога + Символ(КодКаталога);
			Если НомерКаталога = 0 Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		ПодКаталог = ""; // Частичный путь.
		
		// По умолчанию вначале используется корень, если возможности нет,
		// то добавляется A, B, ... Z, .. ZZZZZ, .. AAAAA, .. AAAAAZ и т.д.
		Если  Счетчик = 0 Тогда
			ПодКаталог = "";
		Иначе
			ПодКаталог = БуквыКаталога;
			ЦиклНомер = Окр(Счетчик / 26);
			
			Если ЦиклНомер <> 0 Тогда
				ЦиклНомерСтрока = Строка(ЦиклНомер);
				ПодКаталог = ПодКаталог + ЦиклНомерСтрока;
			КонецЕсли;
			
			Если ЭтоЗарезервированноеИмяКаталога(ПодКаталог) Тогда
				Продолжить;
			КонецЕсли;
			
			ПодКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПодКаталог);
		КонецЕсли;
		
		ПолныйПодКаталог = ИмяКаталога + ПодКаталог;
		
		// Создание каталога для файлов.
		КаталогНаДиске = Новый Файл(ПолныйПодКаталог);
		Если НЕ КаталогНаДиске.Существует() Тогда
			Попытка
				СоздатьКаталог(ПолныйПодКаталог);
			Исключение
				ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Ошибка при создании каталога ""%1"":
					           |""%2"".'"),
					ПолныйПодКаталог,
					КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) );
			КонецПопытки;
		КонецЕсли;
		
		ФайлПопытки = ПолныйПодКаталог + ИмяФайла;
		Счетчик = Счетчик + 1;
		
		// Проверка, есть ли файл с таким именем.
		ФайлНаДиске = Новый Файл(ФайлПопытки);
		Если НЕ ФайлНаДиске.Существует() Тогда  // Нет такого файла.
			ИтоговыйПуть = ПодКаталог + ИмяФайла;
			Успешно = Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ИтоговыйПуть;
	
КонецФункции

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

Рекомендации

Похожие публикации

ПолучитьИмяВопроса (БСП)

ПолучитьПолноеИмяФайлаИзРегистра (БСП)

УникальноеИмяФайлаСообщенияОбмена (БСП)

FTPИмяСервераИПуть (БСП)

Полный путь до предопределенного значения, включая имя самого значения

ЗанятьЛицензиюУникальнойУслуги (БСП)

КоличествоЛицензийУникальнойУслуги (БСП)

ПолучитьРеквизитФормыПоПути (БСП)

ПолучитьСвойстваФоновогоЗадания (БСП)

1С Менеджер конфигураций