Выгрузка из БП 3.0 в УТ 11.4

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

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

Выгрузка из БП3 в УТ11 правила обмена задваиваются договор задвоение договоров

Данная публикация была создана для демонстрации решения по переносу данных из имеющейся БП 3.0 в новую УТ 11.4. Сложность заключалась в том, что некоторые документы (Поступления и Реализации) не переносятся в типовом варианте обмена (именно из Бухгалтерии в Торговлю, а не наоборот). Второй нюанс - это перенос договоров. Подробно о проблеме можно почитать здесь https://forum.infostart.ru/forum9/topic146589/ Однако, конкретного решения для своей задачи из указанной публикации найдено не было, но стало понятно, что правила формирования договоров указаны верно, и причина задвоения договоров при обмене таилась в другом. Но обо всём потихоньку...

Итак, имеется БП, в которой велся учет несколько лет.

На предприятии приняли решение, что удобнее было бы вести учет в УТ и периодически делать перенос данных в БП. 

То есть - задача перенести накопленные данные из БП в УТ, а затем настроить одностороннюю синхронизацию документов из УТ в БП.

Первое что делаем - это бэкап бухгалтерской базы с данными, и все операции будем производить на копии базы.

1. Настраиваем типовую двустороннюю синхронизацию между БП и УТ. На просторах инета есть множество инструкций, вот ссылка на одну из них https://scloud.ru/techinfo_1c_online/sinkhronizatsiya-i-obmen-dannymi/nastroyka-sinkhronizatsii-mezhdu-ut-11-i-bp-3-0/

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

Итак, данные нормативно-справочной информации загружены в УТ. Настаиваем учетную политику.

Теперь подробнее о настройках ведения учета по договорам... По умолчанию в складских документах в УТ отсутствует поле "договор" (в поступлениях и реализациях). И если оставить ведение учета как есть, то после заведения новых документов и последующего переноса их в Бухгалтерию, для каждого контрагента будет создан новый договор "Основной договор", что категорически не приветствуется бухгалтерами )
Поэтому в УТ делаем парочку настроек: в разделе "НСИ и администрирование" - Настройка НСИ и разделов - CRM и маркетинг - "Настройки CRM" устанавливаем флаг "независимо вести партнеров и контрагентов", далее в разделе "НСИ и администрирование" - Настройка НСИ и разделов - "Закупки" - "соглашения и договоры с поставщиками" устанавливаем флаг "договоры с поставщиками", а также в пункте "Продажи" - "Оптовые продажи" раздела "НСИ и администрирование" устанавливаем флаг "договоры с клиентами".
После данных настроек в документах поступления и реализаций появится поле "договор", а так как все договоры были перенесены из бухгалтерии, то при заведении новых документов, а также при первоначально выгрузке документов из БП в УТ договор будет заполняться имеющимися данными.

На втором этапе типового обмена, перенесем документы из БП в УТ. Для этого в базе БП в настройках обмена необходимо поставить флаг "отправлять все документы с ...", указав начальную дату выгрузки, и в составе отправляемых данных регистрируем все документы и регистр сведений "Статусы документов". Выполняем обмен. Типовой обмен настроен, теперь в БП отключаем настройку "отправлять все документы с ...", устанавливаем "не отправлять".

2. Для нетипового переноса документов Поступления и Реализации из БП 3.0 в УТ 11.4 используем обработку "Универсальный обмен данными XML" и правила обмена, которые я прикладываю в данной публикации, предназначаются для ознакомления и доработки для нужд конкретной задачи.

Правила переносят документы: "Поступление товаров","Поступление услуг", "Поступление оборудования" и "Реализации". Так как все справочники были перенесены из БП в УТ типовым обменом, то правила переноса справочников настроены таким образом, что новые элементы не создаются.

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

Далее, просто настаиваете расписание типового обмена.

 

P.S. Хотелось бы отметить, что обмен настраивался между базами БП 3.0.78.64 и УТ 11.4.12.61.

При типовом обмене возникла ошибка отсутствия поля "Характеристика" в справочнике "Штрихкоды номенклатуры". Решается это установкой расширения в базе УТ. Создайте новое расширение (инструкцию можно найти на просторах инета), добавьте в него общий модуль "МенеджерОбменаЧерезУниверсальныйФормат" и в модуле переинициализируйте процедуру ПКО_Справочник_ШтрихкодыНоменклатуры_Получение_ПередЗаписьюПолученныхДанных.

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

