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

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

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

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 1378 06.07.20 12:15 Сейчас в теме
Возможность использовать прием с имитацией движений документов во внешнюю базу. Пользователь что-то проводит, за ненадобностью внутрь 1С в еще один регистр не пишем, а сразу отправляем данные туда, где они требуются.

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

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

Ну и есть такой случай, когда на СУБД лежит таблица-прокладка. Мы пишем, они читают. По крайней мере удобнее, чем файл в виде такой прокладки.
3. alex_bob 222 06.07.20 13:47 Сейчас в теме
Когда-то давно использовал похожее решение (на запись), но потом отказался. Напишу на всякий случай о минусах:
1. Относительная сложность тестирования и отладки. Понятно, что это не так часто требуется.
2. Необходимо следить за наличием нужных драйверов у пользователей. Бывает, отваливается после обновления винды.
3. В какой-то момент я сам мигрировал на Linux и соответственно решения на Com-объектах стали неактуальны.
4. Самое главное, из-за чего отказался от прямой записи - необходимость костылей для проверки окружения - боевая база или копия, чтобы случайно не назаписывать лишнего в стороннюю базу.
4. Infector 179 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    15122    m-rv    2    

Готовые модули для работы с Telegram

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

Готовые модули для отправки сообщений и файлов с логами в Телеграм.

05.10.2021    1660    M_A_D    3    

Сравнительный анализ вариантов интеграции между системами

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

На Infostart Meetup «Интеграционные решения для 1С» выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами кейсами из собственной практики: какие интеграционные решения остаются актуальными до сих пор, а каких приемов стоит избегать – даже в безвыходных ситуациях.

30.07.2021    1799    SergeyN    1    

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

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

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

11.04.2013    43060    YPermitin    42    

Собираем данные для отчетов из +100 баз

Поиск данных Интеграция Управленческие v8 Бесплатно (free)

Ведущий разработчик ГАОУ ДПО ТемоЦентр Василий Попов на онлайн-митапе Инфостарта «Интеграционные решения в 1С» поделился кейсом о том, как собрать данные для отчетов из +100 баз, какой стек технологий для этого использовать, и к каким проблемам нужно быть готовым.

23.07.2021    1802    pallid    8    

Описание формата 1С JDTO (JSON data transfer object)

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

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

16.07.2021    6147    zhichkin    32    

Пример организации HTTP сервиса на 1С: Документооборот. Источник 1С: ЕРП => Приемник 1С: Документооборот

Интеграция Документооборот и делопроизводство v8 ДО Бесплатно (free)

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

13.05.2021    2555    Flover    0    

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

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

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

05.11.2012    53820    sklowsky    16    

Настраиваем авторизацию пользователей 1С через Okta

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

Чем больше в компании различных конфигураций и сервисов, тем актуальнее становится проблема единой системы авторизации single Sign-On. Его лидером практически безоговорочно считается Okta. Но на просторах интернета очень мало информации про интеграцию 1С с Okta через протокол OpenID Connect. Что ж, настало время восполнить недостающие пробелы и перевернуть эту печальную страницу в вашей истории

30.04.2021    3702    ripreal1    14    

ВИДы на жительство. Использование внешних источников данных в прикладных задачах

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

На Infostart Meetup Novosibirsk выступил ведущий разработчик МКК «Ваш Инвестор» Вадим Фоминых. Он на практических примерах показал коллегам, как его команда использует внешние источники данных в прикладных задачах, призвал не отказываться от этого инструмента и объяснил – почему.

19.04.2021    1930    Shmell    4    

Бухгалтерия 3.0. Ошибка загрузки билетов из Smartway

Внешние источники данных v8::БУ 8.3.14 БП3.0 Россия БУ Бесплатно (free)

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

18.03.2021    515    maria_vl    2    

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

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

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

24.05.2012    34716    shakmaev    47    

Правила обмена больше не нужны

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

Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.

17.03.2021    11852    Nikola23    39    

«БИП: Бизнес-Процессы». Интеграция с Telegram и Конструктор чат-ботов

Управление бизнес-процессами (BPM) Интеграция v8 УУ Бесплатно (free)

