Библиотека универсальных функций и процедур (v 1.3)

01.06.15

Разработка - Универсальные функции

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

Скачать файлы

Наименование Файл Версия Размер
Конфигурация с интегрированной библиотекой функций
.cf 11,50Kb
48
.cf 1.3 11,50Kb 48 Скачать

Все функции писал сам (может быть, пару функций где-то позаимствовал, но сейчас уже не вспомню, где и когда). Не буду претендовать на оригинальность, возможно, ряду функций существует достаточно аналогов, в т.ч. на данном сайте.

Надеюсь, кому-нибудь они будут полезны.

#Область РаботаСПримитивнымиТипами

#Область РаботаСоСтроками

Функция ЦифровыеСимволы() Экспорт
	Возврат "0123456789";
КонецФункции // ()

Функция ПустойУИД() Экспорт
	
	Возврат "00000000-0000-0000-0000-000000000000";	
	
КонецФункции // ()

Функция ИнвертироватьСтроку(Знач Строка) Экспорт

	НоваяСтрока = "";
	
	Если Строка <> "" Тогда
		ДлинаСтроки = СтрДлина(Строка);
		
		Для Индекс = 0 По ДлинаСтроки-1 Цикл
		
			НоваяСтрока = НоваяСтрока+Сред(Строка,ДлинаСтроки-Индекс,1)	
		
		КонецЦикла; 
	
	КонецЕсли;
	
	Возврат НоваяСтрока;

КонецФункции // ()

Функция СтрОбрезатьСправа(Знач Строка,ЧислоСимволов) Экспорт
	
	Возврат Лев(Строка,СтрДлина(Строка)-ЧислоСимволов);	

КонецФункции

Функция СтрОбрезатьСлева(Знач Строка,ЧислоСимволов) Экспорт

	Возврат Прав(Строка,СтрДлина(Строка)-ЧислоСимволов);	

КонецФункции

Функция СтрЗаменитьСправа(Знач Строка,ЧислоСимволов,СтрокаЗамены) Экспорт

	Возврат СтрОбрезатьСправа(Строка,ЧислоСимволов)+СтрокаЗамены;			

КонецФункции

Функция СтрЗаменитьСлева(Знач Строка,ЧислоСимволов,СтрокаЗамены) Экспорт

	Возврат СтрокаЗамены+СтрОбрезатьСлева(Строка,ЧислоСимволов);			

КонецФункции

Функция СобратьПредставлениеЗначений(МассивЗначений,Разделитель = " ",ФорматнаяСтрока = "") Экспорт

	МассивСоединения = Новый Массив;
	Форматировать = не ПустаяСтрока(ФорматнаяСтрока);
	
	Если Форматировать Тогда
		ФорматныйТип = Новый ОписаниеТипов("Число,Дата,Булево");	
	Иначе	
		ФорматныйТип = Неопределено;
	КонецЕсли; 
	
	Для каждого ЭлементМассива Из МассивЗначений Цикл
		
		Если Форматировать и ФорматныйТип.СодержитТип(ТипЗнч(ЭлементМассива)) Тогда
			МассивСоединения.Добавить(Формат(ЭлементМассива,ФорматнаяСтрока));
		Иначе	
			МассивСоединения.Добавить(Строка(ЭлементМассива));
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат СтрСоединить(МассивСоединения,Разделитель);

КонецФункции // ()

Процедура ДобавитьСтрокуТекста(Текст,Строка) Экспорт
	
	Если не ПустаяСтрока(Строка) Тогда
		Текст = Текст+?(ПустаяСтрока(Текст),"","
		|")+Строка;
	КонецЕсли;
	
КонецПроцедуры 

Функция СтрУбратьНедопустимыеСимволы(Знач Строка,ДопустимыеСимволы) Экспорт
	НоваяСтрока = "";	
	ЧислоСимволов = СтрДлина(Строка);
	
	Для Индекс = 1 По ЧислоСимволов Цикл
		Символ = Сред(Строка,Индекс,1);
		Если Найти(ДопустимыеСимволы,Символ) > 0 Тогда
			НоваяСтрока = НоваяСтрока+Символ;
		КонецЕсли; 
	КонецЦикла; 
	
	Возврат НоваяСтрока;
КонецФункции // ()

Функция ПолучитьВхожденияПодстроки(Знач Строка,ПодстрокаПоиска) Экспорт
	СтрокаВхождений = Строка;	
	МассивВхождений = Новый Массив;
	ДлинаПодстроки = СтрДлина(ПодстрокаПоиска);
	Обрезано = 0;
	
	Пока Истина Цикл
		Поиск = Найти(СтрокаВхождений,ПодстрокаПоиска);
		
		Если Поиск > 0 Тогда
			МассивВхождений.Добавить(Обрезано+Поиск);
			СтрокаВхождений = СтрОбрезатьСлева(СтрокаВхождений,Поиск+ДлинаПодстроки-1);
			Обрезано = Обрезано+Поиск+ДлинаПодстроки-1;
		Иначе	
			Прервать;
		КонецЕсли; 
		
		Если СтрДлина(СтрокаВхождений) < ДлинаПодстроки Тогда
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат МассивВхождений;
КонецФункции

Процедура СтрГрупповаяЗамена(Строка,СоответствиеЗамен) Экспорт
	Для каждого ЭлементСоответствия Из СоответствиеЗамен Цикл
		Строка = СтрЗаменить(Строка,ЭлементСоответствия.Ключ,ЭлементСоответствия.Значение);
	КонецЦикла;
КонецПроцедуры

Процедура СтрУбратьПодрядидущиеСимволы(Строка,СтрокаЗамены) Экспорт
	
	Для Индекс = 1 По СтрДлина(СтрокаЗамены) Цикл
		СимволЗамены = Сред(СтрокаЗамены,Индекс,1);
		
		Пока Истина Цикл
			ПодстрокаЗамены = СимволЗамены+СимволЗамены;
			
			Если Найти(Строка,ПодстрокаЗамены) > 0 Тогда
				Строка = СтрЗаменить(Строка,ПодстрокаЗамены,СимволЗамены);
			Иначе	
				Прервать;
			КонецЕсли; 
			
		КонецЦикла;
		
	КонецЦикла; 

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

Функция ПолучитьЧислоИзСтроки(Знач Строка,ВернутьЧисло = Ложь) Экспорт
	
	Ошибка = ПустаяСтрока(Строка);
	
	Если Ошибка Тогда
		Возврат ?(ВернутьЧисло,0,Неопределено);
	КонецЕсли; 
	
	ЕстьРазделитель = Ложь;
	Строка = СтрЗаменить(СокрЛП(Строка)," ","");
	Отрицательное = Лев(Строка,1) = "-";
	ЦифровойРяд = ЦифровыеСимволы();
	
	Если Отрицательное Тогда
		Строка = СтрОбрезатьСлева(Строка,1);
	КонецЕсли; 
	
	Для Индекс = 1 По СтрДлина(Строка) Цикл
		Знак = Сред(Строка,Индекс,1);
		
		Если Знак = "," или Знак = "." Тогда
			
			Если ЕстьРазделитель Тогда
				Ошибка = Истина;
				Прервать;
			Иначе
				ЕстьРазделитель = Истина;	
			КонецЕсли;
			
		ИначеЕсли Найти(ЦифровойРяд,Знак) = 0 Тогда
			Ошибка = Истина;
			Прервать;
		КонецЕсли;
		
	КонецЦикла;
	
	Если Отрицательное Тогда
		Строка = "-"+Строка;	
	КонецЕсли; 
	
    Возврат ?(Ошибка,?(ВернутьЧисло,0,Неопределено),Число(Строка));
	
КонецФункции 

#КонецОбласти

Функция _Число(Значение) Экспорт
	Если Значение = Неопределено Тогда
		Возврат 0;
	Иначе
		Возврат Значение;
	КонецЕсли; 
КонецФункции
 
Функция ПроверкаДеления(Делимое,Делитель) Экспорт
	Возврат ?(Делитель = 0,0,Делимое/Делитель);
КонецФункции 

Функция ЗначенияЗаполнены(МассивЗначений) Экспорт
	
	Результат = Истина;
	
	Для каждого ЭлементМассива Из МассивЗначений Цикл
		Результат = Мин(Результат,ЗначениеЗаполнено(ЭлементМассива));
	КонецЦикла;
	
	Возврат Результат;

КонецФункции 

Функция ДатыРавны(Дата1,Дата2) Экспорт
	Возврат НачалоДня(Дата1) = НачалоДня(Дата2);
КонецФункции // ()
 
#КонецОбласти 

#Область РаботаСМассивом

Функция СоздатьМассив(Элемент1 = Неопределено,
	Элемент2 = Неопределено,
	Элемент3 = Неопределено,
	Элемент4 = Неопределено,
	Элемент5 = Неопределено,
	Элемент6 = Неопределено,
	Элемент7 = Неопределено,
	Элемент8 = Неопределено) Экспорт

	МассивЭлементов = Новый Массив;
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент1);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент2);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент3);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент4);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент5);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент6);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент7);
	ДобавитьЭлементВМассив(МассивЭлементов,Элемент8);
	Возврат МассивЭлементов;

