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

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

Разработка - Системная интеграция - Интеграция

Комплексная автоматизация документооборот внедрение интеграция обмен синхронизация

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

КА -комплексная автоматизация, ДО - документооборот.

Итак, базы развернуты, опубликованы, можем начинать. А начнем с синхронизации...

Этап 1: Синхронизация

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

Неверное имя колонки
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(8431)}:        Коллекция.Колонки.Добавить(ИмяПоля);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(8310)}:    КоллекцияГруппировки = ИнициализацияТаблицыПоКлючевымПолям(МассивКлючевыхПолейПоиска);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(9955)}:                ЗагрузитьТабличнуюЧасть(Объект, Имя, ИнформацияОТипах, ПараметрыОбъекта, Правило);
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(16050)}:            ПоследнийОбъектЗагрузки = ПрочитатьОбъект();
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(2663)}:        ПроизвестиЧтениеДанныхВРежимеВнешнегоСоединения(ЧтениеСообщения);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(5794)}:        ОбработкаОбменаДаннымиВнешнееСоединение.ВыполнитьВыгрузкуДанных(ОбработкаДляЗагрузкиДанных);
{ОбщийМодуль.ОбменДаннымиСервер.Модуль(2936)}:            ВыполнитьДействиеОбменаДляУзлаИнформационнойБазыПоВнешнемуСоединению(Отказ,
{Обработка.ВыполнениеОбменаДанными.МодульМенеджера(34)}:    ОбменДаннымиСервер.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(
{(1)}:Обработки.ВыполнениеОбменаДанными.ВыполнитьЗапускОбменаДанными(Параметры[0],Параметры[1])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4884)}:    Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{ОбщийМодуль.ДлительныеОперации.Модуль(724)}:        ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыПроцедуры);
{ОбщийМодуль.ДлительныеОперации.Модуль(715)}:    ВыполнитьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);

 

Что ж, делать нечего...Идем в отладку. И что мы там наблюдаем? Довольно интересную картину.

По какой-то причине у нас две колонки с одним наименованием.

Идем в правила конвертации и видим, что в тч контактной информации две строки с конвертацией реквизита ДействуетС, удаляем лишнюю строку, заменяем правила - и о чудо, все работает.

Больше с синхронизацией проблем не было (только доработки, связанные со спецификой внедрения). Переходим к  бесшовной интеграции.

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

Этап 2.Интеграция (бесшовка).

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

На стороне КА имеются следующие объекты:

ПланОбмена : ИнтеграцияС1СДокументооборотомПереопределяемый

РегистрСведений: ОчередьСообщенийВ1СДокументооборот

При изменении объекта, участвующего в интеграции, этот объект регистрируется на узле плана обмена. Далее фоновое задание вызывает процедуру модуля, в котором соответственно выполняются последовательно три процедуры:

ИнтеграцияС1СДокументооборотОбмен.ПодготовитьДанныеДляОтправки();

ИнтеграцияС1СДокументооборотОбмен.ОтправитьДанные();

ИнтеграцияС1СДокументооборотОбмен.ПолучитьДанные();

ПодготовитьДанныеДляОтправки();  - формирует пакеты в формате xml и помещает их в регистр сведений ОчередьСообщенийВ1СДокументооборот в виде двоичных данных. При этом пакеты формируются с контролем длины пакета, при превышении длины пакет разбивается на части. В одном пакете может содержаться несколько объектов, а значит если возникнет проблема загрузки хотя бы одного объекта из пакета - пакет не прогрузится. По факту это сделано в угоду производительности, но при этом сказалось на устойчивости системы. (В итоге после согласования с заказчиком была механизм был изменен под логику ОдинОбъект-ОдинПакет см. далее)

ОтправитьДанные() - получает записи регистра, получает из двоичных данных пакет, формирует на основе пакетов запрос, выполняет этот запрос на стороне ДО. В случае успешного выполнения запись в регистре удаляется.

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

Также была переделана - каждый пакет обрабатывается в отдельной попытке.

ПолучитьДанные() - в цикле с уловием, пока есть необработанные пакеты на стороне ДО формируется запрос, который передает на сторону ДО номер последнего успешно обработанного пакета и возвращает в КА новый пакет, после чего данный пакет обрабатывается на стороне ДО. В типовом варианте также при возникновении ошибки загрузка останавливается. (Также была доработана).

На стороне ДО:

План обмена ИнтегрированныеСистемы

регистр сведений ОчередиСообщенийОбменаСИнтегрированнымиСистемами

справочник: СообщенияИнтегрированныхСистем

Фоновое задание формирует пакет xml и в виде двоичных данных записывает его в справочник.

Далее на стороне КА вызывается процедура ПолучитьДанные()

при успешном получении элемент справочника помечается на удаление.

2.1 Выгрузка из ДО в КА (не те правила подставляются)

ИнтеграцияС1СДокументооборотОбмен  ПолучитьДанные();

В этой процедуре для объекта производится поиск подходящего правила. Ниже представлен скриншот функции, получающей правило интеграции для объекта.

Как видно из текста запроса, выбирается первое попавшееся правило, у которого тип исходного и конечного объекта совпадают с условием. В нашем случае для договоров было  3 правила, отличающихся заполнением реквизитов и видом внутреннего документа. В итоге при выгрузке выбиралось некорректное правило и дальше весь обмен стопорился с ошибками (набор заполняемых полей во всех 3 правилах был разным). Указано, что функция эта устарела, но при этом даже в самых последних релизах до сих пор используется.

