Как при обмене данных прекращать обмен, если в приемнике нет определенного объекта

1. Lyns_owner 356 14.08.12 11:03 Сейчас в теме
Есть две базы 8.2, между ними запускается обмен. Номенклатура конвертируются по принципу: Если не находим номенклатуру по связке 3-ех полей (Наименование, Код, ЭтоГруппа), то ищем ее в приемнике в регистре сведений "Номенклатура контрагентов". В правиле конвертации номенклатуры, стоит признак "Не создавать новый объект в приемнике, если он НЕ найден".

Задача:
Не начинать/Полностью откатывать обмен (в транзакции) если номенклатура не нашлась в приемнике. При этом выдавать сообщение об ошибке с наименованием номенклатуры источника, которой нет в приемнике.
По теме из базы знаний
Найденные решения
44. serg_gres 154 21.08.12 17:42 Сейчас в теме
Я тоже считаю, что нужно проверку делать перед загрузкой данных.
Все про это пишут, но никакой конкретики, вот что у меня получилось (делал с контрагентами, но суть от этого не изменится):

Мысль такая:
1. При выгрузке данных заполняем массив, где будут все выгруженные контрагенты
2. После выгрузки этот массив сохраняется в файл (через параметр передать не получилось)
3. После загрузки параметров, читаем массив из файла
4. Проверяем контрагентов, если что-то не устраивает - отказываемся от загрузки

Плохой нюанс в том, что данные сохраняются в файл, возможно возникнут проблемы если будут выгружать - загружать несколько пользователей (или даже 1 пользователь но "перепутает файл с данными")

Хотя имя файла можно попробовать формировать через Новый УникальныйИдентификатор(), тогда путаница точно не возникнет.

Скрины прилагаю:




Lyns_owner; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
42. alexlights 21.08.12 16:13 Сейчас в теме
(1) Lyns_owner, А обмен происходит через планы обмена ?
55. PostoronnimV 03.09.12 12:17 Сейчас в теме
(1) Lyns_owner,

я делал предзагрузку.
Вычитываю справочники, пропускаю документы. При загрузке справочников кладу в кэш результат загрузки.
После предзагрузки анализирую кэш и т.д. продолжаю или прерываюсь.

ПЕРЕД ЗАГРУЗКОЙ ДАННЫХ
//----------------------------------------------------------------------------------------------------
ДанныеЗагрузки= Новый Структура();

Параметры.ДанныеЗагрузки= ДанныеЗагрузки;


Кэш= Новый Структура();
Кэш.Вставить("Номенклатура",Новый Соответствие());
Кэш.Вставить("СоответствиеНПП",Новый Соответствие());
Кэш.Вставить("Контрагенты",Новый Соответствие());
Кэш.Вставить("Договора",Новый Соответствие());
Параметры.КэшЗагрузки= Кэш;

//----------------------------------------------------------------------------------------------------

Предзагрузка= Новый Соответствие;
Предзагрузка.Вставить("СправочникСсылка.Контрагенты",Истина);
Предзагрузка.Вставить("СправочникСсылка.ДоговорыКонтрагентов",Истина);

