наверх
Свободные IT публикации
логин:
пароль:

Процедуры и функции 1С для выполнения SQL-запросов и обработки результата [1100]


[8] AdminITD - 2018-12-01 03:00:00



V81, V82, V83, Управляемое приложение, Обычное приложение

Введение


Любой разработчик, обслуживающий информационные базы большого объема, рано или поздно сталкивается с необходимостью использования SQL запросов к базе 1С. Использовать эти возможности или нет - личное дело специалиста, обслуживающего БД. На мой взгляд, знание внутреннего устройства базы хранения данных на порядок повышает качество разработки, умение обращаться к ней напрямую существенно расширяет возможности разработчика, а в ряде случаев эти навыки просто незаменимы. Конечно, это не значит, что нужно переводить обработку данных исключительно на прямые запросы, платформа 1С на текущий момент предоставляет инструменты, позволяющие качественно решать большинство возникающих задач типовыми средствами. Большинство, но не все, к сожалению. Список задач, выполнение которых существенно упрощается при привлечении средств SQL достаточно широк. Вот некоторые из них:
  • Быстрое получение данных из сторонних информационных систем, сайтов и пр.
  • Получение сводных актуальных данных одновременно из любого количества различных БД, в том числе территориально удаленных. К примеру реальное общее количество определенного товара на всех складах и магазинах на текущий момент, текущая сумма выручки и любая подобная актуальная информация.
  • Быстрая сверка данных в различных ИБ. SQL позволяет произвести подобную сверку одним запросом сразу к нескольким базам;
  • Быстрая параллельная загрузка справочной информации в несколько БД. К примеру при создании или изменении номенклатуры в одной базе, прямое сохранение этих изменений в нескольких связанных базах без планов обмена, формирования промежуточных файлов обмена и пр.
  • Быстрая выгрузка/загрузка данных;
  • Свертывание и очистка БД большого объема;
  • Быстрая реструктуризация больших объектов базы 1С при обновлении.
  • Анализ и оптимизация работы 1С.

Главный плюс использования прямых SQL запросов - скорость. Это самый быстрый способ получения и обработки данных в серверных системах 1С из всех возможных. Во вторых - полная независивость от состояния и работоспособности сервера 1С. В третьих - на сервере БД выполняются Ваши запросы, а не запросы, построенные программой по универсальным алгоритмам, зачастую не самым оптимальным.
Основное требование к разработчику - хорошее знание внутренней структуры базы хранения данных, языка запросов SQL и правил построения конструкций MS T-SQL. Изучение внутреннего устройства базы хранения 1С занимает не так уж и много времени, зато когда возможности доступа к данным и их обработки далеко за рамками возможностей, предоставленных платформой 1С, решение многих задач переходит на качественно новый уровень.

Функции и процедуры

//Функция возвращает объект ссылочного типа 1С по описанию в виде структуры ОписаниеЗначения("Тип,Вид,СсылкаSQL"), где
//Тип - тип объекта 1С (справочник, документ и т.д.)
//Вид - вид объекта 1С (справочник "Валюты", "Пользователи" и т.п.)
//строковое представление внутреннего ID может быть получено в запросе SQL с помощью SQL-Функции CONVERT:
//SELECT
//  convert(char(34), Справочники_Валюты._IDRRef,1) AS Ссылка
//  -- ...
//FROM
//  ZuP.dbo._Reference19 Справочники_Валюты (nolock)
Функция СсылкаИзSQL(ОписаниеЗначения) Экспорт
	Перем Ссылка_;
	Попытка
		Если ОписаниеЗначения.Тип = "Документ" Тогда 
			Ссылка_ = Документы[ОписаниеЗначения.Вид].ПустаяСсылка();
		ИначеЕсли	ОписаниеЗначения.Тип = "Справочник" Тогда
			Ссылка_ = Справочники[ОписаниеЗначения.Вид].ПустаяСсылка();
		ИначеЕсли	ОписаниеЗначения.Тип = "Перечисление" Тогда 
			Ссылка_ = Перечисления[ОписаниеЗначения.Вид].ПустаяСсылка();
		ИначеЕсли	ОписаниеЗначения.Тип = "ПланОбмена" Тогда
			Ссылка_ = ПланыОбмена[ОписаниеЗначения.Вид].ПустаяСсылка();
		Иначе	
			Возврат Неопределено;
		КонецЕсли;
		Если Ссылка_ <> Неопределено Тогда
			Строка_ = ЗначениеВСтрокуВнутр( Ссылка_ );
			Строка_ = СтрЗаменить(Строка_,"00000000000000000000000000000000",Прав(СокрЛП(ОписаниеЗначения.СсылкаSQL),32));
			Ссылка_ = ЗначениеИзСтрокиВнутр(Строка_);
		КонецЕсли;
	Исключение
		Ссылка_ = Неопределено;
	КонецПопытки;
    Возврат	Ссылка_;	
