Публикации

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

Найдено публикаций: 9

ChOP 27 5

Добавить вертикальную черту к началу каждой строчки в тексте

Полезно, если надо перенести SQL запрос в код 1С и для прочих подобных ситуаций. В обработку добавить реквизиты "ТекстИсходный", "ТекстФорматированный". Вид полей формы "Поле текстового документа".
ChOP 27 5
&НаКлиенте
Процедура Форматировать(Команда)
	
	ТекстИсходный = СокрЛП(ТекстИсходный);
	ТекстФорматированный = "";
	
	Для Индекс = 1 По СтрЧислоСтрок(ТекстИсходный) Цикл
		
		ТекстФорматированный = ТекстФорматированный + "|" + СтрПолучитьСтроку(ТекстИсходный,Индекс) + Символы.ПС;
		
	КонецЦикла;
	
	ТекстФорматированный = СокрЛП(ТекстФорматированный);
	
КонецПроцедуры

Запрос в SQL базу

Получение результата запроса из SQL в таблицу значений
ChOP 27 5
// Возвращает результат запроса в таблице значений.
//
// Параметры:
//  Connection	 - COMОбъект("ADODB.Connection"), коннект к бд (необязательный).
//  SQLText      - текст, текст запроса.
//  ДанныеДляПодключения - структура, формируется в СоздатьДанныеДляПодключения() (необязательный).
//
Функция ПолучитьРезультатЗапроса(SQLText, ДанныеДляПодключения = Неопределено, Connection = Неопределено) Экспорт
	
	Если Connection = Неопределено Тогда
		Connection = НовоеСоединениеССУБД(ДанныеДляПодключения);
	КонецЕсли;
	
	RecordSet                = Новый ComObject("ADODB.RecordSet");
	RecordSet.CursorLocation = 3;
	RecordSet.LockType       = 3;
	
	Попытка
		
		RecordSet.Open(SQLText, Connection);
		
		ТЗ = Новый ТаблицаЗначений;
		КоличествоПолей = RecordSet.Fields.Count;
		
		Для НомерСтолбца = 0 По КоличествоПолей - 1 Цикл // Создание и добавление колонок во временную таблицу
			
			ИмяСтолбца = RecordSet.Fields.Item(НомерСтолбца).Name;
			ТЗ.Колонки.Добавить(RecordSet.Fields.Item(НомерСтолбца).Name, SQLТипВ1СТип(RecordSet.Fields.Item(НомерСтолбца).Type, RecordSet.Fields.Item(НомерСтолбца).DefinedSize));
			
		КонецЦикла;
		
		Пока НЕ RecordSet.EOF Цикл // Заполнение созданной таблицы
			
			НоваяСтрока = ТЗ.Добавить();
			
			Для ПолеСч = 0 По КоличествоПолей - 1 Цикл
				
				Поле = RecordSet.Fields.item(ПолеСч);
				НоваяСтрока[Поле.name] = Поле.Value;
				
			КонецЦикла;
			
			RecordSet.MoveNext();
			
		КонецЦикла;
		
		RecordSet.Close();
		
	Исключение
		
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Запрос в SQL базу " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выполнения запроса: " + SQLText + Символы.ПС + ОписаниеОшибки());
		ТЗ = Неопределено; 
		
	КонецПопытки;
	
	Возврат ТЗ;
	
КонецФункции

Функция НовоеСоединениеССУБД(ДанныеДляПодключения) Экспорт 
	
	Con = Новый COMОбъект("ADODB.Connection");
	СтрокаПодключения = "Provider=SQLOLEDB; Data Source=" + ДанныеДляПодключения.АдресСервера + ";Initial Catalog=" 
	+ ДанныеДляПодключения.ИмяБД + ";Persist Security Info=True;User ID=" + ДанныеДляПодключения.Логин + ";Password=" + ДанныеДляПодключения.Пароль;
	
	Попытка
		
		Con.ConnectionTimeOut = 15;
		Con.CommandTimeout = 220;
		Con.Open(СтрокаПодключения);
		
	Исключение
		
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Соединение с SQL базой " + ДанныеДляПодключения.ИмяБД + "'"), УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
		Con = Неопределено;
		
	КонецПопытки;
	Возврат Con;
	
КонецФункции