Ответ = Вопрос("Выполнить вначале загрузку справочников?", РежимДиалогаВопрос.ДаНет, 60);
Если Ответ = КодВозвратаДиалога.Да Тогда
	Попытка // Скопировано из штатной обработки
		Пока ФайлОбмена.Прочитать() Цикл
			
			ИмяУзла = ФайлОбмена.ЛокальноеИмя;
			
			#Если Клиент Тогда
				ОбработкаПрерыванияПользователя();
			#КонецЕсли
			
			Если ИмяУзла = "Объект" Тогда
				
				// Обрабатываем только типы из соответствия.
				ТипОбъектаСтрокой       = одАтрибут(ФайлОбмена, одТипСтрока, "Тип");
				Если Предзагрузка.Получить(ТипОбъектаСтрокой)<> Неопределено Тогда   // Проверяем и грузим только то что нужно.
					ПоследнийОбъектЗагрузки = ПрочитатьОбъект();
					ОбработатьОкончаниеЧтенияНовогоЭлемента(ПоследнийОбъектЗагрузки);
				Иначе
					одПропустить(ФайлОбмена, "Объект");  // Всё остальное пропускаем
					ПоследнийОбъектЗагрузки = Неопределено;
				КонецЕсли;
				
			ИначеЕсли ИмяУзла = "ЗначениеПараметра" Тогда // Параметры грузим - на будущее.	
				ЗагрузитьЗначенияПараметровОбменаДанными();
			Иначе
				одПропустить(ФайлОбмена);
			КонецЕсли;
		КонецЦикла;
		
	Исключение
		
		СтрокаОшибки = ОписаниеОшибки();
		
		РезультирующаяСтрокаСИнформациейОбОшибке = ЗаписатьВПротоколВыполнения("Ошибка при загрузке данных: " + СтрокаОшибки, Неопределено, Истина, , , Истина);
		
		ЗавершитьВедениеПротоколаОбмена();
		ФайлОбмена.Закрыть();
		
	КонецПопытки;		
	
	// ПРЕДЗАГРУЗКА ОКОНЧЕНА
	// ВОЗРВАЩАЕМ ПЕРЕМЕННЫЕ В ИСХОДНОЕ СОСТОЯНИЕ	
	// Переоткрываем файл заново.
	ФайлОбмена = Новый ЧтениеXML();
	ФайлОбмена.ОткрытьФайл(ИмяФайлаОбмена);
	ФайлОбмена.Прочитать();
	
	// Устанавливаем соответствия.
	//ОбработкаСоответствий= ВнешниеОбработки.Создать("m:\documents\work\Казахстан\УстановкаСоответствий.epf");
	ОбработкаСоответствий= ДопОбработки.ОбработкаСоответствий;
	ОбработкаСоответствий.КэшЗагрузки= Параметры.КэшЗагрузки;
	Если ОбработкаСоответствий.Инициализировать() Тогда
		НеЗагружать= ОбработкаСоответствий.ПолучитьФорму().ОткрытьМодально();
		Отказ= НеЗагружать= Истина;
		
		Если Не Отказ Тогда
			
			Для Каждого эл из ОбработкаСоответствий.Контрагенты Цикл // Устанавливаем новые соответсвия в кэш загруженных данных. Заглушка(может просто очистить кэш?)
				Если ЗначениеЗаполнено(эл.Ссылка) Тогда
			                СтруктураЗаписи = Новый Структура("СсылкаНаОбъект, СсылкаФиктивная");
					СтруктураЗаписи.СсылкаНаОбъект= эл.Ссылка;
					ЗагруженныеОбъекты[эл.Нпп] = СтруктураЗаписи; // Заглушка(Считаем что для контрагентов не будет "быстрого поиска при загрузке" (ГНпп))
				КонецЕсли;
			КонецЦикла;
			
		КонецЕсли;
		
	КонецЕсли;
КонецЕсли;
Показать


В нужных ПКО: Например Контрагенты.

ПОЛЯ ПОИСКА - запоминаем объект и его свойства, которые искали.
НомерСсылки= ?(НППГлобальнойСсылки= 0,НППСсылки,НППГлобальнойСсылки);
Параметры.КэшЗагрузки.Контрагенты.Вставить(НомерСсылки,ЗначениеИЗСтрокиВнутр(ПараметрыОбъекта.Получить("стрОбъекта")));


ПРИ ЗАГРУЗКЕ - если нашли объект, добавляем его ссылку в сохраненные свойства.
Если ОбъектНайден Тогда
	НомерСсылки= ?(НППГлобальнойСсылки= 0,НППСсылки,НППГлобальнойСсылки);
	СтрОбъекта= Параметры.КэшЗагрузки.Контрагенты.Получить(НомерСсылки);
	стрОбъекта.Вставить("Ссылка",Ссылка);
	
	Параметры.КэшЗагрузки.Контрагенты.Вставить(НомерСсылки,стрОбъекта);
	Параметры.КэшЗагрузки.СоответствиеНПП.Вставить(Ссылка,НомерСсылки); // Это чтобы искать Владельца для договора