КонецФункции

//Функция возвращает шестнадцатиричное представление внутреннего ID объекта1С по объекту ссылочного типа 1С
Функция СсылкаВSQL(Ссылка1с) Экспорт
	SQL_ID = "0x00000000000000000000000000000000";
	Если Ссылка1с <> Неопределено Тогда
		ВнСТР = ЗначениеВСтрокуВнутр(Ссылка1с);
		SQL_ID = "0x"+ВРЕГ(Сред(ВнСТР, Найти(ВнСТР, ":") + 1, 32));
	КонецЕсли;
    Возврат	SQL_ID;		
КонецФункции

//Функция возвращает структуру параметров подключения к базе SQL
//Если в конфигурации присутствует справочник "Базы данных" и передана ссылка на элемент этого справочника, то структура заполняется из справочника,
//иначе структура формируется из строковых параметров функции
//При вызове без параметров возвращае структуру подключения к текущей базе
Функция ВернутьСтруктуруПодключения(БД=Неопределено,СерверБазыSQL="",ИмяБазыSQL="",ИмяПользователяSQL="",ПарольПользователяSQL="") Экспорт
	Перем СтруктураПодключения;
	
	Если БД<>Неопределено или СерверБазыSQL="" Тогда
		СтруктураПодключения = Новый Структура("СерверБазыSQL,ИмяБазыSQL,ПользовательSQL,ПарольПользователяSQL");
		Запрос = Новый Запрос;
		Запрос.Текст = "
		|ВЫБРАТЬ ПЕРВЫЕ 1 РАЗРЕШЕННЫЕ
		|	БД.ИмяБазыSQL,
		|	БД.СерверБазыSQL,
		|	БД.ПользовательSQL,
		|	БД.ПарольПользователяSQL
		|ИЗ Справочник.БазыДанных КАК БД
		|ГДЕ БД.Ссылка = &БД";
		
		ПараметрБазаДанных  =  ?(БД = Неопределено, Константы.ТекущаяБД.Получить(), БД);
		Запрос.УстановитьПараметр("БД",ПараметрБазаДанных);
		
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			ЗаполнитьЗначенияСвойств(СтруктураПодключения,Выборка);
			СтруктураПодключения.ПарольПользователяSQL  = ПрочитатьПароль(Выборка.ПарольПользователяSQL);
		КонецЕсли;
	Иначе	
		СтруктураПодключения = Новый Структура("СерверБазыSQL,ИмяБазыSQL,ПользовательSQL,ПарольПользователяSQL",СерверБазыSQL,ИмяБазыSQL,ИмяПользователяSQL,ПарольПользователяSQL);
	КонецЕсли;
	
	Возврат СтруктураПодключения;           
КонецФункции	

//Функция возвращает строку подключения к базе SQL
Функция  ВернутьСтрокуПодключения(ПараметрыПодключения) Экспорт
	СтрокаПодключения = "Provider=SQLOLEDB.1;
	|Password="+СокрЛП(ПараметрыПодключения.ПарольПользователяSQL)+";
	|User ID="+СокрЛП(ПараметрыПодключения.ПользовательSQL)+";
	|Persist Security Info=True;
	|Initial Catalog="+СокрЛП(ПараметрыПодключения.ИмяБазыSQL)+";
	|Data Source="+СокрЛП(ПараметрыПодключения.СерверБазыSQL);
	
	Возврат СтрокаПодключения;
КонецФункции

