Синхронизация данных через универсальный формат / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ПроцедурыИФункцииБсп

#Область ВыводОписаний

// Возвращает представление команды создания нового обмена данными.
//
// Возвращаемое значение:
//  Строка - представление команды, выводимое в пользовательском интерфейсе.
//
// Например:
//	Возврат НСтр("ru = 'Создать обмен в распределенной информационной базе'");
//
Функция ЗаголовокКомандыДляСозданияНовогоОбменаДанными() Экспорт
	
	Возврат НСтр("ru = 'Любая программа с поддержкой универсального формата данных'");
	
КонецФункции

// Возвращает краткую информацию по обмену, выводимую при настройке синхронизации данных.
//
// Параметры:
//   ИдентификаторНастройки          - Строка - имя дополнительной настройки обмена.
//
// Возвращаемое значение:
//   Строка - краткая информация по обмену.
//
Функция КраткаяИнформацияПоОбмену(ИдентификаторНастройки)
	
	ПоясняющийТекст = "";
	
	Если ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБП30() Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""Бухгалтерия предприятия, редакция 3.0"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	ИначеЕсли ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБПКОРП30() Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""Бухгалтерия предприятия КОРП, редакция 3.0"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	ИначеЕсли ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБазовойУТБП30() Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит отправлять данные из программы ""1С:Управление торговлей базовая, редакция 11""
		|в программу ""Бухгалтерия предприятия, редакция 3.0"". Синхронизация данных выполняется в одностороннем режиме.'");
	ИначеЕсли ИдентификаторНастройки = "ОбменКасса" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""1С:Касса"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	ИначеЕсли ИдентификаторНастройки = "ОбменУПРМК" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""1С:Рабочее место кассира"".  В синхронизации участвуют документы и нормативно-справочная информация.'"); 
	ИначеЕсли ИдентификаторНастройки = "ОбменДО" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""1С:Документооборот КОРП, редакция 3.0"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	//++ НЕ УТ
	ИначеЕсли ИдентификаторНастройки = "ОбменУПБП" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""Бухгалтерия предприятия, редакция 3.0"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	ИначеЕсли ИдентификаторНастройки = "ОбменУП2ЗУП3" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""Зарплата и Управление Персоналом, редакция 3"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	ИначеЕсли ИдентификаторНастройки = "ОбменУПУПП" Тогда
		ПоясняющийТекст = НСтр("ru = 'Данная настройка позволит синхронизировать данные между программами ""%1""
		|и ""Управление производственным предприятием, редакция 1.3"".  В синхронизации участвуют документы и нормативно-справочная информация.'");
	//-- НЕ УТ
	Иначе
		ПоясняющийТекст = НСтр("ru = 'Позволяет синхронизировать данные между любыми программами, поддерживающими универсальный формат обмена ""Enterprise Data"".'");
	КонецЕсли;
	
	ПоясняющийТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                     ПоясняющийТекст, Метаданные.Синоним);
	
	Возврат ПоясняющийТекст;
	
КонецФункции

//++ Локализация

// Возвращает ссылку на подробную информацию по настраиваемой синхронизации,
//
// Параметры:
//      ИдентификаторНастройки          - Строка - имя дополнительной настройки обмена.
//
// Возвращаемое значение:
//      Строка - Ссылка на подробную информацию по настраиваемой синхронизации
//               в виде гиперссылки или полного пути к форме.
//
Функция ПодробнаяИнформацияПоОбмену(ИдентификаторНастройки)
	
	ИмяФормыПодробнойИнформации = "ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Форма.ПодробнаяИнформация";
	
	Если ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБП30()
		Или ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБПКОРП30()
		Или ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБазовойУТБП30()
		Или ИдентификаторНастройки = "ОбменУПБП" Тогда
		ИмяФормыПодробнойИнформации = "ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Форма.ПодробнаяИнформацияБП30";
	//++ НЕ УТ	
	ИначеЕсли ИдентификаторНастройки = "ОбменУП2ЗУП3" Тогда
		ИмяФормыПодробнойИнформации = "ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Форма.ПодробнаяИнформацияЗУП3";
	//-- НЕ УТ
	КонецЕсли;
	
	Возврат ИмяФормыПодробнойИнформации;
	
КонецФункции

//-- Локализация

#КонецОбласти

#Область ПереопределяемаяНастройкаДополненияВыгрузки

// Предназначена для настройки вариантов интерактивной настройки выгрузки по сценарию узла.
// Для настройки необходимо установить значения свойств параметров в необходимые значения.
//
// Параметры:
//     Получатель - ПланОбменаСсылка - Узел, для которого производится настройка
//     Параметры  - Структура        - Параметры для изменения. Содержит поля:
//
//         ВариантБезДополнения - Структура     - настройки типового варианта "Не добавлять".
//                                                Содержит поля:
//             Использование - Булево - флаг разрешения использования варианта. По умолчанию Истина.
//             Порядок       - Число  - порядок размещения варианта на форме помощника, сверху вниз. По умолчанию 1.
//             Заголовок     - Строка - позволяет переопределить название типового варианта.
//             Пояснение     - Строка - позволяет переопределить текст пояснения варианта для пользователя.
//
//         ВариантВсеДокументы - Структура      - настройки типового варианта "Добавить все документы за период".
//                                                Содержит поля:
//             Использование - Булево - флаг разрешения использования варианта. По умолчанию Истина.
//             Порядок       - Число  - порядок размещения варианта на форме помощника, сверху вниз. По умолчанию 2.
//             Заголовок     - Строка - позволяет переопределить название типового варианта.
//             Пояснение     - Строка - позволяет переопределить текст пояснения варианта для пользователя.
//
//         ВариантПроизвольныйОтбор - Структура - настройки типового варианта "Добавить данные с произвольным отбором".
//                                                Содержит поля:
//             Использование - Булево - флаг разрешения использования варианта. По умолчанию Истина.
//             Порядок       - Число  - порядок размещения варианта на форме помощника, сверху вниз. По умолчанию 3.
//             Заголовок     - Строка - позволяет переопределить название типового варианта.
//             Пояснение     - Строка - позволяет переопределить текст пояснения варианта для пользователя.
//
//         ВариантДополнительно - Структура     - настройки дополнительного варианта по сценарию узла.
//                                                Содержит поля:
//             Использование            - Булево            - флаг разрешения использования варианта. По умолчанию Ложь.
//             Порядок                  - Число             - порядок размещения варианта на форме помощника, сверху
//                                                            вниз. По умолчанию 4.
//             Заголовок                - Строка            - название варианта для отображения на форме.
//             ИмяФормыОтбора           - Строка            - Имя формы, вызываемой для редактирования настроек.
//             ЗаголовокКомандыФормы    - Строка            - Заголовок для отрисовки на форме команды открытия формы настроек.
//             ИспользоватьПериодОтбора - Булево            - флаг того, что необходим общий отбор по периоду. По
//                                                            умолчанию Ложь.
//             ПериодОтбора             - СтандартныйПериод - значение периода общего отбора, предлагаемого по умолчанию.
//
//             Отбор                    - ТаблицаЗначений   - содержит строки с описанием подробных отборов по сценарию узла.
//                                                            Содержит колонки:
//                 ПолноеИмяМетаданных - Строка                - полное имя метаданных регистрируемого объекта, отбор
//                                                               которого описывает строка. Например
//                                                               "Документ._ДемоПоступлениеТоваров". Можно  использовать
//                                                               специальные значения "ВсеДокументы" и "ВсеСправочники"
//                                                               для отбора соответственно всех документов и всех
//                                                               справочников, регистрирующихся на узле Получатель.
//                 ВыборПериода        - Булево                - флаг того, что данная строка описывает отбор с общим периодом.
//                 Период              - СтандартныйПериод     - значение периода общего отбора для метаданных строки,
//                                                               предлагаемого по умолчанию.
//                 Отбор               - ОтборКомпоновкиДанных - отбор по умолчанию. Поля отбора формируются в
//                                                               соответствии с общим правилами формирования полей
//                                                               компоновки. Например, для указания отбора по реквизиту
//                                                               документа "Организация", необходимо использовать поле "Ссылка.Организация".
Процедура НастроитьИнтерактивнуюВыгрузку(Получатель, Параметры) Экспорт
	
	РеквизитыУзлаОбмена = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Получатель, "РежимВыгрузкиДокументов, РежимВыгрузкиСправочников");
	
	Если РеквизитыУзлаОбмена.РежимВыгрузкиДокументов = Перечисления.РежимыВыгрузкиОбъектовОбмена.НеВыгружать 
		И РеквизитыУзлаОбмена.РежимВыгрузкиСправочников = Перечисления.РежимыВыгрузкиОбъектовОбмена.НеВыгружать Тогда
		
		Параметры.ВариантВсеДокументы.Использование      = Ложь;
		Параметры.ВариантБезДополнения.Использование     = Ложь;
		Параметры.ВариантПроизвольныйОтбор.Использование = Ложь;
		Параметры.ВариантДополнительно.Использование     = Ложь;
		
	Иначе
		
		// Отключаем вариант "ВариантВсеДокументы"
		
		Параметры.ВариантВсеДокументы.Использование = Ложь;
		
		// Настраиваем вариант "Без дополнения" 
		Параметры.ВариантБезДополнения.Использование = Истина;
		Параметры.ВариантБезДополнения.Порядок       = 3;
		Параметры.ВариантБезДополнения.Заголовок     = НСтр("ru = 'Не добавлять документы к отправке'") 
			+ Символы.ПС 
			+ НСтр("ru = 'Отправлять только нормативно-справочную информацию, измененную с момента последней отправки.'");
		
		// Настраиваем вариант "Произвольный отбор" 
		Параметры.ВариантПроизвольныйОтбор.Использование = Истина;
		Параметры.ВариантПроизвольныйОтбор.Порядок       = 2;
		
		ПравилаОтправкиДокументовПолучателя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Получатель, "ПравилаОтправкиДокументов");
		
		Если ПравилаОтправкиДокументовПолучателя = "НеСинхронизировать" Тогда
			Параметры.ВариантПроизвольныйОтбор.Заголовок = НСтр("ru = 'Добавить справочники'");
		Иначе
			Параметры.ВариантПроизвольныйОтбор.Заголовок = НСтр("ru = 'Добавить произвольные справочники и документы'");
		КонецЕсли;
		
		Если Не ПравилаОтправкиДокументовПолучателя = "НеСинхронизировать" Тогда
			// Вычисляем и устанавливаем параметры сценария
			ПараметрыПоУмолчанию = ПараметрыВыгрузкиПоУмолчанию(Получатель);
			
			// Настраиваем вариант "Дополнительно" по сценарию узла
			Параметры.ВариантДополнительно.Использование            = Истина;
			Параметры.ВариантДополнительно.Порядок                  = 1;
			Параметры.ВариантДополнительно.Заголовок                = НСтр("ru='Отправить все документы'");
			Параметры.ВариантДополнительно.ИмяФормыОтбора           = "ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Форма.НастройкаВыгрузки";
			Параметры.ВариантДополнительно.ЗаголовокКомандыФормы    = НСтр("ru='Выбрать организации для отбора'");
			Параметры.ВариантДополнительно.ИспользоватьПериодОтбора = Истина;
			Параметры.ВариантДополнительно.ПериодОтбора             = ПараметрыПоУмолчанию.Период;
			
			// Добавляем строка настройки отбора
			ОписаниеОтбора = Параметры.ВариантДополнительно.Отбор; // ТаблицаЗначений
			 
			СтрокаОтбора = ОписаниеОтбора.Добавить();
			СтрокаОтбора.ПолноеИмяМетаданных = "ВсеДокументы";
			СтрокаОтбора.ВыборПериода = Истина;
			СтрокаОтбора.Период       = ПараметрыПоУмолчанию.Период;
			СтрокаОтбора.Отбор        = ПараметрыПоУмолчанию.Отбор;
		Иначе
			Параметры.ВариантДополнительно.Использование = Ложь;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Возвращает представление отбора для варианта дополнения выгрузки по сценарию узла.