В статье приводятся примеры настройки автоматических оповещений в системе «БИП: Бизнес-Процессы» с использованием мессенджера Telegram. Также, приводятся примеры создания и настройки произвольных чат-ботов с использованием Конструктора чат-ботов.

15.02.2021    1153    YuriYuriev    0    

Архитектурное решение интеграции баз 1С с использованием брокера сообщений Rabbit MQ

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

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

12.02.2021    1776    Koder_Line    6    

DaJet Exchange: обмен данными с 1С (часть 1)

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

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

11.01.2021    3993    zhichkin    14    

HTML редактор/editor (Wysiwyg) для WebKit 1С (CMS, B2B), альтернатива TinyMCE и стандартному ФорматированныйДокумент

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

Suneditor - отличная замена HTML редактору TinyMCE (бесплатному), в публикации с открытым кодом подключим его в 1С с WebKit, скачать HTMLeditor обработку можно бесплатно.

28.12.2020    3943    SizovE    25    

Чтение вложенных свойств Структур Структуры, Соответствий, свойства через точку, разбор JSON

Практика программирования WEB Интеграция Универсальные функции v8 Бесплатно (free)

JSON: {user.device.type} - как получить значение {type}? А если вложенность значительно глубже? Как проверить, что оно заполнено или удалить его - всё это в публикации с открытым кодом и даже без рекурсии. Бонусом разбор дерева значений - ДанныеФормыЭлементДерева, СтрокаДереваЗначений.

17.11.2020    2243    SizovE    2    

Сказ о том, как в одной крупной компании документооборот внедряли, или проблемы типовых обменов между КА и ДО

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

Приветствую всех. Сегодня пойдет речь о том, как на одной крупной компании внедряли 1С:Документооборот 2.1 в связке с КА 2.4. Вроде бы системы типовые, мы практически не добавляли ничего в них, но проблем было столько, что я решил изложить их в статье. Может, кому-то пригодится это в дальнейшем, и не придется тратить кучу времени на поиск решений.

10.11.2020    7339    maks_20    27    

Структура обработки загрузки номенклатуры поставщика с примерами и комментариями (часть 2)

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

В статье опишу вариант обработки для загрузки номенклатуры поставщика, блок загрузки номенклатуры и доп. реквизитов.

17.10.2020    1036    malikov_pro    3    

Структура обработки загрузки номенклатуры поставщика с примерами и комментариями (часть 1)

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

В статье опишу вариант обработки для загрузки номенклатуры поставщика, блок загрузки групп и их состыковки.

12.10.2020    1161    malikov_pro    0    

Управление соляриями из 1С через Arduino

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

Мой опыт автоматизации сети соляриев с интеграцией 1С и оборудования соляриев с помощью платформы Arduino.

01.10.2020    3089    impextr    32    

Взаимодействие 1С со сторонними продуктами посредством REST и Golang (middleware). Часть 3 - ElasticSearch

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

Как в статье №1 этого цикла выгрузим через прослойку журнал регистрации (xml формат) в ElasticSearch. Статья будет иметь практическую направленность в минималистичном стиле

14.09.2020    2216    dmitry-irk38    4    

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

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

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

19.08.2020    4553    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    1815    RPGrigorev    0    

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

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

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

30.06.2020    2609    malikov_pro    7    

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

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

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

27.06.2020    2297    malikov_pro    0    

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

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

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

24.06.2020    2285    direwest    4    

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

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

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

23.06.2020    9968    IssakN    38    

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

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

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

17.06.2020    13489    John_d    17    

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

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

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

01.06.2020    13153    zhichkin    36    

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

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

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

31.05.2020    3938    barelpro    63    

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

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

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

12.05.2020    6491    zhichkin    31    

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

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

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

08.05.2020    5835    chernenko_vv    26    

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

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

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

08.05.2020    3178    vostok1.dz    3    

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

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

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

04.05.2020    4906    RPGrigorev    0    

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

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

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

02.05.2020    5164    maxlab    16    

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

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

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

26.04.2020    6313    RPGrigorev    0    

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

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

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

06.04.2020    6031    Flyerink    2    

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

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

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

31.03.2020    15926    informa1555    35    

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

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

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

23.03.2020    4353    zhichkin    9    

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

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

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

02.03.2020    9190    RPGrigorev    3    

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

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

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

24.01.2020    6982    e-9    8