КонецЕсли;
2. alexlights 14.08.12 12:37 Сейчас в теме
В типовом обмене в обработке ОбменДаннымиXml, есть настройка - "Использовать транзакции при выгрузке для планов обмена". Т.е весь обмен идет в транзакции.
Потом в алгоритме поиска, нужно указать, что то наподобии "Если ОбъектНайден=Ложь Тогда ВызватьИсключение НазваниеНоменклатуры"
7. Lyns_owner 356 14.08.12 14:05 Сейчас в теме
(2) alexlights, Хотелось бы услышать более развернутый ответ. В алгоритме поиска чего? откуда и как туда передается "НазваниеНоменклатуры" и прочее)
8. alexlights 14.08.12 14:10 Сейчас в теме
(7) Lyns_owner, Напишите код обработчика "ПоляПоиска" для номенклатуры.

Чтобы увидеть:
то ищем ее в приемнике в регистре сведений "Номенклатура контрагентов"
13. Lyns_owner 356 14.08.12 14:29 Сейчас в теме
(8) alexlights,

Если это имеет значение. Код обработчика "Поля поиска" ПКО "Номенклатура":

Если НомерВариантаПоиска = 1 Тогда
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	
	"ВЫБРАТЬ
	|	НоменклатураКонтрагентов.Номенклатура
	|ИЗ
	|	РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
	|ГДЕ
	|	НоменклатураКонтрагентов.КодНоменклатурыКонтрагента = &КодНоменклатурыКонтрагента
	|	И НоменклатураКонтрагентов.Контрагент = &Контрагент";
	
	Запрос.УстановитьПараметр("КодНоменклатурыКонтрагента",    СвойстваПоиска.Получить("Код"));
	Запрос.УстановитьПараметр("Контрагент",    Константы.КС_КонтрагентОбменаДокументами.Получить());
	
	Сообщить(Константы.КС_КонтрагентОбменаДокументами.Получить());
	Сообщить(СвойстваПоиска.Получить("Код"));
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Следующий() Тогда
		СсылкаНаОбъект = Выборка.Номенклатура;
	Иначе
		СсылкаНаОбъект = Неопределено;
	КонецЕсли;
	ПрекратитьПоиск = Истина;
Иначе
	СсылкаНаОбъект = Неопределено;
КОнецЕсли;
Показать
31. shiaju 25 17.08.12 08:02 Сейчас в теме
(13) Чо за "конфертация" на скриншоте? о_О

Это действительно так и есть в конфигурации, или фейк? :)
3. red80 14.08.12 13:43 Сейчас в теме
Проверять наличие этого объекта перед началом обмена. Есть такой обработчик.
4. alexlights 14.08.12 13:53 Сейчас в теме
(3) red80, А где в конвертации данных взять такой обработчик "ПередНачаломОбмена". И если допустить, что есть такой обработчик, то данный обработчик по логике вещей должен видеть данные источника, но никак приемника.
5. red80 14.08.12 14:01 Сейчас в теме
(4) alexlights, Должен быть обработчик типа "Перед загрузкой данных". Но тут это не прокатит, какой объект нужен заранее не известно.
6. alexlights 14.08.12 14:05 Сейчас в теме
(5) red80, А смысл в "ПерезЗагрузкой", если ТС нужно вызывать ошибку в алгоритме поиска
9. red80 14.08.12 14:11 Сейчас в теме
(6) alexlights, Где в названии темы написано об алгоритме поиска?
10. alexlights 14.08.12 14:18 Сейчас в теме
(9) red80, Информация по проблеме озвучена не только в названии темы, но и в первом сообщении ТС
11. red80 14.08.12 14:20 Сейчас в теме
(10) alexlights, Флаг тебе в руки.
12. alexlights 14.08.12 14:25 Сейчас в теме
(11) red80, Грубить не надо. Этим ты проблему не решишь. Форум как раз предназначен для помощи, а не для непонятных высказываний
14. alexlights 14.08.12 15:03 Сейчас в теме
Вот как я делаю поиск:
Если НомерВариантаПоиска = 1 И ПараметрыОбъекта<>Неопределено Тогда
	Выполнить(Алгоритмы.ПоискПоСоответствию);