//Функция выполняет SQL-запрос и возвращает результирующий набор данных в виде объекта ADO RecordSet, либо "Неопределено" в случае ошибки
Функция ВернутьRecordSet(ТекстЗапроса, ПараметрыПодключения, Ошибка = "") Экспорт
	Перем Connection,Command,RecordSet;

	RecordSet = Неопределено;
	Попытка
		Connection = Новый COMОбъект("ADODB.Connection");
		Connection.Open(ВернутьСтрокуПодключения(ПараметрыПодключения));
		
		RecordSet = Новый COMОбъект("ADODB.Recordset");
		RecordSet.Open(ТекстЗапроса, Connection);
		Пока (НЕ RecordSet.State) Цикл
			RecordSet = RecordSet.NextRecordset();
		КонецЦикла;
	Исключение
		Ошибка = ОписаниеОшибки();
		RecordSet = Неопределено;
	КонецПопытки;
	Возврат RecordSet;
КонецФункции 

//Функция преобразовывает ADO RecordSet в таблицу значений 1С
//RS - набор данных(RecordSet)
//ТЗ - таблица значений, в которую необходимо выгрузить RS
//РасшифровкаСсылок - ТЗ вида {Имя,Тип,Вид},
// где Имя (стр) - имя поля, содержащего ссылку
//     Тип (стр) - тип объекта ("Справочник","Документ" и т.д.)
//     Вид (стр) - вид объекта ("Склад","РеализацияТиУ" и т.п.)
//ЭлементФормы - соответствующее табличное поле на форме, которое необходимомзаполнить данными полученной таблицы
Процедура ВыгрузитьRS_В_ТЗ(RS, ТЗ, ЭлементФормы = Неопределено, РасшифровкаСсылок=Неопределено) Экспорт
	Перем СчКолонок, РасшифровкаКолонок ;
	
	Если  RS = Неопределено Тогда
		#ЕСЛИ КЛИЕНТ ТОГДА
			Сообщить("Набор данных пуст!");
		#КОНЕЦЕСЛИ	
		Возврат;
	КонецЕсли;
	
	ОписаниеСсылки = Новый Структура("Тип,Вид,СсылкаSQL");
	
	Если ТипЗнч(ТЗ)<> Тип("ТаблицаЗначений") Тогда
		#ЕСЛИ КЛИЕНТ ТОГДА
			Сообщить("Не определена таблица результата!"); 
		#КОНЕЦЕСЛИ
		Возврат;
	КонецЕсли;
	Если  РасшифровкаСсылок <> Неопределено и ТипЗнч(РасшифровкаСсылок)<> Тип("ТаблицаЗначений")  Тогда
		РасшифровкаСсылок = Неопределено;
	Иначе 
		РасшифровкаКолонок = Новый ТаблицаЗначений;
		РасшифровкаКолонок.Колонки.Добавить("Номер");
		РасшифровкаКолонок.Колонки.Добавить("Тип");
		РасшифровкаКолонок.Колонки.Добавить("Вид");
	КонецЕсли;
	  
	СчКолонок = (RS.Fields.Count - 1);
		
	Если НЕ ТЗ.Колонки.Количество() Тогда
		НаборКолонок = ТЗ.Колонки;
		НаборКолонок.Очистить();
		Для Сч = 0 По СчКолонок Цикл
			ТекИмя = RS.Fields(Сч).Name;
			НаборКолонок.Добавить(ТекИмя, , ТекИмя, 15);
			Если  РасшифровкаСсылок <> Неопределено  Тогда
				ТекСоответствие = РасшифровкаСсылок.Найти(ТекИмя,"Имя");
				Если ТекСоответствие <> Неопределено Тогда 
					 СтрСоотв = РасшифровкаКолонок.Добавить();
					 СтрСоотв.Номер = Сч;
					 СтрСоотв.Тип = ТекСоответствие.Тип;
					 СтрСоотв.Вид = ТекСоответствие.Вид;
				КонецЕсли;	
			КонецЕсли;		
		КонецЦикла;
	Иначе
		Если  РасшифровкаСсылок <> Неопределено  Тогда
			Для Сч = 0 По СчКолонок Цикл
			    ТекИмя = RS.Fields(Сч).Name;
				ТекСоответствие = РасшифровкаСсылок.Найти(ТекИмя,"Имя");
				Если ТекСоответствие <> Неопределено Тогда 
					 СтрСоотв = РасшифровкаКолонок.Добавить();
					 СтрСоотв.Номер = Сч;
					 СтрСоотв.Тип = ТекСоответствие.Тип;
					 СтрСоотв.Вид = ТекСоответствие.Вид;
				КонецЕсли;	
			КонецЦикла;
        КонецЕсли;	
	КонецЕсли;
	
	Если (НЕ ((RS.EOF()) ИЛИ (RS.BOF()))) Тогда
		csaМассив = RS.GetRows();
		Для Сч = 0 По csaМассив.GetLength(0) - 1 Цикл
			СтрокаТЗ = ТЗ.Добавить();
			Для ТекСч = 0 По СчКолонок Цикл
				ТекЗначение = csaМассив.GetValue(Сч, ТекСч);
				
				Если  РасшифровкаСсылок <> Неопределено  Тогда
					СтрРасшифровки = РасшифровкаСсылок.Найти(ТекСч,"Номер");
					Если СтрРасшифровки<>Неопределено Тогда 
						ЗаполнитьЗначенияСвойств(ОписаниеСсылки,СтрРасшифровки);
						ОписаниеСсылки.Вставить("СсылкаSQL",ТекЗначение);
						ТекЗначение = СсылкаИзSQL(ОписаниеСсылки);
					КонецЕсли;	
				КонецЕсли;	
	
				СтрокаТЗ[ТекСч] = ТекЗначение;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	
	Если ЭлементФормы <> Неопределено Тогда
		ЭлементФормы.СоздатьКолонки();			
	КонецЕсли;	