На всякий случай Расширение прикладываю к публикации.

Ещё отмечу, что, для тех кто НЕ хочет вести в УТ договоры, можно обойтись без вышеупомянутых настроек, использовав настройки по умолчанию, но для того, чтобы договоры не задваивались необходимо в расширении к УТ переинициализировать код, который добавляет данные о договоре в выгрузку. Однако, отмечу, что если у контрагента несколько договоров, и отсутствует договор по умолчанию, то в документах поле "договор" заполнен не будет, и документ не будет проведен.

&Вместо("ДоговорИнструкцияКонвертацииПоДаннымВзаиморасчетов")
Функция РасшМОБ_ДоговорИнструкцияКонвертацииПоДаннымВзаиморасчетов(ПараметрыПоУмолчанию, КомпонентыОбмена, ОбъектРасчетов = Неопределено, ДанныеИБ = Неопределено)
	// Функция формирует и возвращает инструкция для выгрузки договора
	// по полученным параметрам и настройкам узла плана обмена.
	//
	// Функция, по сформированной инструкции, выполняет принудительную выгрузку договора в файл обмена.
	//
	// Перед вызовом этой функции выполняется проверка наличия договора в выгружаемом документе
	// или в объекте взаиморасчетов, если договор не найден, то выполняется вызов этой функции.
	
	СтруктураДанныеДоговора = Новый Структура(ДоговорФиксированнаяСтруктураКлючей());
	ДоговорЗаполнен = Ложь;
	СтруктураДанныеДоговора.ВидДоговора = ПараметрыПоУмолчанию.ВидДоговора;
	
	Если ЗначениеЗаполнено(ОбъектРасчетов)
		И ТипЗнч(ОбъектРасчетов) = Тип("СправочникСсылка.ДоговорыМеждуОрганизациями") Тогда
		
		ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, ПараметрыПоУмолчанию,
			"Организация, Контрагент");
		
		РеквизитыИнтеркампани = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ОбъектРасчетов,
			"Дата, Номер, Наименование, ВалютаВзаиморасчетов, ПорядокОплаты");
		ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, РеквизитыИнтеркампани);
	
		РасчетыУЕ = РеквизитыИнтеркампани.ПорядокОплаты = Перечисления.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях;	
		СтруктураДанныеДоговора.РасчетыВУсловныхЕдиницах = РасчетыУЕ;
		
		ДоговорЗаполнен = Истина;
			
	ИначеЕсли ЗначениеЗаполнено(ОбъектРасчетов)
		И ДанныеИБ <> Неопределено
		И Не ДопАналитикаПоДоговорам(КомпонентыОбмена).ДоговорВДоговор Тогда
		Если ТипЗнч(ОбъектРасчетов) = Тип("Структура") Тогда
			// Если в документе соглашение и заказ - 2 разных реквизита, то значения этих реквизитов передаются в структуре:
			// "Заказ" - Ссылка на Заказ клиента (поставщику).
			// "Соглашение" - Ссылка на Соглашение с клиентом (поставщиком).
			// "Сделки" - Ссылка на Сделку с клиентом.
			ЗаказСсылка      = Неопределено;
			СоглашениеСсылка = Неопределено;
			СделкаСсылка     = Неопределено;
			
			ЭтоЗаказ      = ОбъектРасчетов.Свойство("Заказ", ЗаказСсылка) И ЗначениеЗаполнено(ЗаказСсылка);
			ЭтоСоглашение = ОбъектРасчетов.Свойство("Соглашение", СоглашениеСсылка) И ЗначениеЗаполнено(СоглашениеСсылка);
			ЭтоСделка     = ОбъектРасчетов.Свойство("Сделка", СделкаСсылка) И ЗначениеЗаполнено(СделкаСсылка);
		Иначе
			// Подразумевается, что реквизит выгружаемого документа "Заказ" - имеет составной тип
			// и может быть Заказом, Соглашением, Сделкой или другим видом документа/справочника,
			// помимо этого у объекта, указанного в этом реквизите могут быть реквизиты "Соглашение" и/или "Сделка".
			ЗаказСсылка      = ОбъектРасчетов;
			СоглашениеСсылка = ОбъектРасчетов;
			СделкаСсылка     = ОбъектРасчетов;
			
			ЭтоЗаказ = ТипЗнч(ОбъектРасчетов) = Тип("ДокументСсылка.ЗаказКлиента")
				Или ТипЗнч(ОбъектРасчетов) = Тип("ДокументСсылка.ЗаказПоставщику");
			
			РеквизитыЗаказа = Новый Массив;
			Если ОбъектРасчетов.Метаданные().Реквизиты.Найти("Соглашение") <> Неопределено Тогда
				РеквизитыЗаказа.Добавить("Соглашение");
			КонецЕсли;
			Если ОбъектРасчетов.Метаданные().Реквизиты.Найти("Сделка") <> Неопределено Тогда
				РеквизитыЗаказа.Добавить("Сделка");
			КонецЕсли;
			
			Если РеквизитыЗаказа.Количество() > 0 Тогда
				СтруктураЗаказа = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ОбъектРасчетов, РеквизитыЗаказа);
			Иначе
				СтруктураЗаказа = Новый Структура;
			КонецЕсли;
			
			ЭтоСоглашение = ТипЗнч(ОбъектРасчетов) = Тип("СправочникСсылка.СоглашенияСКлиентами")
				Или ТипЗнч(ОбъектРасчетов) = Тип("СправочникСсылка.СоглашенияСПоставщиками")
				Или (СтруктураЗаказа.Свойство("Соглашение", СоглашениеСсылка) И ЗначениеЗаполнено(СоглашениеСсылка));
				
			ЭтоСделка = ТипЗнч(ОбъектРасчетов) = Тип("СправочникСсылка.СделкиСКлиентами")
				Или (СтруктураЗаказа.Свойство("Сделка", СделкаСсылка) И ЗначениеЗаполнено(СделкаСсылка));
		КонецЕсли;
			
		Если ЭтоЗаказ Или ЭтоСоглашение Или ЭтоСделка Тогда
			Если ЭтоЗаказ И КомпонентыОбмена.ПараметрыКонвертации.НастройкиДопАналитикиПоДоговорам.ЗаказВДоговор Тогда
				
				Запрос = Новый Запрос;
				Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
				
				Запрос.УстановитьПараметр("Ссылка", ЗаказСсылка);
				
				Если ТипЗнч(ЗаказСсылка) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	ЗаказКлиента.Ссылка КАК Ссылка,
					|	ЗаказКлиента.Контрагент КАК Контрагент,
					|	ЗаказКлиента.Организация КАК Организация,
					|	ЗаказКлиента.Дата КАК Дата,
					|	ЗаказКлиента.Номер КАК Номер,
					|	ЗаказКлиента.Валюта КАК Валюта,
					|	ЗаказКлиента.Представление КАК Представление,
					|	ЗаказКлиента.ПорядокОплаты = ЗНАЧЕНИЕ(Перечисление.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях) КАК РасчетыВУсловныхЕдиницах
					|ПОМЕСТИТЬ ВТ_Документ
					|ИЗ
					|	Документ.ЗаказКлиента КАК ЗаказКлиента
					|ГДЕ
					|	ЗаказКлиента.Ссылка = &Ссылка";
					Запрос.Выполнить();
				ИначеЕсли ТипЗнч(ЗаказСсылка) = Тип("ДокументСсылка.ЗаявкаНаВозвратТоваровОтКлиента") Тогда
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	ЗаявкаНаВозвратТоваровОтКлиента.Ссылка КАК Ссылка,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Контрагент КАК Контрагент,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Организация КАК Организация,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Дата КАК Дата,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Номер КАК Номер,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Валюта КАК Валюта,
					|	ЗаявкаНаВозвратТоваровОтКлиента.Представление КАК Представление,
					|	ЗаявкаНаВозвратТоваровОтКлиента.ПорядокОплаты = ЗНАЧЕНИЕ(Перечисление.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях) КАК РасчетыВУсловныхЕдиницах
					|ПОМЕСТИТЬ ВТ_Документ
					|ИЗ
					|	Документ.ЗаявкаНаВозвратТоваровОтКлиента КАК ЗаявкаНаВозвратТоваровОтКлиента
					|ГДЕ
					|	ЗаявкаНаВозвратТоваровОтКлиента.Ссылка = &Ссылка";
					Запрос.Выполнить();
				ИначеЕсли ТипЗнч(ЗаказСсылка) = Тип("ДокументСсылка.ЗаказПоставщику") Тогда
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	ЗаказПоставщику.Ссылка КАК Ссылка,
					|	ЗаказПоставщику.Контрагент КАК Контрагент,
					|	ЗаказПоставщику.Организация КАК Организация,
					|	ЗаказПоставщику.Дата КАК Дата,
					|	ЗаказПоставщику.Номер КАК Номер,
					|	ЗаказПоставщику.Валюта КАК Валюта,
					|	ЗаказПоставщику.Представление КАК Представление,
					|	ЗаказПоставщику.ПорядокОплаты = ЗНАЧЕНИЕ(Перечисление.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях) КАК РасчетыВУсловныхЕдиницах
					|ПОМЕСТИТЬ ВТ_Документ
					|ИЗ
					|	Документ.ЗаказПоставщику КАК ЗаказПоставщику
					|ГДЕ
					|	ЗаказПоставщику.Ссылка = &Ссылка";
					Запрос.Выполнить();
				КонецЕсли;
				
				Если Запрос.МенеджерВременныхТаблиц.Таблицы.Количество() > 0 Тогда
					
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	ВТ_Документ.Ссылка КАК Ссылка,
					|	ВТ_Документ.Контрагент КАК Контрагент,
					|	ВТ_Документ.Организация КАК Организация,
					|	ВТ_Документ.Дата КАК Дата,
					|	ВТ_Документ.Номер КАК Номер,
					|	ВТ_Документ.Валюта КАК ВалютаВзаиморасчетов,
					|	ВТ_Документ.Представление КАК Наименование,
					|	ВТ_Документ.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах,
					|	КурсыВалютСрезПоследних.Курс КАК КурсВзаиморасчетов,
					|	КурсыВалютСрезПоследних.Кратность КАК КратностьВзаиморасчетов
					|ИЗ
					|	ВТ_Документ КАК ВТ_Документ
					|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДок, ) КАК КурсыВалютСрезПоследних
					|		ПО ВТ_Документ.Валюта = КурсыВалютСрезПоследних.Валюта";
					Запрос.УстановитьПараметр("ДатаДок", ДанныеИБ.Дата);
					
					Выборка = Запрос.Выполнить().Выбрать();
					Если Выборка.Следующий() Тогда
						ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, Выборка);
						СтруктураДанныеДоговора.Наименование = ОбщегоНазначенияУТ.ПолучитьПредставлениеДокумента(ЗаказСсылка, Выборка.Номер, Выборка.Дата);
						ДоговорЗаполнен = Истина;
					КонецЕсли;
					
				КонецЕсли;
			КонецЕсли;
			
			Если ЭтоСоглашение И ДопАналитикаПоДоговорам(КомпонентыОбмена).СоглашениеВДоговор Тогда
				
				Запрос = Новый Запрос;
				Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
				
				Запрос.УстановитьПараметр("Ссылка", СоглашениеСсылка);
				
				Если ТипЗнч(СоглашениеСсылка) = Тип("СправочникСсылка.СоглашенияСКлиентами") Тогда
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	СоглашенияСКлиентами.Ссылка КАК Ссылка,
					|	СоглашенияСКлиентами.Контрагент КАК Контрагент,
					|	СоглашенияСКлиентами.Организация КАК Организация,
					|	СоглашенияСКлиентами.Дата КАК Дата,
					|	СоглашенияСКлиентами.Номер КАК Номер,
					|	СоглашенияСКлиентами.Валюта КАК ВалютаВзаиморасчетов,
					|	СоглашенияСКлиентами.Наименование КАК Наименование,
					|	СоглашенияСКлиентами.Типовое КАК Типовое,
					|	СоглашенияСКлиентами.ПорядокОплаты = ЗНАЧЕНИЕ(Перечисление.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях) КАК РасчетыВУсловныхЕдиницах
					|ПОМЕСТИТЬ ВТ_Соглашение
					|ИЗ
					|	Справочник.СоглашенияСКлиентами КАК СоглашенияСКлиентами
					|ГДЕ
					|	СоглашенияСКлиентами.Ссылка = &Ссылка";
					Запрос.Выполнить();
				ИначеЕсли ТипЗнч(СоглашениеСсылка) = Тип("СправочникСсылка.СоглашенияСПоставщиками") Тогда
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	СоглашенияСПоставщиками.Ссылка КАК Ссылка,
					|	СоглашенияСПоставщиками.Контрагент КАК Контрагент,
					|	СоглашенияСПоставщиками.Организация КАК Организация,
					|	СоглашенияСПоставщиками.Дата КАК Дата,
					|	СоглашенияСПоставщиками.Номер КАК Номер,
					|	СоглашенияСПоставщиками.Валюта КАК ВалютаВзаиморасчетов,
					|	СоглашенияСПоставщиками.Наименование КАК Наименование,
					|	ЛОЖЬ КАК Типовое,
					|	СоглашенияСПоставщиками.ПорядокОплаты = ЗНАЧЕНИЕ(Перечисление.ПорядокОплатыПоСоглашениям.РасчетыВВалютеОплатаВРублях) КАК РасчетыВУсловныхЕдиницах
					|ПОМЕСТИТЬ ВТ_Соглашение
					|ИЗ
					|	Справочник.СоглашенияСПоставщиками КАК СоглашенияСПоставщиками
					|ГДЕ
					|	СоглашенияСПоставщиками.Ссылка = &Ссылка";
					Запрос.Выполнить();
				КонецЕсли;
				
				Если Запрос.МенеджерВременныхТаблиц.Таблицы.Количество() > 0 Тогда
					
					Запрос.Текст = 
					"ВЫБРАТЬ
					|	СоглашенияСКлиентами.Ссылка КАК Ссылка,
					|	СоглашенияСКлиентами.Контрагент КАК Контрагент,
					|	СоглашенияСКлиентами.Организация КАК Организация,
					|	СоглашенияСКлиентами.Дата КАК Дата,
					|	СоглашенияСКлиентами.Номер КАК Номер,
					|	СоглашенияСКлиентами.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
					|	СоглашенияСКлиентами.Наименование КАК Наименование,
					|	СоглашенияСКлиентами.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах,
					|	СоглашенияСКлиентами.Типовое КАК Типовое,
					|	КурсыВалютСрезПоследних.Курс КАК КурсВзаиморасчетов,
					|	КурсыВалютСрезПоследних.Кратность КАК КратностьВзаиморасчетов
					|ИЗ
					|	ВТ_Соглашение КАК СоглашенияСКлиентами
					|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДок, ) КАК КурсыВалютСрезПоследних
					|		ПО СоглашенияСКлиентами.ВалютаВзаиморасчетов = КурсыВалютСрезПоследних.Валюта";
					Запрос.УстановитьПараметр("ДатаДок", ДанныеИБ.Дата);
					
					Выборка = Запрос.Выполнить().Выбрать();
					Если Выборка.Следующий() Тогда
						ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, Выборка);
						
						Если Не ЗначениеЗаполнено(СтруктураДанныеДоговора.Контрагент) Тогда
							Если ЕстьРеквизитДанныхИБ(ДанныеИБ, "Контрагент") Тогда
								СтруктураДанныеДоговора.Контрагент = ДанныеИБ.Контрагент;
							Иначе
								СтруктураДанныеДоговора.Контрагент = ПараметрыПоУмолчанию.Контрагент;
							КонецЕсли;
						КонецЕсли;
						
						Если Не ЗначениеЗаполнено(СтруктураДанныеДоговора.Организация) Тогда
							Если ЗначениеЗаполнено(ДанныеИБ.Организация) Тогда
								СтруктураДанныеДоговора.Организация = ДанныеИБ.Организация;
							Иначе
								СтруктураДанныеДоговора.Организация = ПараметрыПоУмолчанию.Организация;
							КонецЕсли;
						КонецЕсли;
						
						Если ТипЗнч(СоглашениеСсылка) = Тип("СправочникСсылка.СоглашенияСКлиентами") Тогда
							Наименование = ?(Выборка.Типовое, НСтр("ru = 'Типовое'"), НСтр("ru = 'Индивидуальное'")) + "; ";
						Иначе
						    Наименование = "";
						КонецЕсли;
						
						Наименование = Наименование + Выборка.Наименование
							+ " " + ?(ЗначениеЗаполнено(Выборка.Номер), "№" + Выборка.Номер, "")
							+ " " + ?(ЗначениеЗаполнено(Выборка.Дата), НСтр("ru = 'от'") + " " + Формат(Выборка.Дата, "ДЛФ=D"), "");
							
						СтруктураДанныеДоговора.Наименование = СокрЛП(Наименование);
						ДоговорЗаполнен = Истина;
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ЭтоСделка И ДопАналитикаПоДоговорам(КомпонентыОбмена).СделкаВДоговор Тогда
				Запрос = Новый Запрос(
				"ВЫБРАТЬ
				|	СделкиСКлиентами.Ссылка,
				|	СделкиСКлиентами.Код КАК Номер,
				|	"""" КАК Контрагент,
				|	"""" КАК Организация,
				|	СделкиСКлиентами.ДатаНачала КАК Дата,
				|	КурсыВалютСрезПоследних.Валюта КАК ВалютаВзаиморасчетов,
				|	СделкиСКлиентами.Наименование КАК Наименование,
				|	КурсыВалютСрезПоследних.Курс КАК КурсВзаиморасчетов,
				|	КурсыВалютСрезПоследних.Кратность КАК КратностьВзаиморасчетов
				|ИЗ
				|	Справочник.СделкиСКлиентами КАК СделкиСКлиентами,
				|	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДок, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
				|ГДЕ
				|	СделкиСКлиентами.Ссылка = &Ссылка");
				Запрос.УстановитьПараметр("Ссылка",  СделкаСсылка);
				Запрос.УстановитьПараметр("ДатаДок", ДанныеИБ.Дата);
				Запрос.УстановитьПараметр("Валюта",  ПараметрыПоУмолчанию.ВалютаВзаиморасчетов);
				
				Выборка = Запрос.Выполнить().Выбрать();
				Если Выборка.Следующий() Тогда
					ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, Выборка);
					СтруктураДанныеДоговора.Организация = ДанныеИБ.Организация;
					Если ЕстьРеквизитДанныхИБ(ДанныеИБ, "Контрагент") Тогда
						СтруктураДанныеДоговора.Контрагент = ДанныеИБ.Контрагент;
					Иначе
						СтруктураДанныеДоговора.Контрагент = ПараметрыПоУмолчанию.Контрагент;
					КонецЕсли;
					Если ПараметрыПоУмолчанию.Свойство("РасчетыВУсловныхЕдиницах") Тогда
						СтруктураДанныеДоговора.РасчетыВУсловныхЕдиницах = ПараметрыПоУмолчанию.РасчетыВУсловныхЕдиницах;
					КонецЕсли;
					СтруктураДанныеДоговора.Наименование = ?(ЗначениеЗаполнено(СделкаСсылка.Метаданные().ПредставлениеОбъекта),
						СделкаСсылка.Метаданные().ПредставлениеОбъекта, СделкаСсылка.Метаданные().Синоним)
							+ ?(ЗначениеЗаполнено(Выборка.Номер), " " + Выборка.Номер, "");
					ДоговорЗаполнен = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	//Если Не ДоговорЗаполнен Тогда
	//	ЗаполнитьЗначенияСвойств(СтруктураДанныеДоговора, ПараметрыПоУмолчанию, , "Дата, Номер");
	//	СтруктураДанныеДоговора.Наименование = НСтр("ru = 'Основной договор'");
	//ИначеЕсли ВерсияФорматаЧислом(КомпонентыОбмена.ВерсияФорматаОбмена) > ВерсияФорматаЧислом("1.3") Тогда
	//	СтруктураДанныеДоговора.ВнешнийИдентификатор = СтруктураДанныеДоговора.Наименование;
	//КонецЕсли;
	
	ДопРеквизиты = Новый ТаблицаЗначений;
	ДопРеквизиты.Колонки.Добавить("Свойство");
	ДопРеквизиты.Колонки.Добавить("ЗначениеСвойства");
	
	СтрокаДопРеквизитов = ДопРеквизиты.Добавить();
	СтрокаДопРеквизитов.Свойство = Новый Структура("Наименование", "ВиртуальныйДоговор");
	СтрокаДопРеквизитов.ЗначениеСвойства = "ВиртуальныйДоговор";
	
	СтруктураДанныеДоговора.Вставить("ДополнительныеРеквизиты", ДопРеквизиты);
	
	Договор = Новый Структура("Значение, ИмяПКО", СтруктураДанныеДоговора, "Справочник_ДоговорыКонтрагентов_ИзСтруктуры");
	
	ПравилоОбработки = КомпонентыОбмена.ПравилаОбработкиДанных.Найти("Справочник_ДоговорыКонтрагентов_Отправка", "Имя");
	Если Не ПравилоОбработки = Неопределено Тогда
		ОбменДаннымиXDTOСервер.ВыгрузкаОбъектаВыборки(КомпонентыОбмена, СтруктураДанныеДоговора, ПравилоОбработки);
	КонецЕсли;
	
	Возврат Договор;
