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