// См. описание "ВариантДополнительно" в процедуре "НастроитьИнтерактивнуюВыгрузку".
//
// Параметры:
//     Получатель - ПланОбменаСсылка - Узел, для которого определяется представление отбора
//     Параметры  - Структура        - Характеристики отбора. Содержит поля:
//         ИспользоватьПериодОтбора - Булево            - флаг того, что необходимо использовать общий отбор по периоду.
//         ПериодОтбора             - СтандартныйПериод - значение периода общего отбора.
//         Отбор                    - ТаблицаЗначений   - содержит строки с описанием подробных отборов по сценарию узла.
//                                                        Содержит колонки:
//                 ПолноеИмяМетаданных - Строка                - полное имя метаданных регистрируемого объекта, отбор
//                                                               которого описывает строка. Например
//                                                               "Документ._ДемоПоступлениеТоваров". Могут быть
//                                                               использованы специальные значения "ВсеДокументы" и
//                                                               "ВсеСправочники" для отбора соответственно всех
//                                                               документов и всех справочников, регистрирующихся на
//                                                               узле Получатель.
//                 ВыборПериода        - Булево                - флаг того, что данная строка описывает отбор с общим периодом.
//                 Период              - СтандартныйПериод     - значение периода общего отбора для метаданных строки.
//                 Отбор               - ОтборКомпоновкиДанных - поля отбора. Поля отбора формируются в соответствии с
//                                                               общим правилами формирования полей компоновки.
//                                                               Например, для указания отбора по реквизиту документа
//                                                               "Организация", будет использовано поле "Ссылка.Организация".
//
// Возвращаемое значение: 
//     Строка - описание отбора
//
Функция ПредставлениеОтбораИнтерактивнойВыгрузки(Получатель, Параметры) Экспорт
	
	Если Параметры.ИспользоватьПериодОтбора Тогда
		Если ЗначениеЗаполнено(Параметры.ПериодОтбора) Тогда
			ОписаниеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='за период: %1'"), НРег(Параметры.ПериодОтбора));
		Иначе
			ДатаНачалаВыгрузки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Получатель, "ДатаНачалаВыгрузкиДокументов");
			Если ЗначениеЗаполнено(ДатаНачалаВыгрузки) Тогда
				ОписаниеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru='начиная с даты начала отправки документов: %1'"), Формат(ДатаНачалаВыгрузки, "ДЛФ=DD"));
			Иначе
				ОписаниеПериода = НСтр("ru='за весь период учета'");
			КонецЕсли;
		КонецЕсли;
	Иначе
		ОписаниеПериода = "";
	КонецЕсли;
	
	СписокОрганизаций = ОрганизацииОтбораИнтерактивнойВыгрузки(Параметры.Отбор);
	
	Если СписокОрганизаций.Количество()=0 Тогда
		ОписаниеОтбораОрганизации = НСтр("ru='по всем организациям'");
	Иначе
		ОписаниеОтбораОрганизации = "";
		Для Каждого Элемент Из СписокОрганизаций Цикл
			ОписаниеОтбораОрганизации = ОписаниеОтбораОрганизации+ ", " + Элемент.Представление;
		КонецЦикла;
		ОписаниеОтбораОрганизации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='с отбором по организациям: %1'"), СокрЛП(Сред(ОписаниеОтбораОрганизации, 2)));
	КонецЕсли;
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru='Будут отправлены все документы %1,
		|%2'"),
		ОписаниеПериода, ОписаниеОтбораОрганизации);
	
КонецФункции

// Расчет параметров выгрузки по умолчанию.
//
// Параметры:
//     Получатель - ПланОбменаСсылка - Узел, для которого производится настройка.
//
// Возвращаемое значение - Структура - содержит поля:
//     ПредставлениеОтбора - Строка - текстовое описание отбора по умолчанию 
//     Период              - СтандартныйПериод     - значение периода общего отбора по умолчанию
//     Отбор               - ОтборКомпоновкиДанных - отбор.
//
Функция ПараметрыВыгрузкиПоУмолчанию(Получатель)
	
	Результат = Новый Структура;
	
	// Период по умолчанию
	Результат.Вставить("Период", Новый СтандартныйПериод);
	Результат.Период.Вариант = ВариантСтандартногоПериода.ПрошлыйМесяц;
	
	// Отбор по умолчанию и его представление
	КомпоновщикОтбора = Новый КомпоновщикНастроекКомпоновкиДанных;
	Результат.Вставить("Отбор", КомпоновщикОтбора.Настройки.Отбор);
	
	// Общее представление, период не включаем, так как в этом сценарии поле периода будет редактироваться отдельно.
	Результат.Вставить( "ПредставлениеОтбора", 
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru='Будут отправлены все документы за %1'"),
		НРег(Строка(Результат.Период.Вариант))));
	
	Возврат Результат;
	
КонецФункции

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

// Добавляет в список организаций коллекцию
//
// Параметры:
//     Список      - СписокЗначений из СправочникСсылка.Организации - дополняемый список
//     Организации - СправочникСсылка.Организации, Массив из СправочникСсылка.Организации - коллекция организаций.
// 
Процедура ДобавитьСписокОрганизаций(Список, Знач Организации)
	
	Для Каждого Организация Из Организации Цикл
		
		Если ТипЗнч(Организация)=Тип("Массив") Тогда
			ДобавитьСписокОрганизаций(Список, Организация);
			Продолжить;
		КонецЕсли;
		
		Если Список.НайтиПоЗначению(Организация)=Неопределено Тогда
			Список.Добавить(Организация, Организация.Наименование);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

// При определении поддерживаемых объектов формата.
// 
// Параметры:
//  ПоддерживаемыеОбъекты - ТаблицаЗначений - Содержит перечень объектов формата, поддерживаемых данной информационной базой в разрезе версий формата:
//   *Версия - Строка - Версия формата, например "1.6"
//   *Объект - Строка - Объект формата, например "Справочник.Номенклатура"
//   *Отправка - Булево - Истина, если в информационной базе поддерживается отправка данного объекта формата
//               Колонка доступна, если Режим = "Отправка" или "ОтправкаПолучение"
//   *Получение - Булево - Истина, если в информационной базе поддерживается получение данного объекта формата
//               Колонка доступна, если Режим = "Получение", "ОтправкаПолучение"
//  Режим - Строка - Вид запрашиваемой информации. Возможные значения: "Отправка" - запрос объектов формата,
//			для которых поддерживается отправка; "Получение" - запрос объектов, для которых поддерживается получение;
//			"ОтправкаПолучение" - запрос всех поддерживаемых объектов формата.
//  УзелОбмена - ПланОбменаСсылка, Неопределено - Ссылка на узел плана обмена, соответствующий корреспонденту,
//			в контексте которого запрашивается информация о поддерживаемых объектах формата. 
//          Может использоваться при необходимости ограничить список поддерживаемых этой информационной базой объектов 
//          в зависимости от варианта настройки обмена, заданного на узле.
//
Процедура ПриОпределенииПоддерживаемыхОбъектовФормата(ПоддерживаемыеОбъекты, Режим, УзелОбмена = Неопределено) Экспорт
	
	РазрешитьЗагрузкуДанныхВБазовуюВерсию = ?(УзелОбмена <> Неопределено, УзелОбмена.РазрешитьЗагрузкуДанныхВБазовуюВерсию, Ложь);
	Если СтрНайти(Режим, "Получение") > 0 И СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации()
		И НЕ РазрешитьЗагрузкуДанныхВБазовуюВерсию Тогда
		ПоддерживаемыеОбъекты.ЗаполнитьЗначения(Ложь, "Получение");
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область Прочее

// Заполняет настройки, влияющие на использование плана обмена.
// 
// Параметры:
//  Настройки - см. ОбменДаннымиСервер.НастройкиПланаОбменаПоУмолчанию
//
Процедура ПриПолученииНастроек(Настройки) Экспорт
	
	Настройки.ИмяКонфигурацииИсточника = ОбменДаннымиУТУП.ИмяКонфигурацииИсточника();
	
	Настройки.ЭтоПланОбменаXDTO                              = Истина;
	Настройки.Глобальный                                     = Истина;
	Настройки.ПредупреждатьОНесоответствииВерсийПравилОбмена = Ложь;
	Настройки.ФорматОбмена = "http://v8.1c.ru/edi/edi_stnd/EnterpriseData";
	
	ВерсииФормата = Новый Соответствие;
	ОбменДаннымиУТ.ДоступныеВерсииУниверсальногоФормата(ВерсииФормата);
	
	Настройки.ВерсииФорматаОбмена = ВерсииФормата;
	Настройки.ИспользоватьКешПубличныхИдентификаторов				= Истина;
	Настройки.ПланОбменаИспользуетсяВМоделиСервиса					= Истина;
	
	Настройки.Алгоритмы.ПриПолученииОписанияВариантаНастройки		= Истина;
	Настройки.Алгоритмы.ПриПолученииВариантовНастроекОбмена			= Истина;
	Настройки.Алгоритмы.НастроитьИнтерактивнуюВыгрузку				= Истина;
	Настройки.Алгоритмы.ПредставлениеОтбораИнтерактивнойВыгрузки	= Истина;
	Настройки.Алгоритмы.ПриОпределенииПоддерживаемыхОбъектовФормата = Истина;
	
	Настройки.ПравилаРегистрацииВМенеджере							= Истина;
	Настройки.ИмяМенеджераРегистрации = "МенеджерРегистрации";
	
КонецПроцедуры

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

	//++ НЕ УТ
	Если ПараметрыКонтекста.ИмяКорреспондента = "ЗарплатаИУправлениеПерсоналом"
		Или Не ЗначениеЗаполнено(ПараметрыКонтекста.ИмяКорреспондента) Тогда
		ВариантНастройки = ВариантыНастроекОбмена.Добавить();
		ВариантНастройки.ИдентификаторНастройки        = "ОбменУП2ЗУП3";
		ВариантНастройки.КорреспондентВМоделиСервиса   = Истина;
		ВариантНастройки.КорреспондентВЛокальномРежиме = Истина;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ПараметрыКонтекста.ИмяКорреспондента) Тогда
		ВариантНастройки = ВариантыНастроекОбмена.Добавить();
		ВариантНастройки.ИдентификаторНастройки        = "ОбменУПУПП";
		ВариантНастройки.КорреспондентВМоделиСервиса   = Ложь;
		ВариантНастройки.КорреспондентВЛокальномРежиме = Истина;
	КонецЕсли;
	//-- НЕ УТ	
	Если Не ЗначениеЗаполнено(ПараметрыКонтекста.ИмяКорреспондента) Тогда
		
		ВариантНастройки = ВариантыНастроекОбмена.Добавить();
		ВариантНастройки.ИдентификаторНастройки        = "ОбменКасса";
		ВариантНастройки.КорреспондентВМоделиСервиса   = Истина;
		ВариантНастройки.КорреспондентВЛокальномРежиме = Истина;
		
		ВариантНастройки = ВариантыНастроекОбмена.Добавить();
		ВариантНастройки.ИдентификаторНастройки        = "ОбменУПРМК";
		ВариантНастройки.КорреспондентВМоделиСервиса   = Истина;
		ВариантНастройки.КорреспондентВЛокальномРежиме = Истина;
		
		ВариантНастройки = ВариантыНастроекОбмена.Добавить();
		ВариантНастройки.ИдентификаторНастройки        = "ОбменУниверсальный";
		ВариантНастройки.КорреспондентВМоделиСервиса   = Истина;
		ВариантНастройки.КорреспондентВЛокальномРежиме = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