КонецФункции

Также потребуется добавить расширение в бухгалтерии с общим модулем "МенеджерОбменаЧерезУниверсальныйФормат13" и переинициализацией процедуры:

&Вместо("ОсновнойДоговорКонтрагента")
Функция РасшМОБ_ОсновнойДоговорКонтрагента(Объект, Организация, Контрагент, ВалютаВзаиморасчетов)

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

 

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

Наименование Файл Версия Размер
Правила обмена из БП 3.0.78.64 в УТ 11.4.12.61:

.xml 461,64Kb
51
.xml 461,64Kb 51 Скачать
Расширение для УТ 11.4.12.61 для безошибочного типового обмена:

.cfe 6,20Kb
20
.cfe 6,20Kb 20 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Кукуруза 20.10.20 07:11 Сейчас в теме
Добрый день. Попытался воспользоваться правилами обмена с УТ на базе БСО: Бухгалтерия строительной организации. Это конфигурация по сути БП3.0, только с добавленным функционалом. Обмен не проходит с ошибкой:

Ошибка в обработчике события ПередВыгрузкойОбъекта
ПКО = ПриобретениеТоваровУслуг (Документ: Поступление (акты, накладные))
Объект = Отражение НДС к вычету 26 от 21.06.2019 12:00:02 (Отражение НДС к вычету)
Обработчик = ПередВыгрузкойОбъекта
ОписаниеОшибки = Поле объекта не обнаружено (ВидОперации)
ПозицияМодуля = (1)
КодСообщения = 41