Заменяем на функцию, указанную в рекомендациях (заодно делаем для себя дополнительную запись в Журнал регистрации.

Теперь правило определяются корректно и большая часть ошибок уже решена. Едем дальше...

2.2 Обмен заявками на расходование ДС по физ лицам

После создания правила для Заявки на расходование ДС - Внутренний документ (Заявка на расходование ДС) с частью заявок появились проблемы. А именно, у заявки вид хоз. операции "Выдача подотчетнику" банковский счет с владельцем физ. лицо. В правиле для банковского счета стоит флаг Обновлять. В ДО у банковского счета во владельцах справочника Физ. лица нет в принципе. При обмене из-за этого возникает ошибка "ОбщийМодуль.ИнтеграцияС1СДокументооборот.Модуль(467) Значение не является значением объектного типа (name)". - по отладке это как раз момент заполнения владельца у банковского счета. Сейчас пока выключили обновление у банковского счета, но это решение временное. параллельно написали в ТП 1с. 

Таких заявок оказалось крайне мало, но по мне, это недоработка документооборота.

 

2.3 Обмен статусами документов

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

Перечь статусов в КА и ДО не соответствует, поэтому их нужно синхронизировать с помощью выражений.

Из КА в ДО:

Если Параметры.Источник.Статус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.НеСогласована Тогда
	Параметры.Результат = "НеСогласован";
ИначеЕсли Параметры.Источник.Статус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована Тогда
	Параметры.Результат = "Согласован";
ИначеЕсли Параметры.Источник.Статус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.КОплате Тогда
	Параметры.Результат = "Согласован";
ИначеЕсли Параметры.Источник.Статус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.Отклонена Тогда
	Параметры.Результат = "НеСогласован";
КонецЕсли;
ЗаписьЖурналаРегистрации("интеграция Отправка",УровеньЖурналаРегистрации.Информация,,Параметры.Результат,,);

Из ДО в КА:

пСтатус = Неопределено;
Если Параметры.Источник.statusApproval.name = "Согласован" Тогда
    пСтатус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.Согласована;
ИначеЕсли Параметры.Источник.statusApproval.name = "Не согласован" Тогда
    пСтатус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.НеСогласована;
ИначеЕсли Параметры.Источник.statusApproval.name = "На согласовании" Тогда
    пСтатус = Перечисления.СтатусыЗаявокНаРасходованиеДенежныхСредств.НеСогласована;
КонецЕсли;
пСтатусДляЖР = "статус " + Параметры.Источник.status.name+"; объект "+Параметры.Источник.title+"; ст согл "+Параметры.Источник.statusApproval.name;
ЗаписьЖурналаРегистрации("интеграция Получение",УровеньЖурналаРегистрации.Информация,,пСтатусДляЖР,,);
Параметры.Результат = пСтатус;

 

Также столкнулись с такой проблемой: в КА заявку перевели в статус "К оплате", через некоторое время из ДО прилетает статус "Согласовано". Пришлось на стороне КА делать проверку, если статус "К оплате", то обмен его уже изменить не может. Такие заявки контролируются ответственным пользователем.

3. Меняем логику работы обмена.

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

-сделать проверку на количество итераций по ошибочным пакетам при загрузке из ДО в КА;

-если ошибочный пакет грузится повторно, присваиваем ему статус обработанного с занесением ошибки в ЖР (в дальнейшем планируется отдельный регистр + рассылка ошибок по ответственным);

-под каждый объект делаем свой пакет, т.е если в очереди будет ошибочный объект, то он не повлияет на остальные пакеты в очереди;

В итоге доработки выглядят так:

 
 на стороне КА ИнтеграцияС1СДокументооборотОбмен

 

&Вместо("ПолучитьДанные")
Процедура is4b_ПолучитьДанные()
	Попытка
		
		Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьПрокси();
		
		ПоддерживаетсяОбновлениеФайлов = 
			ИнтеграцияС1СДокументооборотПовтИсп.ДоступенФункционалВерсииСервиса("2.1.9.1.CORP");
		ОбъектыКОбновлениюПечатныхФорм = Новый ТаблицаЗначений;
		ОбъектыКОбновлениюПечатныхФорм.Колонки.Добавить("Объект");
		ОбъектыКОбновлениюПечатныхФорм.Колонки.Добавить("ОбъектXDTO");
		ОбъектыКОбновлениюПечатныхФорм.Колонки.Добавить("Правило");
		
		УзелДокументооборота = ИнтеграцияС1СДокументооборотПовтИсп.УзелДокументооборота();
		СоставПланаОбмена = Метаданные.ПланыОбмена.ИнтеграцияС1СДокументооборотомПереопределяемый.Состав;
		
		ПрочитаныВсеСообщения = Ложь;
		
		МассивОшибочныхПакетов = Новый Массив;
		СчетчикИтераций = 0;
		Пока Не ПрочитаныВсеСообщения 
			И МассивОшибочныхПакетов.Количество()<10 
			И СчетчикИтераций<50 Цикл
			СчетчикИтераций = СчетчикИтераций+1;
			//Каждое сообщение обрабатываем в отдельной попытке
			Попытка
			
			Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMGetChangesRequest");
			Запрос.lastMessageId = Константы.НомерПоследнегоПринятогоСообщенияДокументооборота.Получить();
			
			Ответ = Прокси.execute(Запрос);
			ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Ответ);
			
			//bmv
			//проверяем, если уже была попытка записи и завершилась с ошибокой
			//то помечаем этот пакет, как обработанный в ДО
			ИндексПакетаВМассиве =МассивОшибочныхПакетов.Найти(Ответ.messageId);
			Если ИндексПакетаВМассиве<>Неопределено Тогда
				МассивОшибочныхПакетов.Удалить(ИндексПакетаВМассиве);
				НомерИсходный = Константы.НомерПоследнегоПринятогоСообщенияДокументооборота.Получить();
				НомерПринятый = Строка(Ответ.messageId);
				Если НомерИсходный <> НомерПринятый Тогда
					Константы.НомерПоследнегоПринятогоСообщенияДокументооборота.Установить(НомерПринятый);
				КонецЕсли;
				Продолжить;
			КонецЕсли;

			//bmv

			Для каждого ОбъектXDTO Из Ответ.objects Цикл
				
								
				
				Если ОбъектXDTO.objectId.type = "DMInternalDocumentTemplate"
					Или ОбъектXDTO.objectId.type = "DMIncomingDocumentTemplate"
					Или ОбъектXDTO.objectId.type = "DMOutgoingDocumentTemplate" Тогда
					
					Справочники.ПравилаИнтеграцииС1СДокументооборотом.ОбновитьПравилаПоШаблону(ОбъектXDTO);
					
					Продолжить;
					
				КонецЕсли;
				
				Ссылки = ИнтеграцияС1СДокументооборот.СсылкиПоВнешнимОбъектам(ОбъектXDTO);
				
				Для Каждого ОбъектСсылка Из Ссылки Цикл
					
					//Правило = Справочники.ПравилаИнтеграцииС1СДокументооборотом.ПравилоИнтеграцииОбъекта(
					//	ОбъектСсылка, ОбъектXDTO.objectId.type);
					
					//bmv 26_10_20
					Правило = Неопределено;
					Правила = ИнтеграцияС1СДокументооборотВызовСервера.ПодходящиеПравила(ОбъектСсылка,ОбъектXDTO);
					Если Правила.Количество()=1 Тогда
						Правило = Правила[0].Ссылка;
					КонецЕсли;
					ЗаписьЖурналаРегистрации("ПолучениеИзДО.ПодборПравилИнтеграции", УровеньЖурналаРегистрации.Информация,,ОбъектСсылка,"Выбрано правило "+ Правило);
					//bmv 26_10_20
					Если Правило = Неопределено Тогда
						Продолжить;
					КонецЕсли;
					
					Если ОбъектXDTO.Свойства().Получить("files") <> Неопределено
						И ОбъектXDTO.Установлено("files") Тогда
						
						Если ОбъектXDTO.files.Количество() <> 0 Тогда
							ИнтеграцияС1СДокументооборотПереопределяемый.ПриПоявленииПрисоединенныхФайловДокументооборота(
								ОбъектXDTO.objectId.id,
								ОбъектXDTO.objectId.type,
								ОбъектСсылка);
						Иначе
							ИнтеграцияС1СДокументооборотПереопределяемый.ПриУдаленииПрисоединенныхФайловДокументооборота(
								ОбъектXDTO.objectId.id,
								ОбъектXDTO.objectId.type,
								ОбъектСсылка);
						КонецЕсли;
						
					КонецЕсли;
					
					Объект = ОбъектСсылка.ПолучитьОбъект();
					
					ИсходнаяПометкаУдаления = Объект.ПометкаУдаления;
					
					Обновление = Истина;
					ТребуетсяПерепроведение = Ложь;
					ЕстьИзменения = Справочники.ПравилаИнтеграцииС1СДокументооборотом.ЗаполнитьОбъектПоОбъектуXDTO(
						Прокси,
						Объект,
						ОбъектXDTO,
						Правило,
						Обновление,
						ТребуетсяПерепроведение);
						
					Если ЕстьИзменения Тогда
							
						Если Объект.ПометкаУдаления
							И Не ИсходнаяПометкаУдаления Тогда
							
							МетаданныеОбъекта = Объект.Метаданные();
							Если Метаданные.Документы.Содержит(МетаданныеОбъекта)
								И МетаданныеОбъекта.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить
								И Объект.Проведен Тогда
								Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
							Иначе
								Объект.ОбменДанными.Загрузка = Истина;
								Объект.Записать();
							КонецЕсли;
							
						Иначе
							
											
							ЗаполненКорректно = Объект.ПроверитьЗаполнение();
							
							Если ЗаполненКорректно Тогда
								Если ТребуетсяПерепроведение Тогда
									Объект.Записать(РежимЗаписиДокумента.Проведение,
										РежимПроведенияДокумента.Неоперативный);
								Иначе
									Объект.ОбменДанными.Загрузка = Истина;
									Объект.Записать();
								КонецЕсли;
							Иначе
								СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
								ТекстСообщения = "";
								Для Каждого СообщениеПользователю Из СообщенияПользователю Цикл 
									ТекстСообщения = ТекстСообщения + СообщениеПользователю.Текст + Символы.ПС;
								КонецЦикла;
								ВызватьИсключение ТекстСообщения;
							КонецЕсли;
							
						КонецЕсли;
						
						Если ПоддерживаетсяОбновлениеФайлов
							И ИнтеграцияС1СДокументооборотКлиентСервер.ЭтоДокумент(ОбъектXDTO.objectId.type) Тогда
							КОбновлению = ОбъектыКОбновлениюПечатныхФорм.Добавить();
							КОбновлению.Объект = Объект;
							КОбновлению.ОбъектXDTO = ОбъектXDTO;
							КОбновлению.Правило = Правило;
						КонецЕсли;
					
						Если СоставПланаОбмена.Содержит(Объект.Метаданные()) Тогда
							ПланыОбмена.УдалитьРегистрациюИзменений(УзелДокументооборота, Объект.Ссылка);
						КонецЕсли;
						
					КонецЕсли;
					
				КонецЦикла;
				
			КонецЦикла;
			
			// С версии 1.4.8 выполняется обновление состояний согласования на стороне ИС.
			Если Ответ.Свойства().Получить("records") <> Неопределено Тогда
				
				Для каждого ОбъектXDTO Из Ответ.records Цикл
					
					ЗапросСвязанныйОбъект = Новый Запрос(
						"ВЫБРАТЬ ПЕРВЫЕ 1
						|	Объект
						|ИЗ
						|	РегистрСведений.ОбъектыИнтегрированныеС1СДокументооборотом
						|ГДЕ
						|	ТипОбъектаДО = &ТипОбъектаДО
						|	И ИдентификаторОбъектаДО = &ИдентификаторОбъектаДО
						|");
					Если ИнтеграцияС1СДокументооборот.ПроверитьТип(Прокси, ОбъектXDTO, 
						"DMApprovalStateRecord") Тогда
						ЗапросСвязанныйОбъект.УстановитьПараметр("ТипОбъектаДО",
							ОбъектXDTO.type);
						ЗапросСвязанныйОбъект.УстановитьПараметр("ИдентификаторОбъектаДО",
							ОбъектXDTO.id);
						Выборка = ЗапросСвязанныйОбъект.Выполнить().Выбрать();
						Если Выборка.Следующий() Тогда
							Если ОбъектXDTO.status = Неопределено Тогда // запись удалена (например, прерывание)
								ИнтеграцияС1СДокументооборотВызовСервера.ПриИзмененииСостоянияСогласования(
									ОбъектXDTO.id,
									ОбъектXDTO.type,
									Неопределено,
									Ложь,
									Выборка.Объект);
							Иначе
								ИдентификаторСостояния = ОбъектXDTO.status.objectId.id;
								Состояние = Перечисления.СостоянияСогласованияВДокументообороте[ИдентификаторСостояния];
								ИнтеграцияС1СДокументооборотВызовСервера.ПриИзмененииСостоянияСогласования(
									ОбъектXDTO.id,
									ОбъектXDTO.type,
									Состояние,
									Ложь,
									Выборка.Объект,
									ОбъектXDTO.name,
									ОбъектXDTO.date);
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;					
									
				КонецЦикла;
				
			КонецЕсли;
			
			НомерИсходный = Константы.НомерПоследнегоПринятогоСообщенияДокументооборота.Получить();
			НомерПринятый = Строка(Ответ.messageId);
			Если НомерИсходный <> НомерПринятый Тогда
				Константы.НомерПоследнегоПринятогоСообщенияДокументооборота.Установить(НомерПринятый);
			КонецЕсли;
			
			ПрочитаныВсеСообщения = (Ответ.messageId = Неопределено);
			
			ОбновитьПечатныеФормы(ОбъектыКОбновлениюПечатныхФорм);
			
		Исключение
			МассивОшибочныхПакетов.Добавить(Ответ.messageId);
			Инфо = ОписаниеОшибки();
			ЗаписьЖурналаРегистрации(
			ИнтеграцияС1СДокументооборот.ИмяСобытияЖурналаРегистрации(
				НСтр("ru = 'Получение данных'",
					ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())),
			УровеньЖурналаРегистрации.Ошибка,
			,
			Запрос.Тип().Имя,
			Запрос.Тип().Имя + Символы.ПС + Инфо+"; ИД пакета: "+Ответ.messageId);
		КонецПопытки;
	
		КонецЦикла; 
		
	Исключение
		Инфо = ОписаниеОшибки();
		ЗаписьЖурналаРегистрации(
			ИнтеграцияС1СДокументооборот.ИмяСобытияЖурналаРегистрации(
				НСтр("ru = 'Получение данных'",
					ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())),
			УровеньЖурналаРегистрации.Ошибка,
			,
			Запрос.Тип().Имя,
			Запрос.Тип().Имя + Символы.ПС + Инфо);
		
	КонецПопытки; 

КонецПроцедуры

&Вместо("ПодготовитьДанныеДляОтправки")
Процедура is4b_ПодготовитьДанныеДляОтправки()
	УзелДокументооборота = ИнтеграцияС1СДокументооборотПовтИсп.УзелДокументооборота();
	
	Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьПрокси();
	
	// Выборка всех изменений для данной интегрированной системы
	ИнтегрированныеОбъекты = ПолучитьМассивЗарегистрированныхДанных(УзелДокументооборота);
	
	Если ИнтегрированныеОбъекты.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	//bmv 30_10_20
	МассивУспешноОбработаны = Новый Массив;
	//bmv 30_10_20
	Для Каждого ИнтегрированныйОбъект Из ИнтегрированныеОбъекты Цикл
		//bmv 30_10_20
		//под каждый объект свой пакет
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
		ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
		ЗаписьXML.ЗаписатьОбъявлениеXML();
		ЗаписьXML.ЗаписатьНачалоЭлемента("Message");
		//bmv 30_10_20
		
		ОбъектXDTO = ИнтеграцияС1СДокументооборот.ПолучитьXDTOИзмененийИзОбъекта(Прокси, ИнтегрированныйОбъект);
		
		Если ОбъектXDTO = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Попытка
			Прокси.ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
			//bmv 30_10_20
			МассивУспешноОбработаны.Добавить(ИнтегрированныйОбъект);
			//bmv 30_10_20
		Исключение
			Инфо = ОписаниеОшибки();
			ЗаписьЖурналаРегистрации(
				ИнтеграцияС1СДокументооборот.ИмяСобытияЖурналаРегистрации(НСтр("ru = 'Выгрузка XDTO в XML'",
					ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())),
				УровеньЖурналаРегистрации.Ошибка,
				,
				ОбъектXDTO.Тип().Имя,
				ОбъектXDTO.Тип().Имя + Символы.ПС + Инфо);
		КонецПопытки;
		//bmv 30_10_20
		ЗаписьXML.ЗаписатьКонецЭлемента();
		ЗаписьXML.Закрыть();
		ДвоичныеДанныеСообщения = Новый ДвоичныеДанные(ИмяВременногоФайла);
		ДанныеСообщения = Новый ХранилищеЗначения(ДвоичныеДанныеСообщения, Новый СжатиеДанных(9));
	
		РегистрыСведений.ОчередьСообщенийВ1СДокументооборот.ДобавитьСообщение(ДанныеСообщения);
		#Если Сервер Тогда
		УдалитьФайлы(ИмяВременногоФайла);
		#КонецЕсли
		//bmv 30_10_20
	КонецЦикла;
	
	
	//bmv 30_10_20
	//Для Каждого ИнтегрированныйОбъект Из ИнтегрированныеОбъекты Цикл
	Если МассивУспешноОбработаны.Количество()>0 Тогда
		Для Каждого ИнтегрированныйОбъект Из МассивУспешноОбработаны Цикл
			ПланыОбмена.УдалитьРегистрациюИзменений(УзелДокументооборота, ИнтегрированныйОбъект.Объект);
		КонецЦикла;
	КонецЕсли;
	//bmv 30_10_20
КонецПроцедуры

&Вместо("ОтправитьДанные")
Процедура is4b_ОтправитьДанные()
	Попытка
		
		ИдентификаторСообщения = Неопределено;
		МоментВремени = Неопределено;
		
		Запрос = Новый Запрос(
			"ВЫБРАТЬ
			|	ОчередьСообщенийВ1СДокументооборот.МоментВремени КАК МоментВремени,
			|	ОчередьСообщенийВ1СДокументооборот.Данные КАК Данные,
			|	ОчередьСообщенийВ1СДокументооборот.Идентификатор КАК Идентификатор
			|ИЗ
			|	РегистрСведений.ОчередьСообщенийВ1СДокументооборот КАК ОчередьСообщенийВ1СДокументооборот
			|
			|УПОРЯДОЧИТЬ ПО
			|	МоментВремени");
		
		Результат = Запрос.Выполнить();
		
		Если Результат.Пустой() Тогда
			Возврат;
		КонецЕсли; 
		
		Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьПрокси();
		
		//Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMPutChangesRequest");
		//ОбщийРазмерСообщений = 0;
		ПредельныйРазмерСообщений = 
			ИнтеграцияС1СДокументооборотВызовСервера.МаксимальныйРазмерПередаваемогоФайла();
		
		Выборка = Результат.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			//bmv 30_10_20
			Попытка
			Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMPutChangesRequest");
			ИдентификаторСообщения = Выборка.Идентификатор;
			МоментВремени = Выборка.МоментВремени;
			
			ДвоичныеДанные = Выборка.Данные.Получить();
			РазмерДвоичныеДанные = ДвоичныеДанные.Размер();
			//ОбщийРазмерСообщений = ОбщийРазмерСообщений + ДвоичныеДанные.Размер();
			
			//Если ОбщийРазмерСообщений > ПредельныйРазмерСообщений
			//	И Запрос.objects.Количество() > 0 Тогда
			
			Если РазмерДвоичныеДанные>ПредельныйРазмерСообщений Тогда
				ЗаписьЖурналаРегистрации(
				НСтр("ru = 'Интеграция с 1С:Документооборотом.Отправка данных'",
				ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
				УровеньЖурналаРегистрации.Ошибка,
				Метаданные.РегистрыСведений.ОчередьСообщенийВ1СДокументооборот,
				Строка(ИдентификаторСообщения),
				" превышен максимальный размер пакета");
				Продолжить;
			КонецЕсли;
				//Результат = Прокси.execute(Запрос);
				//ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Результат);
				
				//Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMPutChangesRequest");
				//ОбщийРазмерСообщений = 0;
				
			
			ИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла("xml");
			ДвоичныеДанные.Записать(ИмяФайлаСообщенияОбмена);
			
			ЧтениеXML = Новый ЧтениеXML;
			ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена);
			ЧтениеXML.Прочитать();
			ЧтениеXML.Прочитать();
			
			Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
				// Выполняется последовательное чтение одного объекта за другим
				ТипXDTO = Прокси.ФабрикаXDTO.Тип("http://www.1c.ru/dm", ЧтениеXML.Имя);
				ОбъектXDTO = Прокси.ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипXDTO);
				Запрос.objects.Добавить(ОбъектXDTO);
			КонецЦикла;
			
			ЧтениеXML = Неопределено;
			#Если Сервер Тогда
			УдалитьФайлы(ИмяФайлаСообщенияОбмена);
			#КонецЕсли
			Результат = Прокси.execute(Запрос);
			ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Результат);
			//если ошибок нет, сразу удаляем запись в регистре
			МенеджерЗаписи = РегистрыСведений.ОчередьСообщенийВ1СДокументооборот.СоздатьМенеджерЗаписи();
			ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка);
			МенеджерЗаписи.Удалить();

		Исключение
				Инфо = ОписаниеОшибки();
				ЗаписьЖурналаРегистрации(
				НСтр("ru = 'Интеграция с 1С:Документооборотом.Отправка данных'",
				ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
				УровеньЖурналаРегистрации.Ошибка,
				Метаданные.РегистрыСведений.ОчередьСообщенийВ1СДокументооборот,
				Строка(ИдентификаторСообщения),
				Запрос.Тип().Имя + Символы.ПС + Инфо);
			    ОбновитьДанныеПоОшибке(ИдентификаторСообщения, МоментВремени, Инфо);
			КонецПопытки;
		КонецЦикла; 
		
		//Если Запрос.objects.Количество() > 0 Тогда
		//	Результат = Прокси.execute(Запрос);
		//	ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Результат);
		//КонецЕсли;
		
		//Выборка.Сбросить();
		
		//Пока Выборка.Следующий() Цикл
			
						
		//КонецЦикла;
		
	Исключение
		
		Инфо = ОписаниеОшибки();
		
		ЗаписьЖурналаРегистрации(
			НСтр("ru = 'Интеграция с 1С:Документооборотом.Отправка данных'",
				ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,
			Метаданные.РегистрыСведений.ОчередьСообщенийВ1СДокументооборот,
			Строка(ИдентификаторСообщения),
			Запрос.Тип().Имя + Символы.ПС + Инфо);
		ОбновитьДанныеПоОшибке(ИдентификаторСообщения, МоментВремени, Инфо);	
		
		
	КонецПопытки; 

КонецПроцедуры

Процедура ОбновитьДанныеПоОшибке(ИдентификаторСообщения, МоментВремени, Инфо)
	    Если ИдентификаторСообщения <> Неопределено Тогда
			МенеджерЗаписи = РегистрыСведений.ОчередьСообщенийВ1СДокументооборот.СоздатьМенеджерЗаписи();
			МенеджерЗаписи.МоментВремени = МоментВремени;
			МенеджерЗаписи.Идентификатор = ИдентификаторСообщения;
			МенеджерЗаписи.Прочитать();
			МенеджерЗаписи.КоличествоПопытокОтправки = МенеджерЗаписи.КоличествоПопытокОтправки + 1;
			МенеджерЗаписи.ТекстСообщенияОбОшибке = Инфо;
			МенеджерЗаписи.Записать();
		КонецЕсли;
КонецПроцедуры

 

 
На стороне ДО модуль ОбработкаЗапросовXDTOОбмен

 


&Вместо("ФормированиеСообщений")
Процедура is4b_ФормированиеСообщений()
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
	
	УзлыОбмена = ОбработкаЗапросовXDTOПовтИсп.ПолучитьУзлыОбменаИнтегрированныхСистем();
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюСИнтегрированнымиСистемами") Тогда
		Для каждого ИнтегрированнаяСистема Из УзлыОбмена Цикл
			ПланыОбмена.УдалитьРегистрациюИзменений(ИнтегрированнаяСистема);
		КонецЦикла; 
		Возврат;
	КонецЕсли; 
	
	Для каждого ИнтегрированнаяСистема Из УзлыОбмена Цикл
		СформироватьПакетыОбмена(ИнтегрированнаяСистема);
		//Сообщение = СоздатьНовоеСообщение(ИнтегрированнаяСистема);
		//СформироватьПакетОбмена(Сообщение, ИнтегрированнаяСистема);
	КонецЦикла;
КонецПроцедуры

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

			Сообщение = СоздатьНовоеСообщение(Узел);
			НачалоПодготовки = ТекущаяУниверсальнаяДатаВМиллисекундах();
			ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
			ЗаписьXML = Новый ЗаписьXML;
			ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "UTF-8");
			ЗаписьXML.ЗаписатьОбъявлениеXML();
			Попытка
				ПолучитьXDTOИзОбъекта(ЭлементДанных, ОбъектыXDTO, ЗаписиXDTO);
				//ВызватьИсключение("тест"); //тестируем ошибочную ситуацию
			Исключение
				Инфо = ИнформацияОбОшибке();
				ЗаписьЖурналаРегистрации(
					НСтр("ru = 'Обмен с интегрированными системами.Формирование сообщения'", Метаданные.ОсновнойЯзык.КодЯзыка),
					УровеньЖурналаРегистрации.Ошибка,,
					ЭлементДанных,
					ПодробноеПредставлениеОшибки(Инфо));
				//ВызватьИсключение;
				
				//Если формирование объекта прошло с ошибкой, тогда удаляем сообщение для этого пакета, очищаем записьХМЛ
				СообщениеОбъект = Сообщение.ПолучитьОбъект();
				СообщениеОбъект.Удалить();
				ЗаписьXML.Закрыть();
				УдалитьФайлы(ИмяВременногоФайла);
				МассивНеобработанныхОбъектов.Добавить(ЭлементДанных);
			    Продолжить;				
			КонецПопытки;
			// Расчет процента готовности сообщения.
			// Максимальное значение 99, т.к. необходимо гарантировать, 
			//	что не будет выполняться попытка передать сообщение клиенту до того,
			//	как данные сообщения будут записаны.
			СчетчикОбъектов = 1;
			ПроцентГотовности = Окр(99 * СчетчикОбъектов);
			РегистрыСведений.СтепеньГотовностиСообщенийИнтегрированныхСистем.УстановитьПроцентГотовности(
				Сообщение, ПроцентГотовности);
				
				КонецПодготовки = ТекущаяУниверсальнаяДатаВМиллисекундах();
		
			РегистрыСведений.СведенияОСообщенияхОбменаСИнтегрированнымиСистемами.ЗаписатьВремяПодготовки(
			Сообщение,
			(КонецПодготовки - НачалоПодготовки)/1000);

			
			ВыгрузитьМассивXDTOВСообщение(ИмяВременногоФайла, ЗаписьXML, ОбъектыXDTO, ЗаписиXDTO, Сообщение);
			УдалитьФайлы(ИмяВременногоФайла);

		КонецЦикла;
		ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСообщения);
		//Если были ошибочные данные, перерегистрируем их на узле
		Если МассивНеобработанныхОбъектов.Количество()>0 Тогда
			Для Каждого ОшибочныйОбъект Из МассивНеобработанныхОбъектов Цикл
				ПланыОбмена.ЗарегистрироватьИзменения(Узел,ОшибочныйОбъект);
			КонецЦикла;
		КонецЕслИ;
		ЗафиксироватьТранзакцию();
