Интеграции с сервером SQL. Быстро и просто

Публикация № 1260010

Разработка - Системная интеграция - Внешние источники данных

SQL СУБД экспорт/импорт данных прямые запросы

Решаем вопросы экспорта/импорта данных в базы отличного от 1С происхождения.

Условия тестирования описанного ниже:  Microsoft SQL Server 2008, Платформа 8.3.9.2170

В этот раз хотелось бы снова поговорить о прямых запросах к СУБД. Да, автор статьи слышал о том, что 1С крайне не рекомендует этим заниматься. Однако же заниматься этим мы будем с одной оговоркой – базы, с которыми предстоит поработать имеют отличное от 1С происхождение. Уже предчувствую возгласы – есть же «Внешние источники данных» в конфигурации, ими и пользуйтесь. Пользовались, умеем, однако же мнения публики об этом объекте конфигурации весьма противоречивы и многие из них далеко не восторженные. Основное преимущество их – понятная всякому, даже начинающему, программисту 1C методика работы с ними – либо аналогично объектам вроде документов и справочников, либо очень напоминающая непериодический независимый регистр сведений.

Вместе с тем есть и неприятные особенности. Прежде всего – отдельные типы данных «внешний источник» переваривает со скрипом. А чтобы положить в этот источник ссылку объекта в том виде, в каком она хранится в СУБД приходится указывать тип «Уникальный идентификатор», преобразовывать идентификаторы объектов в строки и заниматься перестановками групп символов. Случалось и так, что при указании строки подключения в пользовательском режиме ошибался, но вместо повторного запроса таковой просто получил бесконечные исключения при попытке обращения к нему.

В тоже время, для работы с иными базами данных «Внешний источник данных» нам совершенно не обязателен. Ведь научить 1C выполнять запросы к MS SQL или иной СУБД большой проблемы не составляет. Зато преимуществ получается сразу довольно много. Как ни крути, а СУБД – запросы как способ интеграции во многом выигрывают даже у WEB-сервисов, а у выгрузок/загрузок через файловую систему подавно.

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

Функция СоединитьСерверSQL() Экспорт
    
    Настройки   =    inf_ПовтИспСеанс.ВернутьНастройкиСвязиSQL();
    
    Server        =   Настройки.СерверSQL;
    Base        =   Настройки.CATALOG;
    User        =   Настройки.ЛогинSQL;
    Pass        =    Настройки.ПарольSQL; 
    булWinLogin =     Ложь;
        
    con = Новый  COMОбъект("ADODB.Connection");
    con.ConnectionTimeout    = 5;
    con.CommandTimeout        = 0;
    con.CursorLocation        = 3;
    con.Provider            = "MSDASQL";
    Если (не ПустаяСтрока(User))и(не булWinLogin) тогда
        con.ConnectionString    = "driver={SQL Server};server="+Server+";uid="+User+";pwd="+Pass+";Database="+Base+";";
    иначеЕсли не ПустаяСтрока(User) тогда
        con.ConnectionString    = "Driver={SQL Server Native Client 11.0};Server="+Server+";Database="+Base+";Trusted_Connection=yes;uid="+User+";pwd="+Pass+";";
    иначе
        con.ConnectionString    = "Driver={SQL Server Native Client 11.0};Server="+Server+";Database="+Base+";Trusted_Connection=yes;";
    КонецЕсли;
    Попытка
        con.Open();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    Возврат con;
    
КонецФункции

Функция ПолучитьТаблицуДанныхSQL(ТекстЗапроса, con)  Экспорт
    Таблица = Новый ТаблицаЗначений;
    cmd    = Новый COMОбъект("ADODB.Command");
    cmd.CommandTimeout = 0;
    cmd.ActiveConnection = con;    
    cmd.CommandText    = ТекстЗапроса;
    rs = cmd.Execute();
    Для НомерСтолбца = 0 По Rs.Fields.Count-1 Цикл
        ИмяНовойКолонки = Rs.Fields(НомерСтолбца).Name;
        Таблица.Колонки.Добавить(ИмяНовойКолонки);
    КонецЦикла;
    Если Не Rs.eof Тогда
        rs.MoveFirst();
    КонецЕсли;
    Пока Не Rs.eof Цикл    
        НоваяСтрока = Таблица.Добавить();
        Для каждого Колонка из Таблица.Колонки Цикл
            ИмяКолонки = Колонка.Имя;
            Значение = Rs.Fields.Item(ИмяКолонки).Value;
            Если значение <> Null Тогда
                НоваяСтрока[ИмяКолонки] = Значение;
            КонецЕсли;        
        КонецЦикла;
        rs.MoveNext();
    КонецЦикла;
    Возврат Таблица;
КонецФункции

       Пример вызова:

Соединение = inf_ИнтеграцияССерверомSQL.СоединитьСерверSQL();
ТекстЗапроса =  ШаблонЗапроса();
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Номер&"	, Ном.Начало);
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Год&"	, Ном.Год	);
Т_SQL = inf_ИнтеграцияССерверомSQL.ПолучитьТаблицуДанныхSQL(ТекстЗапроса, Соединение);
Соединение.Close();


В общем-то на этом вопрос получения данных из внешней базы закрывается. Но остается второй, куда более обширный вопрос – как же наоборот, выгрузить данные из 1С в базу данных на «чистом» SQL?  Web-сервисы, COM-соединения и промежуточные файлы не рассматриваем ввиду тематики статьи, хотя они имеют место быть и часто даже оказываются уместными, про эти вещи и без меня написано достаточно. А в рамках данной статьи нам будут интересны именно пути, предполагающие прямое взаимодействие с SQL.

Способ 1. Очевидный (но не лучший).

Уверен, что это первое, что приходит в голову разработчику, по крайней мере не из касты 1С – вооружаемся SQL-профайлером, любой консолью запросов и любой обработкой, раскрывающей структуру хранения базы данных и готовим прямой запрос к данным 1С. Далее этот запрос размещается где-нибудь в недрах стороннего продукта и обеспечивает получение данных. Это в теории. На практике же кроме использования на уровне СУБД нумерованных имен вместо отражающих смысл хранимой информации вылезают «подводные камни», подробнее о которых можно посмотреть здесь. Но в любом случае на выходе имеем нечто подобное:


SELECT T1._IDRRef as 'goods_ref' 
,T1._Code as 'goods_Code'
,T1._Description as 'goods_Description'
,T1._Fld2522RRef as 'Vendor_ref'
,ISNULL(T3._Description,'') as 'Vendor_Description'
,T1._Fld26356RRef as 'Manufacturer_ref'
,ISNULL(T4._Description,'') as 'Manufacturer_Description'
,ISNULL(T4._Fld2091,'') as 'Manufacturer_Full_Description'
,ISNULL(T4._Fld2097,'') as 'Manufacturer_Site'
,T1._Fld2526RRef as 'Country_ref'
,ISNULL(T5._Code,'') as 'Country_code'
,ISNULL(T5._Description,'') as 'Country_Description'
,ISNULL(T5._Fld2042,'') as 'Country_Full_Description'
,ISNULL(T5._Fld2043,'') as 'Country_code_2'
,T1._Fld32598RRef as 'Tariff_ref'
,ISNULL(T6._Code,'') as 'Tariff_Code'
,ISNULL(T6._Description,'') as 'Tariff_Description'
,ISNULL(T6._Fld32593,'') as 'Tariff_Full_Description'
,ISNULL(T2._Fld35042,'') as 'Trademark'
,ISNULL(T2._Fld35043,'') as 'Packing'
,ISNULL(T2._Fld35044,'') as 'Packing_EP'
,ISNULL(T2._Fld35045,'') as 'Remark'
,ISNULL(T2._Fld35046,'') as 'Purpose'
,ISNULL(T2._Fld35047,'') as 'Purpose_2'
,ISNULL(T2._Fld35048,'') as 'Declaration_or_Certificate'
,ISNULL(T2._Fld35049RRef,0x00000000000000000000000000000000) as 'Declaration_ref'
,ISNULL(T7._Code,'') as 'Declaration_code'
,ISNULL(T2._Fld35157RRef,0x00000000000000000000000000000000) as 'Tariff_LT_ref'
,ISNULL(T8._Code,'') as 'Tariff_LT_Code'
,ISNULL(T8._Description,'') as 'Tariff_LT_Description'
,ISNULL(T8._Fld32593,'') as 'Tariff_LT_Full_Description'
,ISNULL(CAST(T1._Fld23987 AS NUMERIC(15, 5)),0.0) as 'Netto'
,ISNULL(T2._Fld35325,'2001-01-01 00:00:00') as 'Synchronization_Date_Time'

 FROM [1C_VRUS_PRODUCTION].[dbo].[_Reference151] T1 WITH(NOLOCK)
   INNER JOIN [1C_VRUS_PRODUCTION].[dbo].[_InfoRg35040] T2 WITH(NOLOCK)         
      ON (T1._IDRRef = T2._Fld35041RRef)
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference122] T3 WITH(NOLOCK)        
      ON T1._Fld2522RRef = T3._IDRRef 
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference122] T4 WITH(NOLOCK)
      ON T1._Fld26356RRef = T4._IDRRef  
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference111] T5 WITH(NOLOCK)     
      ON T1._Fld2526RRef = T5._IDRRef
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference32592] T6 WITH(NOLOCK)          
      ON T1._Fld32598RRef = T6._IDRRef
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference154] T7 WITH(NOLOCK)
      ON T2._Fld35049RRef = T7._IDRRef
   LEFT OUTER JOIN [1C_VRUS_PRODUCTION].[dbo].[_Reference32592] T8 WITH(NOLOCK)          
      ON T2._Fld35157RRef = T8._IDRRef

Из плюсов можно отметить разве что возможность передать эти задачи IT-специалистам из областей, отличных от 1С и в частности – занимающимся поддержкой целевой базы. Правда тут тоже есть свои ньюансы, т.к. радиус кривизны рук сильно варьируется не только среди 1С-ников, и на сервере с СУБД могут «завестись» интересные задания, гоняющие одни и те же данные через десяток таблиц и пытающиеся обработать миллионы строк из какого-нибудь регистра с себестоимостью в нашей 1С, а разобраться в них, не принимая участия в непосредственном создании окажется крайне затруднительно. Но не забывайте, что когда-нибудь могут попросить помочь с этим разобраться и Вас.

Способ 2. Удобный (хотя и не столь очевидный)

Мысль эта посещает не сразу, а когда посещает часто бывает уже поздновато, но все-таки: Если со стороны внешней базы не получается прочесть данные с нормальными именами полей, то почему бы не заставить 1С работать на запись? Реализация этого мероприятия несколько сложнее, чем чтения из внешней базы, тем не менее ничего сверхъестественного из себя не представляет. Прежде всего потребуется еще одна функция, которая будет выполнять SQL запросы, не предполагающие возврат какого-либо результата.

Процедура ВыполнитьЗапросSQL(ТекстЗапроса, con)  Экспорт

	cmd	= Новый COMОбъект("ADODB.Command");
	cmd.CommandTimeout = 0;
	cmd.ActiveConnection = con;	
	cmd.CommandText	= ТекстЗапроса;
	rs = cmd.Execute();
	
КонецПроцедуры

Далее обратим внимание на структуру данных, таблиц, в которые будем писать. Помимо целевых полей, нам потребуется ключ, позволяющий однозначно идентифицировать принадлежность строк данных во внешней базе объектам 1С. Иначе говоря, смотрим как 1С хранит ссылки объектов и добавляем во всякой таблице с выгружаемыми нами данными поля с аналогичным типом данных и размерностью, т.е. binary(16)

Определяемся предполагает ли наша разработка соответствие одному объекту базы 1С одной записи внешней таблицы (как пример – отражение записи справочника), или же записей может быть несколько (отражение или имитация движений документов или табличных частей объектов). Для второго случая добавляем поле с номерами строк.

Не обязательно, но полезно при разборе полетов – Дата и время фактической записи во внешнюю таблицу.

    


Осталось самое главное – обеспечить запись данных в SQL. Как именно это будет выполняться – в подписке при непосредственном изменении (записи) объекта в 1C, регламентным заданием по расписанию, или по требованию пользователя зависит только от контекста задачи и личных вкусов разработчика. Нам же важен сам механизм. В зависимости от наличия одной строки (идентифицируется Ссылкой однозначно) или группы строк (т.е. строка идентифицируется по Ссылке и автономеру строки) запись будет слегка отличаться.

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

