Создание базы данных Firebird (при небольших доработках любой sql базы) на основании метаданных 1С. Заполнение данными. Выгрузка в JSON

18.12.20

Интеграция - Внешние источники данных

Создание базы SQL на основании существующей базы 1С. Для разработчиков. Создается база и заполняется данными из нее. Имена таблиц берутся из метаданных 1С. Наименования таблиц, реквизитов переводятся на английский язык. Делается выгрузка данных в формате JSON. Выгружаются справочники, документы с табличными частями, перечисления. Для каждой табличной части создается своя таблица в SQL. Дополнительно создаются таблицы с описанием таблиц, реквизитов, перечислений.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Создание БД Firebird(при не больших доработках в любую sql базу) на основании метаданных 1С. Заполнение данными. Выгрузка в JSON.:
.epf 20,53Kb
2
2
2 SM
Скачать Купить за 2 150 руб.

1С:Предприятие 8.3 (8.3.18.1208)  64 

Firebird Server 3.07 64

Возникла необходимость сделать базу данных не в 1с. Выбрал Firebird.

	СтрокаСоединения ="DRIVER={Firebird/InterBase(r) driver};CHARSET=utf8;UID=SYSDBA;PWD=masterkey;DBNAME=" + объект.ИмяФайлаБазы;
	// Создаем соединение
	мСоединение=Новый COMОбъект("ADODB.Connection");
	мСоединение.ConnectionString=СтрокаСоединения; 
	Попытка
		мСоединение.Open(мСоединение.ConnectionString);
		ПоказатьОповещениеПользователя("ОК",,"Соединение успешно установлено!");
	Исключение
		Сообщить("Ошибка при установке соединения: "+ОписаниеОшибки());
		мСоединение=Неопределено;
	КонецПопытки;
	Command    = Новый COMОбъект("ADODB.Command");
	RecordSet  = Новый COMОбъект("ADODB.RecordSet");

Имена в БД английские. Сделал соответствие русских названий и английских(Имена таблиц и реквизитов).

// Перевод метаданных на английский язык для создания БД
&НаКлиенте
Процедура ТаблицаДобавить(Англ, Рус)
	стр         = Объект.ТаблицыБДшаблон.Добавить();
	стр.ИмяАнгл = Англ;
	стр.ИмяРус  = Рус;
КонецПроцедуры

&НаКлиенте
Процедура РеквизитДобавить(Англ, Рус)
	стр         = Объект.РеквизитыШаблон.Добавить();
	стр.ИмяАнгл = Англ;
	стр.ИмяРус  = Рус;
КонецПроцедуры

&НаКлиенте
Процедура ИнициализацияДанных() Экспорт
	// Таблицы для создания БД порядок играет роль на загрузку в другие базы 1С. 
	// Сперва выгружаются простые таблицы. 
	ТаблицаДобавить( "Departments"     , "Подразделения");
	ТаблицаДобавить( "Employees"       , "Сотрудники");
	ТаблицаДобавить( "Posts"           , "Должности");
	ТаблицаДобавить( "Employment"      , "ПриемНаРаботу");
	ТаблицаДобавить( "TransferEmployee", "ПереводСотрудника");
	
	
	// Реквизиты для создания БД
	стр         = Объект.РеквизитыШаблон.Добавить();
	стр.ИмяАнгл = "ID";
	стр.ИмяРус  = "Ссылка";
	стр.тип     = "строка(36)";
	
	РеквизитДобавить("Cod"          , "Код");
	РеквизитДобавить("DateDoc"      , "Дата");
	РеквизитДобавить("NumberDoc"    , "Номер");
	РеквизитДобавить("Name"         , "Наименование");
	РеквизитДобавить("Department"   , "Подразделение");
	РеквизитДобавить("Post"         , "Должность");
	РеквизитДобавить("Period"       , "Период");
	РеквизитДобавить("Summa"          , "Сумма");
КонецПроцедуры