Функция SQLТипВ1СТип(Num, size)
	
	ПараметрыСтроки = Новый КвалификаторыСтроки(size);
	
	Если
		Num = 20 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 128 Тогда
		Возврат Новый ОписаниеТипов("Булево");
	ИначеЕсли
		Num = 8 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 136 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 129 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	ИначеЕсли
		Num = 7 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 133 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 134 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 135 Тогда
		Возврат Новый ОписаниеТипов("Дата");
	ИначеЕсли
		Num = 14 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 0 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adEmpty 0 no value
	ИначеЕсли
		Num = 3 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adInteger 3 4 - byte signed integer
	ИначеЕсли
		Num = 205 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarBinary 205 Long binary value
	ИначеЕсли
		Num = 201 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarChar 201 Long string value
	ИначеЕсли
		Num = 203 Тогда
		Возврат Новый ОписаниеТипов("Строка,  , , , ПараметрыСтроки"); // adLongVarWChar 203 Long Null - terminates string value
	ИначеЕсли
		Num = 131 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adNumeric 131 Number with fixed precision and scale
	ИначеЕсли
		Num = 5 Тогда
		Возврат Новый ОписаниеТипов("Число");
	ИначеЕсли
		Num = 4 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adSingle 4 Single - precision floating - point value
	ИначеЕсли
		Num = 2 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adSmallInt 2 2 - byte signed integer
	ИначеЕсли
		Num = 16 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adTinyInt 16 1 - byte signed integer
	ИначеЕсли
		Num = 21 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedBigInt 21 8 - byte unsigned integer
	ИначеЕсли
		Num = 19 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedInt 19 4 - byte unsigned integer
	ИначеЕсли
		Num = 18 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedSmallInt 18 2 - byte unsigned integer
	ИначеЕсли
		Num = 17 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUnsignedTinyInt 17 1 - byte unsigned integer
	ИначеЕсли
		Num = 132 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adUserDefined 132 User - defined variable
	ИначеЕсли
		Num = 204 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarBinary 204 Binary value
	ИначеЕсли
		Num = 12 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adVariant 12 Automation variant
	ИначеЕсли
		Num = 139 Тогда
		Возврат Новый ОписаниеТипов("Число"); // adVarNumeric 139 Variable width exact numeric with signed scale
	ИначеЕсли
		Num = 202 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarWChar 202 Null - terminated Unicode character string
	ИначеЕсли
		Num = 130 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adWChar 130
	ИначеЕсли
		Num = 200 Тогда
		Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки);
	Иначе
		Возврат Новый ОписаниеТипов("Строка");
	КонецЕсли;
	
КонецФункции

// Возвращает структуру с данными для НовоеСоединениеССУБД().
//
// Параметры:
//  АдресСервера	 - текст, адрес сервера.
//  ИмяБД      - текст, текст имя базы данных.
//  Логин - текст, логин.
//  Пароль - текст, пароль.
//
Функция СоздатьДанныеДляПодключения(АдресСервера, ИмяБД, Логин, Пароль) Экспорт
	
	ДанныеДляПодключения = Новый Структура("АдресСервера, ИмяБД, Логин, Пароль", АдресСервера, ИмяБД, Логин, Пароль);
	Возврат ДанныеДляПодключения;
	
КонецФункции

Генератор случайных символов

В данном примере показано, как можно сгенерировать строку длинной в 6 символов, состоящие из цифр, маленьких и больших букв латиницы. !Особенность.Если ТекущаяУниверсальнаяДатаВМиллисекундах() вернет 2 и более одинаковых числа (т.е. сервер настолько быстрый, что 2 и более операции произошли в рамках 1 миллисекунды), будут сгенерированы 2 и более одинаковых "случайных числа".
ChOP 27 5
Процедура КнопкаСгенерировать()    
    Для Сч = 1 по 100 Цикл
        Сообщить(ГенерацияСлучайногоСимвола(ТекущаяУниверсальнаяДатаВМиллисекундах()));
    КонецЦикла;   
КонецПроцедуры