Процедура ОтразитьСтрокуДанных(Строка, Данные, ТекстЗапросаУдаление, ТекстЗапросаЗапись,
			БлокЗначений, БлокУдаление, ДопПараметры, Соединение, ЭтоНаборЗаписей, НомСтр = 0)
	
	ЗначенияДляСтроки = "";	
	ЗнУдаление = "";
	Для Каждого Кл Из Данные.Колонки Цикл
		Значение = Строка[Кл.Имя];
		СтрЗначение = СтроковоеЗначениеПоля(Значение);
		
		Если (НЕ ЭтоНаборЗаписей) И (Кл.Имя = ДопПараметры.ИмяПоляИдентификатора) Тогда
			Если БлокУдаление = "" Тогда
				БлокУдаление = СтрЗначение;
			Иначе	
				БлокУдаление = БлокУдаление + Символы.ПС + ", " + СтрЗначение;
			КонецЕсли;	
		КонецЕсли;	
		
		Если ЗначенияДляСтроки = "" Тогда
			ЗначенияДляСтроки = СтрЗначение;
		Иначе
			ЗначенияДляСтроки = ЗначенияДляСтроки + Символы.ПС + ", " + СтрЗначение;
		КонецЕсли;			
	КонецЦикла;	
	
	Если ДопПараметры.Свойство("ИмяПоляНумератора") Тогда
		ЗначенияДляСтроки = ЗначенияДляСтроки + Символы.ПС + ", " + СтроковоеЗначениеПоля(НомСтр);		
	КонецЕсли;
	
	РезДлина = СтрДлина(ТекстЗапросаЗапись) + СтрДлина(БлокЗначений) + СтрДлина(ЗначенияДляСтроки);
	
	Если РезДлина > ДопПараметры.МаксимальнаяДлинаСтроки Тогда
		
		Если ЗначениеЗаполнено(БлокУдаление) Тогда
			ТекстЗапросаУдаление = СтрЗаменить(ТекстЗапросаУдаление, "%Идентификаторы%", БлокУдаление); 
			ВыполнитьЗапросSQL(ТекстЗапросаУдаление	,  Соединение);
			ТекстЗапросаУдаление = ШаблонЗапросаНаУдаление(ДопПараметры.ИмяТаблицы, ДопПараметры.ИмяПоляИдентификатора);
			БлокУдаление = "";
		КонецЕсли;	
		
		Если ЗначениеЗаполнено(БлокЗначений) Тогда
			ТекстЗапросаЗапись = СтрЗаменить(ТекстЗапросаЗапись, "%Значения%", БлокЗначений);	
			ВыполнитьЗапросSQL(ТекстЗапросаЗапись	,  Соединение);
			ТекстЗапросаЗапись = ШаблонЗапросаНаЗапись(ДопПараметры.ИмяТаблицы, ДопПараметры.ОписаниеКолонок);
			БлокЗначений = "";
		КонецЕсли;			
	КонецЕсли;
	
	Если БлокЗначений = "" Тогда
		БлокЗначений = "(" + ЗначенияДляСтроки + ")";
	Иначе	
		БлокЗначений = БлокЗначений  + Символы.ПС + ", (" +	ЗначенияДляСтроки + ")";	
	КонецЕсли;	
	
КонецПроцедуры	

Процедура ОтразитьНаборЗаписей_SQL(Данные, ИмяТаблицы, ИмяПоляИдентификатора, ИмяПоляНумератора) Экспорт
	
	Если Данные.Колонки.Найти(ИмяПоляИдентификатора) = Неопределено Тогда
		Возврат;		
	КонецЕсли;	
	
	ОписаниеКолонок = ОписаниеКолонок(Данные, ИмяПоляНумератора);
	
	ТекстЗапросаУдаление 	= ШаблонЗапросаНаУдаление(ИмяТаблицы, ИмяПоляИдентификатора);
	ТекстЗапросаЗапись		= ШаблонЗапросаНаЗапись(ИмяТаблицы, ОписаниеКолонок);
	БлокЗначений = "";
	БлокУдаление = "";
		
	ДопПараметры = Новый Структура;
	
	ДопПараметры.Вставить("МаксимальнаяДлинаСтроки", 200000);   //Строка неограниченной длины не совсем неограниченная //6054606
	ДопПараметры.Вставить("ОписаниеКолонок", ОписаниеКолонок);
	ДопПараметры.Вставить("ИмяТаблицы"		,  ИмяТаблицы);
	ДопПараметры.Вставить("ИмяПоляИдентификатора", ИмяПоляИдентификатора);
	Если ЗначениеЗаполнено(ИмяПоляНумератора) Тогда
		ДопПараметры.Вставить("ИмяПоляНумератора", ИмяПоляНумератора);
	КонецЕсли;
	
	Соединение =  СоединитьСерверSQL();	

	Попытка	
		Если ТипЗнч(Данные) = Тип("РезультатЗапроса") Тогда
			ВыборкаРегистратор = Данные.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
			
			Пока ВыборкаРегистратор.Следующий() Цикл
				
				ЗначениеКлюча = ВыборкаРегистратор[ИмяПоляИдентификатора];
				СтрЗначение = СтроковоеЗначениеПоля(ЗначениеКлюча);
				
				Если БлокУдаление = "" Тогда
					БлокУдаление = СтрЗначение;
				Иначе	
					БлокУдаление = БлокУдаление + Символы.ПС + ", " + СтрЗначение;
				КонецЕсли;	
		
				Выборка =  ВыборкаРегистратор.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
				
				НомСтр = 0;
				Пока Выборка.Следующий() Цикл
					НомСтр = НомСтр + 1;
					ОтразитьСтрокуДанных(Выборка, Данные, ТекстЗапросаУдаление, ТекстЗапросаЗапись,
						БлокЗначений, БлокУдаление, ДопПараметры, Соединение, Истина, НомСтр);
				КонецЦикла;	
			КонецЦикла;	
			
		ИначеЕсли	ТипЗнч(Данные) = Тип("ТаблицаЗначений") Тогда
			
			Т_ИД = Данные.Скопировать(,ИмяПоляИдентификатора);
			Т_ИД.Свернуть(ИмяПоляИдентификатора);
			
			Для Каждого СтрИД Из Т_ИД Цикл
				
				ЗначениеКлюча = СтрИД[ИмяПоляИдентификатора];
				СтрЗначение = СтроковоеЗначениеПоля(ЗначениеКлюча);
				
				Если БлокУдаление = "" Тогда
					БлокУдаление = СтрЗначение;
				Иначе	
					БлокУдаление = БлокУдаление + Символы.ПС + ", " + СтрЗначение;
				КонецЕсли;	

				ПараметрыОтбораСтрок = Новый Структура(ИмяПоляИдентификатора, СтрИД[ИмяПоляИдентификатора]);		
				СтрокиПоИД = Данные.НайтиСтроки(ПараметрыОтбораСтрок);		
				НомСтр = 0;
				Для Каждого Стр Из СтрокиПоИД Цикл
					НомСтр = НомСтр + 1;

					ОтразитьСтрокуДанных(Стр, Данные, ТекстЗапросаУдаление, ТекстЗапросаЗапись,
						БлокЗначений, БлокУдаление, ДопПараметры, Соединение, Истина, НомСтр);
				КонецЦикла;	
		    КонецЦикла;
		КонецЕсли;	
		
		Если ЗначениеЗаполнено(БлокУдаление) Тогда
			ТекстЗапросаУдаление = СтрЗаменить(ТекстЗапросаУдаление, "%Идентификаторы%", БлокУдаление); 
			ВыполнитьЗапросSQL(ТекстЗапросаУдаление	,  Соединение);
		КонецЕсли;	
			
		Если ЗначениеЗаполнено(БлокЗначений) Тогда	
			ТекстЗапросаЗапись = СтрЗаменить(ТекстЗапросаЗапись, "%Значения%", БлокЗначений);			
			ВыполнитьЗапросSQL(ТекстЗапросаЗапись,  Соединение);
		КонецЕсли;	
	Исключение 
	КонецПопытки;
	
	Соединение.Close();
	
КонецПроцедуры	

