Обмен данными через обработку.

1. digorec88 11.01.19 17:18 Сейчас в теме
Всем привет. Делаю обмен с помощью обработки. Документ Переносится. Но когда в базе источнике я меняю что нибудь в этом документе(допустим в тч количество или сумма),
то при очередном обмене у меня в базе приемнике создается новый документ.
Обмен идет через добавленный регистр в базе источнике. Т.е при проведении документа в базе источнике, в регистре появляется запись с измерением типа ДокументСсылка.
База приемник обращается к этому регистру и вытаскивает оттуда данные. После обмена записи в регистре очищаются.
Обмен настроен через NewObject.


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

			НовыйДокумент.УстановитьНовыйНомер();  			
			      			
		КонецЕсли;
		
	     НовыйДокумент.Статус            = ВыборкаДокументов.Статус;
		 НовыйДокумент.Ответственный     = ПараметрыСеанса.ТекущийПользователь;		        		
		 

		
		
		ЗапросТовары = База2.NewObject("Запрос");       	
		ЗапросТовары.Текст = 
		"ВЫБРАТЬ
		|	ВыпускПродукцииТовары.НомерСтроки КАК НомерСтроки,
		|	ВыпускПродукцииТовары.Номенклатура,
		|	ВыпускПродукцииТовары.Номенклатура.Наименование,
		|	ВыпускПродукцииТовары.Штрихкод,
		|	ВыпускПродукцииТовары.ДатаВыпуска,
		|	ВыпускПродукцииТовары.Количество,
		|	ВыпускПродукцииТовары.Склад,
		|	ВыпускПродукцииТовары.Склад.Наименование КАК СкладНаименование,
		|	ВыпускПродукцииТовары.Номенклатура.Код КАК НоменклатураКод
		|ИЗ
		|	Документ.ВыпускПродукции.Товары КАК ВыпускПродукцииТовары
		|ГДЕ
		|	ВыпускПродукцииТовары.Ссылка = &Документ
		|
		|СГРУППИРОВАТЬ ПО
		|	ВыпускПродукцииТовары.НомерСтроки,
		|	ВыпускПродукцииТовары.Номенклатура,
		|	ВыпускПродукцииТовары.Номенклатура.Наименование,
		|	ВыпускПродукцииТовары.Штрихкод,
		|	ВыпускПродукцииТовары.ДатаВыпуска,
		|	ВыпускПродукцииТовары.Количество,
		|	ВыпускПродукцииТовары.Склад,
		|	ВыпускПродукцииТовары.Склад.Наименование
		|
		|УПОРЯДОЧИТЬ ПО
		|	НомерСтроки"; 
		
		ЗапросТовары.УстановитьПараметр("Документ", ВыборкаДокументов.Документ);

		РезультатЗапроса = ЗапросТовары.Выполнить();
		
		ВыборкаТовары = РезультатЗапроса.Выбрать();
		
		Пока ВыборкаТовары.Следующий() Цикл  						
			
			НоваяСтрока = НовыйДокумент.Товары.Добавить();
				
			НоваяСтрока.Номенклатура 		= НайтиСоздатьНоменклатуру(ВыборкаТовары);
			НоваяСтрока.Штрихкод            = ВыборкаТовары.Штрихкод;
			НоваяСтрока.ДатаВыпуска         = ВыборкаТовары.ДатаВыпуска;
 			НоваяСтрока.Количество 			= ВыборкаТовары.Количество;
			НоваяСтрока.Склад			    = Справочники.Склады.НайтиПоНаименованию(СокрЛП(ВыборкаТовары.СкладНаименование), Истина);

		КонецЦикла;
		
		Если НовыйДокумент.Товары.Количество() > 0 Тогда  			
			Если НовыйДокумент.Проведен Тогда
				НовыйДокумент.Записать(РежимЗаписиДокумента.ОтменаПроведения);  
			КонецЕсли;
			
			Попытка
				НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

				ТекстСообщения = "Документ ""Выпуск продукции №"" " + ВыборкаДокументов.Номер + " от " + Формат(ВыборкаДокументов.Дата,"ДФ=dd.MM.yyyy") + ": записан.";
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);  
			Исключение
				ТекстСообщения = "Документ ""Выпуск продукции №"" " + ВыборкаДокументов.Номер + " от " + Формат(ВыборкаДокументов.Дата,"ДФ=dd.MM.yyyy") + ": " + ОписаниеОшибки();
				ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
			КонецПопытки;
		КонецЕсли;  
		
		УдалитьРегистрациюОбъекта(ВыборкаДокументов.Документ, База2);

	КонецЦикла;	
	
КонецПроцедуры	



&НаСервере
Функция ПолучитьНужныеДокументы(БазаИмпорта, ВидОбъекта)

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

КонецФункции



&НаСервере
Функция ПолучитьДокументВыпускПродукции(ВыборкаДокументов)

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ВыпускПродукции.Ссылка КАК Документ
	|ИЗ
	|	Документ.ВыпускПродукции КАК ВыпускПродукции
	|ГДЕ
	|	ВыпускПродукции.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
	|	И ВыпускПродукции.Выгрузить = &Выгрузить";
	
	Запрос.УстановитьПараметр("Дата", 		ВыборкаДокументов.Дата);
	Запрос.УстановитьПараметр("Выгрузить",ВыборкаДокументов.Выгрузить);
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	ВыборкаДетальныеЗаписи.Следующий();
	
	Возврат ВыборкаДетальныеЗаписи.Документ;
	
КонецФункции
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. digorec88 11.01.19 17:20 Сейчас в теме
&НаСервере
Процедура УдалитьРегистрациюОбъекта(Объект, БазаИмпорта)

НаборЗаписей = БазаИмпорта.РегистрыСведений.МТ_КатегорииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(Объект);
НаборЗаписей.Отбор.Категория.Установить(БазаИмпорта.Справочники.МТ_КатегорииОбъектов.WMSИзменен);

НаборЗаписей.Записать();

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

Это процедура удаления записей регистра.
+
3. user633533_encantado 11 11.01.19 18:53 Сейчас в теме
ПолучитьДокументВыпускПродукции() у тебя никогда не найдет нужный документ. Ты в запрос ссылку не передаешь.

И вообще убери запрос из цикла нафиг.
+
4. digorec88 12.01.19 20:07 Сейчас в теме
(3) | ВыпускПродукции.Ссылка КАК Документ
А это что тогда????
+
5. digorec88 13.01.19 12:41 Сейчас в теме
Есть еще какие нибудь идеи?
+
6. digorec88 14.01.19 07:44 Сейчас в теме
Внимание! Тема сдана в архив

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