КонецПроцедуры

//Функция выполняет SQL-запрос и возвращает результат в виде таблицы значений 1С
//Колонки таблицы значений соответствуют обозначениям полей в запросе
Функция СоздатьЗаполнитьТаблицуРезультата(ТекстЗапроса, ПараметрыПодключения)Экспорт
	Перем ТаблицаРезультата;
	ТаблицаРезультата = Новый ТаблицаЗначений;
	
	Попытка
		Connection = Новый COMОбъект("ADODB.Connection");
		Connection.Open(ВернутьСтрокуПодключения(ПараметрыПодключения));
		
		ADOCommand = Новый COMОбъект("ADODB.Command");
		ADOCommand.ActiveConnection = Connection;
		ADOCommand.CommandTimeout = 300;
		ADOCommand.CommandText = ТекстЗапроса;
	Исключение
		Ошибка = ОписаниеОшибки();
		#ЕСЛИ КЛИЕНТ ТОГДА
			Сообщить("Не удалось подключить ADO: " + Ошибка);
		#КОНЕЦЕСЛИ
	КонецПопытки;
	
	Попытка
		RecordSet = ADOCommand.Execute();
	Исключение
		ФлЕстьОшибкиОбработки = Истина;
		Возврат ТаблицаРезультата;
	КонецПопытки;
	
	Пока (НЕ RecordSet.State) Цикл
		RecordSet = RecordSet.NextRecordset();
	КонецЦикла;
	
	Если (НЕ ((RecordSet.EOF()) ИЛИ (RecordSet.BOF()))) Тогда
		//Выгрузка результата запроса в COMSafeArray
		csaМассивРезультата = RecordSet.GetRows();
	Иначе 
		Возврат ТаблицаРезультата;
	КонецЕсли;	
	
	//Заполнение колонок таблицы рез. по полям результата запроса
	СчКолонок = (RecordSet.Fields.Count - 1);
	НаборКолонок = ТаблицаРезультата.Колонки;
	Для Сч = 0 По СчКолонок Цикл
		ТекИмя = RecordSet.Fields(Сч).Name;
		НаборКолонок.Добавить(ТекИмя);	
	КонецЦикла;
	
	//Выгрузка результата запроса в таблицу результата
	Для СчСтрок = 0 По csaМассивРезультата.GetLength(0) - 1 Цикл
		СтрокаДанных = ТаблицаРезультата.Добавить();
		Для СчПолей = 0 По СчКолонок Цикл
			СтрокаДанных[СчПолей] = csaМассивРезультата.GetValue(СчСтрок, СчПолей);	 
		КонецЦикла;
	КонецЦикла;	
	
	Попытка
		RecordSet.Close();
		RecordSet = "";
	Исключение
	КонецПопытки;
	
	Возврат ТаблицаРезультата;	