// Заполняет набор параметров, определяющих вариант настройки обмена.

// При получении описания варианта настройки.
// 
// Параметры:
//  ОписаниеВарианта       - см. ОбменДаннымиСервер.ОписаниеВариантаНастройкиОбменаПоУмолчанию
//  ИдентификаторНастройки - Строка - идентификатор варианта настройки обмена.
//  ПараметрыКонтекста     - см. ОбменДаннымиСервер.ПараметрыКонтекстаПолученияОписанияВариантаНастройки
Процедура ПриПолученииОписанияВариантаНастройки(ОписаниеВарианта, ИдентификаторНастройки, ПараметрыКонтекста) Экспорт
	
	ОписаниеВарианта.ПутьКФайлуКомплектаПравилНаПользовательскомСайте = "https://users.v8.1c.ru/distribution/project/EnterpriseERP20";
	ОписаниеВарианта.ПутьКФайлуКомплектаПравилВКаталогеШаблонов       = "\1c\enterprise";
	ОписаниеВарианта.ИмяФайлаНастроекДляПриемника                     = НСтр("ru = 'Синхронизация данных через формат EnterpriseData'");
	ОписаниеВарианта.ИспользоватьПомощникСозданияОбменаДанными        = ИспользоватьПомощникСозданияОбменаДанными();
	ОписаниеВарианта.ИспользуемыеТранспортыСообщенийОбмена            = ИспользуемыеТранспортыСообщенийОбмена(ИдентификаторНастройки);
	ОписаниеВарианта.КраткаяИнформацияПоОбмену                        = КраткаяИнформацияПоОбмену(ИдентификаторНастройки);
	//++ Локализация
	ОписаниеВарианта.ПодробнаяИнформацияПоОбмену                      = ПодробнаяИнформацияПоОбмену(ИдентификаторНастройки);
	//-- Локализация
	ОписаниеВарианта.ОбщиеДанныеУзлов                                 = ОбщиеДанныеУзлов();
	Если ИдентификаторНастройки = "ОбменДО" Тогда
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = '1С:Документооборот КОРП, редакция 3.0 (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""1С:Документооборот КОРП, редакция. 3.0"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""1С:Документооборот КОРП, редакция 3.0""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = '1С:Документооборот КОРП, редакция 3.0'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "ДокументооборотКОРП");
		
	ИначеЕсли ИдентификаторНастройки = "ОбменУПБП" 
		Или ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБП30()
		Или ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБазовойУТБП30()
		Тогда
		
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = 'Бухгалтерия предприятия, редакция 3.0 (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""Бухгалтерия предприятия, редакция. 3.0"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""Бухгалтерия предприятия, редакция 3.0""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Бухгалтерия предприятия, редакция 3.0'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "БухгалтерияПредприятия");
		
	ИначеЕсли ИдентификаторНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБПКОРП30() Тогда
		
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = 'Бухгалтерия предприятия КОРП, редакция 3.0 (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""Бухгалтерия предприятия КОРП, редакция. 3.0"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""Бухгалтерия предприятия КОРП, редакция 3.0""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Бухгалтерия предприятия КОРП, редакция 3.0'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "БухгалтерияПредприятия");
		
	ИначеЕсли ИдентификаторНастройки = "ОбменУП2ЗУП3" Тогда
		
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = 'Зарплата и Управление Персоналом, редакция 3 (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""Зарплата и Управление Персоналом, редакция 3"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""Зарплата и Управление Персоналом, редакция 3""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Зарплата и Управление Персоналом, редакция 3'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                 "ЗарплатаИУправлениеПерсоналом");
		
	ИначеЕсли ИдентификаторНастройки = "ОбменУПУПП" Тогда
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = 'Управление производственным предприятием, редакция 1.3 (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""Управление производственным предприятием, редакция. 1.3"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""Управление производственным предприятием, редакция 1.3""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Управление производственным предприятием, редакция 1.3'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "УправлениеПроизводственнымПредприятием");
		
	ИначеЕсли ИдентификаторНастройки = "ОбменКасса" Тогда
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = '1С:Касса (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""1С:Касса"" (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""1С:Касса""'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = '1С:Касса'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "Касса");	
		
	ИначеЕсли ИдентификаторНастройки = "ОбменУПРМК" Тогда
		
		ОписаниеВариантаНастройкиОбменУПРМК(ОписаниеВарианта);
		
	ИначеЕсли ИдентификаторНастройки = "ОбменУниверсальный" Тогда
		
		ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = 'Другая программа (EnterpriseData)'"));
		ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации данных через формат EnterpriseData'"));
		ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация данных через формат EnterpriseData'"));
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Другая программа'"));
		ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "ДругаяПрограмма");
		
	Иначе
		
		ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = 'Через формат обмена EnterpriseData'"));
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПереходСУправлениеТорговлей() Экспорт
	
	УзлыПланаОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Выбрать();
	
	Пока УзлыПланаОбмена.Следующий() Цикл
		
		Если СтрНайти(УзлыПланаОбмена.ВариантНастройки, "ОбменБП") > 0 
			Или УзлыПланаОбмена.ВариантНастройки= "ОбменУТ_БП3" Тогда
			ОчереднойУзел = УзлыПланаОбмена.ПолучитьОбъект();
			ОчереднойУзел.ВариантНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБП30();

			ОчереднойУзел.Записать();
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ПрочиеПроцедурыИФункции

// Формирует и возвращает список правил выгрузки договора по данным объектов Взаиморасчетов.
//
// Возвращаемое значение: 
// 	СписокЗначений из Строка.
//
Функция СписокПравилФормированияДоговора() Экспорт
	
	СписокПравил = Новый СписокЗначений;
	СписокПравил.Добавить("БезРазделения", НСтр("ru = 'Договоры контрагентов формируются без привязки к соглашениям или заказам'"));
	
	Если (ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыКлиентов")
		Или ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыПоставщикам"))
		И Не (ПолучитьФункциональнуюОпцию("ИспользоватьПоступлениеПоНесколькимЗаказам")
			И ПолучитьФункциональнуюОпцию("ИспользоватьРеализациюПоНесколькимЗаказам")
			И ПолучитьФункциональнуюОпцию("ИспользоватьАктыВыполненныхРаботПоНесколькимЗаказам")) Тогда
		
		СписокПравил.Добавить("ПоЗаказам", НСтр("ru = 'Разным заказам соответствуют разные договоры контрагентов'"));
		
	КонецЕсли;
	
	Если Константы.ИспользованиеСоглашенийСКлиентами.Получить() <> Перечисления.ИспользованиеСоглашенийСКлиентами.НеИспользовать Тогда
		СписокПравил.Добавить("ПоСоглашениям", НСтр("ru = 'Разным соглашениям соответствуют разные договоры контрагентов'"));
	КонецЕсли;
	
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСделкиСКлиентами") Тогда
		СписокПравил.Добавить("ПоСделкам", НСтр("ru = 'Разным сделкам соответствуют разные договоры контрагентов'"));
	КонецЕсли;
	
	Возврат СписокПравил;
	
КонецФункции

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

	Если Не ИспользоватьОтборПоСкладам И КоличествоВыбранныхСкладов <> 0 Тогда
		УзелПланаОбмена.Склады.Очистить();
	ИначеЕсли КоличествоВыбранныхСкладов = 0 И ИспользоватьОтборПоСкладам Тогда
		УзелПланаОбмена.ИспользоватьОтборПоСкладам = Ложь;
	КонецЕсли;
	
	Если Не ИспользоватьОтборПоФизическимЛицам И КоличествоВыбранныхФизическихЛиц <> 0 Тогда
		УзелПланаОбмена.ФизическиеЛица.Очистить();
	ИначеЕсли КоличествоВыбранныхФизическихЛиц = 0 И ИспользоватьОтборПоФизическимЛицам Тогда
		УзелПланаОбмена.ИспользоватьОтборПоФизическимЛицам = Ложь;
	КонецЕсли;
	
	Если Не ИспользоватьОтборПоКассамККМ И КоличествоВыбранныхКассККМ <> 0 Тогда
		УзелПланаОбмена.КассыККМ.Очистить();
	ИначеЕсли КоличествоВыбранныхКассККМ = 0 И ИспользоватьОтборПоКассамККМ Тогда
		УзелПланаОбмена.ИспользоватьОтборПоКассамККМ = Ложь;
	КонецЕсли;
	
	Если ВариантНастройки = "ОбменУПРМК" И ИспользоватьОтборПоКассамККМ И КоличествоВыбранныхКассККМ <> 0 Тогда
		
		ОбновитьЗависимыеОтборы(УзелПланаОбмена);
		
	КонецЕсли;
	
	Если Не ИспользоватьОтборПоЭТ И КоличествоВыбранныхЭТ <> 0 Тогда
		УзелПланаОбмена.ЭквайринговыеТерминалы.Очистить();
	ИначеЕсли КоличествоВыбранныхЭТ = 0 И ИспользоватьОтборПоЭТ Тогда
		УзелПланаОбмена.ИспользоватьОтборПоЭквайринговымТерминалам = Ложь;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(УзелПланаОбмена.УправленческаяОрганизация) Тогда
		УзелПланаОбмена.УправленческаяОрганизация = Справочники.Организации.УправленческаяОрганизация;
	КонецЕсли;
	
	Если ПравилаОтправкиДокументов <> "АвтоматическаяСинхронизация" Тогда
		УзелПланаОбмена.ДатаНачалаВыгрузкиДокументов = Дата(1,1,1,0,0,0);
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(УзелПланаОбмена.ВерсияФорматаОбмена) Тогда
		УзелПланаОбмена.ВерсияФорматаОбмена = "1.8";
	КонецЕсли;
	
	Если (ИспользоватьОтборПоРазделамУчета 
		И УзелПланаОбмена.РазделыУчета.НайтиСтроки(Новый Структура("Выгружать", Истина)).Количество() = 0)
		Или УзелПланаОбмена.РежимВыгрузкиДокументов = Перечисления.РежимыВыгрузкиОбъектовОбмена.НеВыгружать Тогда
		
		УзелПланаОбмена.ИспользоватьОтборПоРазделамУчета = Ложь;
		
	КонецЕсли;
	
	Если Не УзелПланаОбмена.ИспользоватьОтборПоРазделамУчета Тогда
		
		УзелПланаОбмена.РазделыУчета.Очистить();
		
		РазделыУчета = ПолучитьРазделыУчета(Ложь, ВариантНастройки);
		УзелПланаОбмена.РазделыУчета.Загрузить(РазделыУчета);
		
	КонецЕсли;
	
КонецПроцедуры

// Заполняет описание варианта настройки для обмена с идентификатором "ОбменУПРМК"
// 
// Параметры:
//  ОписаниеВарианта - см. ОбменДаннымиСервер.ОписаниеВариантаНастройкиОбменаПоУмолчанию
Процедура ОписаниеВариантаНастройкиОбменУПРМК(ОписаниеВарианта) Экспорт
	
	ОписаниеВарианта.Вставить("ЗаголовокКомандыДляСозданияНовогоОбменаДанными", НСтр("ru = '1С:Рабочее место кассира (EnterpriseData)'"));
	ОписаниеВарианта.Вставить("ЗаголовокПомощникаСозданияОбмена",               НСтр("ru = 'Настройка синхронизации с программой ""1С:Рабочее место кассира"" (EnterpriseData)'"));
	ОписаниеВарианта.Вставить("ЗаголовокУзлаПланаОбмена",                       НСтр("ru = 'Синхронизация с программой ""1С:Рабочее место кассира""'"));
	ОписаниеВарианта.Вставить("НаименованиеКонфигурацииКорреспондента",         НСтр("ru = '1С:Рабочее место кассира'"));
	ОписаниеВарианта.Вставить("ИмяКонфигурацииКорреспондента",                  "РабочееМестоКассира");
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ОтборПоРазделамВидамДокументов

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

// Начальное заполенение разделов и видов документов, которые в них содержатся.
//
// Параметры:
//   УзелОбъект - ПланОбменаОбъект - план обмена, для которого выполняется заполнение.
//   МассивРазделовПланаОбмена - Массив из Строка - имена разделов, для которых выполняется заполнение.
//
Процедура ЗаполнитьВидыДокументовПоРазделамУчета(УзелОбъект, МассивРазделовПланаОбмена) Экспорт
	
	МассивРазделов = Новый Массив;
	МассивРазделов.Добавить("Ввод остатков");
	МассивРазделов.Добавить("Внеоборотные активы");
	МассивРазделов.Добавить("Закупки");
	МассивРазделов.Добавить("Зарплата");
	МассивРазделов.Добавить("Казначейство");
	МассивРазделов.Добавить("Продажи");
	МассивРазделов.Добавить("Производство");
	МассивРазделов.Добавить("Склад");
	
	МассивВводОстатков  = Новый Массив;
	МассивВводОстатков.Добавить("ВводОстатков");
	МассивВводОстатков.Добавить("ВводОстатковВзаиморасчетов");
	МассивВводОстатков.Добавить("ВводОстатковДенежныхСредств");
	МассивВводОстатков.Добавить("ВводОстатковПоФинансовымИнструментам");
	МассивВводОстатков.Добавить("ВводОстатковСПодотчетниками"); 
	МассивВводОстатков.Добавить("ВводОстатковТоваров");
	
	МассивВнеоборотныеАктивы  = Новый Массив;
	МассивВнеоборотныеАктивы.Добавить("ВводОстатковВнеоборотныхАктивов2_4");
	МассивВнеоборотныеАктивы.Добавить("ВводОстатковВнеоборотныхАктивов"); 
	
	МассивЗакупки = Новый Массив;
	МассивЗакупки.Добавить("ВозвратТоваровПоставщику");
	МассивЗакупки.Добавить("ЗаказПоставщику");
	МассивЗакупки.Добавить("КорректировкаПриобретения");
	МассивЗакупки.Добавить("ОтчетКомитенту");
	МассивЗакупки.Добавить("ПриобретениеТоваровУслуг");
	МассивЗакупки.Добавить("ПриобретениеУслугПрочихАктивов");
	МассивЗакупки.Добавить("СчетФактураПолученный");
	МассивЗакупки.Добавить("СчетФактураПолученныйАванс");
	МассивЗакупки.Добавить("СчетФактураПолученныйНалоговыйАгент");
	МассивЗакупки.Добавить("ТаможеннаяДекларацияИмпорт"); 
	МассивЗакупки.Добавить("УведомлениеОВвозеПрослеживаемыхТоваров");
	МассивЗакупки.Добавить("УведомлениеОбОстаткахПрослеживаемыхТоваров");
	МассивЗакупки.Добавить("УведомлениеОПеремещенииПрослеживаемыхТоваров");
	
	МассивКазначейство  = Новый Массив;
	МассивКазначейство.Добавить("АвансовыйОтчет");
	МассивКазначейство.Добавить("ВнесениеДенежныхСредствВКассуККМ");
	МассивКазначейство.Добавить("ВзаимозачетЗадолженности");
	МассивКазначейство.Добавить("ВедомостьПрочихДоходовВБанк");
	МассивКазначейство.Добавить("ВедомостьПрочихДоходовВКассу");
	МассивКазначейство.Добавить("ВедомостьПрочихДоходовПеречислением");
	МассивКазначейство.Добавить("ВыбытиеДенежныхДокументов");
	МассивКазначейство.Добавить("ВыемкаДенежныхСредствИзКассыККМ");
	МассивКазначейство.Добавить("ЗаявкаНаРасходованиеДенежныхСредств");
	МассивКазначейство.Добавить("КорректировкаЗадолженности");
	МассивКазначейство.Добавить("НачисленияКредитовИДепозитов");
	МассивКазначейство.Добавить("ОперацияПоПлатежнойКарте");
	МассивКазначейство.Добавить("ОперацияПоЯндексКассе");
	МассивКазначейство.Добавить("ОтчетБанкаПоОперациямЭквайринга");
	МассивКазначейство.Добавить("ПоступлениеБезналичныхДенежныхСредств");
	МассивКазначейство.Добавить("ПоступлениеДенежныхДокументов");
	МассивКазначейство.Добавить("ПриходныйКассовыйОрдер");
	МассивКазначейство.Добавить("РасходныйКассовыйОрдер");
	МассивКазначейство.Добавить("СписаниеБезналичныхДенежныхСредств"); 
	
	МассивПродажи  = Новый Массив;
	МассивПродажи.Добавить("АктВыполненныхРабот");
	МассивПродажи.Добавить("АннулированиеПодарочныхСертификатов");
	МассивПродажи.Добавить("АктВыполненныхРабот");
	МассивПродажи.Добавить("ВозвратПодарочныхСертификатов");
	МассивПродажи.Добавить("ВозвратТоваровОтКлиента");
	МассивПродажи.Добавить("ВозвратТоваровМеждуОрганизациями");
	МассивПродажи.Добавить("ЗаказКлиента");
	МассивПродажи.Добавить("КассоваяСмена");
	МассивПродажи.Добавить("КорректировкаРеализации");
	МассивПродажи.Добавить("ОтчетКомиссионера");
	МассивПродажи.Добавить("ОтчетКомиссионераОСписании");
	МассивПродажи.Добавить("ОтчетПоКомиссииМеждуОрганизациями");
	МассивПродажи.Добавить("ОтчетПоКомиссииМеждуОрганизациямиОСписании");
	МассивПродажи.Добавить("ОтчетКомитенту");
	МассивПродажи.Добавить("ОтчетКомитентуОСписании");
	МассивПродажи.Добавить("ОтчетОРозничныхВозвратах");
	МассивПродажи.Добавить("ОтчетОРозничныхПродажах");
	МассивПродажи.Добавить("ПередачаТоваровХранителю");
	МассивПродажи.Добавить("ПередачаТоваровМеждуОрганизациями");
	МассивПродажи.Добавить("РеализацияПодарочныхСертификатов");
	МассивПродажи.Добавить("РеализацияТоваровУслуг"); 
	МассивПродажи.Добавить("РеализацияУслугПрочихАктивов");
	МассивПродажи.Добавить("СчетНаОплатуКлиенту");
	МассивПродажи.Добавить("СчетФактураВыданный");
	МассивПродажи.Добавить("СчетФактураВыданныйАванс");
	МассивПродажи.Добавить("СчетФактураКомиссионеру");
	
	МассивПроизводство = Новый Массив;  
	МассивПроизводство.Добавить("ВозвратМатериаловИзПроизводства");
	МассивПроизводство.Добавить("ВозвратСырьяДавальцу");
	МассивПроизводство.Добавить("ВозвратСырьяОтПереработчика");
	МассивПроизводство.Добавить("ВозвратПодарочныхСертификатов");
	МассивПроизводство.Добавить("ВозвратТоваровОтКлиента");
	МассивПроизводство.Добавить("ВозвратТоваровМеждуОрганизациями"); 
	МассивПроизводство.Добавить("ДвижениеПродукцииИМатериалов");
	МассивПроизводство.Добавить("ЗаказКлиента");
	МассивПроизводство.Добавить("ЗаказДавальца2_5");
	МассивПроизводство.Добавить("ОтчетДавальцу2_5");
	МассивПроизводство.Добавить("ОтчетПереработчика"); 
	МассивПроизводство.Добавить("ОтчетПереработчика2_5");
	МассивПроизводство.Добавить("ОтгрузкаТоваровСХранения");
	МассивПроизводство.Добавить("ПередачаМатериаловВПроизводство");
	МассивПроизводство.Добавить("ПередачаСырьяПереработчику");
	МассивПроизводство.Добавить("ПередачаТоваровХранителю");
	МассивПроизводство.Добавить("ПередачаСырьяПереработчику");
	МассивПроизводство.Добавить("ПередачаТоваровХранителю");
	МассивПроизводство.Добавить("ПоступлениеСырьяОтДавальца");
	МассивПроизводство.Добавить("ПоступлениеОтПереработчика");
	МассивПроизводство.Добавить("ПоступлениеТоваровОтХранителя");
	МассивПроизводство.Добавить("ПриемкаТоваровНаХранение");
	МассивПроизводство.Добавить("ПроизводствоБезЗаказа");
	МассивПроизводство.Добавить("СборкаТоваров");
	МассивПроизводство.Добавить("ПередачаДавальцу");
	
	МассивСклад = Новый Массив;
	МассивСклад.Добавить("ВнутреннееПотребление");
	МассивСклад.Добавить("ВыкупПринятыхНаХранениеТоваров");
	МассивСклад.Добавить("ЗаказНаПеремещение");
	МассивСклад.Добавить("ИнвентаризационнаяОпись");
	МассивСклад.Добавить("ИнвентаризацияТМЦВЭксплуатации");
	МассивСклад.Добавить("ОприходованиеИзлишковТоваров");
	МассивСклад.Добавить("ОприходованиеТМЦВЭксплуатации");
	МассивСклад.Добавить("ОтчетОСписанииТоваровСХранения");
	МассивСклад.Добавить("ПеремещениеТоваров");
	МассивСклад.Добавить("ПередачаТоваровМеждуОрганизациями");
	МассивСклад.Добавить("ПересортицаТоваров");
	МассивСклад.Добавить("ПересчетТоваров"); 
	МассивСклад.Добавить("ПрочееОприходованиеТоваров");
	МассивСклад.Добавить("СписаниеИзЭксплуатации");
	МассивСклад.Добавить("СписаниеНедостачТоваров");
	
	МассивЗарплата = Новый Массив;
	МассивЗарплата.Добавить("ОтражениеЗарплатыВФинансовомУчете");
	МассивЗарплата.Добавить("ДоговорЗаймаСотруднику");
	МассивЗарплата.Добавить("ВыработкаСотрудников");
	
	СтруктураРазделов = Новый Структура;
	МассивПрочее = Новый Массив;
	
	СтруктураРазделов.Вставить("МассивВводОстатков", МассивВводОстатков);
	СтруктураРазделов.Вставить("МассивВнеоборотныеАктивы", МассивВнеоборотныеАктивы);
	СтруктураРазделов.Вставить("МассивЗакупки", МассивЗакупки); 
	СтруктураРазделов.Вставить("МассивЗарплата", МассивЗарплата);
	СтруктураРазделов.Вставить("МассивКазначейство", МассивКазначейство);
	СтруктураРазделов.Вставить("МассивПродажи", МассивПродажи);
	СтруктураРазделов.Вставить("МассивПроизводство", МассивПроизводство);
	СтруктураРазделов.Вставить("МассивСклад", МассивСклад);
	СтруктураРазделов.Вставить("МассивПрочее", МассивПрочее);
	
	Для каждого РазделУчета Из МассивРазделов Цикл 
		Если МассивРазделовПланаОбмена.Найти(РазделУчета) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		КлючРазделаУчета = "Массив" + СтрЗаменить(РазделУчета, " ", "");
		СтруктураРаздела = СтруктураРазделов[КлючРазделаУчета];
		ЗаполнитьРазделПоДокументам(УзелОбъект.ВидыДокументов, РазделУчета, СтруктураРаздела);
	КонецЦикла;
	УзелОбъект.ИспользоватьОтборПоРазделамУчетаИДокументам = Истина;
	УзелОбъект.ИспользоватьОтборПоРазделамУчета = Ложь;
КонецПроцедуры

#КонецОбласти

#Область ПрочиеПроцедурыИФункции

// Заполнение разделов учета в формах настроек
// 
// Параметры:
//  ВВидеСтруктуры - Булево
//  ИдентификаторНастройки - Строка
// 
// Возвращаемое значение:
// Структура:
//    * РазделУчета - Массив из Строка
//    * Выгружать - Булево,
// ТаблицаЗначений:
//   * РазделУчета - Строка
//   * Выгружать - Булево
Функция ПолучитьРазделыУчета(ВВидеСтруктуры, ИдентификаторНастройки = "") Экспорт
	
	РазделыУчета = Новый ТаблицаЗначений;
	РазделыУчета.Колонки.Добавить("РазделУчета");
	РазделыУчета.Колонки.Добавить("Выгружать");
	
	Если ИдентификаторНастройки = "ОбменУП2ЗУП3" Тогда
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Зарплата";
		Раздел.Выгружать = Истина;
	Иначе
		
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Ввод остатков";
		Раздел.Выгружать = Истина;
		
		Если НЕ Константы.УправлениеТорговлей.Получить() Тогда
			Раздел = РазделыУчета.Добавить();
			Раздел.РазделУчета = "Внеоборотные активы";
			Раздел.Выгружать = Истина;
		КонецЕсли;
		
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Закупки";
		Раздел.Выгружать = Истина;
		
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Казначейство";
		Раздел.Выгружать = Истина;
		
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Продажи";
		Раздел.Выгружать = Истина;
		
		Если НЕ Константы.УправлениеТорговлей.Получить() Тогда
			Раздел = РазделыУчета.Добавить();
			Раздел.РазделУчета = "Производство";
			Раздел.Выгружать = Истина;
		КонецЕсли;
		
		Раздел = РазделыУчета.Добавить();
		Раздел.РазделУчета = "Склад";
		Раздел.Выгружать = Истина;
		
	КонецЕсли;
	
	Если ВВидеСтруктуры Тогда
		Возврат Новый Структура("РазделУчета, Выгружать", 
			РазделыУчета.ВыгрузитьКолонку("РазделУчета"), 
			РазделыУчета.ВыгрузитьКолонку("Выгружать"));
	Иначе
		Возврат РазделыУчета;
	КонецЕсли;
	
КонецФункции

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

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

// Возвращает имена реквизитов и табличных частей плана обмена, перечисленных через запятую,
// которые являются общими для пары обменивающихся конфигураций.
//
// Возвращаемое значение:
//   Строка - Список имен реквизитов.
//
Функция ОбщиеДанныеУзлов()
	
	Возврат "РежимВыгрузкиПриНеобходимости";
	
КонецФункции

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

// Заполнить используемые транспорты сообщений обмена.
// 
// Параметры:
//  Результат - Массив Из ОбъектМетаданных - Массив поддерживаемых транспортов обмена.
//  БазоваяВерсия - Булево - Базовая версия
//
Процедура ЗаполнитьИспользуемыеТранспортыСообщенийОбмена(Результат, БазоваяВерсия)
	
	Результат.Добавить(Обработки.ТранспортСообщенийОбменаWS);
	Результат.Добавить(Обработки.ТранспортСообщенийОбменаHTTP);
	Результат.Добавить(Обработки.ТранспортСообщенийОбменаПассивныйРежим);
	Результат.Добавить(Обработки.ТранспортСообщенийОбменаЯндексДиск);
	Результат.Добавить(Обработки.ТранспортСообщенийОбменаGoogleDrive);
	
	Если Не БазоваяВерсия Тогда
		Результат.Добавить(Обработки.ТранспортСообщенийОбменаFTP);
		Результат.Добавить(Обработки.ТранспортСообщенийОбменаEMAIL);
		Результат.Добавить(Обработки.ТранспортСообщенийОбменаCOM);
		Результат.Добавить(Обработки.ТранспортСообщенийОбменаESB1C);
		Результат.Добавить(Обработки.ТранспортСообщенийОбменаSM);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПереходНаУниверсальныйФормат

// Функция-обертка, выполняет подготовку параметров и вызывает основную функцию 
// (см. ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат).
// Вызывается при первом обмене по настройке синхронизации данных через универсальный формат
//  через COM-соединение.
//
// Параметры:
//  ПараметрыНастройкиСинхронизацииДанных - Структура - сведения о настройке синхронизации, с которой происходит переход: 
//  * Код - Строка - Код настройки.
//  * ВариантНастройки - Строка - вариант настройки синхронизации данных через универсальный формат базы-корреспондента.
//  * Ошибка - Булево - признак ошибки при выполнении функции.
//  * СообщениеОбОшибке - Строка - текст сообщения об ошибке.
//
// Возвращаемое значение:
//  ПланОбменаСсылка, Неопределено - Ссылка на настройку синхронизации данных через универсальный формат (при успешном выполнении перехода),
//  Неопределено (в случае критичных ошибок, возникших в процессе перехода).
Функция ПереходНаСинхронизациюЧерезУниверсальныйФорматВнешнееСоединение(ПараметрыНастройкиСинхронизацииДанных) Экспорт
	
	ВариантНастройки = ПараметрыНастройкиСинхронизацииДанных.ВариантНастройки;
	
	Если Не ЗначениеЗаполнено(ВариантНастройки) Тогда
		
		ПараметрыНастройкиСинхронизацииДанных.Ошибка = Истина;
		ТекстСообщения = НСтр("ru = 'Не указан вариант настройки синхронизации в базе-корреспонденте'");
		ПараметрыНастройкиСинхронизацииДанных.СообщениеОбОшибке = ТекстСообщения;
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	ИмяПланаОбменаСтаройНастройки = ИмяПланаОбменаСтаройНастройки(ВариантНастройки);
	
	Если Не ЗначениеЗаполнено(ИмяПланаОбменаСтаройНастройки) Тогда
		
		ПараметрыНастройкиСинхронизацииДанных.Ошибка = Истина;
		
		НСтрока = НСтр("ru = 'Передан неизвестный вариант настройки синхронизации: %1.'");
		
		ПараметрыНастройкиСинхронизацииДанных.СообщениеОбОшибке = 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, ВариантНастройки);

		Возврат Неопределено;
		
	КонецЕсли;
	
	Если Метаданные.ПланыОбмена.Найти(ИмяПланаОбменаСтаройНастройки) = Неопределено Тогда
		
		ПараметрыНастройкиСинхронизацииДанных.Ошибка = Истина;
		
		НСтрока = НСтр("ru = 'Не обнаружен план обмена, соответствующий варианту настройки: %1.'");
		
		ПараметрыНастройкиСинхронизацииДанных.СообщениеОбОшибке = 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, ВариантНастройки);
			
		Возврат Неопределено;
		
	КонецЕсли;
	
	КодНастройки = ПараметрыНастройкиСинхронизацииДанных.Код;
	
	НастройкаСинхронизацииДанных = ПланыОбмена[ИмяПланаОбменаСтаройНастройки].НайтиПоКоду(КодНастройки);
	
	Если Не ЗначениеЗаполнено(НастройкаСинхронизацииДанных) Тогда
		
		ПараметрыНастройкиСинхронизацииДанных.Ошибка = Истина;
		
		НСтрока = НСтр("ru = 'Не найден узел корреспондента для плана обмена: %1, код: %2.'");
		
		ПараметрыНастройкиСинхронизацииДанных.СообщениеОбОшибке = 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, 
			ИмяПланаОбменаСтаройНастройки, 
			КодНастройки);
		
		Возврат Неопределено;
		
	КонецЕсли;
	
	Возврат ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат(НастройкаСинхронизацииДанных);
	