Иначе
	СтрокаИменСвойствПоиска = "Код, Наименование,ЭтоГруппа";
КонецЕсли;

Если НЕ ОбъектНайден Тогда 
	СтрокаИменСвойствПоиска = "Код, Наименование,ЭтоГруппа";	
КонецЕсли;
Показать


Алгоритм.ПоискПоСоответствию
Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| СоответствиеОбъектовДляОбмена.СобственнаяСсылка КАК Ссылка

|ИЗ

| РегистрСведений.СоответствиеОбъектовДляОбмена КАК СоответствиеОбъектовДляОбмена

|ГДЕ

| СоответствиеОбъектовДляОбмена.УзелОбмена = &УзелОбмена

| И СоответствиеОбъектовДляОбмена.СсылкаВДругойИБ = &СсылкаВДругойИБ

| И СоответствиеОбъектовДляОбмена.ИмяТипаПриемника = &ИмяТипаПриемника";

Запрос.УстановитьПараметр("УзелОбмена", Неопределено);

Запрос.УстановитьПараметр("СсылкаВДругойИБ",ПараметрыОбъекта.Получить("СсылкаСтрокой"));

Запрос.УстановитьПараметр("ИмяТипаПриемника", СтруктураСвойств.ТипСсылкиСтрокой);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
	
	СсылкаНаОбъект=Выборка.Ссылка;
	
	ОбъектНайден=Истина;
	
КонецЕсли;
Показать

Скидываю свой алгоритм, может окажется полезным.

Вот в конце обработчика твоего "Поля поиска" пишешь Если ОбъектНайден=Ложь Тогда ВызватьИсключение ТвойПараметр КонецЕсли;
Или в Обработчике "ПриЗагрузке" пишешь такой код.
15. Lyns_owner 356 14.08.12 15:24 Сейчас в теме
(14) alexlights, Поиск по соответствию обмен делает сам автоматически. Переменной "ОбъектНайден" нет в обработчике "Поля поиска", она есть в обработчике "ПриЗагрузке".
Если ОбъектНайден=Ложь Тогда ВызватьИсключение ТвойПараметр КонецЕсли;

- хотелось бы увидеть пример. И есть ли возможность в справочнике "Настройка обмена данными" указать, что обмен происходит в единой транзакции?
17. alexlights 14.08.12 16:05 Сейчас в теме
(15) Lyns_owner, В Справочнике "НастройкиОбменаДанными", на вкладке Интерактивный обмен. Там указываются указываются количество элементов в транзакции. Можно поставить нереальное число и весь обмен будет в одной транзакции.
20. Lyns_owner 356 14.08.12 17:08 Сейчас в теме
(17) alexlights, Если почитать подсказку к этому полю то там написано следующее: "Количество элементов данных, обрабатываемых в одной транзакции на загрузку. Если 0 то все данные загружаются в одной транзакции".

В обработчике "При загрузке" ПКО "Номенклатура" написал:

 Если НЕ ОбъектНайден Тогда
	 ТекстОшибки = "Не найдено соответствие номенклатуры " + Параметры.НаименованиеПолное + " в базе приемнике!";
	 ВызватьИсключение ТекстОшибки; 
 КонецЕсли;


- не взлетело. Обмен спокойно сработал: создал, что нашел, что не нашел - не создал.

Пошел по другому пути: В обработчике "Поля поиска" ПКО "Номенклатура" написал код (приведу кусок):

Если Выборка.Следующий() Тогда
		СсылкаНаОбъект = Выборка.Номенклатура;
	Иначе
		СсылкаНаОбъект = Неопределено;
		ТекстОшибки = "Не найдено соответствие номенклатуры " + СвойстваПоиска.Получить("Наименование") + " в базе приемнике!";
		ВызватьИсключение ТекстОшибки; 
	КонецЕсли;
