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

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 Сейчас в теме
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)