КонецПроцедуры


&Вместо("ПолучитьИзменения")
Функция is4b_ПолучитьИзменения(Сообщение)
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюСИнтегрированнымиСистемами") = Ложь Тогда 
		Константы.ИспользоватьСинхронизациюСИнтегрированнымиСистемами.Установить(Истина);
	КонецЕсли; 
	
	Ответ = ОбработкаЗапросовXDTO.СоздатьОбъект("DMGetChangesResponse");
	Узел = ОбработкаЗапросовXDTOКОРП.УзелИнтегрированнойСистемыПоСообщению(Сообщение);
	
	ИдентификаторПринятогоСообщения = Сообщение.lastMessageId;
	
	Если ИдентификаторПринятогоСообщения <> Неопределено Тогда
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ ПЕРВЫЕ 1
			|	СообщенияИнтегрированныхСистем.Ссылка
			|ИЗ
			|	Справочник.СообщенияИнтегрированныхСистем КАК СообщенияИнтегрированныхСистем
			|ГДЕ
			|	СообщенияИнтегрированныхСистем.ПометкаУдаления = ЛОЖЬ
			|	И СообщенияИнтегрированныхСистем.ИдентификаторСообщения = &ИдентификаторСообщения
			|	И СообщенияИнтегрированныхСистем.Входящее = ЛОЖЬ";
		Запрос.УстановитьПараметр("ИдентификаторСообщения", Строка(ИдентификаторПринятогоСообщения));
		ВыборкаПринятыеСообщения = Запрос.Выполнить().Выбрать();
		Если ВыборкаПринятыеСообщения.Следующий() Тогда
			ПринятоеСообщение = ВыборкаПринятыеСообщения.Ссылка;
			ПринятоеСообщениеОбъект = ПринятоеСообщение.ПолучитьОбъект();
			ПринятоеСообщениеОбъект.УстановитьПометкуУдаления(Истина);
			РегистрыСведений.СведенияОСообщенияхОбменаСИнтегрированнымиСистемами.ЗаписатьДатуПередачиКлиенту(
				ПринятоеСообщение,
				ТекущаяДатаСеанса());
			ИдентификаторПринятогоСообщения = Неопределено;
		Иначе
			ИдентификаторПринятогоСообщения = Неопределено;
		КонецЕсли;
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	СообщенияИнтегрированныхСистем.Ссылка,
		|	СообщенияИнтегрированныхСистем.ДанныеСообщения КАК Данные,
		|	СообщенияИнтегрированныхСистем.ДатаСоздания КАК ДатаСоздания,
		|	СообщенияИнтегрированныхСистем.ИдентификаторСообщения
		|ИЗ
		|	Справочник.СообщенияИнтегрированныхСистем КАК СообщенияИнтегрированныхСистем
		|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|	РегистрСведений.ОчередиСообщенийОбменаСИнтегрированнымиСистемами КАК ОчередиСообщенийОбменаСИнтегрированнымиСистемами
		|ПО
		|	СообщенияИнтегрированныхСистем.Очередь = ОчередиСообщенийОбменаСИнтегрированнымиСистемами.Очередь
		|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		|	РегистрСведений.СтепеньГотовностиСообщенийИнтегрированныхСистем КАК СтепеньГотовностиСообщенийИнтегрированныхСистем
		|ПО
		|	СообщенияИнтегрированныхСистем.Ссылка = СтепеньГотовностиСообщенийИнтегрированныхСистем.Сообщение
		|ГДЕ
		|	ОчередиСообщенийОбменаСИнтегрированнымиСистемами.ИнтегрированнаяСистема = &ИнтегрированнаяСистема
		|	И НЕ СообщенияИнтегрированныхСистем.ПометкаУдаления
		|	И СтепеньГотовностиСообщенийИнтегрированныхСистем.ПроцентГотовности = 100
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаСоздания УБЫВ";
	Запрос.УстановитьПараметр("ИнтегрированнаяСистема", Узел);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		
		ИмяФайлаСообщенияОбмена = ПолучитьИмяВременногоФайла("xml");
		ДвоичныеДанные = Выборка.Данные.Получить();
		ДвоичныеДанные.Записать(ИмяФайлаСообщенияОбмена);
		СсылочныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/dm", "DMObject");
			
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщенияОбмена);
		
		ЧтениеXML.Прочитать(); // корневой элемент "Message"
		
		ЧтениеXML.Прочитать();
		Пока ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл
			ТипXDTO = ФабрикаXDTO.Тип("http://www.1c.ru/dm", ЧтениеXML.Имя);
			ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипXDTO);
			Если СсылочныйТип.ЭтоПотомок(ТипXDTO) Тогда
				Ответ.objects.Добавить(ОбъектXDTO);
			Иначе // записи РС и тому подобные объекты не ссылочных типов
				Ответ.records.Добавить(ОбъектXDTO);
			КонецЕсли;
		КонецЦикла;
			
		Ответ.messageId = Строка(Выборка.ИдентификаторСообщения);
		
	КонецЕсли; 
	
	Возврат Ответ;