- взлетело - обмен встал с моим текстом ошибки. Это уже кое-что. Но все-таки обмен прошел не в транзакции, что успело загрузиться - то осталось.
18. alexlights 14.08.12 16:13 Сейчас в теме
(15) Lyns_owner,
хотелось бы увидеть пример

Что Вы хотите увидеть в примере ?
16. kilokilo 18 14.08.12 15:55 Сейчас в теме
Есть две базы 8.2, между ними запускается обмен. Номенклатура конвертируются по принципу: Если не находим номенклатуру по связке 3-ех полей (Наименование, Код, ЭтоГруппа), то ищем ее в приемнике в регистре сведений "Номенклатура контрагентов". В правиле конвертации номенклатуры, стоит признак "Не создавать новый объект в приемнике, если он НЕ найден".

Задача:
Не начинать/Полностью откатывать обмен (в транзакции) если номенклатура не нашлась в приемнике. При этом выдавать сообщение об ошибке с наименованием номенклатуры источника, которой нет в приемнике.

Ваши Правила обмена прикрепите или на внешний ресурс и ссылку киньте на нее
19. Lyns_owner 356 14.08.12 16:23 Сейчас в теме
(16) kilokilo, Это специфические базы данных, у вас нет описания их метаданных. В правилах обмена пока нет ничего кроме вышеприведенного кода обработчика "Поля поиска" ПКО "Номенклатура". Кроме того, не вижу в этом ровно никакого смысла, если только вы не хотите скинуть мне готовые правила обмена)
21. alexlights 15.08.12 10:13 Сейчас в теме
(19) Lyns_owner, Ну вот, с одним из условий разобрались. Сейчас подумаем насчет транзакции.
22. Lyns_owner 356 15.08.12 17:59 Сейчас в теме
(21) alexlights, Готов перевести вам половину вознаграждения)
24. alexlights 16.08.12 08:56 Сейчас в теме
(22) Lyns_owner, Это хорошо будет. Но теперь самому стало интересно с транзакцией. Сейчас немного на работе освобожусь и сразу проверю
23. Farpost 116 16.08.12 03:24 Сейчас в теме
Я предпочитаю писать свои обработки обмена, если есть возможность, то не через файлы обмена, а через подключение COM/OLE, в этом случае пусть затрачу чуть больше времени на написание и настройку, но зато получаю большую гибкость при проведении обменов. А когда есть готовые шаблоны, то настройка таких обменов по времени сопоставима с настройкой в конвертации данных
25. alexlights 16.08.12 08:59 Сейчас в теме
(23) Farpost, А смысл написания ручного обмена. Тут никакой гибкости. Если обмен происходит между конфигурациями 1С, то быстрее, гибче делать через конвертацию данных. Ну а всякие мелочи, то можно и вручную написать.
26. Farpost 116 16.08.12 09:53 Сейчас в теме
Быстрее может быть, но ненамного и то сомневаюсь, а насчёт гибкости - я в коде гораздо большими возможностями и инструментами обладаю, нежели настройки в конвертации... ибо язык внутренний ниже уровнем чем настройки внутри конфигурации, ну, а недостатков файлообмена, я вообще касаться не буду... впрочем у каждого свои предпочтения... мне лично удобнее работать не с конвертацией данных, а с внешними обработками, начинающим само собой чем выше уровень, тем легче...
Я же не говорю, что КД это плохо - я говорю, что мне удобнее
27. Lyns_owner 356 16.08.12 10:26 Сейчас в теме
(26) Farpost, Как смешно читать ваше сообщение. Собираясь поесть, вы не возьмете в руку вилку, вы скажете, что она неудобная. Пойдете добывать руду, затем будете ее обрабатывать и в итоге у вас получится жалкое подобие вилки, которым вы будете гордо пользоваться. Остальным же останется только посмеяться над вами.

Плюс ко всему, кто сказал, что обмен по правилам обмена не может работать через COM/OLE?