Функция ОписаниеКолонок(Данные, ИмяПоляНумератора = "")
	
	ОписаниеКолонок = "";
	
	Для Каждого Кл Из Данные.Колонки Цикл
		Если ОписаниеКолонок = "" Тогда
			ОписаниеКолонок = Кл.Имя;
		Иначе
			ОписаниеКолонок = ОписаниеКолонок + Символы.ПС + ", " + Кл.Имя;
		КонецЕсли;	
	КонецЦикла;	

	Если ЗначениеЗаполнено(ИмяПоляНумератора) Тогда
		ОписаниеКолонок = ОписаниеКолонок + Символы.ПС + ", " + ИмяПоляНумератора;	
	КонецЕсли;	
	
	Возврат ОписаниеКолонок;
	
КонецФункции	

Функция СтроковоеЗначениеПоля(Значение)
	
	Если ТипЗнч(Значение) = Тип("Строка") Тогда
		Значение = СтрЗаменить(Значение, "'", "''");
		Значение = СокрЛП(Значение);
		СтрЗначение = "'" + Значение + "'";	
	ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда
		СтрЗначение = "'" + Формат(Значение, "Л=ru_RU; ДФ='yyyy-MM-dd HH:mm:ss'")  + "'";	
	ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
		СтрЗначение = Формат(Значение, "ЧРД=.; ЧН=0; ЧГ=");
	ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда	
		СтрЗначение = Формат(Значение, "БЛ=0x00; БИ=0x01");	
	ИначеЕсли ТипЗнч(Значение) = Тип("Null") Тогда
		СтрЗначение = "NULL";
	Иначе
		СтрЗначение = ПредставлениеСсылкиСУБД(Значение);	
	КонецЕсли;	

	Возврат СтрЗначение;
	
КонецФункции	

Функция ШаблонЗапросаНаУдаление(ИмяТаблицы, ИмяПоляИдентификатора)

	ТекстЗапроса = 
	"DELETE FROM %ИмяТаблицы% 
	|WHERE %ПолеИдентификатора% in (%Идентификаторы%)"
	;	
		
	ТекстЗапроса 	= СтрЗаменить(ТекстЗапроса,"%ИмяТаблицы%", ИмяТаблицы);
	ТекстЗапроса 	= СтрЗаменить(ТекстЗапроса,"%ПолеИдентификатора%", ИмяПоляИдентификатора);

	
	Возврат ТекстЗапроса;

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

Функция ШаблонЗапросаНаЗапись(ИмяТаблицы, ОписаниеКолонок)
	
	ТекстЗапроса =
	"INSERT INTO %ИмяТаблицы% 
	|
	|(%ПоляТаблицы%
	|)
	|VALUES
	|	%Значения%
	|"	
	;
	
	ТекстЗапроса 		= СтрЗаменить(ТекстЗапроса,"%ИмяТаблицы%", ИмяТаблицы);
	ТекстЗапроса 		= СтрЗаменить(ТекстЗапроса, "%ПоляТаблицы%", ОписаниеКолонок);
	
	Возврат ТекстЗапроса;
	
КонецФункции	

Функция ПредставлениеСсылкиСУБД(Значение) Экспорт
	
	Если Не ЗначениеЗаполнено(Значение) Тогда
		Возврат  "0x00000000000000000000000000000000";
	КонецЕсли;	
	
	СтрокаИД = ЗначениеВСтрокуВнутр(Значение);
	
	СтрокаИДПоКомпонентам 	= СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаИД, ":");
	ПредставлениеСсылки0 	= СтрокаИДПоКомпонентам[1];	
	Блок0 = Сред(ПредставлениеСсылки0,1,32);
	ПредставлениеИсх0		="0x"+Врег(Блок0);
	Возврат ПредставлениеИсх0;
	
КонецФункции


      Принцип работы таков:

  1. Обеспечиваем выборку и при необходимости программную обработку данных. Функциям в качестве основного аргумента подходит как результат запроса, так и таблица значений.
  2. Собираем параллельно два запроса в формате SQL, первый удаляет из внешней таблицы записи по значению ключевого поля, второй добавляет свежие. Не забываем, что длина неограниченной строки в реальной жизни ограничена и составляет в районе 200 000+ символов, после которых растет только значение, определяемое через СтрДлина(), но не сама строка. Данный факт сам собой задает нам размер объема данных, которые могут быть обработаны за одно обращение к SQL. После превышения предельной длины строки немедленно выполняем запросы и приступаем к формированию новых. Тем самым, обработка данных ведется блоками. Даже если бы нам очень не хотелось морочиться с её обеспечением, это пришлось бы сделать применительно к большинству практических задач.
  3. По завершении обхода еще раз выполняем запрос и записывает тем самым последнюю порцию данных.


Примеры обращения:

Процедура ЭкспортНоменклатуры()
	
	ЗапросНоменклатура = Новый Запрос;
	
	ЗапросНоменклатура.Текст = 

	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НоменклатураСпр.Ссылка КАК _GoodsID,
	|	НоменклатураСпр.Наименование КАК _NAME,
	|	НоменклатураСпр.Артикул КАК _ART_NO,
	|	""n/a"" КАК _1C_ParentGroupID,
	|	""n/a"" КАК _1C_GroupID,
	|	""n/a"" КАК _1C_GroupName,
	|	ВЫБОР
	|		КОГДА ПОДСТРОКА(ЕСТЬNULL(ЦехСв.Значение.Наименование, """"), 1, 3) = ""801""
	|			ТОГДА ""CRAB""
	|		ИНАЧЕ ""FISH""
	|	КОНЕЦ КАК _WORKSHOP,
	|	НоменклатураСпр.Код КАК _CODE,
	|	ПОДСТРОКА(НоменклатураСпр.НаименованиеПолное, 1, 150) КАК _PRINTNAME,
	|	НоменклатураСпр.inf_ВесНеттоКг * 1000 КАК _PACKAGE_WEIGHT,
	|	ПРЕДСТАВЛЕНИЕ(НоменклатураСпр.inf_ВесНеттоКг * 1000) КАК _PACKAGE_WEIGHT_NVARCHAR,
	|	НоменклатураСпр.ЕдиницаХраненияОстатков.inf_СодержитШтук КАК _PACKAGES_PER_BOX,
	|	НоменклатураСпр.inf_КоробокНаПоддоне КАК _BOXES_PER_PALETTE,
	|	БрендСв.Значение КАК _BRAND_ID,
	|	ЕСТЬNULL(БрендСв.Значение.Наименование, """") КАК _BRAND_NAME,
	|	ВЫБОР
	|		КОГДА НоменклатураСпр.inf_ВсегоВесУпаковки = 0
	|			ТОГДА 1
	|		ИНАЧЕ НоменклатураСпр.inf_ВсегоВесУпаковки
	|	КОНЕЦ КАК _BRUTO_COEFF,
	|	НоменклатураСпр.ВидНоменклатуры КАК _TYPE_ID,
	|	НоменклатураСпр.ВидНоменклатуры.Наименование КАК _TYPE_NAME,
	|	ВЫБОР
	|		КОГДА НоменклатураСпр.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
	|			ТОГДА 10
	|		КОГДА НоменклатураСпр.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
	|			ТОГДА 18
	|		КОГДА НоменклатураСпр.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
	|			ТОГДА 20
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК _VAT,
	|	ЕСТЬNULL(inf_ДопКлассификаторыНоменклатуры.ТермическоеСостояние.Наименование, """") КАК _KEEPING_CONDITIONS,
	|	ЕСТЬNULL(inf_РазмерыОбъектов.ТипоразмерУпаковки.КоличествоВ_РядуЕвропаллета, 1) КАК _BOXES_IN_ROW,
	|	ЕСТЬNULL(НоменклатураСпр.КодТНВЭД.Код,"""") КАК _CUSTOMS_CODE,
	|	НоменклатураСпр.inf_ВесНеттоКоробка * 1000 КАК _BOX_WEIGHT_NETTO,
	|	ИСТИНА КАК _ForUseOMS,
	|	&ТекДата КАК _RecordDateTime
	|ИЗ
	|	Справочник.Номенклатура КАК НоменклатураСпр
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЦехСв
	|		ПО НоменклатураСпр.Ссылка = ЦехСв.Объект
	|			И (&СвойствоЦех = ЦехСв.Свойство)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК БрендСв
	|		ПО НоменклатураСпр.Ссылка = БрендСв.Объект
	|			И (&СвойствоБренд = БрендСв.Свойство)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.inf_ДопКлассификаторыНоменклатуры КАК inf_ДопКлассификаторыНоменклатуры
	|		ПО (inf_ДопКлассификаторыНоменклатуры.Номенклатура = НоменклатураСпр.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.inf_РазмерыОбъектов КАК inf_РазмерыОбъектов
	|		ПО (inf_РазмерыОбъектов.Объект = НоменклатураСпр.Ссылка)
	|ГДЕ
	|	НоменклатураСпр.Ссылка В ИЕРАРХИИ(&Ссылки)
	|	И НоменклатураСпр.Наименование <> """"
	|	И НЕ НоменклатураСпр.ПометкаУдаления
	|	И НЕ НоменклатураСпр.inf_НеИспользовать
	|	И НЕ НоменклатураСпр.ЭтоГруппа"
	;
	
	ЗапросНоменклатура.УстановитьПараметр("Ссылки", Номенклатура);
	
	ЗапросНоменклатура.УстановитьПараметр("СвойствоЦех"		, inf_ПовтИспСеанс.СсылкаСвойстваОбъекта("Цех"));
	ЗапросНоменклатура.УстановитьПараметр("СвойствоБренд"	, inf_ПовтИспСеанс.СсылкаСвойстваОбъекта("Торговая марка"));
	ЗапросНоменклатура.УстановитьПараметр("ТекДата"			, ТекущаяДата());
	
	Результат = ЗапросНоменклатура.Выполнить();

	//inf_ИнтеграцияССерверомSQL.ОтразитьЕдиничныеОбъекты_SQL(Результат, "[VRUS_DW].[dbo].[GoodsExport_1C]", "_GoodsID"); 
	
	//Возврат;
	
	ТЗ = Результат.Выгрузить();
	
	Для Каждого Стр Из ТЗ Цикл
		Стр._PACKAGE_WEIGHT_NVARCHAR = Формат(Стр._PACKAGE_WEIGHT * 1000,"ЧРД=.; ЧН=0; ЧГ=") + " гр";
	КонецЦикла;	
	
	inf_ИнтеграцияССерверомSQL.ОтразитьЕдиничныеОбъекты_SQL(ТЗ, "[VRUS_DW].[dbo].[GoodsExport_1C]", "_GoodsID"); 
	
КонецПроцедуры

Процедура ОтражениеПродаж()
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	
	"ВЫБРАТЬ
	|	Продажи.Период КАК _Period,
	|	Продажи.Регистратор КАК _Recorder,
	|	Продажи.Номенклатура КАК _GoodsID,
	|	Продажи.Номенклатура.Наименование КАК _GoodsName,
	|	Продажи.Номенклатура.Артикул КАК _ART_NO,
	|	Продажи.Контрагент КАК _buyerID,
	|	Продажи.Контрагент.Наименование КАК _buyerName,
	|	Продажи.Количество КАК _quantity,
	|	Продажи.Стоимость КАК _cost,
	|	Продажи.НДС КАК _VAT,
	|	Продажи.Регистратор.Номер КАК _RecorderNumber,
	|	&ТекДата КАК _RecordDateTime
	|ИЗ
	|	РегистрНакопления.Продажи КАК Продажи
	|ГДЕ
	|	Продажи.Период МЕЖДУ &НачДата И &КонДата
	|
	|УПОРЯДОЧИТЬ ПО
	|	_Period,
	|	_Recorder,
	|	Продажи.НомерСтроки
	|"
	;
	Запрос.УстановитьПараметр("НачДата", Период.ДатаНачала);
	Запрос.УстановитьПараметр("КонДата", Период.ДатаОкончания);
	Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
	
	Результат = Запрос.Выполнить();
	
	ТЗ = Результат.Выгрузить();
	inf_ИнтеграцияССерверомSQL.ОтразитьНаборЗаписей_SQL(ТЗ, "[VRUS_DW].[dbo].[SalesExport_1C]", "_Recorder", "_LineNo");
	
КонецПроцедуры

И, наконец проверяем результат:

 

С некоторых пор при экспорте данных из 1С на уровне SQL стараюсь работать только на запись. Проблем с быстродействием замечено не было. Затраты времени – минимальны, фактически процесс разработки сводится к написанию запроса. Думается, что и для поклонников каноничного объекта «Внешние источники данных» аналогичный инструмент может быть легко реализован, хотя и без гарантий отсутствия некоторых проблем с совместимостью и преобразованиями типов. Среди основных достоинств замечены:

  1. Высокая оперативность при отражении данных (отражение может быть произведено непосредственно после записи объекта в 1С)
  2. Возможность использовать прием с имитацией движений документов во внешнюю базу. Пользователь что-то проводит, за ненадобностью внутрь 1С в еще один регистр не пишем, а сразу отправляем данные туда, где они требуются.
  3. Часто нет необходимости изобретать промежуточные форматы файлов/сообщений.
  4. В штатном режиме работы нет тяжелых операций по полному замещению объемной внешней таблицы её актуальной версией.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1193 06.07.20 12:15 Сейчас в теме
Возможность использовать прием с имитацией движений документов во внешнюю базу. Пользователь что-то проводит, за ненадобностью внутрь 1С в еще один регистр не пишем, а сразу отправляем данные туда, где они требуются.

Т.е. предлагаете внутри транзакции проведения документа обращаться к внешней БД, верно?
ИМХО решение так себе во многих случаях - быстродействие, блокировки и т.п.

ну и прямая работа с СУБД должна быть последним средством. До обращения к нему лучше рассмотреть\проверить другие, более штатные возможности интеграции - сервисы от самого приложения, которое связано с СУБД.
2. Infector 165 06.07.20 12:42 Сейчас в теме
(1)Далеко не всегда по ту сторону приложение от брендового разработчика с набором сервисов на все случаи жизни. Это может быть и база с оболочкой, написанная иностранцами-коллегами на коленке в достаточно старые годы и заточенная под одну-две укоспецифические задачи.

Ну и есть такой случай, когда на СУБД лежит таблица-прокладка. Мы пишем, они читают. По крайней мере удобнее, чем файл в виде такой прокладки.
3. alex_bob 222 06.07.20 13:47 Сейчас в теме
Когда-то давно использовал похожее решение (на запись), но потом отказался. Напишу на всякий случай о минусах:
1. Относительная сложность тестирования и отладки. Понятно, что это не так часто требуется.
2. Необходимо следить за наличием нужных драйверов у пользователей. Бывает, отваливается после обновления винды.
3. В какой-то момент я сам мигрировал на Linux и соответственно решения на Com-объектах стали неактуальны.
4. Самое главное, из-за чего отказался от прямой записи - необходимость костылей для проверки окружения - боевая база или копия, чтобы случайно не назаписывать лишнего в стороннюю базу.
4. Infector 165 06.07.20 14:07 Сейчас в теме
(3)по п.2. - в нынешних реалиях решается работой на стороне сервера. 99%, что обращение к СУБД пойдет оттуда, следовательно драйверов на сервере достаточно
п. 4 - именно так, такой костыль/заглушка необходим. Решается по большому счету одной функцией.

Функция ПроверитьИмяБазы() Экспорт
	
	СтрокаПодключения = СтрокаСоединенияИнформационнойБазы();
	ИмяБазы = "";
	
	ПараметрыСписком = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаПодключения, ";");
	//вичи_ОбщиеФункции.ПолучитьКлючиСписком(СтрокаПодключения, ";");
	
	Для Каждого Параметр Из ПараметрыСписком Цикл
		Если Найти(Параметр,"Ref=")>0 Тогда
			ИмяБазы = СтрЗаменить(Параметр, "Ref=", "");
			Прервать;
		ИначеЕсли Найти(Параметр,"File=")>0 Тогда	
			ИмяБазы = СтрЗаменить(Параметр, "File=", "");
			Прервать;
		КонецЕсли;	
	КонецЦикла;	

	ИмяБазыНастройка = ИмяОсновнойБазы();
	
	Если ВРег(СокрЛП(ИмяБазы)) = ВРег(СокрЛП(ИмяБазыНастройка)) Тогда
		Возврат Истина;
	Иначе	
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции
Показать

п.1,3 - так оно и есть, добавить нечего
Оставьте свое сообщение

См. также

Обмен данными. Консистентность vs Многопоточность Промо

Интеграция v8 1cv8.cf Бесплатно (free)

Рассмотрим теоретические основы обмена данными. Какие бывают обмены, какие гарантии при этом даются, зачем идти на компромиссы и что при этом может пойти не так. Есть ли идеальная схема?

03.09.2019    12142    m-rv    1    

Интеграция с Трелло. Готовый код

Обмен данными 1С Интеграция Agile (XP, SCRUM, Канбан) v8 Бесплатно (free)

Код основных действий, интеграция с API Трелло.

19.08.2020    2043    Yashazz    14    

Загрузка данных из Algoritm-S в конфигурацию "Бухгалтерия предприятия 3.0 (3.0.79.21) "

Розничная торговля Внешние источники данных v8 БП3.0 Розничная и сетевая торговля (FMCG) Фармацевтика, аптеки Россия Бесплатно (free)

В статье представлен шаблон обработки для загрузки некоторых данных из программы Algoritm-S в конфигурацию "Бухгалтерия предприятия 3.0 (3.0.79.21)

04.08.2020    1160    RPGrigorev    0    

Мониторинг факта выполнения обмена с помощью сервиса healthchecks.io

Интеграция Системное администрирование v8 1cv8.cf Россия Бесплатно (free)

В статье опишу вариант простого мониторинга обработчиков, запускаемых по расписанию.

30.06.2020    1624    malikov_pro    5    

Кэширование COM-соединения. Три способа Промо

Практика программирования Перенос данных из 1С7.7 в 1C8.X Внешние источники данных WEB v8 Россия Бесплатно (free)

Статья о трех способах кэширования COM-соединения в 1С:Предприятии 8.x.

11.04.2013    41219    YPermitin    41    

Структура обработки загрузки цен и остатков поставщика с примерами и комментариями

Внешние источники данных WEB v8 1cv8.cf Россия Бесплатно (free)

В статье опишу структуру обработки по загрузке цен и остатков от поставщика с примерами.

27.06.2020    1540    malikov_pro    0    

Как мы запилили в АЙТАТ.РФ обработку-бота, чтобы ускорить отгрузку в 2 раза или Реальный опыт внедрения нового механизма "Трансляция событий" от 1С-Коннект

Интеграция v8 Бесплатно (free)

Статья о внедрении и использовании в решениях задач нового механизма от 1С-Коннект. Будет полезно тем кто использует интеграцию 1С-Коннект с 1С Предприятие. На текущий момент механизм "Трансляция событий" находится в бета-тестировании и доступен только закрытому списку приглашенных участников. Выражаем благодарность разработчикам механизма "Трансляция событий".

24.06.2020    1453    direwest    4    

Маркировка лекарственных препаратов. Часть первая "Быстрая интеграция"

Интеграция v8 1cv8.cf Фармацевтика, аптеки Россия УУ Бесплатно (free)

Данный цикл будет посвящен маркировке лекарственных препаратов (далее ЛП), нюансам работы с "1С: Библиотека интеграции с МДЛП", доступной для скачивания на сайте ИТС, методиками работы с регистраторами выбытия, и проблемам, с которыми пришлось столкнуться при интеграции. Эта статья будет представлять из себя краткую инструкцию, что делать, когда маркировка уже близко и необходимо быстро внедрить ее. Надеюсь, она станет подспорьем в данной задаче. Будут приведены рекомендации, как в короткие сроки с минимально необходимой функциональностью и минимумом чтения документации произвести интеграцию библиотеки МДЛП и выполнить начальные настройки. Также будут даны рекомендации по быстрым, но важным, на мой взгляд, доработкам.

23.06.2020    2709    IssakN    22    

Перенос данных из учетных программ Парус в конфигурации 1С Промо

Внешние источники данных v7.7 v8 БП2.0 ЗУП2.5 ЗКБУ БГУ 1С7:Бух 1С7:ЗиК 1С7:ББУ Россия БУ Госбюджет Бесплатно (free)

Статья посвящена анализу процессов переноса данных из учетных программ Парус в конфигурации 1С.

05.11.2012    51482    sklowsky    16    

Диадок. Подключаемый модуль. Отладка

Интеграция Внешние источники данных v8 1cv8.cf Бесплатно (free)

Небольшой пример, как работать с подключаемым модулем Диадок (для изменения УПД перед выгрузкой на сайт Диадок.). Отладка подключаемого модуля, если не смогли подключить стандартную отладку.

17.06.2020    3508    John_d    1    

1C# – 1С моей мечты

Интеграция v8 Бесплатно (free)

Встроенных в платформу 1С возможностей не всегда хватает для построения сложных интеграционных схем между различными 1С и не-1С-решениями на базе MS SQL Server. Как сделать интеграцию между SQL-базами более гибкой с помощью платформы 1С# на конференции Infostart Event 2019 Inception рассказал Дмитрий Жичкин.

01.06.2020    10726    zhichkin    33    

Обработчик "После завершения транзакции" своими руками

Практика программирования Интеграция v8::blocking Бесплатно (free)

Обработчик "Сразу после завершения транзакции" очень востребован в механизме обмена мгновенными сообщениями, развитием которого фирма 1С заинтересовались настолько, что уже создала "Сервисы интеграции". Но платформа 8.3.17 всё еще не имеет полноценного обработчика "После записи" в подписках на события.

31.05.2020    2678    barelpro    62    

Сканируем без сканера или MXL to JPG Промо

Внешние источники данных Универсальные функции Печатные формы документов v8 1cv8.cf Бесплатно (free)

Хотите конвертировать документы в формат изображения менее чем за минуту, не имея сканера? Тогда эта статья для вас.

24.05.2012    34083    shakmaev    47    

Интеграция Camunda BPM и 1С

WEB Интеграция v8 Бесплатно (free)

Быстрый старт. Только практические примеры. Установка, запуск и публикация бизнес-процесса на сервере Camunda BPM. Управление бизнес-процессами из 1С при помощи Camunda REST API.

12.05.2020    3466    zhichkin    19    

Как мы загружаем данные в "Центр управления кассами Магнита"

Внешние источники данных Интеграция v8 1cv8.cf Бесплатно (free)

Статья о том, как мы делали механизм загрузки больших объемов данных в "Центр управления кассами Магнита"

08.05.2020    4835    chernenko_vv    25    

Интеграция СуперОкна7 и УНФ

Интеграция Внешние источники данных v8 УНФ Россия Бесплатно (free)

Изучаем базу данных СуперОкна7, смотрим возможности передачи и получения информации.

08.05.2020    2101    vostok1.dz    3    

Синхронизация БИТ:СКУД 8 с Parsec.Net 2.5

Интеграция Внешние источники данных v8 1cv8.cf Бесплатно (free)

Настройка синхронизации БИТ:СКУД 8 с Parsec.Net.2.5, выгрузка данных из внешней системы контроля доступа.

04.05.2020    3875    RPGrigorev    0    

Измерительная лаборатория с использованием 1С+Ардуино

Периферийные устройства Интеграция v8 Россия Бесплатно (free)

1С в автоматизации "научных" и около... экспериментов.

02.05.2020    4209    maxlab    15    

Интеграция БИТ:СКУД с типовой конфигурацией

Интеграция v8 1cv8.cf Россия Бесплатно (free)

Интеграция БИТ:СКУД с типовой конфигурацией, обновление БИТ:СКУД в составе конфигурации и отдельно. Обновление системы защиты.

26.04.2020    5000    RPGrigorev    0    

Интеграция 1С и BI-системы: мой опыт с коннектором ATK BIView

Интеграция v8 1cv8.cf Россия Бесплатно (free)

Интеграция 1С и BI-системы: мой опыт с коннектором ATK BIView.

06.04.2020    4063    Flyerink    0    

Как я собрал для себя высокопроизводительный и бесплатный облачный бекенд для 1С на PosgreSQL + PostgREST

Производительность и оптимизация (HighLoad) WEB Интеграция Мобильная разработка Администрирование веб-серверов v8 Бесплатно (free)

В этой статье я расскажу о проблемах бека для мобильных приложений или другого фронта, который требует производительности, быстрой реакции и отказоустойчивости, и как я решил это благодаря opensource проекту PostgREST и СУБД Postgre SQL 12. Проведу простой тест производительности для сравнения 1С с данным решением. Это может быть полезно всем, кто разрабатывает мобильные приложения либо фронтсайд-приложения для 1С на чем угодно - на мобильной платформе или на нативном языке или на Simple UI. И также обзор новых функций SimpleUI для связи с этим бекендом.

31.03.2020    12548    informa1555    31    

Использование таблиц SQL Server в качестве очередей сообщений

Практика программирования Интеграция v8 Бесплатно (free)

Статья о событийно-ориентированной интеграции и об асинхронной обработке данных в контексте 1C под управлением SQL Server. Подробно разбирается вопрос использования таблиц СУБД в качестве очередей сообщений.

23.03.2020    2760    zhichkin    6    

Интеграция "Библиотеки интеграции МДЛП 1.1.2.7" с типовой конфигурацией

Интеграция Конфигурирование 1С v8 Здравоохранение, медицина, стоматология Россия Бесплатно (free)

Инструкция для интеграции “Библиотеки интеграции МДЛП 1.1.2.7” в типовые конфигурации, на примере конфигурации “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”.

02.03.2020    5703    RPGrigorev    3    

Бесшовная интеграция через обмен по правилам - миссия выполнима

Практика программирования Интеграция Перенос данных из 1C8 в 1C8 v8 ДО ERP2 Бесплатно (free)

При организации работы с договорами в ERP 2, с помощью бесшовной интеграции с Документооборотом, «типовой» методикой является создание договоров в ЕРП. После создания договора в ЕРП, пользователь «отправляет» договор в ДО по бесшовной интеграции. На практике, весьма часто пользователи хотят видеть обратную схему: вводить договоры в ДО и при этом получать их в ЕРП без «лишних телодвижений». Или даже вводить их независимо в обеих системах – так, чтобы потом «стыковать» по каким-то определенным правилам.

24.01.2020    4963    e-9    2    

Получение данных из Сигур

Внешние источники данных v8 1cv8.cf Бесплатно (free)

Получение данных из СКУД Сигур (без танцов с бубном)

25.12.2019    4060    skaoxy    5    

Передача данных с сервера на клиент через WebSocket NativeAPI и Centrifugo

Интеграция v8::УФ 1cv8.cf Россия Бесплатно (free)

В статье описываю реализацию обмена для замены передачи сообщений через 1С Сервер взаимодействия.

23.09.2019    7259    malikov_pro    11    

Оповещения боту из 1С за 31 минуту

Практика программирования Интеграция v8::УФ 1cv8.cf Бесплатно (free)

Поделюсь опытом, как быстро сделать бота с оповещениями в Телеграмм из 1С без лишних затрат.

18.09.2019    16966    feva    41    

Выгрузка из 1С номенклатуры со штрихкодами без программирования

Загрузка и выгрузка в Excel Внешние источники данных v8 УТ11 Россия Бесплатно (free)

Я так и не смог найти простой инструкции или обработки, чтобы выгрузить из 1С: Управление торговлей 11 номенклатуру вместе со штрихкодами, поэтому решил написать собственную инструкцию.

28.08.2019    11554    user1114182    4    

Вставка BLOB в таблицы ORACLE средствами 1С 8.х с использованием Microsoft OLEDB Provider

Внешние источники данных v8 1cv8.cf Россия Бесплатно (free)

Столкнулся с необходимостью выгружать картинки из 1С 8 в ORACLE-таблицу.

08.08.2019    4730    nomad_irk    0    

Как организовать консолидацию данных из трех десятков предприятий, не привлекая программистов на местах?

Интеграция v8 1cv8.cf Бесплатно (free)

Какую архитектуру и технологии выбрать для организации обмена между «зоопарком» разных конфигураций и системой, принципиально отличающейся от 1С, как наладить такой обмен без изменения конфигурации и организовать мониторинг из единого центра, расскажет докладчик конференции INFOSTART EVENT 2018 EDUCATION Александр Бобрышов. 

15.07.2019    4523    ShurikDM    4    

Выгрузка данных в таблицу MS SQL SERVER

Внешние источники данных v8 Бесплатно (free)

Процедура по выгрузке данных из 1C (таблица значений) в таблицу MS SQL SERVER через COM.

02.07.2019    8141    EvgenSav    18    

Система питания в офисе: как совместить вендинговые автоматы, 1С, облачную кассу и веб-технологии

Интеграция Розничная торговля Розничная торговля v8 1cv8.cf Розничная и сетевая торговля (FMCG) Россия УУ Бесплатно (free)

В начале 2019 года тенденция развития автоматов питания в России привела к появлению проекта нового формата питания на работе — МикроМаркета “Го!Поедим”. Потребовалось создать новый формат зоны питания сотрудников: интегрировать в офисные кухни полноценные МикроМаркеты с бесконтактной оплатой, кофе-машинами, лаунж-зоной. Если правильно совместить вендинговые автоматы, облачную кассу, 1С и веб-технологии, то в результате будут не только сытые сотрудники, но и корректная работа всей системы офисного питания.

22.06.2019    6478    antonovintervolga    6    

1С и компьютерное зрение: новый подход к контролю за ассортиментом магазина

Розничная торговля Внешние источники данных Розничная торговля v8 1С:Франчайзи, автоматизация бизнеса УУ Бесплатно (free)

Машинное зрение в магазинах и 1С. Как поднять эффективность торгового предприятия (магазин. кафе, шоурум и т.д.) с совершенно неожиданной стороны? Как получить реальные демографические данные покупателей и, самое главное, как это использовать в повседневной работе магазина? Как можно расширить привычные ABC и XYZ анализ, добавив в них пласт данных о трафике и демографии покупателей? Что необходимо для 1С, чтобы использовать данные видеоанализа людского трафика?

20.06.2019    8975    osipov_cvizi    16    

1С + TecDoc + CMS Битрикс. Трудности перевода

Интеграция Оптовая торговля Оптовая торговля v8 1cv8.cf Автомобили, автосервисы Россия УУ Бесплатно (free)

Варианты подключения номенклатурных данных базы TecDoc, если у вас автобизнес.

12.04.2019    6848    n.saltsina    11    

MS Access и 1С. Что, когда и зачем?

Практика программирования Внешние источники данных Разработка v8 Бесплатно (free)

Об использовании MS Access в связке с 1С. Можно ли использовать продукты Office на сервере. Когда Access может быть полезен. Примеры работы и другое.

09.04.2019    28217    YPermitin    46    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Предлагаем ознакомиться с хронологией проекта, проследить ход мыслей от снятия потребностей до реализации, и решить, удалось ли проектной команде найти оптимальное архитектурное решение под конкретный кейс заказчика путем совмещения двух известных, но до сих пор не пересекавшихся технологий, и получилось ли сложить плюсы и устранить минусы каждой из них.

21.03.2019    26184    barelpro    82    

Загрузка ЭЛН (электронных листов нетрудоспособности) из файлов

Внешние источники данных Зарплата Зарплата v8 УПП1 Россия БУ ФОМС, ПФ, ФСС Бесплатно (free)

Что делать, если по каким-то причинам нет возможности разместить 1С и Крипто-Про на одном рабочем месте? Правильно - открывать конфигуратор и пилить. Благо, там не сложно. Непосредственно решение для УПП 1.3. Для ЗиК 2.5 и Комплексной автоматизации должно быть аналогично.

07.02.2019    6697    SatanClaws    4    

Переход на "Зарплату и управление персоналом 3.1"

Интеграция Управление персоналом (HRM) Пользователю системы Бухгалтерский учет Управление персоналом (HRM) v8 v8::СПР ЗУП2.5 ЗУП3.x Россия БУ Бесплатно (free)

Сменила я тут работу и уже после того, как я приступила к исполнению обязанностей, мой новый начальник мне призналась, что выбор пал на меня только из-за того, что я знаю программу. Справедливости ради, эта уверенность была основана только на том, что я прошла тестирование, включающее только основные операции кадрового делопроизводства. Так или иначе, а работодатель попал в точку, нанимая меня в надежде, что я решу проблему: нужно перейти «с 8.2 на 8.3». Ничего сложного, скажет большинство, я тоже так говорю, но ситуация осложнялась некоторым количеством предшественников, которые уже «нафеячили» в программах до меня. Взять и сделать все заново мне не разрешили, так что пришлось исходить из того, что есть, и именно это дало пищу для размышлений и, в конце концов, привело к написанию этих рекомендаций. Если перед Вами стоит задача перехода с ЗУП 2.5 на ЗУП 3.1, я попробую облегчить Вам жизнь этой статьей.

01.02.2019    13272    VKuser24804875    33    

Выбор программы 1С

Пользователю системы Интеграция Управление проектом v8 1cv8.cf Россия Бесплатно (free)

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

16.01.2019    9175    itworks    22    

Работа с кассой Atol через веб-сервер ДТО-10

Внешние источники данных ККМ Фискальный регистратор Кассовые операции Кассовые операции v8 Россия НДС Бесплатно (free)

Поддержка многопользовательской печати на одном устройстве ККТ. Поддержка изменений в законодательстве (Переход на ФФД 1.05 и НДС 20%).

31.12.2018    35865    medangel    43    

RabbitMQ, Python и Windows. Step By Step

Внешние источники данных v8 Бесплатно (free)

Работа с шиной RabbitMQ, используя Python на Windows. Пошаговый быстрый старт.

13.12.2018    9201    w.r.    9    

Проектирование архитектуры и модификация программных продуктов как технология в сложных проектах системной интеграции и автоматизации на базе 1С: СППР

Управление проектом Интеграция СППР v8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

Как сделать проектирование функциональной архитектуры ПО технологией. Цель - устранить ряд типовых проблем на сложных проектах. Как использовать для решения этих задач 1С система проектирования прикладных решений (СППР). Статья полезна для директоров франчайзи, системных интеграторов, руководителей проектов, архитекторов и консультантов.

03.10.2018    16783    roman72    19    

Из 1С в IIKO: Передаем перемещения УТ в приходные накладные

Внешние источники данных Оптовая торговля Оптовая торговля v8 УТ11 Рестораны, кафе и фаст-фуд УУ Бесплатно (free)

Рассмотрение вариантов передачи документа "Перемещение товаров" из Управление торговлей 11 в документ "Приходная накладная" IIKO.

12.09.2018    8600    oyti    7