КонецФункции


 

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

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Torin 308 10.11.20 14:58 Сейчас в теме
3. maks_20 134 10.11.20 16:06 Сейчас в теме
2. MSK_Step 22 10.11.20 15:14 Сейчас в теме
4. Rustig 1638 10.11.20 17:22 Сейчас в теме
(0) спасибо за опыт!
как полит.корректно вы написали в конце
Как показывает практика, даже если разворачивать "из коробки" типовые решения, то корректно они работают далеко не всегда.


вопросы из зала:
1) что за префикс "is4b_" ?
2) сколько человек с вашей стороны участвовало при решении проблем интеграции, тестировании, переговоров с заказчиком?
3) сколько времени потрачено на решение проблем?
5. maks_20 134 10.11.20 19:54 Сейчас в теме
(4) Префикс нашей команды, отмечаем им свои доработки, чтобы не путать с чужими. На внедрении ДО участвовало 3 человека: руководитель проекта, он же общался с заказчиком, специалист-консультант (занимался настройкой бизнес-процессов и тестированием) и программист. На настройку синхронизации и интеграции (с периодическим обсуждениями с заказчиком) ушло почти 2 недели.
6. 5277209 11.11.20 11:40 Сейчас в теме
Отличная статья! Спасибо! Уточните плиз, ДО проф или корп?
7. maks_20 134 11.11.20 11:55 Сейчас в теме
(6) Спасибо за отзыв. ДО версии КОРП.
8. baykovsky 11.11.20 12:02 Сейчас в теме
Спасибо за статью.
Типовые правила обмена между ДО и КА не предусматривают возможности отбора объектов. Т.е. грузится абсолютно все. Нет возможности установить отбор по одной организации или например указать, что синхронизировать надо только номенклатуру и контрагентов. Как вы решали эту проблему?
11. maks_20 134 11.11.20 12:42 Сейчас в теме
(8) дорабатывали правила регистрации.
9. kolya_tlt 24 11.11.20 12:15 Сейчас в теме
информация о стабильных релизах БИД не разглашается по понятным причинам. обратившись к сообществу на фб или вк вы бы получили стабильную сборку от команды разработки ДО или релиз на который нужно обновиться.
10. maks_20 134 11.11.20 12:37 Сейчас в теме
(9) Большая часть проблем именно в модулях на стороне КА, мы ставили самые последние релизы и там те же проблемы, по крайней мере касательно интеграции.
12. Kovekh 11.11.20 14:02 Сейчас в теме
Добрый человек, спасибо вам большое за первый пункт!
Вы бы знали, как долго я пытался найти эту ошибку. Такая вываливалась при обмене ERP-ДО в части контрагентов и организаций. Причём ДО уже у нас поднялся с 12 до 21, а в синхронизации всё та же дичь)
13. user1080690 11.11.20 16:29 Сейчас в теме
При всем уважении, статья вызывает улыбку.
Крупная компания и проект на 3 человека с акцентом на копание в коде выглядит забавно.
14. maks_20 134 11.11.20 16:39 Сейчас в теме
(13) На всем проекте работает 11 человек. Конкретно документооборотом занимается 3 человека. Если для Вас статья получилась забавной, что ж, это Ваше мнение, спорить с ним смысла не вижу.
papche; RSConsulting; +2 Ответить
16. papche 415 12.11.20 10:08 Сейчас в теме
(13) Я думаю, на описанные задачи можно было бы посадить команду в 10 чел. И написать свою подсистему с обменом, повсюду вплетая типовой функционал. Ну и тогда было бы солиднее?
17. maks_20 134 12.11.20 10:47 Сейчас в теме
(16) Все возможно. вопрос в том, за чей счет будет вестись разработка. Ведь наладить типовой обмен в любом случае будет быстрее, чем разработать свою систему. Не каждый заказчик согласится оплачивать лишние часы. Разрабатывать аналог обмена за счет компании имеет смысл, если в дальнейшем планируется массовая продажа этих разработок другим клиентам.
18. papche 415 12.11.20 10:57 Сейчас в теме
(17) Ваш подход мне кажется рациональным. А размер команды должен быть адекватным в первую очередь выполняемым работам, а не размерам компании заказчика.
15. Константин С. 677 12.11.20 08:24 Сейчас в теме
Не реклама.
Берите Бит-финанс, там утверждение заявок можно в одной системе сделать.
19. SergeyTY 13.11.20 08:49 Сейчас в теме
спасибо что выводите в свет проблемы 1С и делитесь с решениями. КА я бы сравнил с кактусом: колется, но приходится... пока донесешь проблему до техподдержки, приходишь к мысли что лучше самому все сделать вручную.
20. sulig 44 23.11.20 15:47 Сейчас в теме
Отличная статья. Прошел почти все этапы. "не те правила подставляются" - нет базы под рукой, но насколько я помню это решается условиями применимости. С итерациями - спорное решение, я разбирал каждое событие и фиксил чтобы подобный инцидент не приводил к остановке обмена, сейчас обмен встает не чаще 1 раза за 3 месяца. Как решили проблему с авторизацией или для вас это не являлось проблемой?
21. maks_20 134 24.11.20 09:34 Сейчас в теме
(20) Спасибо. Условиями применимости к сожалению не решалась проблема. Изначально хотели ими обойтись. По поводу итераций - тут было согласовано с заказчиком. Сейчас у нас сделан отчет, который три раза в день рассылает ошибки обмена. Ответственный за обмены человек анализирует ошибки и далее оперативно их исправляет. Массив ошибок с момента внедрения уменьшился в десятки раз. А с авторизацией проблем не было кстати.
22. vihrov_av 22.12.20 09:43 Сейчас в теме
Всё четко и по делу. Прошел каждый из этих шагов при внедрении ERP + ДО.
К пункту 2.3 Обмен статусами документов добавлю:
Периодически сталкивался с такой проблемой когда согласование в ДО прошло и статус в ДО поменялся, а в ERP нет. Спустя какое то время удалось выяснить что некоторые процессы пользователи считают супер срочными и создавай документы в ERP и запускай процесс согласования не закрывают сам документ, а сразу же обзванивают участников процесса для оперативности согласования. И так как объект заблокирован, регламентное задание не может его изменить.
Оставьте свое сообщение