З.Ы. программист, изобретающий велосипед - плохой программист.

З.Ы.Ы. Прежде чем употреблять термин, выясните, что он означает. Вы не знаете, что понятие "гибкость" подразумевает.
28. alexlights 16.08.12 10:42 Сейчас в теме
(26) Farpost,
ибо язык внутренний ниже уровнем чем настройки внутри конфигурации

И что же такое по Вашему мнению настройки конфигурации? И что в КД нельзя сделать?

Так что если Вы в достаточной степени не умеете пользоваться инструментом, то это не говорит о том, что инструмент плохой
Lyns_owner; +1 Ответить
29. nucha 97 16.08.12 10:50 Сейчас в теме
(26) Farpost, в ряде небольшого количества случаев так оно и есть.
30. Farpost 116 17.08.12 05:42 Сейчас в теме
Ребята, вы смотрю не вышли ещё из возраста детского, всё то у вас в черно-белом контрастном цвете... КД инструмент типа конструктора, язык тоже инструмент, но типа несколько другого, им конструкторы создают, кому привычней будет работать на уровне языка - это моё и никому я его не навязываю... насчёт руды и вилки -

(26) Собираясь поесть, вы не возьмете в руку вилку, вы скажете, что она неудобная. Пойдете добывать руду, затем будете ее обрабатывать и в итоге у вас получится жалкое подобие вилки, которым вы будете гордо пользоваться.

Вы сударь передёргиваете и слишком сильно... я же не призываю писать обработки на ассемблере..., хотя вы наверное про такой язык и не слыхивали...
Хотя истины ради настоящие спецы на ассемблере такие вещи делают - никаким языкам более высокого уровня не угнаться...
Ещё раз повторю, для особо упёртых - Я НЕ ГОВОРЮ, ЧТО КД ГОВНО!!! Я ГОВОРЮ, ЧТО ЛИЧНО МНЕ УДОБНЕЕ ПОЛЬЗОВАТЬСЯ ВНЕШНИМИ САМОПИСНЫМИ ОБРАБОТКАМИ!!!
Если Вам удобнее ваять обмен в КД - флаг в руки и вперёд, только тогда возникает вопрос - а что при всём удобстве и гибкости КД знаний не хватает решить проблемы при обмене, раз вы их здесь выносите или всё таки КД не такая уж гибкая весч? ;-)
32. alexlights 17.08.12 09:58 Сейчас в теме
а что при всём удобстве и гибкости КД знаний не хватает решить проблемы

А я смотрю Вы сразу родились со знанием 1С :) И ни у кого не спрашивали как решить проблему
33. alexlights 17.08.12 10:06 Сейчас в теме
Я ГОВОРЮ, ЧТО ЛИЧНО МНЕ УДОБНЕЕ ПОЛЬЗОВАТЬСЯ ВНЕШНИМИ САМОПИСНЫМИ ОБРАБОТКАМИ!!!

Интересно. А обмен между двумя разнородными конфигурациями с кучей справочников, документов Вы тоже будете делать через самописную обработку ?
34. Lyns_owner 356 17.08.12 19:49 Сейчас в теме
а что при всём удобстве и гибкости КД знаний не хватает решить проблемы


Если я не знаю, как решить задачу с помощью определенного функционала, это еще не означает, что данным функционалом задачу решить нельзя.

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

Не умеете пользоваться функционалом и не хотите учиться - ваше дело, пишите свой неуниверсальный функционал.

Впредь попрошу в данной теме писать по вопросу, описанному в первом сообщении, а не флудить.
35. Lyns_owner 356 17.08.12 19:53 Сейчас в теме
я же не призываю писать обработки на ассемблере..., хотя вы наверное про такой язык и не слыхивали...


Что за глупые оскорбления? Кто из нас после этого ребенок?
36. Farpost 116 20.08.12 06:39 Сейчас в теме
(35) Lyns_owner,
А я смотрю Вы сразу родились со знанием 1С :) И ни у кого не спрашивали как решить проблему