КонецФункции

// Функция-обертка, выполняет подготовку параметров и вызывает основную функцию 
// (см. ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат).
// Вызывается при транспорте Интернет: корреспондент выполнил переход на универсальный формат,
//  а текущая ИБ нет. 
//
// Параметры:
//  КодУзла - Строка - Код настройки.
//  Ошибка - Булево - признак ошибки при выполнении функции.
//
// Возвращаемое значение:
//  ПланОбменаСсылка - Ссылка на настройку синхронизации данных через универсальный формат (при успешном выполнении перехода),
//  Неопределено (в случае критичных ошибок, возникших в процессе перехода).
Функция ПереходНаСинхронизациюЧерезУниверсальныйФорматИнтернет(КодУзла, Ошибка) Экспорт
	
	Если Метаданные.ПланыОбмена.Найти("ОбменУправлениеТорговлейБухгалтерияПредприятияКОРП30") <> Неопределено Тогда
		ИмяПланаОбменаДляПерехода = "ОбменУправлениеТорговлейБухгалтерияПредприятияКОРП30";
	ИначеЕсли Метаданные.ПланыОбмена.Найти("ОбменУправлениеТорговлейБухгалтерияПредприятия30") <> Неопределено Тогда
		ИмяПланаОбменаДляПерехода = "ОбменУправлениеТорговлейБухгалтерияПредприятия30";
	КонецЕсли;
	
	НастройкаСинхронизацииЧерезУниверсальныйФормат = Неопределено;
	
	Если ИмяПланаОбменаДляПерехода <> "" Тогда
		
		НастройкаСинхронизацииДанных = ПланыОбмена[ИмяПланаОбменаДляПерехода].НайтиПоКоду(КодУзла);
		
		Если Не НастройкаСинхронизацииДанных.Пустая() Тогда
			
			ПланОбменаМенеджер = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат;
			
			Попытка
				
				НастройкаСинхронизацииЧерезУниверсальныйФормат = 
					ПланОбменаМенеджер.ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат(НастройкаСинхронизацииДанных);
				
			Исключение
				Ошибка = Истина;
			КонецПопытки;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат НастройкаСинхронизацииЧерезУниверсальныйФормат;
	
КонецФункции

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