См. также

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

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

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

03.09.2019    13261    m-rv    1    

Перенос данных из ЗУП 2.5 в ЗУП 3.1

Зарплата Перенос данных из 1C8 в 1C8 v8 v8::СПР ЗУП2.5 ЗУП3.x Россия БУ Бесплатно (free)

Довольно часто сталкиваюсь с тем, что у коллег возникает вопрос, как правильно выполнить перенос данных из ЗУП 2.5 в ЗУП 3.1. (Неужели еще кто-то до сих пор работает в ЗУП 2.5? Да, и очень много людей)

25.01.2021    1000    VAAngelov    40    

Перенос документов 1С из одной базы в другую

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

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

23.01.2021    962    Koder_Line    6    

Объединение баз ЗУП

Перенос данных из 1C8 в 1C8 v8 v8::СПР ЗУП3.x БУ Бесплатно (free)

Есть база ЗУП 3.1, в которой ведется одна организация, все данные из нее нужно перенести в общий ЗУП, обе базы типовые. Используем для переноса КД 2.0.

10.01.2021    613    roger83    0    

Как прикрутить ГУИД к регистру сведений Промо

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

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    20855    m-rv    17    

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

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

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

28.12.2020    1436    SizovE    13    

Неожиданное использование XDTO

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Расскажу про свой опыт, как XDTO может помочь в отладке обменов данных. И какие полезности можно почерпнуть для себя при работе с XDTO.

