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

18.12.20

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

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

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

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

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С 8.3 в БД Clickhouse (для работы с данными 1С в BI-системах)

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

Готовое решение для автоматизированной выгрузки данных из 1С 8.3, а также MS Excel в базу данных ClickHouse для работы с данными 1С в Yandex Datalens, Visiology, Apache Superset (и не только) - "Экстрактор данных 1С в BI". Решение отлично работает со всеми типовыми (и не только) конфигурациями 1С 8.3 для управляемых форм. Gозволяет автоматизировать работу бизнес-аналитика по ежедневной выгрузке данных из 1С в БД ClickHouse для последующей работы с этой БД в Yandex Datalens/ Система полностью автоматизирует работу с хранилищем данных в БД Clickhouse. Не надо быть программистом, чтобы одной кнопкой получать любые данные из 1С в Yandex Datalens

160000 руб.

15.11.2022    9917    6    23    

18

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    8166    4    8    

7

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Внешняя обработка с открытым кодом.

9000 руб.

08.12.2011    79808    119    121    

139

Перенос данных из Парус 7.хх в ЗГУ ред.3

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

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

24000 руб.

24.04.2017    46896    89    153    

82

Обмен с СУФД (Федеральным казначейством) для Бухгалтерии предприятия 3.0

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

Комплект обработок для обмена СУФД и Бухгалтерии 3.0. Содержит две обработки: для переноса платежных поручений из БП 3.0 в СУФД Федерального казначейства и загрузки выписок из СУФД в БП 3.0.

2400 руб.

30.03.2023    5499    14    2    

15

Импорт документов из розничной программы учета (ТрейдФарм, Манускрипт Солюшн, Е-Фарма и др.) в Бухгалтерию 3.0 с формированием книги учета доходов и расходов при УСН и бухгалтерского и налогового учета при ОСНО

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

Представлена обработка для импорта документов из розничной программы учета товара в торговых точках и аптеках, необходимых для ведения бухгалтерского и налогового учёта, в Бухгалтерию 3.0. При загрузке данных в бухгалтерию переносятся документы поступлений, реализации, возвратов и перемещений в торговых точках и формируются все бухгалтерские и налоговые отчеты с учетом этих документов для любой системы налогообложения. Обработка позволяет загрузить данные из ПО ТрейдФарм. Имеются варианты для других розничных программ (ПО Manuscript Solution, Е-Фарма и S-Market).

18000 руб.

09.04.2020    17312    10    8    

6

Загрузка спецификаций в УНФ из системы Базис-мебельщик

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

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

6000 руб.

24.06.2021    17674    45    41    

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