// Функция выполняет переход с существующей настройки синхронизации данных 
//  на настройку синхронизации данных через универсальный формат.
//
// Параметры:
//  НастройкаСинхронизацииДанных - ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат - Ссылка на настройку синхронизации данных, с которой выполняется переход.
// 
// Возвращаемое значение:
//  - ПланОбменаСсылка - Ссылка на настройку синхронизации данных через универсальный формат (при успешном выполнении перехода).
//  - Неопределено - в случае критичных ошибок, возникших в процессе перехода.
Функция ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат(НастройкаСинхронизацииДанных) Экспорт
	
	НастройкаСинхронизацииЧерезУниверсальныйФормат = Неопределено;
	КодНастройки = НастройкаСинхронизацииДанных.Код;
	ИмяПланаОбменаСтаройНастройки = НастройкаСинхронизацииДанных.Метаданные().Имя;
	
	ОбновитьПовторноИспользуемыеЗначения();
	
	// Поиск или создание настройки синхронизации через универсальный формат.
	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
		|	СинхронизацияДанныхЧерезУниверсальныйФормат.Ссылка
		|ИЗ 
		|	ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК СинхронизацияДанныхЧерезУниверсальныйФормат
		|ГДЕ 
		|	НЕ СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел 
		|	И СинхронизацияДанныхЧерезУниверсальныйФормат.Код = &КодНастройки");
	
	Запрос.УстановитьПараметр("КодНастройки", КодНастройки);
	РезультатЗапроса = Запрос.Выполнить();
	
	ИмяСобытияЖурналРегистрации = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат'", ОбщегоНазначения.КодОсновногоЯзыка());
	
	Сообщение = НСтр("ru = 'Начало перехода'");
	ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

	Сообщение = НСтр("ru = 'Создание новой настройки синхронизации данных'");
	ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);
	
	НачатьТранзакцию();
	
	Попытка
		
		Если Не РезультатЗапроса.Пустой() Тогда
			
			Выборка = РезультатЗапроса.Выбрать();
			Выборка.Следующий();
			НоваяНастройкаОбъект = Выборка.Ссылка.ПолучитьОбъект();
			
		Иначе
			// Создание новой настройки.
			НоваяНастройкаОбъект = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.СоздатьУзел();
		КонецЕсли;
		
		ЗаполнитьЗначенияСвойств(НоваяНастройкаОбъект, НастройкаСинхронизацииДанных,,
			"НомерОтправленного, НомерПринятого, ПометкаУдаления");
		
		ВариантНастройки = "";
		
		Если ИмяПланаОбменаСтаройНастройки = "ОбменУправлениеТорговлейБухгалтерияПредприятия30" Тогда
			
			ВариантНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБП30();
			
		ИначеЕсли ИмяПланаОбменаСтаройНастройки = "ОбменУправлениеТорговлейБухгалтерияПредприятияКОРП30" Тогда
			
			ВариантНастройки = ОбменДаннымиЛокализация.ИдентификаторНастройкиОбменаБПКОРП30();
			
		КонецЕсли;
		
		НоваяНастройкаОбъект.ВариантНастройки = ВариантНастройки;
		
		МетаданныеСтаройНастройки = Метаданные.ПланыОбмена[ИмяПланаОбменаСтаройНастройки];
		Если МетаданныеСтаройНастройки.ТабличныеЧасти.Найти("Организации") <> Неопределено Тогда
			
			НоваяНастройкаОбъект.Организации.Очистить();
			
			Для Каждого СтрокаОрганизации Из НастройкаСинхронизацииДанных.Организации Цикл
				НоваяСтрокаОрганизации = НоваяНастройкаОбъект.Организации.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрокаОрганизации, СтрокаОрганизации);
			КонецЦикла;
			
		КонецЕсли;
		
		НоваяНастройкаОбъект.ВыгружатьАналитикуПоСкладам = Истина;
		
		Если МетаданныеСтаройНастройки.Реквизиты.Найти("ОбобщенныйСклад") <> Неопределено Тогда
			//@skip-check bsl-legacy-check-static-feature-access-for-unknown-left-part
			// это свойство плана обмена, с которого осуществляется переход, актуально для УТ
			Если ЗначениеЗаполнено(НастройкаСинхронизацииДанных.ОбобщенныйСклад) Тогда
				НоваяНастройкаОбъект.ВыгружатьАналитикуПоСкладам = Ложь;
			КонецЕсли;
		КонецЕсли;
		
		ДоступныеВерсииФормата = Новый Соответствие;
		ОбменДаннымиУТ.ДоступныеВерсииУниверсальногоФормата(ДоступныеВерсииФормата);
		
		Для Каждого КлючИЗначение Из ДоступныеВерсииФормата Цикл
			НоваяНастройкаОбъект.ВерсияФорматаОбмена = КлючИЗначение.Ключ;
		КонецЦикла;
		
		НоваяНастройкаОбъект.Записать();
		
		НастройкаСинхронизацииЧерезУниверсальныйФормат = НоваяНастройкаОбъект.Ссылка;
		
		КодПредопределенногоУзла = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.ЭтотУзел(), "Код");
		Если СтрДлина(КодПредопределенногоУзла) = 36 Тогда
			СтруктураЗаписи = Новый Структура;
			СтруктураЗаписи.Вставить("Корреспондент", НастройкаСинхронизацииЧерезУниверсальныйФормат);
			СтруктураЗаписи.Вставить("КодУзла",
				//@skip-check bsl-legacy-check-string-literal
				// это код плана обмена, с которого осуществляется переход, актуально для УТ
				ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПланыОбмена[ИмяПланаОбменаСтаройНастройки].ЭтотУзел(), "Код"));
			ОбменДаннымиСлужебный.ОбновитьЗаписьВРегистрСведений(СтруктураЗаписи, "ПсевдонимыПредопределенныхУзлов");
		КонецЕсли;
		
		// Регистрация изменений.
		Сообщение = НСтр("ru = 'Регистрация изменений'");
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

		ВыполнитьРегистрациюИзменений(НастройкаСинхронизацииДанных, НастройкаСинхронизацииЧерезУниверсальныйФормат);
		
		// Настройки транспорта.
		Сообщение = НСтр("ru = 'Заполнение настроек транспорта сообщений'");
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

		ВыгружатьСообщениеПослеПерехода = Ложь;
		ОбработатьНастройкиТранспортаСообщенийОбмена(НастройкаСинхронизацииДанных, 
			НастройкаСинхронизацииЧерезУниверсальныйФормат, 
			ВыгружатьСообщениеПослеПерехода);

		// Дата запрета изменения.
		Сообщение = НСтр("ru = 'Заполнение настроек запрета изменения данных'");
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

		ОбработатьДатыЗапретаИзменения(НастройкаСинхронизацииДанных, НастройкаСинхронизацииЧерезУниверсальныйФормат);
		
		// Сценарии обменов данными.
		Сообщение = НСтр("ru = 'Заполнение сценариев обмена данными'");
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

		ОбработатьСценарииОбменовДанными(НастройкаСинхронизацииДанных, НастройкаСинхронизацииЧерезУниверсальныйФормат);
		
		//  ПубличныеИдентификаторыСинхронизируемыхОбъектов и ДанныеОбъектовДляРегистрацииВОбменах.
		ОбработатьСоответствияОбъектовИнформационныхБаз(НастройкаСинхронизацииДанных, 
			НастройкаСинхронизацииЧерезУниверсальныйФормат);
		
		// Заполнение настроек главного узла.
		Сообщение = НСтр("ru = 'Заполнение настроек главного узла'");
		ЗаписьЖурналаРегистрации(ИмяСобытияЖурналРегистрации, УровеньЖурналаРегистрации.Информация, , , Сообщение);

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

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

// Процедура переносит сведения о дате запрета изменения с одного узла на другой.
//
// Параметры:
//  СтарыйУзел - ПланОбменаСсылка - ссылка на узел плана обмена, который является источником сведений
//  НовыйУзел - ПланОбменаСсылка - ссылка на узел плана обмена, который является получателем сведений.
Процедура ОбработатьДатыЗапретаИзменения(СтарыйУзел, НовыйУзел)
	
	ДатыЗапрета = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
	ДатыЗапрета.Отбор.Пользователь.Установить(СтарыйУзел);
	ДатыЗапрета.Прочитать();
	
	ДатыЗапретаНовый = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
	ДатыЗапретаНовый.Отбор.Пользователь.Установить(НовыйУзел);
	
	Для Каждого ДатаЗапрета Из ДатыЗапрета Цикл
		
		ЗаписьНовая = ДатыЗапретаНовый.Добавить();
		ЗаписьНовая.Пользователь = НовыйУзел;
		ЗаполнитьЗначенияСвойств(ЗаписьНовая, ДатаЗапрета,,"Пользователь");
		
	КонецЦикла;
	
	ДатыЗапрета.Очистить();
	ДатыЗапрета.Записать();
	ДатыЗапретаНовый.Записать();
	
КонецПроцедуры

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

// Процедура переносит сведения о соответствиях объектов информационных баз с одного узла на другой.
//
// Параметры:
//  СтарыйУзел - ПланОбменаСсылка - ссылка на узел плана обмена, который является источником сведений
//  НовыйУзел - ПланОбменаСсылка - ссылка на узел плана обмена, который является получателем сведений.
Процедура ОбработатьСоответствияОбъектовИнформационныхБаз(СтарыйУзел, НовыйУзел)
	
	// Заполнение ДанныеОбъектовДляРегистрацииВОбменах
	ИмяРазделаСобытия = НСтр("ru = 'Переход на синхронизацию данных через универсальный формат'", ОбщегоНазначения.КодОсновногоЯзыка());
	ИмяПодразделаСобытия = НСтр("ru = 'Данные для регистрации в обменах'", ОбщегоНазначения.КодОсновногоЯзыка());
	ИмяСобытия = СтрШаблон("%1.%2", ИмяРазделаСобытия, ИмяПодразделаСобытия); 
	
	Сообщение = НСтр("ru = 'Заполнение данных для регистрации в обменах'");
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,,, Сообщение);

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

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

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

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

// Процедура выполняет попытку перехода на новый обмен с существующего обмена.
//  Вызывается, если в ходе синхронизации данных получено сообщение не соответствующее формату "старого" обмена.
//
// Параметры:
//  НастройкаСинхронизацииДанных - ПланОбменаСсылка - ссылка на узел плана обмена, с которого выполняется переход на новый обмен
//  ОбменЧерезВнешнееСоединение - Булево - признак того что текущий обмен выполняется через внешнее соединение.
Процедура ВыполнитьПереходНаНовыйОбмен(НастройкаСинхронизацииДанных, ОбменЧерезВнешнееСоединение = Ложь) Экспорт
	
	НастройкаСинхронизацииЧерезУниверсальныйФормат = 
		ВыполнитьПереходНаСинхронизациюДанныхЧерезУниверсальныйФормат(НастройкаСинхронизацииДанных);
	
	// Передача сведений для обработки ВыполнениеОбменовДанными и ПомощникИнтерактивногоОбменаДанными.
	ПередаваемоеЗначение = Новый Структура;
	ИмяПланаОбменаДляПереходаНаНовыйОбмен = НастройкаСинхронизацииЧерезУниверсальныйФормат.Метаданные().Имя;
	ПередаваемоеЗначение.Вставить("ИмяПланаОбменаДляПереходаНаНовыйОбмен", ИмяПланаОбменаДляПереходаНаНовыйОбмен);
	ПередаваемоеЗначение.Вставить("Код", НастройкаСинхронизацииЧерезУниверсальныйФормат.Код);
	
	ПередаваемыйТекст = "{ВыполненПереходНаНовыйОбмен}"+ОбщегоНазначения.ЗначениеВСтрокуXML(ПередаваемоеЗначение);
	ПолучитьСообщенияПользователю(Истина); // Удаление предыдущих сообщений.
	ОбщегоНазначения.СообщитьПользователю(ПередаваемыйТекст);
	
КонецПроцедуры

#КонецОбласти