КонецФункции 

Процедура ДобавитьЭлементВМассив(Массив,Элемент) Экспорт

	Если Элемент <> Неопределено Тогда
		Массив.Добавить(Элемент);
	КонецЕсли; 		

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

Функция ПолучитьМассивЗначенийКлючей(Знач Источник,Знач СтрокаКлючей,Разделитель = ",") Экспорт
	
	МассивКлючей = СтрРазделить(СтрокаКлючей,Разделитель);
	МассивЗначений = Новый Массив;
	
	Для каждого ЭлементМассива Из МассивКлючей Цикл
		МассивЗначений.Добавить(Источник[ЭлементМассива]);		
	КонецЦикла; 
	
	Возврат МассивЗначений;
	
КонецФункции // ()

#КонецОбласти 
 
#Область РаботаССоответствием

Процедура ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение) Экспорт
	
	ТекущееСоответствие = Соответствие;
	ЧислоКлючей = МассивКлючей.Количество();
	
	Если ЧислоКлючей > 1 Тогда
	
		Для Индекс = 0 По ЧислоКлючей-2 Цикл
			Элемент = МассивКлючей[Индекс];
			ДанныеСоответствия = ТекущееСоответствие[Элемент];
			
			Если ДанныеСоответствия = Неопределено Тогда
				ТекущееСоответствие.Вставить(Элемент,Новый Соответствие);
			КонецЕсли; 
			
			ТекущееСоответствие = ТекущееСоответствие[Элемент];
		КонецЦикла; 
	
	КонецЕсли; 
	
	ТекущееСоответствие.Вставить(МассивКлючей[ЧислоКлючей-1],Значение);

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

Функция ПолучитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей) Экспорт
	
	ТекущееСоответствие = Соответствие;
	
	Для каждого Элемент Из МассивКлючей Цикл
		
		ДанныеСоответствия = ТекущееСоответствие[Элемент];
		
		Если ДанныеСоответствия = Неопределено Тогда
			Возврат Неопределено;
			Прервать;
		КонецЕсли; 
		
		ТекущееСоответствие = ДанныеСоответствия;
	
	КонецЦикла;
	
	Возврат ДанныеСоответствия;

КонецФункции

Процедура АгрегироватьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение) Экспорт
	
	ТекущееЗначение = ПолучитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей);
	
	Если ТипЗнч(ТекущееЗначение) = Тип("Число") Тогда
		ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,ТекущееЗначение+Значение);
	Иначе	
		ВставитьЗначениеВложенногоСоответствия(Соответствие,МассивКлючей,Значение);
	КонецЕсли; 
	
КонецПроцедуры

Функция СоздатьСоответствиеТаблицы(МенеджерТаблицы,ИмяРеквизита) Экспорт
	
	СоответствиеТаблицы = Новый Соответствие;
	Выборка = МенеджерТаблицы.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		СоответствиеТаблицы.Вставить(Выборка.Ссылка,Выборка[ИмяРеквизита]);	
	КонецЦикла; 
	
    Возврат СоответствиеТаблицы;
	
КонецФункции

#КонецОбласти 

#Область РаботаСоСтруктурой

Функция ПолучитьСтруктуруПоКлючам(СтрокаКлючей,ДанныеЗаполнения = Неопределено,МассивЗначений = Неопределено,БазоваяСтруктура = Неопределено) Экспорт
	 
	СтруктураПараметров = Новый Структура(СтрокаКлючей);
	 
	Если ДанныеЗаполнения <> Неопределено Тогда
	 	ЗаполнитьЗначенияСвойств(СтруктураПараметров,ДанныеЗаполнения);
	КонецЕсли;
	
	Если МассивЗначений <> Неопределено Тогда
		Индекс = 0;
		Количество = МассивЗначений.Количество();
		
		Для каждого ЭлементСтруктуры Из СтруктураПараметров Цикл
			
			Если Индекс >= Количество Тогда
				Прервать;
			КонецЕсли; 
			
			СтруктураПараметров[ЭлементСтруктуры.Ключ] = МассивЗначений[Индекс];
			Индекс = Индекс+1;
		КонецЦикла; 
	
	КонецЕсли; 
	
	Если БазоваяСтруктура <> Неопределено Тогда
		Для каждого ЭлементСтруктуры Из СтруктураПараметров Цикл
			БазоваяСтруктура.Вставить(ЭлементСтруктуры.Ключ,ЭлементСтруктуры.Значение);
		КонецЦикла; 
	КонецЕсли; 
 	
	Возврат СтруктураПараметров;
	
КонецФункции // ()

Функция СравнитьЗначенияКлючей(СтрокаКлючей,Источник1,Источник2) Экспорт

	МассивКлючей = СтрРазделить(СтрокаКлючей,",");
	Равны = Истина;
	
	Для каждого ЭлементМассива Из МассивКлючей Цикл
		Если Источник1[ЭлементМассива] <> Источник2[ЭлементМассива] Тогда
			Равны = Ложь;	
			Прервать;
		КонецЕсли; 
	КонецЦикла; 
	
	Возврат Равны;

КонецФункции // ()

#КонецОбласти 

#Если не (ТонкийКлиент или ВебКлиент) Тогда
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа со списком значений
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

Процедура УдалитьСтрокиТаблицыЗначений(Таблица,СтруктураПоиска = Неопределено,МассивЭлементов = Неопределено) Экспорт
	
	Если СтруктураПоиска <> Неопределено Тогда
		МассивЭлементов = Таблица.НайтиСтроки(СтруктураПоиска);
	ИначеЕсли МассивЭлементов = Неопределено Тогда 	
		МассивЭлементов = Новый Массив;
	КонецЕсли; 
	
	Для каждого ЭлементМассива Из МассивЭлементов Цикл
		Таблица.Удалить(ЭлементМассива);
	КонецЦикла; 

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

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа с деревом значений
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт

    Если Таблица = Неопределено Тогда
        Таблица = Новый ТаблицаЗначений;
		
        Для Каждого Колонка Из Дерево.Колонки Цикл
            Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
		КонецЦикла;
		
	КонецЕсли;
	
    Для Каждого СтрокаДерева Из Дерево.Строки Цикл
        ЗаполнитьЗначенияСвойств(Таблица.Добавить(), СтрокаДерева);
        ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, Таблица);
	КонецЦикла;
	
    Возврат Таблица;

КонецФункции 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Запросы
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Функция ПолучитьРеквизитыПоСсылкам(Знач МассивСсылок,Знач СтрокаРеквизитов,Знач СтрокаРеквизитов1 = Неопределено) Экспорт

	ОдинРеквизит = Неопределено;
	РеквизитИсточник = Неопределено;
	ОднаСсылка = Неопределено;
	ВторойУровень = Ложь;
	МассивРеквизитов = СтрРазделить(СтрокаРеквизитов,",");
	
	Если МассивРеквизитов.Количество() = 1 и СтрокаРеквизитов1 <> Неопределено Тогда
		РеквизитИсточник = МассивРеквизитов[0];
		МассивРеквизитов = СтрРазделить(СтрокаРеквизитов1,",");
		ВторойУровень = Истина;
	КонецЕсли;
	
	Если ТипЗнч(МассивСсылок) <> Тип("Массив") Тогда
		ОднаСсылка = МассивСсылок;
		МассивСсылок = СоздатьМассив(МассивСсылок);
	КонецЕсли;
	
	Запрос = Новый Запрос;
	ТекстЗапроса = "";
	Номер = 0;
	
	Для каждого Ссылка Из МассивСсылок Цикл
		Номер = Номер+1;
		ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
		ТекстЗапроса = ТекстЗапроса+"
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	Таблица.Ссылка,";
		
		Для каждого Реквизит Из МассивРеквизитов Цикл
			ТекстЗапроса = ТекстЗапроса+"
			|	Таблица."+?(ВторойУровень,РеквизитИсточник+"."+Реквизит,Реквизит)+" КАК "+Реквизит+",";
		КонецЦикла; 
		
		ТекстЗапроса = СтрОбрезатьСправа(ТекстЗапроса,1);
		ТекстЗапроса = ТекстЗапроса+"
		|ИЗ "+ИмяТаблицы+" КАК Таблица
		|ГДЕ
		|	Таблица.Ссылка = &Ссылка"+Номер+";";
		Запрос.УстановитьПараметр("Ссылка"+Номер,Ссылка);
	КонецЦикла; 
	
	Запрос.Текст = ТекстЗапроса;	
	РезультатПакета = Запрос.ВыполнитьПакет();
	СоответствиеРезультатов = Новый Соответствие;
	
	Если МассивРеквизитов.Количество() = 1 Тогда
		ОдинРеквизит = МассивРеквизитов[0];
	КонецЕсли; 
	
	Для Индекс = 0 По Номер-1 Цикл
		Выборка = РезультатПакета[Индекс].Выбрать();
		
		Если Выборка.Следующий() Тогда
			СоответствиеРезультатов.Вставить(Выборка.Ссылка,
			?(ОдинРеквизит = Неопределено,ПолучитьСтруктуруПоКлючам(
			?(СтрокаРеквизитов1 = Неопределено,СтрокаРеквизитов,СтрокаРеквизитов1),Выборка),Выборка[ОдинРеквизит]));
		КонецЕсли; 
	
	КонецЦикла; 
	
	Если ОднаСсылка <> Неопределено Тогда
		Возврат СоответствиеРезультатов[ОднаСсылка];
	Иначе 
		Возврат СоответствиеРезультатов;	
	КонецЕсли; 
	
КонецФункции

Функция ПолучитьЗаписиТаблицы(ПутьТаблицы,СтруктураОтбора,СтрокаРеквизитов = "Ссылка",КоличествоЗаписей = 0) Экспорт

	Запрос = Новый Запрос;
	ИмяТаблицы = СтрЗаменить(ПутьТаблицы,".","");
	МассивРеквизитов = СтрРазделить(СтрокаРеквизитов,",");
	БезРеквизитов = МассивРеквизитов.Количество() = 1;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ"+?(КоличествоЗаписей = 0,""," ПЕРВЫЕ "+Формат(КоличествоЗаписей,"ЧГ=0"));
	
	Для каждого ЭлементМассива Из МассивРеквизитов Цикл
		ТекстЗапроса = ТекстЗапроса+"
		|	"+ИмяТаблицы+"."+ЭлементМассива+",";
	КонецЦикла; 
	
	ТекстЗапроса = СтрОбрезатьСправа(ТекстЗапроса,1);
	ТекстЗапроса = ТекстЗапроса+"
	|ИЗ "+ПутьТаблицы+" КАК "+ИмяТаблицы+"
	|ГДЕ
	|	ИСТИНА";
	
	Для каждого ЭлементСтруктуры Из СтруктураОтбора Цикл
		Запрос.УстановитьПараметр(ЭлементСтруктуры.Ключ,ЭлементСтруктуры.Значение);
		ТекстЗапроса = ТекстЗапроса+"
		|	И "+ИмяТаблицы+"."+ЭлементСтруктуры.Ключ+" В (&"+ЭлементСтруктуры.Ключ+")";
	КонецЦикла;
	
	Запрос.Текст = ТекстЗапроса;
	Результат = Запрос.Выполнить();
	
	Если КоличествоЗаписей = 1 Тогда
		Выборка = Результат.Выбрать();
		
		Если Выборка.Следующий() Тогда
			Если БезРеквизитов Тогда
				Возврат Выборка[МассивРеквизитов[0]]; //значение
			Иначе
				Возврат Выборка; //элемент выборки
			КонецЕсли;	
		КонецЕсли; 
		
	ИначеЕсли БезРеквизитов Тогда
		Возврат Результат.Выгрузить().ВыгрузитьКолонку(МассивРеквизитов[0]); //массив
	Иначе	
		Возврат Результат.Выбрать(); //выборка
	КонецЕсли; 

КонецФункции // ()

#Область РаботаСОтчетами

Процедура СкомпоноватьОтчет(Объект,НаборДанных,ДокументРезультат,ДанныеРасшифровки) Экспорт
    Настройки=Объект.КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки=КомпоновщикМакета.Выполнить(Объект.СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки);
    ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,НаборДанных,ДанныеРасшифровки);
    ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры

Процедура УстановитьПараметрОтчета(Настройки,ИмяПараметра,Значение) Экспорт
	Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(ИмяПараметра,Значение);
КонецПроцедуры

Процедура ПолучитьПараметрОтчета(Настройки,ИмяПараметра) Экспорт
	Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
КонецПроцедуры

#КонецОбласти 

#КонецЕсли 

#Область РаботаСПроизвольнымиКоллекциями

Функция ПолучитьЗначениеПоКлючу(Источник,Ключ,ТипЗначения = Неопределено) Экспорт
	
	Значение = Неопределено;
	
	Если Источник <> Неопределено Тогда
		Приемник = Новый Структура(Ключ);
		ЗаполнитьЗначенияСвойств(Приемник,Источник);
		Значение = Приемник[Ключ];
	КонецЕсли;
	
	Если ТипЗначения <> Неопределено Тогда
		ОписаниеТипов = Новый ОписаниеТипов(СоздатьМассив(ТипЗначения));
		Значение = ОписаниеТипов.ПривестиЗначение(Значение);
	КонецЕсли;
	
	Возврат Значение;
 
КонецФункции 

Процедура УстановитьЗначениеПоКлючу(Источник,Ключ,Значение) Экспорт
	
	Если Источник <> Неопределено Тогда
		Приемник = Новый Структура(Ключ);
		ЗаполнитьЗначенияСвойств(Приемник,Источник);
		
		Если Приемник[Ключ] <> Неопределено Тогда
			Источник[Ключ] = Значение;
		КонецЕсли;
		
	КонецЕсли;
 
КонецПроцедуры 

Функция ПроверитьЗаполнениеРеквизитов(Источник,СтрокаРеквизитов,
	ПолнаяПроверка = Истина,
	ФормироватьСообщение = Истина,
	ВыводитьСообщение = Истина,
	ВызовИсключения = Ложь) Экспорт

	СтруктураВозврата = Новый Структура;
	МассивОшибок = Новый Массив;
	МассивКлючей = СтрРазделить(СтрокаРеквизитов,",",Ложь);
	ТекстСообщения = "";
	
	Для каждого Ключ Из МассивКлючей Цикл
		Если не ЗначениеЗаполнено(Источник[Ключ]) Тогда
			МассивОшибок.Добавить(Ключ);
			
			Если не ПолнаяПроверка Тогда
				Прервать;
			КонецЕсли; 
			
		КонецЕсли; 	
	КонецЦикла;
	
	Если МассивОшибок.Количество() > 0 Тогда
	
		Если ФормироватьСообщение Тогда
			ТекстСообщения = "Ошибка! Не заполнены значения реквизитов: "+СтрСоединить(МассивОшибок,", ")+".";
			
			Если ВыводитьСообщение и не ВызовИсключения Тогда
				Сообщить(ТекстСообщения);
			КонецЕсли; 
			
		КонецЕсли;
		
		Если ВызовИсключения Тогда
			ВызватьИсключение ТекстСообщения;
		КонецЕсли; 
	
	КонецЕсли; 
	
	СтруктураВозврата.Вставить("МассивОшибок",МассивОшибок);
	СтруктураВозврата.Вставить("ТекстСообщения",ТекстСообщения);	
	СтруктураВозврата.Вставить("РезультатПроверки",МассивОшибок.Количество() = 0);	
	
	Возврат СтруктураВозврата;

КонецФункции  

Процедура ЗаполнитьЗначенияРеквизитов(Источник,СтрокаРеквизитов,Заполненные = Истина,Значение = Неопределено) Экспорт
	
	МассивКлючей = СтрРазделить(СтрокаРеквизитов,",");
	
	Для каждого Ключ Из МассивКлючей Цикл
		Если не Заполненные или ЗначениеЗаполнено(Источник[Ключ]) Тогда
			Источник[Ключ] = Значение;
		КонецЕсли; 
	КонецЦикла;
	
КонецПроцедуры

#Если не (ТонкийКлиент или ВебКлиент) Тогда
 
Функция СоздатьКопиюОбъекта(Источник) Экспорт
	Возврат ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Источник));
КонецФункции 

Функция ИмяЭлементаПеречисления(ЭлементПеречисления) Экспорт

	ИмяПеречисления = ЭлементПеречисления.Метаданные().Имя;
	Возврат Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления[Перечисления[ИмяПеречисления].Индекс(ЭлементПеречисления)].Имя;	

КонецФункции 
 
#КонецЕсли 
	
#КонецОбласти 

#Если не (ТонкийКлиент или ВебКлиент) Тогда

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Работа с транзакциями
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Процедура ЗафиксироватьАктивнуюТранзакцию() Экспорт
	Если ТранзакцияАктивна() Тогда
		ЗафиксироватьТранзакцию();
	КонецЕсли; 
КонецПроцедуры

Процедура ОтменитьАктивнуюТранзакцию() Экспорт
	Если ТранзакцияАктивна() Тогда
		ОтменитьТранзакцию();
	КонецЕсли; 
КонецПроцедуры

Процедура ЗавершитьАктивнуюТранзакцию(Отказ) Экспорт

	Если Отказ Тогда
		ОтменитьАктивнуюТранзакцию();
	Иначе	
		ЗафиксироватьАктивнуюТранзакцию();	
	КонецЕсли; 	

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

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Шифрование
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Функция ПолучитьЗашифрованныеДанные(ИдентификаторДанных,ДанныеШифрования,КлючШифрования) Экспорт
	
	Попытка
		
		Путь = КаталогВременныхФайлов()+"\"+ИдентификаторДанных;
		ПутьФайла = Путь+".txt";
		ПутьАрхива = Путь+".zip";
		ЗаписьТекста = Новый ЗаписьТекста(ПутьФайла);
		ЗаписьТекста.Записать(ДанныеШифрования);
		ЗаписьТекста.Закрыть();
		ЗаписьАрхива = Новый ЗаписьZipФайла(ПутьАрхива,КлючШифрования,,,,МетодШифрованияZIP.AES256);
		ЗаписьАрхива.Добавить(ПутьФайла);
		ЗаписьАрхива.Записать();
		ДвоичныеДанные = Новый ДвоичныеДанные(ПутьАрхива);
		Возврат Новый ХранилищеЗначения(ДвоичныеДанные,Новый СжатиеДанных(9));
		
	Исключение
		Возврат Неопределено;
	КонецПопытки; 

КонецФункции

Функция ПолучитьРасшифрованныеДанные(ИдентификаторДанных,ХранилищеДанных,КлючШифрования) Экспорт
	
	Попытка
		КаталогСохранения = КаталогВременныхФайлов();
		Путь = КаталогСохранения+"\"+ИдентификаторДанных;
		ПутьАрхива = Путь+".zip";
		ХранилищеДанных.Получить().Записать(ПутьАрхива);
		ЧтениеАрхива = Новый ЧтениеZipФайла(ПутьАрхива,КлючШифрования);
		ЭлементАрхива = ЧтениеАрхива.Элементы[0];
		ЧтениеАрхива.Извлечь(ЭлементАрхива,КаталогСохранения);
		ЧтениеАрхива.Закрыть();
		ЧтениеТекста = Новый ЧтениеТекста(КаталогСохранения+"\"+ЭлементАрхива.Имя);
		Данные = ЧтениеТекста.Прочитать();
		ЧтениеТекста.Закрыть();
		Возврат Данные;
		
	Исключение
		Возврат Неопределено;
	КонецПопытки; 

КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Прочее
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Функция ПопыткаЗаписиОбъекта(Объект,ТекстОшибки = "",
	ВключатьОписаниеОшибки = Ложь,
	ВыводитьСообщение = Ложь,
	Статус = Неопределено,
	ПредставлениеМетода = Неопределено,
	ТекстОшибок = Неопределено,
	Отказ = Ложь) Экспорт
	
	Если не ЗначениеЗаполнено(ПредставлениеМетода) Тогда
		ПредставлениеМетода = "Записать()";
	КонецЕсли; 
	
	Попытка
		
		Выполнить("Объект."+ПредставлениеМетода);
		
	Исключение
		Отказ = Истина;
		ТекстСообщения = ТекстОшибки+?(ВключатьОписаниеОшибки," "+ОписаниеОшибки(),"");
		
		Если ВыводитьСообщение Тогда
			Сообщить(ТекстСообщения,Статус);
		КонецЕсли;
		
		Если ТекстОшибок <> Неопределено Тогда
			ДобавитьСтрокуТекста(ТекстОшибок,ТекстСообщения);
		КонецЕсли; 
		
		Возврат ТекстСообщения;
	КонецПопытки; 
		
КонецФункции

Функция ИнициализироватьCOMОбъект(Имя) Экспорт
	
	Попытка
		COMОбъект = Новый COMОбъект(Имя);
		Возврат COMОбъект; 
	Исключение
		Сообщить("Произошла ошибка инициализации "+Имя);
	КонецПопытки; 	

КонецФункции // ()

#КонецЕсли 
                        

Библиотека Универсальные функции

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2667    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4600    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3960    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8813    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16143    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7242    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lex27119 17.12.14 10:42 Сейчас в теме
Есть несколько весьма интересных функций
awk; bashirov.rs; +2 Ответить
2. Famza 84 17.12.14 12:53 Сейчас в теме
Автор lex271, а в (1) lex27119 он же?
Аналоги функций есть в типовых конфах, или наоборот
3. Infector 199 17.12.14 13:32 Сейчас в теме
Подозреваю, что с использованием заимствований из типовых конф в нетиповые встает вопрос авторских прав.

А вот мне интересно - кто-нибудь еще нечто подобное делал?

Функция ПреобразоватьТаблицуВДерево(ИсходнаяТаблица, КлючевыеПоля, РазрешеноМенятьПорядокСтрок=Истина) Экспорт
	
	Если СокрЛП(КлючевыеПоля) = "" Тогда
		Возврат Неопределено;
	КонецЕсли;	
	
	Дерево = новый ДеревоЗначений;
	ПрошлыеЗначенияКлючевыхПолей = новый Структура;
	
	КвоКолонок = ИсходнаяТаблица.Колонки.Количество();
	
	Для Каждого Кол Из ИсходнаяТаблица.Колонки Цикл		
		ИмяКолонки = Кол.Имя;
		Дерево.Колонки.Добавить(ИмяКолонки);
		//ПрошлыеЗначенияКлючевыхПолей.Добавить(""); //Начальное присвоение
	КонецЦикла;
		
	Если РазрешеноМенятьПорядокСтрок Тогда
		ОбрабатываемаяТаблица = ИсходнаяТаблица;
	Иначе	
		ОбрабатываемаяТаблица = ИсходнаяТаблица.Скопировать();
	КонецЕсли;	
	
	ОбрабатываемаяТаблица.Сортировать(КлючевыеПоля);
			
	ИменаКлючевыхПолейСписком = ПолучитьКлючиСписком(КлючевыеПоля, ",");	
	
	Для Каждого Поле Из ИменаКлючевыхПолейСписком Цикл
		ПрошлыеЗначенияКлючевыхПолей.Вставить(Поле.Значение); //Начальное присвоение	
	КонецЦикла;	
	
	КвоКлючей = ИменаКлючевыхПолейСписком.Количество();
	
	Для СчСтроки = 0 По ОбрабатываемаяТаблица.Количество() - 1 Цикл
		ТекСтрока = ОбрабатываемаяТаблица[СчСтроки]; 	
		НачальныйУровеньДерева = 0;
		Для СчПоля = 0 По КвоКлючей-1 Цикл
			ИмяТекПоля = ИменаКлючевыхПолейСписком[СчПоля].Значение;
			Если ПрошлыеЗначенияКлючевыхПолей[ИмяТекПоля] <> ТекСтрока[ИмяТекПоля] ИЛИ  СчСтроки = 0 Тогда
				НачальныйУровеньДерева = СчПоля+1;
				Прервать;
			КонецЕсли;			
		КонецЦикла;	
		
		Если НачальныйУровеньДерева = 0 Тогда
			НачальныйУровеньДерева = КвоКлючей+1;	
		КонецЕсли;	
		
		ДобавитьВДерево(Дерево, НачальныйУровеньДерева, ТекСтрока, ИменаКлючевыхПолейСписком);
		ЗаполнитьЗначенияСвойств(ПрошлыеЗначенияКлючевыхПолей, ТекСтрока);
		
	КонецЦикла;
	
	Возврат Дерево;	
	
КонецФункции

Функция ДобавитьВДерево(Дерево, НачальныйУровеньДерева, ТекСтрокаТаблицы, ИменаКлючевыхПолейСписком)
	
	ТекРодитель = Дерево;
	
	Для Уровень = 1 По ИменаКлючевыхПолейСписком.Количество()+1 Цикл
		
		Если Уровень < НачальныйУровеньДерева Тогда
			СтрокТекУровня = ТекРодитель.Строки.Количество();
			ТекРодитель = ТекРодитель.Строки[СтрокТекУровня-1];
		Иначе	
			СтрокаТекУровня = ТекРодитель.Строки.Добавить();
			Если Уровень <= ИменаКлючевыхПолейСписком.Количество() Тогда 
				Для СчПоля = 0 По Уровень - 1 Цикл
					ИмяТекПоля = ИменаКлючевыхПолейСписком[СчПоля].Значение;
	                 СтрокаТекУровня[ИмяТекПоля] = ТекСтрокаТаблицы[ИмяТекПоля];			
				КонецЦикла;
			Иначе
				ЗаполнитьЗначенияСвойств(СтрокаТекУровня, ТекСтрокаТаблицы);
			КонецЕсли;
			ТекРодитель = СтрокаТекУровня;
		КонецЕсли;	
			
	КонецЦикла	
		
КонецФункции

  Функция ПолучитьКлючиСписком(СтрокаЗначений, СимвРазделитель=",") Экспорт
	//удаление пробелов и символов-разделителей по краям строки
	КлючиСтрокой = СокрЛП(СтрокаЗначений);
	Пока Лев(КлючиСтрокой,1)=СимвРазделитель Цикл
		 КлючиСтрокой = Прав(КлючиСтрокой, СтрДлина(КлючиСтрокой)-1);
	КонецЦикла;	
	Пока Прав(КлючиСтрокой,1)=СимвРазделитель Цикл
		 КлючиСтрокой = Лев(КлючиСтрокой, СтрДлина(КлючиСтрокой)-1);
	КонецЦикла;
	
	ПозицииРазделителя = новый Массив;
	ПозицииРазделителя.Добавить(0);
	Для ПозСимвол = 1 По СтрДлина(КлючиСтрокой) Цикл
		Если Сред(КлючиСтрокой, ПозСимвол, 1)= СимвРазделитель Тогда
			ПозицииРазделителя.Добавить(ПозСимвол);
		КонецЕсли;			
	КонецЦикла;	
	ПозицииРазделителя.Добавить(СтрДлина(КлючиСтрокой)+1);
	
	СписокКлючей = новый СписокЗначений;
	Для ЭлементМассива = 0 По ПозицииРазделителя.Количество()-2 Цикл
		ДлинаКлюча = ПозицииРазделителя[ЭлементМассива+1]-ПозицииРазделителя[ЭлементМассива]-1;
		СписокКлючей.Добавить(СокрЛП(Сред(КлючиСтрокой, ПозицииРазделителя[ЭлементМассива]+1,ДлинаКлюча)));
	КонецЦикла;	
    возврат СписокКлючей;
	
КонецФункции //ПолучитьКлючиСписком	

Показать
5. TMV 14 17.12.14 18:00 Сейчас в теме
(3) Infector,
с использованием заимствований из типовых конф в нетиповые встает вопрос авторских прав

Довольно странное утверждение, ведь количество ключевых слов ограничено, а значит можно запросто своим умом составить такую же функцию и пр.. Да, и разве можно тогда пользоваться шаблонами?
9. leasing 5 24.12.14 13:42 Сейчас в теме
(3) Infector, как защитить авторское право 1С на функцию ЗдравствуйМир() , если она оказалась в составе типовой, но её еще в школе ВСЕ проходили?
Если любая из приведенных тут автором функций завтра окажется в составе типовой? Или уже есть там, но автор-то не был в курсе (не обязан он всякую муру на рынок выбрасываемую читать) и получил тот же результат?
Я это все к тому, что если взять тридцать программистов и дать им одно и тоже задание, то обязательно получим энное количество совпадающих решений. Объектом авторского является произведение и его части. Чем крупнее произведение, тем больше вероятность, что там есть неоригинальные части, которые встречаются у других авторов. В музыке плагиатом не считается если совпало менее 4 нот подряд.
Будем считать, хе-хе, если из конфигурации взято не более трех объектов, то это не считается нарушением авторских прав?
KazanKokos; izidakg; jobkostya1c_ERP; alex271; +4 Ответить
28. Nikola23 696 22.06.20 16:51 Сейчас в теме
(9) Полагаю, защита авторским правом не будет распространяться на 30 строк кода.
С учетом количества слов в языке.
Зачем вы развели этот диалог?

Пожалуйста, в комментарии не приводите абстрактных примеров, доказывающих, что я не прав. Если есть аргумент - пусть он будет острый как бритва.
12. Yashazz 4709 25.12.14 11:14 Сейчас в теме
Всё, здесь изложенное, я сделал и начал использовать в 2009 году, задолго до появления похожих функционалов в типовых конфах. В том числе и (3) - быстрые переходы между разными коллекциями - давным-давно себе сделал. Вообще, удивлён подобными публикациями - это как выложить 2*2=4 и вдруг получить отчётливый интерес. Или современные одинэсники уже даже такие простейшие вещи полагают супер-наработкой?
13. alex271 363 25.12.14 11:24 Сейчас в теме
(12) Yashazz,
Я думаю, тут дело не в том, что это супер-наработка, а в том, что многие программисты не хотят заниматься разработкой универсальных механизмов.
Я на оригинальность не претендую, это написано в шапке публикации, но раз выложенные библиотеки вызвали оживленный интерес, значит в них есть потребность.
Возможно, фирме 1С стоит подумать и добавить в технологическую платформу ряд универсальных функций, чтобы они сразу были под рукой у начинающих программистов.
14. BlackCors 4 25.12.14 12:38 Сейчас в теме
(13) alex271, да, это интересный вопрос. Может стоило поместить в платформу например ТЗ в ДЗ или что подобное? Почему на этапе планирования такие возможности не промелькнули ни в одной версии платформы, хотя бы в бета версиях?
15. BlackCors 4 25.12.14 12:46 Сейчас в теме
(12) Yashazz, + к тому что сказал alex271 у любого программиста в любом проекте ограниченно время, а объем задания не ограничен)) Заниматься постоянным изобретением велосипеда, нет никакого желания. И не только 1с-ков ;) К тому же большинство задач (основная масса) которые ставят программистам 1с однотипны, уникальных задач куда более низкий процент, мое оценочное суждение ;) Поэтому наработка подобной базы решений очень полезная вещь.
Designer1C; +1 Ответить
16. leasing 5 25.12.14 13:10 Сейчас в теме
(12) (12) Yashazz, как могло случиться такое невероятное событие, что вы написали и стали использовать в 2009 году все, что автор тут выложил в 2014?
ixijixi; json; spetzpozh; +3 Ответить
17. Gureev 25.12.14 15:14 Сейчас в теме
(3) Infector, если целый модуль свистнуть - то да.

использование отдельных процедур, особенно если они представляют из себя общий алгоритм, а не работу с конкретными объектами конкретной конфигурации
- то нет. никаких авторских прав.
4. ruslan0277 4 17.12.14 14:24 Сейчас в теме
Добавлю в копилку:
Функция ТипЛюбаяСсылка() Экспорт
	Имена = 
	"Справочники
	|Документы
	|Перечисления
	|ПланыВидовХарактеристик
	|ПланыСчетов
	|ПланыВидовРасчета
	|ПланыОбмена
	|БизнесПроцессы
	|Задачи";
	ЧислоИмен = СтрЧислоСтрок(Имена);
	ВсеСсылки = Новый ОписаниеТипов(Новый Массив());
	Для Номер = 1 по ЧислоИмен Цикл
		ВсеСсылки = Новый ОписаниеТипов(ВсеСсылки, Вычислить(СтрПолучитьСтроку(Имена, Номер)).ТипВсеСсылки().Типы());
	КонецЦикла;
	ВсеСсылки = Новый ОписаниеТипов(ВсеСсылки, БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().Типы());
	Возврат ВсеСсылки;
КонецФункции

Функция ТипыОбъектов(КакМассив=Ложь)
	Имена = 
	"Справочники
	|Документы
	|ПланыВидовХарактеристик
	|ПланыСчетов
	|ПланыВидовРасчета
	|ПланыОбмена
	|БизнесПроцессы
	|Задачи";
	ЧислоИмен = СтрЧислоСтрок(Имена);
	
	м = Новый Массив;
	
	Для Номер = 1 по ЧислоИмен Цикл
		мд = Метаданные[СтрПолучитьСтроку(Имена, Номер)];
		
		Для Каждого мдОбъекта Из мд Цикл
			ПолноеИмя = мдОбъекта.ПолноеИмя();
			
			поз = Найти(ПолноеИмя,".");
			Если поз<>0 Тогда
				ИмяОбъекта = Лев(ПолноеИмя,поз-1)+"Объект"+Сред(ПолноеИмя,поз);
				
				м.Добавить(Тип(ИмяОбъекта));
				
				Для Каждого мдТЧ Из мдОбъекта.ТабличныеЧасти Цикл
					ИмяОбъекта = Лев(ПолноеИмя,поз-1)+"ТабличнаяЧасть"+Сред(ПолноеИмя,поз)+"."+мдТЧ.Имя;
					м.Добавить(Тип(ИмяОбъекта));
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ВсеОбъекты = Новый ОписаниеТипов(м);
	
	Если КакМассив Тогда
		Возврат м;
	Иначе
		Возврат ВсеОбъекты;
	КонецЕсли;
КонецФункции

Функция ТипПроизвольный() Экспорт
	//Если ТипПроизвольный<>Неопределено Тогда
	//	Возврат ТипПроизвольный;
	//КонецЕсли;
	
	ВсеТипы = ТипЛюбаяСсылка();
	
	м = Новый Массив;
	м.Добавить(Тип("Дата"));
	м.Добавить(Тип("Число"));
	м.Добавить(Тип("Булево"));
	м.Добавить(Тип("Строка"));
	м.Добавить(Тип("Null"));
	м.Добавить(Тип("Неопределено"));
	м.Добавить(Тип("СписокЗначений"));
	м.Добавить(Тип("ТаблицаЗначений"));
	м.Добавить(Тип("Структура"));
	м.Добавить(Тип("Массив"));
	
	ВсеТипы = Новый ОписаниеТипов(ВсеТипы, м);
	
	мТипыОбъектов = ТипыОбъектов(Истина);
	ВсеТипы = Новый ОписаниеТипов(ВсеТипы, мТипыОбъектов);
	
	ТипПроизвольный = ВсеТипы;
	
	Возврат ВсеТипы;
КонецФункции

Функция ВыгрузитьСЗвТЗ(сп,ДобавлятьКартинку=Ложь)
	ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Индекс",Новый ОписаниеТипов("Число"));
	ТЗ.Колонки.Добавить("Значение",ТипПроизвольный());
	ТЗ.Колонки.Добавить("Представление",Новый ОписаниеТипов("Строка"));
	Если ДобавлятьКартинку Тогда
		ТЗ.Колонки.Добавить("Картинка",Новый ОписаниеТипов("Картинка"));
	КонецЕсли;
	ТЗ.Колонки.Добавить("Пометка",Новый ОписаниеТипов("Булево"));
	
	Для Каждого эл Из сп Цикл
		НСтрока = ТЗ.Добавить();
		НСтрока.Индекс = сп.Индекс(эл);
		ЗаполнитьЗначенияСвойств(НСтрока,эл);
	КонецЦикла;
	
	Возврат ТЗ;
КонецФункции