Функция ГенерацияСлучайногоСимвола(Счетчик)
    ГСЧ = Новый ГенераторСлучайныхЧисел(Счетчик);    
    СлучайнаяСтрока = "";
    // генерируем случайное число из 6-ти символов, например "d0c8Yf"
    Для Сч = 1 по 6 Цикл        
        Набор = ГСЧ.СлучайноеЧисло(1,3);    
        Если Набор = 1 Тогда
            // это число
            СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,9);    
        ИначеЕсли Набор = 2 Тогда
            // это Большая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(65,90));
        ИначеЕсли Набор = 3 Тогда
            // это маленькая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(97,122));
        КонецЕсли;
        СлучайнаяСтрока = СлучайнаяСтрока + СлучайныйСимвол;
    КонецЦикла;      
    Возврат(СлучайнаяСтрока);    
КонецФункции

Дополнительная расшифровка отчета БСП

Добавление своих вариантов расшифровки в ОбщиеФормы.ФормаОтчета
ChOP 27 5
// Общий модуль ОтчетыКлиентПереопределяемый

Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	
	ОбработкаРасшифровкиПереопределение(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	
КонецПроцедуры

Процедура ОбработкаДополнительнойРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	
	ОбработкаРасшифровкиПереопределение(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

		ПараметрыФормыХ = Новый Структура("СформироватьПриОткрытии, Отбор, КлючВарианта", Истина, ОтборХ, "ДляРасшифровки"); 
		
		ОткрытьФорму("Отчет.ЗаявкиНаПлатежПоДоговоруКонтрагента.Форма.ФормаОтчета", ПараметрыФормыХ, ДополнительныеПараметры.ФормаОтчета, ДополнительныеПараметры.Договор);		
		
	КонецЕсли;
	
КонецПроцедуры

//Общий модуль ОтчетыВызовСервера установлены галочки: сервер, вызов сервера

Функция ЗначениеДанныхВПолеРасшифровки(ОтчетДанныеРасшифровки, Расшифровка) Экспорт
	
	ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
	Возврат ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля()[0].Значение;	
	
КонецФункции

Убрать итоги из готового текста запроса

Позволяет убрать итоги из текста запроса, на пример, перед передачей его в СКД
ChOP 27 5
СхемаЗапроса = новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).ВыраженияИтогов.Очистить();
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).КонтрольныеТочкиИтогов.Очистить();
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();

Открыть форму незаписанного документа

ChOP 27 5
&НаКлиенте
Процедура Команда(Команда)

Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть();

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

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

&НаСервереБезКонтекста

Функция ЗаполнитьДокументНаСервере(ДанныеФормы);

Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.НашДокумент")); // Получаем объект из данных формы ИЛИ

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

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

Проверка Модифицированности объекта

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

Сократить лидирующие нули

Убирает лидирующие нули в строке без пробелов
ChOP 27 5
Функция УбратьЛидирующиеНули(СокращаемаяСтрока)

		Возврат СтрЗаменить(СокрЛ(СтрЗаменить(СокращаемаяСтрока,"0"," "))," ","0");

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

Генератор случайных чисел для диапазона с дробными и отрицательными числами

ChOP 27 5
Функция Генератор(КоличествоСимволовПослеЗапятой = 0, НижняяГраница, ВерхняяГраница )
	
		Множитель = 1;
		
		Пока КоличествоСимволовПослеЗапятой <> 0 Цикл
			
			КоличествоСимволовПослеЗапятой = КоличествоСимволовПослеЗапятой - 1;
			
			Множитель = Множитель*10;
			
		КонецЦикла;
		
		Генератор = Новый ГенераторСлучайныхЧисел();
		
		НижняяГраница = НижняяГраница * Множитель;
		ВерхняяГраница = ВерхняяГраница * Множитель;
		
		Если НижняяГраница > ВерхняяГраница Тогда
			
			Возврат Неопределено;
		
		ИначеЕсли НижняяГраница < 0 Тогда
			
			НижняяГраница = 0;
			ВерхняяГраница = ВерхняяГраница - НижняяГраница;
			
			РезультатГенератора = Генератор.СлучайноеЧисло(НижняяГраница, ВерхняяГраница)/Множитель - НижняяГраница;
							
		ИначеЕсли НижняяГраница >= 0 Тогда
			
			РезультатГенератора = Генератор.СлучайноеЧисло(НижняяГраница, ВерхняяГраница)/Множитель;
									
		КонецЕсли;

		Возврат РезультатГенератора ;

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