#Область ОбменУПРМК
// Регистрирует изменения на переданном узле с учетом остатка на складе, указанном в настройках узла
//
// Параметры:
//  Узел - ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат
//
Процедура ЗарегистрироватьИзмененияНаУзлеПоОстаткамНаСкладе(Узел) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	СинхронизацияДанныхЧерезУниверсальныйФорматСклады.Ссылка КАК Узел,
	|	СинхронизацияДанныхЧерезУниверсальныйФорматСклады.Склад КАК Склад
	|ИЗ
	|	ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Склады КАК СинхронизацияДанныхЧерезУниверсальныйФорматСклады
	|ГДЕ
	|	СинхронизацияДанныхЧерезУниверсальныйФорматСклады.Ссылка.ВыгружатьТолькоНоменклатуруСОстатками
	|	И СинхронизацияДанныхЧерезУниверсальныйФорматСклады.Ссылка = &Узел
	|	И СинхронизацияДанныхЧерезУниверсальныйФорматСклады.Ссылка.ВариантНастройки = &ВариантНастройки";
	
	Запрос.УстановитьПараметр("Узел", Узел);
	Запрос.УстановитьПараметр("ВариантНастройки", "ОбменУПРМК");
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Не Выборка.Следующий() Тогда
		Возврат;
	КонецЕсли;
		
	Склад = Выборка.Склад;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	// Товар с номенклатурой и характеристикой есть на остатке на складе, указанный в отборе
	// Штрих-коды регистрируются только по той номенклатуре которая есть на остатках
	"ВЫБРАТЬ
	|	ОстаткиТоваров.Номенклатура КАК Номенклатура,
	|	ОстаткиТоваров.Характеристика КАК Характеристика,
	|	ОстаткиТоваров.Серия КАК Серия,
	|	ЕСТЬNULL(ШтрихкодыНоменклатуры.Штрихкод, &ПустаяСтрока) КАК Штрихкод
	|ПОМЕСТИТЬ ДанныеКРегистрацииПоОстаткам
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ОстаткиТоваров
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
	|		ПО ОстаткиТоваров.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
	|			И ОстаткиТоваров.Характеристика = ШтрихкодыНоменклатуры.Характеристика
	|ГДЕ
	|	ОстаткиТоваров.ВНаличииОстаток > 0
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Номенклатура
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ДанныеОбъектовДляРегистрацииВОбменах.Ссылка КАК СсылкаКРегистрации
	|ПОМЕСТИТЬ ДанныеЗарегистрированныхОбъектов
	|ИЗ
	|	РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах
	|ГДЕ
	|	ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы = &Узел
	|ИНДЕКСИРОВАТЬ ПО
	|	СсылкаКРегистрации
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СерииНоменклатуры.Ссылка КАК СсылкаКРегистрации
	|ПОМЕСТИТЬ ДанныеКРегистрацииСправочно
	|ИЗ
	|	Справочник.ВидыНоменклатуры.ПолитикиУчетаСерий КАК ПолитикиУчетаСерий
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
	|		ПО ПолитикиУчетаСерий.Ссылка = СерииНоменклатуры.ВидНоменклатуры
	|			И (ПолитикиУчетаСерий.Склад = &Склад)
	|			И (ПолитикиУчетаСерий.ПолитикаУчетаСерий.ТипПолитики В (&ТипПолитики))
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Номенклатура.Ссылка
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.ТипНоменклатуры В(&ТипНоменклатурыУслугаРабота)
	|ИНДЕКСИРОВАТЬ ПО
	|	СсылкаКРегистрации
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
	|ПОМЕСТИТЬ ШтрихкодыНоменклатурыИзменения
	|ИЗ
	|	РегистрСведений.ШтрихкодыНоменклатуры.Изменения КАК ШтрихкодыНоменклатуры
	|ГДЕ
	|	ШтрихкодыНоменклатуры.Узел = &Узел
	|ИНДЕКСИРОВАТЬ ПО
	|	Штрихкод
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ИзмененныеШК.ШтрихКод КАК ШтрихКод
	|ПОМЕСТИТЬ ИзмененныеШКПоЗарегистрированнымКортежам
	|ИЗ
	|	РегистрСведений.ШтрихкодыНоменклатуры.Изменения КАК ИзмененныеШК
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ДанныеШК
	|		ПО ИзмененныеШК.ШтрихКод = ДанныеШК.ШтрихКод
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ОтправленнаяНоменклатура
	|			ПО ДанныеШК.Номенклатура = ОтправленнаяНоменклатура.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеШК.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
    |
	|ОБЪЕДИНИТЬ ВСЕ
    |
	|ВЫБРАТЬ
	|	ИзмененныеШК.ШтрихКод
	|ИЗ
	|	РегистрСведений.ШтрихкодыНоменклатуры.Изменения КАК ИзмененныеШК
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ДанныеШК
	|		ПО ИзмененныеШК.ШтрихКод = ДанныеШК.ШтрихКод
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ОтправленнаяНоменклатура
	|			ПО ДанныеШК.Номенклатура = ОтправленнаяНоменклатура.СсылкаКРегистрации
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ОтправленнаяХарактеристика
	|			ПО ДанныеШК.Характеристика = ОтправленнаяХарактеристика.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеШК.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
	|ИНДЕКСИРОВАТЬ ПО
	|	ШтрихКод
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.ШтрихКод КАК ШтрихКод
	|ПОМЕСТИТЬ РегистрацияПоОстаткамШК
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектовНоменклатура
	|		ПО ДанныеКРегистрации.Номенклатура = ДанныеЗарегистрированныхОбъектовНоменклатура.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеКРегистрации.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
	|	И ДанныеЗарегистрированныхОбъектовНоменклатура.СсылкаКРегистрации ЕСТЬ NULL
	|
	|Объединить Все
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.ШтрихКод КАК ШтрихКод
	|	
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектовНоменклатура
	|		ПО ДанныеКРегистрации.Номенклатура = ДанныеЗарегистрированныхОбъектовНоменклатура.СсылкаКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектовХарактеристика
	|		ПО ДанныеКРегистрации.Характеристика = ДанныеЗарегистрированныхОбъектовХарактеристика.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеКРегистрации.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
	|	И (ДанныеЗарегистрированныхОбъектовНоменклатура.СсылкаКРегистрации ЕСТЬ NULL
	|		ИЛИ ДанныеЗарегистрированныхОбъектовХарактеристика.СсылкаКРегистрации ЕСТЬ NULL)
	|ИНДЕКСИРОВАТЬ ПО 
	|	ШтрихКод 
	|;
	|
	|	
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.Номенклатура КАК Номенклатура
	|ПОМЕСТИТЬ НоменклатураДляВыгрузкиЦен
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.Номенклатура = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL
	|ИНДЕКСИРОВАТЬ ПО 
	|	Номенклатура
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НоменклатураДляВыгрузкиЦен.Номенклатура КАК Номенклатура,
	|	Цены.Ссылка КАК ДокУстановкаЦен,
	|	Цены.Ссылка.Дата КАК ДатаДок
	|ПОМЕСТИТЬ УстановкиЦенПоНоменклатуре
	|ИЗ
	|	Документ.УстановкаЦенНоменклатуры.Товары КАК Цены
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ НоменклатураДляВыгрузкиЦен КАК НоменклатураДляВыгрузкиЦен
	|		ПО Цены.Номенклатура = НоменклатураДляВыгрузкиЦен.Номенклатура
	|ГДЕ
	|	НЕ &Ценообразование25
	|	И Цены.Ссылка.Согласован
	|	И Цены.Ссылка.Проведен
	|	И Цены.Ссылка.Дата >= &ДатаВыгрузкиДок
	|
	|ОБЪЕДИНИТЬ ВСЕ 
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НоменклатураДляВыгрузкиЦен.Номенклатура,
	|	Цены.Ссылка,
	|	Цены.Ссылка.Дата
	|ИЗ
	|	Документ.УстановкаЦенНоменклатуры.Товары2_5 КАК Цены
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ НоменклатураДляВыгрузкиЦен КАК НоменклатураДляВыгрузкиЦен
	|		ПО Цены.Номенклатура = НоменклатураДляВыгрузкиЦен.Номенклатура
	|ГДЕ
	|	&Ценообразование25
	|	И Цены.Ссылка.Согласован
	|	И Цены.Ссылка.Проведен
	|	И Цены.Ссылка.Дата >= &ДатаВыгрузкиДок
	|ИНДЕКСИРОВАТЬ ПО 
	|	Номенклатура
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	УстановкиЦенПоНоменклатуре.Номенклатура КАК Номенклатура,
	|	МАКСИМУМ(УстановкиЦенПоНоменклатуре.ДатаДок) КАК ДатаДок
	|ПОМЕСТИТЬ ДатаЦеныНоменклатуры
	|ИЗ
	|	УстановкиЦенПоНоменклатуре КАК УстановкиЦенПоНоменклатуре
	|
	|СГРУППИРОВАТЬ ПО
	|	УстановкиЦенПоНоменклатуре.Номенклатура
	|ИНДЕКСИРОВАТЬ ПО
	|	Номенклатура
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ  РАЗЛИЧНЫЕ
	|	 ПоследняяЦенаПоНоменклатуре.ДокУстановкаЦен КАК СсылкаКРегистрации
	|ПОМЕСТИТЬ ПоздняяРегистрацияУстановкиЦен
	|ИЗ
	|(ВЫБРАТЬ
	|	УстановкиЦенПоНоменклатуре.Номенклатура КАК Номенклатура,
	|	МАКСИМУМ(УстановкиЦенПоНоменклатуре.ДокУстановкаЦен) КАК ДокУстановкаЦен
	|ИЗ
	|	УстановкиЦенПоНоменклатуре КАК УстановкиЦенПоНоменклатуре
	|	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатаЦеныНоменклатуры КАК ДатаЦеныНоменклатуры
	|		ПО УстановкиЦенПоНоменклатуре.Номенклатура = ДатаЦеныНоменклатуры.Номенклатура
	|		И УстановкиЦенПоНоменклатуре.ДатаДок = ДатаЦеныНоменклатуры.ДатаДок
	|
	|СГРУППИРОВАТЬ ПО
	|	УстановкиЦенПоНоменклатуре.Номенклатура) ПоследняяЦенаПоНоменклатуре
	|ИНДЕКСИРОВАТЬ ПО
	|	СсылкаКРегистрации
	|;
	//++ Локализация
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.Номенклатура КАК НоменклатураЧастичногоВыбытия
	|ИЗ ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.Номенклатура = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ОписаниеНоменклатурыИС КАК ОписаниеНоменклатурыИС
	|		ПО ДанныеКРегистрации.Номенклатура = ОписаниеНоменклатурыИС.Номенклатура
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL
	|;
	|
	//-- Локализация
	|////////////////////////////////////////////////////////////////////////////////
	|Выбрать 
	|	РегистрацияПоОстаткамШК.ШтрихКод 
	|ИЗ РегистрацияПоОстаткамШК КАК РегистрацияПоОстаткамШК
	|	ЛЕВОЕ СОЕДИНЕНИЕ ШтрихкодыНоменклатурыИзменения КАК ИзмененныеШК
	|	ПО РегистрацияПоОстаткамШК.ШтрихКод = ИзмененныеШК.ШтрихКод
	|ГДЕ
	|	ИзмененныеШК.ШтрихКод ЕСТЬ NULL
	|;
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
	|ИЗ
	|	ШтрихкодыНоменклатурыИзменения КАК ШтрихкодыНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ ИзмененныеШКПоЗарегистрированнымКортежам КАК ОтправленныеРанееКортежиШК
	|		ПО ШтрихкодыНоменклатуры.ШтрихКод = ОтправленныеРанееКортежиШК.ШтрихКод
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрацияПоОстаткамШК КАК РегистрацияПоОстаткамШК
	|		ПО ШтрихкодыНоменклатуры.ШтрихКод = РегистрацияПоОстаткамШК.ШтрихКод
	|ГДЕ
	|	РегистрацияПоОстаткамШК.ШтрихКод ЕСТЬ NULL
	|	И ОтправленныеРанееКортежиШК.ШтрихКод ЕСТЬ NULL
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.Номенклатура КАК ДанныеКРегистрации
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.Номенклатура = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ДанныеКРегистрации.Характеристика
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.Характеристика = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL
	|	И НЕ ДанныеКРегистрации.Характеристика = &ПустаяХарактеристика
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ДанныеКРегистрации.Серия
	|ИЗ
	|	ДанныеКРегистрацииПоОстаткам КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.Серия = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL
	|	И НЕ ДанныеКРегистрации.Серия = &ПустаяСерия
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ПоздняяРегистрацияУстановкиЦен.СсылкаКРегистрации
	|ИЗ
	|	ПоздняяРегистрацияУстановкиЦен КАК ПоздняяРегистрацияУстановкиЦен
	|	ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК Регистрации
	|		ПО ПоздняяРегистрацияУстановкиЦен.СсылкаКРегистрации = Регистрации.СсылкаКРегистрации
	|ГДЕ
	|	Регистрации.СсылкаКРегистрации ЕСТЬ NULL
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ДанныеКРегистрации.СсылкаКРегистрации
	|ИЗ
	|	ДанныеКРегистрацииСправочно КАК ДанныеКРегистрации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗарегистрированныхОбъектов КАК ДанныеЗарегистрированныхОбъектов
	|		ПО ДанныеКРегистрации.СсылкаКРегистрации = ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации
	|ГДЕ
	|	ДанныеЗарегистрированныхОбъектов.СсылкаКРегистрации ЕСТЬ NULL";
	
	ТипыПолитикиСправочноеУказаниеСерий = Новый Массив;
	ТипыПолитикиСправочноеУказаниеСерий.Добавить(Перечисления.ТипыПолитикУказанияСерий.СправочноеУказаниеСерий);
	ТипыПолитикиСправочноеУказаниеСерий.Добавить(Перечисления.ТипыПолитикУказанияСерий.АвторасчетПоFEFOОстатковСерий);
	
	МассивТиповНоменклатуры = Новый Массив;
	МассивТиповНоменклатуры.Добавить(ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Услуга"));
	МассивТиповНоменклатуры.Добавить(ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Работа"));
	
	Запрос.УстановитьПараметр("Узел", Узел);
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("ВариантНастройки", "ОбменСУРМК");
	Запрос.УстановитьПараметр("ПустаяХарактеристика", Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
	Запрос.УстановитьПараметр("ПустаяСерия", Справочники.СерииНоменклатуры.ПустаяСсылка());
	Запрос.УстановитьПараметр("ПустаяСтрока", "");
	Запрос.УстановитьПараметр("ТипПолитики", ТипыПолитикиСправочноеУказаниеСерий);
	Запрос.УстановитьПараметр("ТипНоменклатурыУслугаРабота", МассивТиповНоменклатуры);
	Запрос.УстановитьПараметр("Ценообразование25", ПолучитьФункциональнуюОпцию("ИспользуетсяЦенообразование25"));
	Запрос.УстановитьПараметр("ДатаВыгрузкиДок", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Узел, "ДатаНачалаВыгрузкиДокументов"));
	
	РезультатЗапроса = Запрос.ВыполнитьПакет();
	ИзмененияОбъектов = РезультатЗапроса[РезультатЗапроса.ВГраница()].Выгрузить();
	
	ДанныеКРегистрации = ИзмененияОбъектов.ВыгрузитьКолонку("ДанныеКРегистрации");
	Если ДанныеКРегистрации.Количество() > 0 Тогда
		ПланыОбмена.ЗарегистрироватьИзменения(Узел, ДанныеКРегистрации);
	КонецЕсли;
	
	Для Каждого Данные Из ДанныеКРегистрации Цикл
		РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах.ДобавитьОбъектВФильтрРазрешенныхОбъектов(Данные, Узел);
	КонецЦикла;
	
	ИзмененияШтрихкодов = РезультатЗапроса[РезультатЗапроса.ВГраница()-1].Выгрузить();
	Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
	
	// Удаляем регистрацию изменений по штрихкодам, номенклатуры которых нет на остатке.
	Для каждого ДанныеШтрихкода Из ИзмененияШтрихкодов Цикл
		Набор.Отбор.Штрихкод.Установить(ДанныеШтрихкода.Штрихкод, Истина);
		Набор.Прочитать();
		ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Набор);
	КонецЦикла;
	
	// Добавляем позднюю регистрацию ШК в обмене
	ПоздняяПервичнаяВыгрузкаШК = РезультатЗапроса[РезультатЗапроса.ВГраница()-2].Выгрузить();
	Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
	Для каждого ДанныеШтрихкода Из ПоздняяПервичнаяВыгрузкаШК Цикл
		Набор.Отбор.Штрихкод.Установить(ДанныеШтрихкода.Штрихкод, Истина);
		Набор.Прочитать();
		ПланыОбмена.ЗарегистрироватьИзменения(Узел, Набор);
	КонецЦикла;
	
	//++ Локализация
	
	// Добавляем позднюю регистрацию ШК в обмене
	ПоздняяПервичнаяВыгрузкаЧастичногоВыбытия = РезультатЗапроса[РезультатЗапроса.ВГраница()-3].Выгрузить();
	Набор = РегистрыСведений.ОписаниеНоменклатурыИС.СоздатьНаборЗаписей();
	Для каждого ДанныеНоменклатурыЧастичногоВыбытия Из ПоздняяПервичнаяВыгрузкаЧастичногоВыбытия Цикл
		Набор.Отбор.Номенклатура.Установить(ДанныеНоменклатурыЧастичногоВыбытия.НоменклатураЧастичногоВыбытия, Истина);
		Набор.Прочитать();
		ПланыОбмена.ЗарегистрироватьИзменения(Узел, Набор);
	КонецЦикла;
	//-- Локализация
КонецПроцедуры

// Заполнение зависимых реквизитов для настройки УПРМК.
// на основании текущих значений касс ККМ устанавливаются прочие реквизиты.
// Параметры:
//	Объект - ПланОбменаОбъект.СинхронизацияДанныхЧерезУниверсальныйФормат
Процедура ОбновитьЗависимыеОтборы(Объект) Экспорт

	Если Объект.ВариантНастройки <> "ОбменУПРМК" Тогда
		
		Возврат;
		
	КонецЕсли;
	
	Объект.Организации.Очистить();
	Объект.ИспользоватьОтборПоОрганизациям = Истина;
	Объект.Склады.Очистить();
	Объект.ИспользоватьОтборПоСкладам = Объект.ИспользоватьОтборПоКассамККМ;
	Объект.ВидыЦенНоменклатуры.Очистить();
	Объект.ВидыДокументов.Очистить();
	Объект.ВыгружатьЦеныНоменклатуры = Истина;
	Если Объект.КассыККМ.Количество() = 0 Тогда
		Объект.ЭквайринговыеТерминалы.Очистить(); 
		Объект.ДоговорыПодключенияКПлатежнымСистемам.Очистить(); 
		
		Возврат;
		
	КонецЕсли;
	
	ЗапросКоллекций = Новый Запрос;
	ЗапросКоллекций.Текст = 
	"ВЫБРАТЬ
	|	КассыККМ.Ссылка КАК КассаККМ,
	|	КассыККМ.Склад КАК СкладККМ
	|ПОМЕСТИТЬ ВремКассыККМ
	|ИЗ
	|	Справочник.КассыККМ КАК КассыККМ
	|ГДЕ
	|	НЕ КассыККМ.ПометкаУдаления
	|	И КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.АвтономноеРМК)
	|	И КассыККМ.Ссылка В(&ТекущиеКассыККМ)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ВремКассыККМ.КассаККМ.Владелец КАК ОрганизацияКассы
	|ПОМЕСТИТЬ ОрганизацииККМ
	|ИЗ
	|	ВремКассыККМ КАК ВремКассыККМ
	|ГДЕ
	|	ВремКассыККМ.КассаККМ.Ссылка ЕСТЬ НЕ NULL 
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	ОрганизацияКассы
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ВремКассыККМ.СкладККМ КАК СкладККМ
	|ПОМЕСТИТЬ СкладыККМ
	|ИЗ
	|	ВремКассыККМ КАК ВремКассыККМ
	|ГДЕ
	|	ВремКассыККМ.СкладККМ.Ссылка ЕСТЬ НЕ NULL 
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	СкладККМ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЭквайринговыеТерминалы.Ссылка КАК ЭквайринговыйТерминал
	|ИЗ
	|	Справочник.ЭквайринговыеТерминалы КАК ЭквайринговыеТерминалы
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОрганизацииККМ КАК ОрганизацииККМ
	|		ПО ЭквайринговыеТерминалы.Владелец.Организация = ОрганизацииККМ.ОрганизацияКассы
	|ГДЕ
	|	ЭквайринговыеТерминалы.Ссылка В(&ТекущиеЭквТерминалы)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ДоговорыЭквайринга.Ссылка КАК ДоговорПодключения
	|ИЗ
	|	Справочник.ДоговорыЭквайринга КАК ДоговорыЭквайринга
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОрганизацииККМ КАК ОрганизацииККМ
	|		ПО ДоговорыЭквайринга.Организация = ОрганизацииККМ.ОрганизацияКассы
	|ГДЕ
	|	ДоговорыЭквайринга.Ссылка В(&ТекущиеЭквДоговоры)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	СкладыККМ.СкладККМ.РозничныйВидЦены КАК ВидЦенНоменклатуры
	|ИЗ
	|	СкладыККМ КАК СкладыККМ
	|ГДЕ
	|	СкладыККМ.СкладККМ.РозничныйВидЦены.Ссылка ЕСТЬ НЕ NULL 
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СкладыККМ.СкладККМ КАК Склад
	|ИЗ
	|	СкладыККМ КАК СкладыККМ
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ОрганизацииККМ.ОрганизацияКассы КАК Организация
	|ИЗ
	|	ОрганизацииККМ КАК ОрганизацииККМ";
	
	ЗапросКоллекций.Параметры.Вставить("ТекущиеКассыККМ", 
		Объект.КассыККМ.Выгрузить().ВыгрузитьКолонку("КассаККМ"));
	ЗапросКоллекций.Параметры.Вставить("ТекущиеЭквТерминалы", 
		Объект.ЭквайринговыеТерминалы.Выгрузить().ВыгрузитьКолонку("ЭквайринговыйТерминал"));
	ЗапросКоллекций.Параметры.Вставить("ТекущиеЭквДоговоры", 
		Объект.ДоговорыПодключенияКПлатежнымСистемам.Выгрузить().ВыгрузитьКолонку("ДоговорПодключения"));
	РезультатыЗапроса = ЗапросКоллекций.ВыполнитьПакет();
	РазмерПакета = РезультатыЗапроса.Количество();
	
	Объект.Организации.Загрузить(РезультатыЗапроса[РазмерПакета-1].Выгрузить());
	Объект.Склады.Загрузить(РезультатыЗапроса[РазмерПакета-2].Выгрузить());
	Объект.ВидыЦенНоменклатуры.Загрузить(РезультатыЗапроса[РазмерПакета-3].Выгрузить());
	Объект.ДоговорыПодключенияКПлатежнымСистемам.Загрузить(РезультатыЗапроса[РазмерПакета-4].Выгрузить());
	Объект.ЭквайринговыеТерминалы.Загрузить(РезультатыЗапроса[РазмерПакета-5].Выгрузить());

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

#КонецОбласти

#КонецОбласти

#КонецЕсли

Связанные материалы