КонецФункции

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

	Возврат "("+Сред(Фильтр,2)+")";
КонецФункции

//Функция формирует строковое представление таблицы значений 1С для использования в тексте SQL-запроса
Функция  ТаблицаВSQL(ИсточникЗначений) Экспорт
	Перем СчСтрок, СчКол, ТаблицаSQL;
	ТаблицаSQL = "";
	СтрокаОбъединенияСтрок = Символы.ПС+"UNION ALL"+Символы.ПС;
	
	КоличествоСтрок = ИсточникЗначений.Количество();
	Колонки = ИсточникЗначений.Колонки;
	КоличествоКолонок = Колонки.Количество();
	
	Для СчСтрок = 0 По КоличествоСтрок-1 Цикл
		ТаблицаSQL = ТаблицаSQL + ?(СчСтрок=0,"",СтрокаОбъединенияСтрок);
		Для СчКол = 0 По КоличествоКолонок-1 Цикл
		    ТаблицаSQL = ТаблицаSQL + ?(СчКол=0,"SELECT ",",") + ЗначениеВSQL(ИсточникЗначений[СчСтрок][СчКол]) + ?(СчСтрок=0," AS "+Колонки[СчКол].Имя, "");
		КонецЦикла;	
	КонецЦикла;

	Возврат "("+ТаблицаSQL+")";
КонецФункции

//Функция формирует строковое представление переданного значения для использования в тексте SQL-запроса
Функция ЗначениеВSQL(Значение1С) Экспорт 
	Если ТипЗнч(Значение1С) = Тип("Дата") Тогда
		Возврат "'"+Формат(Значение1С,Формат("ДФ='yyyy-MM-dd HH:mm:ss'"))+"'";
	ИначеЕсли ТипЗнч(Значение1С) = Тип("Число") Тогда 
		Возврат Формат(Значение1С,Формат("ЧРД=.; ЧГ=0"));
	ИначеЕсли ТипЗнч(Значение1С) = Тип("Булево") Тогда
		Возврат ?(Значение1С,"0x01","0x00");
	ИначеЕсли ТипЗнч(Значение1С) = Тип("Строка") Тогда
		Возврат "'"+Значение1С+"'";		
	ИначеЕсли ТипЗнч(Значение1С) = Тип("Массив") ИЛИ ТипЗнч(Значение1С) = Тип("СписокЗначений") Тогда
		Возврат СформироватьФильтрSQL(Значение1С);	
	ИначеЕсли ТипЗнч(Значение1С) = Тип("ТаблицаЗначений") Тогда
		Возврат ТаблицаВSQL(Значение1С);
	ИначеЕсли ЭтоСсылка(Значение1С) Тогда
		Возврат СсылкаВSQL(Значение1С);	
	Иначе
		Возврат "";
	КонецЕсли;	
КонецФункции 

//Функция определяет, является ли параметр ссылкой
Функция ЭтоСсылка(Значение1С) Экспорт	
	Попытка
		Значение1С=Значение1С.Ссылка;
		Возврат Истина;
	исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции	

//Получение объекта adoConnection
Функция  ВернутьAdoConnection(ПараметрыПодключения, Ошибка="")Экспорт	
    Попытка
		Connection = Новый COMОбъект("ADODB.Connection");
		Connection.Open(ВернутьСтрокуПодключения(ПараметрыПодключения));
	Исключение
		Connection = Неопределено;
		#ЕСЛИ КЛИЕНТ ТОГДА
			Сообщить("Не удалось подключить ADO: " + ОписаниеОшибки());
		#КОНЕЦЕСЛИ
	КонецПопытки;		
	Возврат Connection;		
КонецФункции