Вывел на основании метаданных таблицы и реквизиты для генерации SQL запроса на создание таблиц, индексов, внешних ключей.

// Создадим запрос на создание таблицы в БД
&НаКлиенте
Функция СоздатьSQL(таблица, Реквизиты)
	sql = "RECREATE TABLE " + таблица.ИмяАнгл +"(";
	Для каждого стрРеквизит из Реквизиты Цикл
		тип = стрРеквизит.тип;
		Если  Найти(стрРеквизит.тип, "VARCHAR")+  Найти(стрРеквизит.тип, "DATE")+
			Найти(стрРеквизит.тип, "DOUBLE PRECISION") + Найти(стрРеквизит.тип,  "BOOLEAN NOT NULL") = 0 Тогда
			тип = "VARCHAR(36)";  
			стрРеквизит.SQL_indexFK="";
			Если стрРеквизит. ИмяАнгл <> "ID" тогда 
				стрРеквизит.SQL_indexFK = "ALTER TABLE " + таблица.ИмяАнгл + " add FOREIGN KEY (" +стрРеквизит. ИмяАнгл+") REFERENCES " + стрРеквизит.ТИП + " (ID);" ;
			Конецесли;	
		Конецесли;	
		sql =sql +	"
		|	" + стрРеквизит. ИмяАнгл + " " + тип +","; 	
		Если  стрРеквизит.индексировать  и стрРеквизит. ИмяАнгл <> "ID"  Тогда
			стрРеквизит.SQL_index = "CREATE INDEX " +таблица.ИмяАнгл + "_" + стрРеквизит. ИмяАнгл+ "_IDX ON " +таблица.ИмяАнгл + " (" + стрРеквизит. ИмяАнгл+ ");"
		КонецЕсли;		
	КонецЦикла;
	sql =sql +"
	|	CONSTRAINT """ + таблица.ИмяАнгл + "_PK"" PRIMARY KEY (ID)
	|);";
	таблица.SQL_Create = sql;
КонецФункции

 

Сделал выгрузку в JSON сгенерированных таблиц. 


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

	КонецЕсли;
	
	Запрос.Текст = лев(Запрос.Текст, стрдлина(Запрос.Текст)-1);
	
	//таблица
	Если тип = "Справочник" или тип = "Документ" Тогда
		
		Запрос.Текст =  Запрос.Текст +" 
		|ИЗ
		|	" + Тип+"." + имятаблицы + " КАК " + тип + имятаблицы  + "
		|ГДЕ";
	ИначеЕсли тип = "ТабличнаяЧасть" Тогда
		имятаблицы1 = Стрзаменить(имятаблицы,имяТЧ,"");

		Запрос.Текст =  Запрос.Текст +" 
		|ИЗ
		|	" + имявладельца+"." + имяТЧ + "." + имятаблицы1 +" КАК " + имятаблицы  + "
		|ГДЕ";
	КонецЕсли;	
	// отборы
	Если тип = "Справочник"  Тогда
		Запрос.Текст =  Запрос.Текст +"
        |	   " + тип + имятаблицы +".ПометкаУдаления = ЛОЖЬ";
	ИначеЕсли тип = "Документ"  Тогда
		Запрос.Текст =  Запрос.Текст +" 
		|      " + тип + имятаблицы +".Проведен >= Истина 
		|	и  " + тип + имятаблицы +".Дата >= &ДатаНачало 
		|	и  " + тип + имятаблицы +".Дата <= &ДатаОкончание";
	ИначеЕсли тип = "ТабличнаяЧасть" Тогда
		Запрос.Текст =  Запрос.Текст +" 
		|      "  + имятаблицы + ".Ссылка.Проведен >= Истина 
		|	и  " + имятаблицы + ".Ссылка.Дата >= &ДатаНачало 
		|	и  "  + имятаблицы + ".Ссылка.Дата <= &ДатаОкончание";

	КонецЕсли;	
	Запрос.Параметры.Вставить("ДатаНачало",Объект.ДатаНачало);
	Запрос.Параметры.Вставить("ДатаОкончание",КонецДня(Объект.ДатаОкончание));
	РезультатЗапроса = Запрос.Выполнить();
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	мас1 = новый Массив;
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		струк = Новый Структура;
		Для каждого стрРеквизит из Реквизиты Цикл
			Если    Найти(стрРеквизит.тип, "DATE") >0  Тогда
				струк.Вставить(стрРеквизит.ИмяРус,Формат(ВыборкаДетальныеЗаписи[стрРеквизит.ИмяРус],"ДФ=dd.MM.yyyy"));
			ИначеЕсли Найти(стрРеквизит.тип, "DOUBLE PRECISION")+  Найти(стрРеквизит.тип, "BIGINT")  >0 Тогда
				струк.Вставить(стрРеквизит.ИмяРус,  стрзаменить(строка(ВыборкаДетальныеЗаписи[стрРеквизит.ИмяРус]),Символы.НПП,""));
			ИначеЕсли Найти(стрРеквизит.тип, "перечисление")  > 0 Тогда
				струк.Вставить(стрРеквизит.ИмяРус,  строка(ВыборкаДетальныеЗаписи[стрРеквизит.ИмяРус]));
			ИначеЕсли Найти(стрРеквизит.тип, "VARCHAR") + Найти(стрРеквизит.тип,  "BOOLEAN NOT NULL") = 0 Тогда
				струк.Вставить(стрРеквизит.ИмяРус, строка(ВыборкаДетальныеЗаписи[стрРеквизит.ИмяРус].УникальныйИдентификатор()));
			Иначе
				если   стрРеквизит.ИмяРус="ключ" Тогда продолжить КонецЕсли;
				струк.Вставить(стрРеквизит.ИмяРус, ВыборкаДетальныеЗаписи[стрРеквизит.ИмяРус]); 
			КонецЕсли;
		КонецЦикла;
		мас1.Добавить(струк);
	КонецЦикла;
	возврат мас1;
КонецФункции

&НаКлиенте
Процедура ВыгрузкаJSON(Таблица)
	параметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(,символы.Таб);
	мас1 = ВыгрузкаЗапрос(Таблица.Имярус, Таблица.Тип,  Таблица.ВладелецРус, таблица.типвладельца);
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ОткрытьФайл(Объект.Каталог + строка(Таблица.НомерСтроки)+ Таблица.Имярус + ".json","UTF-8",,параметрыЗаписиJSON);
	ЗаписьJSON.ЗаписатьНачалоОбъекта();
	ЗаписьJSON.ЗаписатьИмяСвойства(Таблица.Имярус);
	ЗаписатьJSON(ЗаписьJSON,мас1);
	ЗаписьJSON.ЗаписатьКонецОбъекта();
	ЗаписьJSON.Закрыть();	
КонецПроцедуры	

 

В Firebird создал описания таблиц(mdTable) и реквизитов(mdrekvizit)

&НаКлиенте
Функция СоздатьМетаданныеТаблица()

	возврат    "
	|RECREATE TABLE MDTABLE (
	|	NAMEENGL VARCHAR(100),
	|	NAMERUS VARCHAR(100),
	|	SYNONYM VARCHAR(100),
	|	TIP VARCHAR(100),
	|	OWNER VARCHAR(100),
	|	ID VARCHAR(36) NOT NULL,
	|   COMMENT VARCHAR(100),
	|   HINT VARCHAR(100),
	|	CONSTRAINT MDTABLE_PK PRIMARY KEY (ID)
	|);";
	
КонецФункции

&НаКлиенте
Функция СоздатьМетаданныетРеквизиты()
	sql =    "
	|RECREATE TABLE MDREKVIZIT (
	|	NAMEENGL VARCHAR(100),
	|	NAMERUS VARCHAR(100),
	|	SYNONYM VARCHAR(100),
	|	TIP VARCHAR(100),
	|	TABL VARCHAR(100),
	|	ID VARCHAR(36) NOT NULL,
	|   COMMENT VARCHAR(100),
	|   HINT VARCHAR(100),
	|   FORMAT VARCHAR(100),
	|	CONSTRAINT MDREKVIZIT_PK PRIMARY KEY (ID)
	|);";
	возврат sql;
КонецФункции

Заполнил их метаданными из 1С.

	
	Если Объект.Метаданные Тогда
		Command.ActiveConnection = мСоединение;
		Command.CommandText = СоздатьМетаданныеТаблица();
		Попытка
			RecordSet = Command.Execute();
		Исключение
			Сообщить("Ошибка при выполнении запроса. Текст запроса:"+Символы.ПС+стр.SQL_index+Символы.ПС+"Описание ошибки: "+ОписаниеОшибки());	
		КонецПопытки;
		Command.CommandText = СоздатьМетаданныетРеквизиты();
		Попытка
			RecordSet = Command.Execute();
		Исключение
			Сообщить("Ошибка при выполнении запроса. Текст запроса:"+Символы.ПС+стр.SQL_index+Символы.ПС+"Описание ошибки: "+ОписаниеОшибки());	
		КонецПопытки;
		Для каждого стр из Объект.ТаблицыБД Цикл
			Если стр.Отметка Тогда
				Command.CommandText = "INSERT INTO MDTABLE (NAMEENGL,OWNER, NAMERUS, SYNONYM, TIP, ID, COMMENT, HINT) 
				| VALUES('" + стр.ИмяАнгл+ "', '" + стр.Владелец+ "', '" + стр.ИмяРус+ "', '" + стр.Синоним+ "', '" + стр.Тип+ "', '" +строка(стр.НомерСтроки)+ "', '" + стр.Комментарий+ "', '" + стр.Подсказка+ "');";
				RecordSet = Command.Execute();
				Для каждого стрР из Объект.Реквизиты Цикл
					Если стрР.Отметка Тогда
						Если стрР.Таблица =  стр.ИмяРус Тогда
							Command.CommandText = "INSERT INTO MDREKVIZIT (NAMEENGL, NAMERUS, SYNONYM, TIP, TABL, ID, COMMENT, HINT, FORMAT) 
							| VALUES('" + стрР.ИмяАнгл+ "', '" + стрР.ИмяРус+ "', '" + стрР.Синоним+ "', '" + стрР.Тип+ "', '" +строка(стрР.НомерСтроки)+ "', '"+ строка(стрР.НомерСтроки)+ "', '"  + стрР.Комментарий+ "', '" + стрР.Подсказка+"', '"   "');";
							RecordSet = Command.Execute();
						КонецЕсли;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;	
	

Результат работы:

   1. В качестве создания БД использую привычный мне инструмент 1С.

   2. Создаю SQL базу данных.

   3. Заполняю их данными из 1с.

   4. Делаю выгрузку JSON.  Что дает мне интеграцию с 1С. 

   5. Метаданные дают мне возможность использовать синонимы, подсказки, сделанные в 1С.

Firebird JSON метаданные обработка

См. также

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

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    16613    17    SQV0    48    

35

Зарплата Внешние источники данных Бюджетный учет Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    23273    20    1    

23

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30294    21    31    

22

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10200 руб.

24.06.2021    19823    53    53    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 785 18.12.20 09:49 Сейчас в теме
для чего это вообще нужно?
2. user1045404 167 22.12.20 00:33 Сейчас в теме
Делаю программу на другом языке программирования. На основании метаданных генерируется код (структуры и доступ к данным) . Остается написать логику приложения. У меня есть задача с использованием отпечатка пальца. Другая задача с загрузкой достаточно большого объема данных csv, xml, html. В 1с это медленно. И ещё с лицензированием, много работающих в разных регионах... На первом плане скорость загрузки, выгрузки..
Оставьте свое сообщение