05.12.2020    2269    simon_sidoruk    20    

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

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

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

17.11.2020    1457    SizovE    2    

Повышаем эффективность разработки правил обмена Промо

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

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    28852    olegtymko    47    

Запрет повторного запуска комплексных процессов типовыми средствами в 1С: Документооборот

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

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

09.11.2020    705    sulig    4    

Простой пример разработки регулярного обмена с использованием БСП на примере ERP 2.4 и УПП 1.3

БСП (Библиотека стандартных подсистем) Перенос данных из 1C8 в 1C8 v8 1cv8.cf УПП1 КД ERP2 Россия Бесплатно (free)

Данный вариант подойдет тем, кто хочет настроить "свой" регулярный обмен с добавлением "своих" планов обмена с использованием правил обмена на КД 2.1.

27.10.2020    3608    байт    8    

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

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

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

17.10.2020    695    malikov_pro    2    

Универсальный обмен между идентичными конфигурациями через REST интерфейс OData. Часть І: Справочники Промо

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

Сейчас все чаще интеграции различных конфигураций проектируются через HTTP-сервисы - они и работают быстрее, и "войти" в режим отладки гораздо проще, тем самым обойдя "черный ящик" универсального обмена через xml, например. Более года назад я начал работать в компании, в которой разработчики работали с конфигурациями 1С в режиме совместимости еще 8.2.16 (менять режим совместимости в типичных базах мы не хотели) - а как Вы наверное знаете, если интересовались HTTP-сервисами в 1С, их использование в режиме совместимости 8.3.4 и ниже недопустимо - и здесь я уже не надеялся на разработку и использование HTTP-сервисов. Но позже меня заинтересовал такой "сервис" как REST интерфейс OData, так как его можно использовать не меняя режим совместимости конфигурации - именно он и стал для меня идеальным вариантом решения "нетривиальных" задач.