Нет конечно - учился, спрашивал, экспериментировал..., но при этом никому не навязывал своего мнения - оно моё и для меня... так же как весь мой опыт. И своим мнением и опытом я делюсь с другими, так же как делились со мной мои "учителя" в том числе и заочные...
Интересно. А обмен между двумя разнородными конфигурациями с кучей справочников, документов Вы тоже будете делать через самописную обработку ?
Если Вам интересно - как раз обмен между разнородными конфигурациями наиболее эффективно получается при использовании самописной моей обработки - это из моего личного опыта...
Что за глупые оскорбления? Кто из нас после этого ребенок?
Ну дык не я же первый начал... вот ваш посыл, если забыли:

(26) Farpost, Как смешно читать ваше сообщение. Собираясь поесть, вы не возьмете в руку вилку, вы скажете, что она неудобная. Пойдете добывать руду, затем будете ее обрабатывать и в итоге у вас получится жалкое подобие вилки, которым вы будете гордо пользоваться. Остальным же останется только посмеяться над вами.
37. Robot123 172 21.08.12 13:20 Сейчас в теме
Хех, развели тут... В общем, нужно просто в обработчике "Перед загрузкой данных" вручную проверить загружаемую номенклатуру и вызвать исключении при ее отсутствии.
38. Нагайна 21.08.12 13:49 Сейчас в теме
в общем согласна с (37) .. но я бы использовала "после загрузки объекта" в обработчиках конвертации .. т.е. глобальный обработчик , там есть ссылка и объект , если ссылка не определена , но объект не записывать и падать.
39. alexlights 21.08.12 15:47 Сейчас в теме
(37) Robot123, (38) Нагайна,
Как бы это проблему то решили :) Читаем внимательно посты.
Нужно, что бы откатывался весь обмен. Это Вы можете увидеть, если еще раз перечитаете первое сообщение ТС
40. serg_gres 154 21.08.12 16:05 Сейчас в теме
(39) alexlights,
Как бы это проблему то решили :) Читаем внимательно посты.
Нужно, что бы откатывался весь обмен. Это Вы можете увидеть, если еще раз перечитаете первое сообщение ТС


- не совсем понял : проблема с транзакцией решена?
41. alexlights 21.08.12 16:12 Сейчас в теме
(40) serg_gres, С транзакцией нет. А чтобы ошибка валилась - да
43. Robot123 172 21.08.12 16:47 Сейчас в теме
При чем здесь транзакции. Я же русским языком написал, что нужна проверка до загрузки всех данных и реализовать ее можно в глобальном обработчике "Перед загрузкой данных". Тогда и откатывать никакие измения не придется. Номенклатуру для проверки можно поместить в параметры конвертации в какую-нибудь коллекцию.
44. serg_gres 154 21.08.12 17:42 Сейчас в теме
Я тоже считаю, что нужно проверку делать перед загрузкой данных.
Все про это пишут, но никакой конкретики, вот что у меня получилось (делал с контрагентами, но суть от этого не изменится):

Мысль такая:
1. При выгрузке данных заполняем массив, где будут все выгруженные контрагенты
2. После выгрузки этот массив сохраняется в файл (через параметр передать не получилось)
3. После загрузки параметров, читаем массив из файла
4. Проверяем контрагентов, если что-то не устраивает - отказываемся от загрузки

Плохой нюанс в том, что данные сохраняются в файл, возможно возникнут проблемы если будут выгружать - загружать несколько пользователей (или даже 1 пользователь но "перепутает файл с данными")

Хотя имя файла можно попробовать формировать через Новый УникальныйИдентификатор(), тогда путаница точно не возникнет.

Скрины прилагаю:




Lyns_owner; +1 Ответить
50. Lyns_owner 356 22.08.12 00:15 Сейчас в теме
(44) serg_gres, Хорошая идея, чуть позже проверю ее и попробую развить без использования файла.

