gifts2017

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

Опубликовал Александр Анисин (alex271) в раздел Программирование - Универсальные функции

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

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

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

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

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

Функция ЦифровыеСимволы() Экспорт
	Возврат "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Объект; 
	Исключение
		Сообщить("Произошла ошибка инициализации "+Имя);
	КонецПопытки; 	

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

#КонецЕсли 
                        

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Иван Иванов (lex27119) 17.12.14 10:42
Есть несколько весьма интересных функций
awk; bashirov.rs; +2 Ответить 1
2. Иван Иванов (Famza) 17.12.14 12:53
Автор lex271, а в (1) lex27119 он же?
Аналоги функций есть в типовых конфах, или наоборот
3. Андрей Конев (Infector) 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,ДлинаКлюча)));
	КонецЦикла;	
    возврат СписокКлючей;
	
КонецФункции //ПолучитьКлючиСписком	

...Показать Скрыть
4. Руслан Новиков (ruslan0277) 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.Представление Тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
КонецФункции
...Показать Скрыть
5. TMV 17.12.14 18:00
(3) Infector,
с использованием заимствований из типовых конф в нетиповые встает вопрос авторских прав

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


Или я ее просто не заметил у автора :(
8. Игорь Матюшин (Nebiros777) 24.12.14 11:50
Чтобы каждый раз не писать свои функции весьма полезно. Скорость разработки повышается, главное быстро найти нужный модуль. А так в закладки по-любому!
9. Евгений Евгений (leasing) 24.12.14 13:42
(3) Infector, как защитить авторское право 1С на функцию ЗдравствуйМир() , если она оказалась в составе типовой, но её еще в школе ВСЕ проходили?
Если любая из приведенных тут автором функций завтра окажется в составе типовой? Или уже есть там, но автор-то не был в курсе (не обязан он всякую муру на рынок выбрасываемую читать) и получил тот же результат?
Я это все к тому, что если взять тридцать программистов и дать им одно и тоже задание, то обязательно получим энное количество совпадающих решений. Объектом авторского является произведение и его части. Чем крупнее произведение, тем больше вероятность, что там есть неоригинальные части, которые встречаются у других авторов. В музыке плагиатом не считается если совпало менее 4 нот подряд.
Будем считать, хе-хе, если из конфигурации взято не более трех объектов, то это не считается нарушением авторских прав?
kostyaomsk; alex271; +2 Ответить
10. Андрей Вахрин (dolter) 24.12.14 14:09
Все не просмотрел - слишком много букв. Но покритиканствовать охота )

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

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

КонецФункции
...Показать Скрыть


Заменить на

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

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

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

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

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


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

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


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

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