//не рекомендуется для ссылок, ибо полезет в базу
//и вообще не очень красиво
Функция СвойствоСуществует(Объект,ИмяСвойства) Экспорт
	Результат = Ложь;
	
	Выполнить("
	|Попытка
	|	а = Объект."+ИмяСвойства+";
	|	Результат = Истина;
	|Исключение
	|	Результат = Ложь;
	|КонецПопытки
	|");
	
	Возврат Результат;
КонецФункции

Функция СравнитьСпискиЗначений(сп1,сп2,СравниватьПометки=Ложь,СравниватьПредставления=Ложь) Экспорт
	Если сп1.Количество()<>сп2.Количество() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Для Каждого эл1 Из сп1 Цикл
		Индекс = сп1.Индекс(эл1);
		
		эл2 = сп2[Индекс];
		
		Если эл1.Значение<>эл2.Значение Тогда
			Возврат Ложь;
		КонецЕсли;
		
		Если СравниватьПометки Тогда
			Если эл1.Пометка<>эл2.Пометка Тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
		
		Если СравниватьПредставления Тогда
			Если эл1.Представление<>эл2.Представление Тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
КонецФункции
Показать
6. Infector 199 18.12.14 08:28 Сейчас в теме
Не утверждаю, но смею предположить.
Конечно, простые функции могут быть воспроизведены разными авторами в одинаковом содержании. С более сложными - нереально. Хотя бы стиль написания будет отличаться (я разделю 1 функцию на три мелких, кто-то не станет и т.д.)
7. kaging 8 24.12.14 10:41 Сейчас в теме
Можно думаю сюда прикрутить еще вот это
Функция КратноеЧисло(ЧислоПроверки, КратноЧислу)
	
	РезультатДеления = ЧислоПроверки / КратноЧислу;
	Если Цел(РезультатДеления) =  Окр(РезультатДеления, 2) Тогда 
		Возврат Истина;
	Иначе 
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции
Показать


Или я ее просто не заметил у автора :(
8. Nebiros777 5 24.12.14 11:50 Сейчас в теме
Чтобы каждый раз не писать свои функции весьма полезно. Скорость разработки повышается, главное быстро найти нужный модуль. А так в закладки по-любому!
10. dolter 119 24.12.14 14:09 Сейчас в теме
Все не просмотрел - слишком много букв. Но покритиканствовать охота )

Функция СтрОбрезатьСлева(Знач Строка,ЧислоСимволов) Экспорт

    Возврат Прав(Строка,СтрДлина(Строка)-ЧислоСимволов);    

КонецФункции


Заменить на

Функция СтрОбрезатьСлева(Знач Строка,ЧислоСимволов) Экспорт

    Возврат Сред(Строка,ЧислоСимволов + 1);    

КонецФункции
alexscamp; +1 Ответить
11. dolter 119 24.12.14 16:44 Сейчас в теме
В любом случае ПЛЮС!

Но )... ПодставитьПараметрыВСтроку - заменить на:

Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, Параметры) Экспорт
	
    Для Каждого Элм Из Параметры Цикл
    	СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%" + Элм.Ключ, ?(ТипЗнч(Элм.Значение) = Тип("Строка"), Элм.Значение, СокрЛП(Элм.Значение)));
	КонецЦикла;
	
	Возврат СтрокаПодстановки;
    
КонецФункции
Показать


Пример вызова:

ПодставитьПараметрыВСтроку(СтрокаПодстановки, Новый Структура("1,2,3,5", "123", Формат(ТекущаяДата(), "ДЛФ=D"), "321", 555));


Плюсы: работает быстрее и не имеет ограничений по количеству параметров
18. chmv 25.12.14 16:44 Сейчас в теме
Я бы включила гораздо больше стандартных функций в 1с (особенно при работе со строкой)
Их очень мало, так что приходится дописывать в глобальных модулях
SemenovaMarinaV; Fox-trot; +2 Ответить
19. chmv 25.12.14 16:47 Сейчас в теме
Мне понравилась ИнвертироватьСтроку
20. Yashazz 4709 25.12.14 19:31 Сейчас в теме
Насчёт отсутствия преобразований, зашитых в платформу - целиком согласен.
21. dyak84 29.12.14 10:48 Сейчас в теме
Автору спасибо очень интересно работает со строкой. Есть чему поучится. Так держать
22. nipil 16.01.15 10:39 Сейчас в теме
Забрал в копилку.
Понравилась сама идея формирования публичной библиотеки необходимых функций.
Желательно выработать и принять классификатор. (Группы, подгруппы и т.д.)
23. SemenovaMarinaV 26.01.15 10:50 Сейчас в теме
Для меня интересны функции работы со строкой. Полезно. Но лучше бы 1с расширило круг функций работы со строкой.
24. Andris_infostart 18.03.15 16:30 Сейчас в теме
25. alex271 363 01.06.15 08:02 Сейчас в теме
Обновил публикацию.
Учел новые функции версии 8.3.6
26. KazanKokos 10 05.06.18 10:27 Сейчас в теме
А
 Возврат 
в функциях уже необязателен?
////////////////////////////////////////////////////////////­///////////////////////////////////////////////////////////
// Прочее
////////////////////////////////////////////////////////////­///////////////////////////////////////////////////////////

Функция ПопыткаЗаписиОбъекта(Объект,ТекстОшибки = "",
    ВключатьОписаниеОшибки = Ложь,
    ВыводитьСообщение = Ложь,
    Статус = Неопределено,
    ПредставлениеМетода = Неопределено,
    ТекстОшибок = Неопределено,
    Отказ = Ложь) Экспорт
    
    Если не ЗначениеЗаполнено(ПредставлениеМетода) Тогда
        ПредставлениеМетода = "Записать()";
    КонецЕсли; 
    
    Попытка
        
        Выполнить("Объект."+ПредставлениеМетода);
        
    Исключение
        Отказ = Истина;
        ТекстСообщения = ТекстОшибки+?(ВключатьОписаниеОшибки," "+ОписаниеОшибки(),"");
        
        Если ВыводитьСообщение Тогда
            Сообщить(ТекстСообщения,Статус);
        КонецЕсли;
        
        Если ТекстОшибок <> Неопределено Тогда
            ДобавитьСтрокуТекста(ТекстОшибок,ТекстСообщения);
        КонецЕсли; 
        
        Возврат ТекстСообщения;
    КонецПопытки; 
        
КонецФункции

Функция ИнициализироватьCOMОбъект(Имя) Экспорт
    
    Попытка
        COMОбъект = Новый COMОбъект(Имя);
        Возврат COMОбъект; 
    Исключение
        Сообщить("Произошла ошибка инициализации "+Имя);
    КонецПопытки;     

КонецФункции // ()
Показать
27. dolter 119 05.06.18 23:56 Сейчас в теме
Да, собственно, возврат в функции действительно не обязателен - вернется значение Неопределено и все.
Оставьте свое сообщение