Данная статья рассчитана на:
1) минимальные навыки работы с КД2, т.к. необходимо будет дорабатывать правила обмена, если правил нет то их необходимо будет создать самостоятельно.
2) Обработки выгрузки/загрузки служат как пример, код которого можно скопировать и немного доработав под свои нужды автоматического запуска.
Привет всем. Решил поделиться реальным примером автоматизации обмена через правила КД2.
Задача: Сделать автоматический обмен из УТ в БП(Подобный алгоритм подойдет и для обратного обмена из БП в УТ).
При решении задачи использовались Бухгалтерия предприятия 3.0.134.23 в дальнейшем БП и Управление торговлей 10.3.29.1 в дальнейшем УТ.
Приступим:
Заходим в конфигурацию в УТ и добавим новый план обмена, заполним состав документами, которые будут участвовать в обмене
Для удобства создаем форму списка и добавляем кнопку "НастройкиОбменов" (можно ее скопировать с других обменов, как сделал я. Но если не хотите, то добавляйте просто кнопку. Картинка кнопки называется "МониторСостоянияОбмена").
У кнопки создаем процедуру с кодом:
Если ЭлементыФормы.ПланОбменаСписок.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПроцедурыОбменаДаннымиКлиент.ПоказатьЗарегистрированныеИзмененияДляУзла(ЭлементыФормы.ПланОбменаСписок.ТекущиеДанные.Ссылка, ЭтаФорма);
Далее заходим в режим предприятие в УТ и добавляем свой узел в план обмена.
Обязательно вручную назначьте у своего и узла по умолчанию код. Если у узла по умолчанию не назначить код, то потом при обращении к своему узлу могут возникнуть ошибки (с чем связано подобное поведение, не разбирался).
Кнопка, которую мы добавили, открывает окно регистрации изменений. В нем отображаются все документы, в которые вносились изменения с момента добавления нашего узла. При необходимости документы пометить для обмена можно вручную.
Правила:
Открываем наши правила в КД2(если правил нет, то их надо создать. Как создать правила обмена между базами в этой статье не затрагивается, предполагается что они уже присутствуют) и добавляем в нашу конвертацию параметр. Он будет служить нам для возможности снятия с регистрации документа в УТ.
Если нам по каким-то условиям надо документ снять с регистрации в УТ, то перед выгрузкой делаем проверку, ставим Отказ и удаляем регистрацию объекта в нашей базе (в моем случае в УТ).
В правила конвертации добавляем параметр, в который будем записывать наши загруженные документы, для последующего удаления их с регистрации в базе (в моем случае УТ).
В ПКО добавляем подобный код. Здесь если все прошло успешно, то мы добавляем этот документ на снятие с регистрации (в моем случае в УТ).
После загрузки мы будем снимать записанные документы с регистрации (в моем случае в УТ).
Добавляем новый "Алгоритм", который будем выполнять. Код можно вставить и после загрузки, здесь уже на ваше усмотрение.
Код алгоритма "СнятьРегистрациюИзмененийВУТ".
ТЗТиповДокументов - служит для сопоставления типов УТ и БП для поиска и удаления регистрации.
ТЗТиповДокументов = новый ТаблицаЗначений;
ТЗТиповДокументов.Колонки.Добавить("Значение");
ТЗТиповДокументов.Колонки.Добавить("ТипБП");
ТЗТиповДокументов.Колонки.Добавить("ТипУТ");
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "РеализацияТоваровУслуг";
стрТЗТиповДокументов.ТипУТ = "РеализацияТоваровУслуг";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ПоступлениеТоваровУслуг";
стрТЗТиповДокументов.ТипУТ = "ПоступлениеТоваровУслуг";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ВозвратТоваровПоставщику";
стрТЗТиповДокументов.ТипУТ = "ВозвратТоваровПоставщику";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ПоступлениеНаРасчетныйСчет";
стрТЗТиповДокументов.ТипУТ = "ПлатежноеПоручениеВходящее";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "СписаниеСРасчетногоСчета";
стрТЗТиповДокументов.ТипУТ = "ПлатежноеПоручениеИсходящее";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "СчетФактураВыданный";
стрТЗТиповДокументов.ТипУТ = "СчетФактураВыданный";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ОплатаПлатежнойКартой";
стрТЗТиповДокументов.ТипУТ = "КассовыйЧек";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "РасходныйКассовыйОрдер";
стрТЗТиповДокументов.ТипУТ = "КассовыйЧек";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ПриходныйКассовыйОрдер";
стрТЗТиповДокументов.ТипУТ = "КассовыйЧек";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ПриходныйКассовыйОрдер";
стрТЗТиповДокументов.ТипУТ = "ПриходныйКассовыйОрдер";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "РасходныйКассовыйОрдер";
стрТЗТиповДокументов.ТипУТ = "РасходныйКассовыйОрдер";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "СчетФактураПолученный";
стрТЗТиповДокументов.ТипУТ = "СчетФактураПолученный";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ОтчетПроизводстваЗаСмену";
стрТЗТиповДокументов.ТипУТ = "КомплектацияНоменклатуры";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "КомплектацияНоменклатуры";
стрТЗТиповДокументов.ТипУТ = "КомплектацияНоменклатуры";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ОприходованиеТоваров";
стрТЗТиповДокументов.ТипУТ = "ОприходованиеТоваров";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "СписаниеТоваров";
стрТЗТиповДокументов.ТипУТ = "СписаниеТоваров";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "ПеремещениеТоваров";
стрТЗТиповДокументов.ТипУТ = "ПеремещениеТоваров";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "КорректировкаРеализации";
стрТЗТиповДокументов.ТипУТ = "КорректировкаРеализации";
стрТЗТиповДокументов = ТЗТиповДокументов.Добавить();
стрТЗТиповДокументов.ТипБП = "КорректировкаПоступления";
стрТЗТиповДокументов.ТипУТ = "КорректировкаПоступления";
ТЗДокументов = ТЗТиповДокументов.СкопироватьКолонки();
спДокументов = новый СписокЗначений;
Для каждого стр из Параметры.СписокЗагруженныхДокументов Цикл
Найдено = ТЗТиповДокументов.НайтиСтроки(новый Структура("ТипБП",стр.Значение.Метаданные().Имя));
Для каждого Строка из Найдено Цикл
стрТЗДокументов = ТЗДокументов.Добавить();
стрТЗДокументов.Значение = стр.Значение;
стрТЗДокументов.ТипБП = Строка.ТипБП;
стрТЗДокументов.ТипУТ = Строка.ТипУТ;
КонецЦикла;
КонецЦикла;
Если ТЗДокументов.Количество() > 0 Тогда
Сервер="там, где расположена база";
База="база, где регистрируются докумнеты для выгрузки";
ИмяПользователя="пользователь базы";
Пароль="пароль пользователя";
СтрокаПодключения = "srvr='" + Сервер + "'; ref='" + База + "'; usr='" + ИмяПользователя + "'; pwd='" + Пароль + "';";
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Если Соединение <> "" Тогда
УзелОбмена = Соединение.ПланыОбмена.ОбменБПЧерезУниверсальныйОбмен.НайтиПоКоду("2");
МассивДокументов = новый Массив;
Для каждого стрДокумент из ТЗДокументов Цикл
Если стрДокумент.Значение = Документы[стрДокумент.ТипБП].ПустаяСсылка() Тогда
Продолжить;
КонецЕсли;
МетаданныеОбъекта = стрДокумент.Значение.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти("УИД_УТ") = Неопределено Тогда
УИД = стрДокумент.Значение.УникальныйИдентификатор();
Иначе
УИД = стрДокумент.Значение.УИД_УТ;
КонецЕсли;
Попытка
СсылкаНаДок = Соединение.Документы[стрДокумент.ТипУТ].ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
Соединение.ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена,СсылкаНаДок);
МассивДокументов.Добавить(СсылкаНаДок);
Исключение
КонецПопытки
КонецЦикла;
Для каждого стр из МассивДокументов Цикл
Найдено = Параметры.СписокЗагруженныхДокументов.НайтиПоЗначению(стр);
Если Найдено = Неопределено Тогда
Продолжить;
Иначе
Параметры.СписокЗагруженныхДокументов.Удалить(Найдено);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Предварительные действия перед обменом описал.
Обработку загрузки и выгрузки добавил ниже.