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

18.12.20

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Создание БД Firebird(при не больших доработках в любую sql базу) на основании метаданных 1С. Заполнение данными. Выгрузка в JSON.:
.epf 20,53Kb
3
3 Скачать (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 Управляемые формы Анализ и прогнозирование 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

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

28500 руб.

15.11.2022    22295    23    49    

39

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

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

120000 руб.

19.08.2020    26124    25    1    

28

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

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

84000 руб.

24.04.2017    52338    104    165    

91

Внешние источники данных Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Готовая интеграция для управляемых форм. Встраивается в вашу 1С как расширение. Реализует автоматический обмен данными между 1С (1С:Фитнес клуб и аналогов) и СКУД RusGuard, автоматизирует бизнес-процессы по созданию и учету сотрудников в СКУД. Значительно упрощает работу специалистов отдела кадров и отдела безопасности: избавляет от двойного ввода информации в 1С и СКУД.

94999 руб.

11.07.2024    1169    1    0    

3

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

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

84000 руб.

05.10.2022    11442    13    8    

15

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

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

120000 руб.

07.06.2021    13622    2    3    

3

Розничная торговля Внешние источники данных Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Бухгалтерский учет 1С:Бухгалтерия 3.0 Фармацевтика, аптеки Россия Бухгалтерский учет Платные (руб)

Внешняя обработка загрузки данных из файла-выгрузки, сформированного в программе F3 TAIL версии 3.4 (и выше) или еФарма версии 2.1, в базу конфигурации 1С: Бухгалтерия предприятия 8, ред. 3.0 (базовая, ПРОФ, КОРП, ФРЕШ).

13200 руб.

19.12.2016    48176    93    106    

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