Есть ли возможность доработать правила за дополнительную плату?
2. Kitri 84 20.10.20 12:38 Сейчас в теме
(1)Добрый день.
Можете скинуть структуру вашей базы, её нужно выгрузить с помощью файла выгрузки MD83Exp.epf
Если у вас его нет, могу скинуть на почту.
3. Serge_ASB 14.11.20 22:09 Сейчас в теме
Добрый вечер.
Прочел, что стандартным путем, через синхронизацию (универсальный формат данных) из БП 3.0 в УТ 11 документы товарные из бухи не выгружаются. У меня выгрузились только касса и банк.
Будет ли данные правила обмена "работать" гарантированно, или нужно будет внутри бухгалтерии тоже что-то подкорректировать, в каких-нибудь общих модулях?
4. Kitri 84 15.11.20 11:10 Сейчас в теме
(3)Добрый день.
Трудно сказать будет ли гарантированно работать данный обмен, особенно если версии конфигурации отличаются, или отличается ведение учета.
Есть недавний пример, в базе БП в счетах-фактурах документами-основаниями являются "Поступления доп.расходов".
В данных правилах нет выгрузки документа "Поступления доп.расходов", поэтому выгрузка работать не будет.
Я сама долго искала хоть какого-нибудь примерного обмена, чтобы правила писать не с "нуля", но так и не нашла. Пришлось делать самой.
Поэтому данные правила - это скорее пример, чтобы было с чего стартовать.
6. Cherepovets 08.12.20 17:55 Сейчас в теме
(3) Через редактор реквизитов, установи в плане обмене выгрузку торговых документов к примеру, и обмен по ним заработает. Тут правильно написали, из БУХ в УТ не улетают документы по поступлению объектов строительства к примеру.
5. Serge_ASB 16.11.20 08:19 Сейчас в теме
А, вообще, странно, что 1С считает безусловным порядок, где БП является на 110% получателем документов, и никак, кроме банка и кассы - не их отправитель.
Не пробовали, все-таки, в конфе найти и "отключить" "отключатель" регистрации документов товародвижения к обмену?
Оставьте свое сообщение

См. также

Перенос объектов 1С Промо

Перенос данных из 1C8 в 1C8 v8 v8::УФ 1cv8.cf Абонемент ($m)

Простой и наглядный перенос объектов между любыми базами 1С 8 с предварительным анализом на возможные различия в данных (через файл, через интернет, через буфер обмена). Интерактивная настройка правил обмена на стороне источника и получателя. В обработке есть удобный обзор по подсистемам, поиск и обработка данных по заданному фильтру. Сравнение объектов, поиск ссылок. Конструктор кода по созданию объектов, написание скриптов и отладка мини-функций в УФ. Отключение/включение регламентных заданий. Регистрация/снятие с регистрации объектов в планах обмена. И многое другое. Инструменты администратора в одной обработке.

1 стартмани

16.03.2015    94530    2043    moolex    199