//Получение объекта ADOCommand
Функция ПолучитьRecordSet(ADOCommand, ТекстЗапроса)Экспорт
	ADOCommand.CommandText = ТекстЗапроса;	
	Попытка
		Возврат ADOCommand.Execute();
	Исключение
		ФлЕстьОшибкиОбработки = Истина;
		Возврат Неопределено;
	КонецПопытки;
КонецФункции	
	
Функция ПолучитьADOCommand(ПараметрыПодключения) Экспорт
	Перем ADOCommand;
	Попытка
		Connection = Новый COMОбъект("ADODB.Connection");
		Connection.Open(ВернутьСтрокуПодключения(ПараметрыПодключения));
		
		ADOCommand = Новый COMОбъект("ADODB.Command");
		ADOCommand.ActiveConnection = Connection;
		ADOCommand.CommandTimeout = 300;
	Исключение
		ADOCommand = Неопределено;		
		#ЕСЛИ КЛИЕНТ ТОГДА
			Сообщить("Не удалось подключить ADO: " + ОписаниеОшибки());
		#КОНЕЦЕСЛИ
	КонецПопытки;
	Возврат ADOCommand;
КонецФункции	

//Функция выполнения произвольной команды SQL, включая запросы изменения данных
Функция ВыполнитьКомандуSQL(ТекстКоманды, ADOCommand) Экспорт
	ADOCommand.CommandText = ТекстКоманды;
	Попытка
		ADOCommand.Execute();
		Возврат Истина;
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции	

//Простое кодирование пароля для справочника "БазыДанных"
Функция ПрочитатьПароль(стрИсточник = "") Экспорт
	стрРезультат = "";
	Для Ном = 0 По СтрДлина(стрИсточник) / 3 - 1 Цикл
		стрРезультат = стрРезультат + 
			Символ(Из_Любой_В_10(Сред(стрИсточник, 1 + Ном * 3, 3), 16));
	КонецЦикла;
	Возврат стрРезультат;
КонецФункции

Функция КодироватьПароль(стрИсточник) Экспорт
	СтрПароль = стрИсточник;
	стрРезультат = "";
	Для Ном = 1 По СтрДлина(СтрПароль) Цикл
		стрРезультат = стрРезультат + Прав("000" + 
		Из_10_В_Любую(Формат(КодСимвола(Сред(СтрПароль, 
		Ном, 1)), "ЧЦ=6;ЧРД=.;ЧН=;ЧВН=;ЧГ=0"), 16), 3);
	КонецЦикла;
	Возврат стрРезультат;
КонецФункции

// Пересчет между системами счисления
Функция Из_10_В_Любую(Знач Значение = 0, Нотация = 36) Экспорт
	
	Если Нотация <= 0 Тогда
		Возврат("");
	КонецЕсли;
	
	Значение = Число(Значение);
	Если Значение <= 0 Тогда 
		Возврат("00"); 
	КонецЕсли;
	
	Значение = Цел(Значение);
	Результат = "";
	Пока Значение > 0 Цикл
		Результат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%", Значение % Нотация + 1, 1) + Результат;
		Значение = Цел(Значение / Нотация);
	КонецЦикла;
	Результат = ?(СтрДлина(Результат) = 1, "0" + Результат, Результат);
	
	Возврат Результат;
	
КонецФункции

Функция Из_Любой_В_10(Знач Значение = "0", Нотация = 36) Экспорт
	
	Если Нотация <= 0 Тогда
		Возврат(0);
	КонецЕсли;
	Значение = СокрЛП(Значение);
	Если Значение = "0" Тогда
		Возврат(0);
	КонецЕсли;
	Результат = 0;
	Длина = СтрДлина(Значение);
	Для Х = 1 По Длина Цикл
		М = 1;
		Для У = 1 По Длина - Х Цикл
			М = М * Нотация 
		КонецЦикла;
		Результат = Результат + (Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", 
		ВРег(Сред(Значение, Х, 1))) - 1) * М;
	КонецЦикла;
	Возврат Окр(Результат);
	
КонецФункции

● Файлы для скачивания:

для получения доступа требуется авторизация размер: 5.5 кб, скачиваний: 31. cодержимое архива: Процедуры и функции 1С для SQL.txt - 17,7 кб.

● Комментарии:

Для добавления комментария необходима авторизация.

Нет комментариев