11.05.2018    23842    V.Stavinsky    11    

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

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

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

01.10.2020    2037    impextr    31    

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

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

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

19.08.2020    3166    Yashazz    14    

Ограничение выбора вариантов шаблонов запуска процессов в Документообороте 2.1

Документоборот 2 v8 ДО Бесплатно (free)

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

20.07.2020    1336    Maito    4    

Взаимодействие между базами 1С через COM Промо

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Рассмотрено много особенностей взаимодействия между базами 1С по COM технологии

10.08.2015    157891    tormozit    67    

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

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

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

06.07.2020    2333    Infector    4    

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

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

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

30.06.2020    1892    malikov_pro    5    

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

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

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

24.06.2020    1797    direwest    4    

Использование инструментов разработчика для отладки обменов КД 2.0 Промо

Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Пара трюков, благодаря которым жить становится намного проще...

05.05.2017    27956    unichkin    3    

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

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

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

23.06.2020    5670    IssakN    32    

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

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

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

17.06.2020    5617    John_d    8    

Конвертация данных 2. Использование подключаемых обработок в правилах обмена. Конвертация дерева значений

Обмен данными 1С Обмен через XML Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

15.06.2020    4114    Drivingblind    8    

Приемы обработки больших данных в 1С Промо

Универсальные обработки Математика и алгоритмы Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Рассказ об эффективных приемах организации обработок больших объемов данных на платформе 1С

07.08.2015    68366    tormozit    27    

Конвертация данных 2.1. Методика переноса остатков

Перенос данных из 1C8 в 1C8 v8 1cv8.cf УУ Бесплатно (free)

В данной статье я приведу пример использования базовой методики конвертации данных для переноса остатков из одной информационной базы в другую.

12.06.2020    8037    aximo    17    

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

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

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

01.06.2020    11578    zhichkin    36    

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

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

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

12.05.2020    4236    zhichkin    22    

Настройка типового обмена данными между: 1С: Предприятие Бухгалтерия ред. 3.0 (БП 3.0) и 1С: Управление торговлей ред. 10.3 (УТ 10.3). Промо

Перенос данных из 1C8 в 1C8 v8 УТ10 Россия Бесплатно (free)

В этой статье я опишу, как настраивается типовой обмен данными между БП 3.0 и УТ 10.3.

29.01.2014    271318    arr    56    

Механизм XDTO

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

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

12.05.2020    5972    totchaz    4    

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

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

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

08.05.2020    5307    chernenko_vv    25    

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

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

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

08.05.2020    2349    vostok1.dz    3    

Отладка правил обмена 7.7, 8 Промо

Перенос данных из 1С7.7 в 1C8.X Обмен через XML Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

29.10.2013    51814    pyrkin_vanya    70    

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

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

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

04.05.2020    4217    RPGrigorev    0    

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

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

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

02.05.2020    4613    maxlab    16    

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

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

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

26.04.2020    5457    RPGrigorev    0    

Обмен по расписанию типовыми средствами. Промо

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

Часто перед интеграторами стоит задача организовать автообмен (по расписанию или при наступлении какого-либо события) данными между различными конфигурациями. В этой статье я попробую изложить простую инструкцию, как это можно сделать средствами, заложенными в типовые конфигурации 1С (ЗУП, БП, УПП и т.д.). Для обмена используется подсистема "Обмен данными" из БСП

20.06.2012    103794    kser87    52    

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

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

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

06.04.2020    4810    Flyerink    0    

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

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

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

31.03.2020    14009    informa1555    35    

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

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

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

23.03.2020    3266    zhichkin    7    

Заготовка для загрузки файлов по ftp Промо

WEB Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

3 процедуры и 1 макет

03.06.2013    30694    anig99    6    

Механизмы проведения документов при обмене по универсальному формату

Перенос данных из 1C8 в 1C8 БСП (Библиотека стандартных подсистем) v8 Бесплатно (free)

Как проводятся документы при обмене по универсальному формату. Пример доработки типовых правил обмена с переносом состояния документа: проведен/не поведен/пометка удаления.

04.03.2020    5326    partizand    6    

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

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

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

02.03.2020    7342    RPGrigorev    3    

Односторонний обмен ЗУП и БП

Перенос данных из 1C8 в 1C8 v8 БП3.0 ЗУП3.x Россия Бесплатно (free)

Односторонний обмен из ЗУП в БУХ

29.02.2020    6176    VAAngelov    14    

Интеграция «1С:Управление производственным предприятием» с «1С:Документооборот» Промо

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

В данной статье пойдет речь о возможности интеграции 1С:Управление производственным предприятием ред. 1.3 с 1С:Документооборот КОРП и о том, что может получить предприятие от этой интеграции.

18.02.2013    64539    Vladimir_Konyrev    38    

Автоматический обмен при появлении файла, по регламентному заданию создаёт файл выгрузки, даже если файл загрузки не появлялся

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Россия Бесплатно (free)

Заметил, что "Автоматический обмен при появлении файла" каждый раз создаёт файл выгрузки данных, даже если файл для загрузки данных не появлялся. Данный код проверит, что файл появился, только после чего создаст файл выгрузки данных.

20.02.2020    3041    wau8824ru    4    

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

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

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

24.01.2020    5670    e-9    2    

Конвертация ставок НДС: из Перечисления в Справочник (правила обмена в конвертации 2.0)

Перенос данных из 1C8 в 1C8 v8 КД Россия НДС Бесплатно (free)

При написании правил обмена между "более старой" и "более новой" конфигурациями можно столкнуться с тем, что в одной конфигурации ставки НДС - это перечисление, а в другой - справочник (или наоборот, но мой пример именно из перечисления в справочник). Ситуация несложная, но нестандартная, поэтому выкладываю работающий пример, может, кому пригодится.

09.11.2019    7059    vikulinamari    1    

Особенности обмена данными с использованием "ручной" регистрации Промо

Распределенная БД (УРИБ, УРБД) Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Эта статья рассчитана на программистов, которые используют обмен данными с помощью метода "ВыбратьИзменения" и последующую их запись. Только для планов обменов, имеющих "ручную" регистрацию.

14.01.2013    35744    logarifm    6    

Настройка синхронизации между конфигурациями Бухгалтерия для Беларуси 2.1 и Управление торговлей для Беларуси 3.4

Перенос данных из 1C8 в 1C8 v8 БП3.0 УТ11 Беларусь Бесплатно (free)

Пошаговое описание настройки типового обмена между конфигурациями Бухгалтерия для Беларуси 2.1 и Управление торговлей для Беларуси 3.4

21.10.2019    8361    Olesia_Matusevich    1    

Объединение организаций в ЗУП при реорганизации с переносом данных из ЗУП 2.5 в ЗУП 3.1

Зарплата Управление персоналом (HRM) Перенос данных из 1C8 в 1C8 v8 v8::СПР ЗУП2.5 ЗУП3.x БУ Бесплатно (free)

В этой статье описан опыт объединения 2-х организаций при реорганизации в ЗУП 3.1 с переносом данных одной организации из ЗУП 2.5 (релизы баз более или менее свежие, но не самые последние на момент перехода, примерно двух- и трехмесячной давности). За основу было взято решение из этой статьи https://infostart.ru/public/833658/, в которой описан алгоритм решения задачи, за что автору статьи огромная благодарность! Здесь же даны некоторые комментарии и пояснения к алгоритму переноса и объединения, описаны выявленные мною ошибки. Также приведена небольшая инструкция по использованию обработки ирПодборИОбработкаОбъектовБД — она будет полезна для пользователей — «не программистов», впервые работающих в не управляемых формах.

09.10.2019    8407    Neti    2    

EnterpriseData: простой способ защиты данных в базе получателя при одностороннем обмене

Перенос данных из 1C8 в 1C8 v8 1cv8.cf Бесплатно (free)

Очень часто бухгалтеры ругаются, когда уже отраженные документы в бухгалтерском учета меняются сотрудниками.

04.10.2019    7462    handscenter    12    

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

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

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

18.09.2019    17960    feva    42