(48) Uscolegy, Трудно сказать. Это будет зависеть от объема продаж. Думаю сейчас 200-300. Обмен происходит через прямое подключение к базе приемнику.
51. Uscolegy 22.08.12 06:12 Сейчас в теме
(50) Lyns_owner, тогда тем более незначительно увеличится объем передаваемых данных. А при прямом подключении вообще почти не ощутится нагрузка при моем методе
58. Lyns_owner 356 19.09.12 01:19 Сейчас в теме
К моему сожалению, не было времени заниматься данной темой, да и сейчас нет)

Лучший ответ - (44) serg_gres.
alexlights также получает вознаграждение за потраченное время.

(55) PostoronnimV, Я смотрю вы выполнили немалую работу когда-то :) Хоть и очень мудреный способ. Спасибо, что поделились кодом.

Правда не поделились обработкой ;)

  
//ОбработкаСоответствий= ВнешниеОбработки.Создать("m:\documents\work\Казахстан\УстановкаСоответствий.epf");
ОбработкаСоответствий= ДопОбработки.ОбработкаСоответствий;
59. anchovy 24 01.12.13 17:51 Сейчас в теме
45. Uscolegy 21.08.12 19:14 Сейчас в теме
а что собсно мешает создать правила сначала для поиска, а затем уже для конечной загрузки?
т.е. первый раз выгружаем только связку реквизитов по которым ищете, перед загрузкой проверка на найден ли элемент. в параметрах конвертации указываем флаг были ли пропуски при загрузке этих полей проверки. если хоть одна номенклатура пропущена, тогда загрузку реальную не начинаем вообще.
46. serg_gres 154 21.08.12 20:18 Сейчас в теме
(45) Uscolegy, по идее должно сработать, только отказ=1 нужно будет писать во всех ПКО (и справочников, и документов).
47. Uscolegy 21.08.12 21:31 Сейчас в теме
(46) serg_gres, а чем не нравится событие ПередЗагрузкойОбъекта у конвертации данных? по сути ведь то же самое что и прописывать у каждого объекта перед загрузкой? (Поправьте, если не так, сам ни разу не использовал это событие)
49. serg_gres 154 22.08.12 00:03 Сейчас в теме
(47) Uscolegy, ПередЗагрузкойОбъекта - тоже никогда не пользовался, посмотрел толмут - должно сработать.
48. Uscolegy 21.08.12 21:35 Сейчас в теме
Топикстартеру, а сколько объектов примерно выгружается за одну выгрузку? какой канал связи между базами?
52. kansler 29.08.12 08:53 Сейчас в теме
А что мешает в обработчике "Поля поиска" описать свой алгоритм поиска объекта в базе приемника. Если объект не найден указать "ПрекратитьПоиск = Истина". Потом в обработчике ПриЗагрузке написать
Если НЕ ОбъектНайден Тогда
    Отказ = Истина
КонецЕсли
53. Rufous 29.08.12 16:31 Сейчас в теме
В типовом обмене в обработке ОбменДаннымиXml, есть настройка - "Использовать транзакции при выгрузке для планов обмена". Т.е весь обмен идет в транзакции.
Потом в алгоритме поиска, нужно указать, что то наподобии "Если ОбъектНайден=Ложь Тогда ВызватьИсключение НазваниеНоменклатуры"


А что мешает в обработчике "Поля поиска" описать свой алгоритм поиска объекта в базе приемника. Если объект не найден указать "ПрекратитьПоиск = Истина". 


?
54. kansler 30.08.12 10:54 Сейчас в теме
(53) Rufous,
Параметр "ОбъектНайден" доступен в обработчике ПриЗагрузке, там же и надо вызывать исключение. При этом объект не должен записаться, а транзакция должна откатиться. Именно это и требуется в задаче.
56. Uscolegy 03.09.12 21:58 Сейчас в теме
судя по отсутствию активности в теме автор все давно решил, ну или просто не может добавить фото в аватар:)
kill3rl88p; +1 Ответить
57. ArtfulCrom 22 08.09.12 15:47 Сейчас в теме
Я может не правильно прочитал условие задачи, но если обе БД находятся "территориально рядом", стоит использовать СОМ подключение для обмена.

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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот