Как правильно при выгрузке по ссылке заменить ИмяПКО

1. impulse_1010 36 30.05.13 20:19 Сейчас в теме
Пишу перенос остатков и документов (свертка) средствами конвертации.

Столкнулся со следующей проблемой:

К примеру, в исходной базе имеем документы "Передача материалов в эксплуатацию" на которые в остатках будут ссылки.

Нужно выгрузить по условию: Если дата документа <= ДатаСвёртки Тогда конвертируем в документ "Партия материалов в эксплуатации (ручной учет)" иначе, в "Передача материалов в эксплуатацию"


Создаю 2 ПКО:

1. "ПередачаМатериаловВЭксплуатацию" (Конвертируем в "Партия материалов в эксплуатации (ручной учет)")
- Для тех у которых Дата <= ДатаСвёртки

В обработчике событий "Перед выгрузкой"

Если Источник.Дата > Параметры.ДатаСвертки Тогда
    ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
Иначе
    ИмяПКО = "ПередачаМатериаловВЭксплуатацию";	
КонецЕсли;




2. "ПередачаМатериаловВЭксплуатациюДок" (Конвертируем в ""Передача материалов в эксплуатацию"")
- Для тех которые выгружаю как есть

В обработчике событий "Перед выгрузкой"

Если Источник.Дата > Параметры.ДатаСвертки Тогда
    ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
Иначе
    ИмяПКО = "ПередачаМатериаловВЭксплуатацию";	
КонецЕсли;


В результате, если объект выгружается по ссылке, то встречаются документы с датой < ДатаСвертки, выгруженные по правилу "ПередачаМатериаловВЭксплуатациюДок". Как я понял событие в каких то случаях не обрабатывается.

Подскажите где ещё ИмяПКО можно установить? Или может что то не правильно делаю?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ZergKRSK 130 01.06.13 05:27 Сейчас в теме
Все верно, создаем 2 ПКО. Но в обработчике Перед выгрузкой 1го ПКО пишешь
Если Источник.Дата > Параметры.ДатаСвертки Тогда
    Отказ = ИСТИНА;
КонецЕсли;

В обработчике 2го ПКО пишешь
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
    Отказ = ИСТИНА;
КонецЕсли;

ПВД (правило выгрузки данных) этого дока в обработчике "Перед выгрузкой" пишешь
Если Объект..Дата > Параметры.ДатаСвертки Тогда
    ВыгрузитьПоПравилу(Объект.Ссылка, , , , "ПередачаМатериаловВЭксплуатациюДок");
Иначе
    ВыгрузитьПоПравилу(Объект.Ссылка, , , , "ПередачаМатериаловВЭксплуатацию");
КонецЕсли;

Возможно что в этих двух ПКО обработчики лишние, не знаю. Поэкспериментируйте.
3. impulse_1010 36 01.06.13 16:30 Сейчас в теме
(2) ZergKRSK, Спасибо за ответ.
когда вставляем условие в ПВД выгружается нормально. Но не работает при выгрузке по ссылке. Единственный рабочий способ который мне удалось найти, это указывать ИмяПКО в правилах конвертации свойств при выгрузке. Но это очень большой объём работы, так как предстоит ещё кучу документов конвертировать в "Документ расчетов с контрагентом (ручной учет)".
5. ZergKRSK 130 02.06.13 04:50 Сейчас в теме
(3) impulse_1010,
когда вставляем условие в ПВД выгружается нормально. Но не работает при выгрузке по ссылке.
как проверил? У меня такая связка работает без проблем...
4. impulse_1010 36 01.06.13 16:52 Сейчас в теме
Разобрался.
Может кому пригодится.
Пошарив в обработке УниверсальныйОбменДаннымиВФорматеХML в процедуре ВыгрузитьПоПравилу, наткнулся на код в самом начале процедуры:
Если ПКО = Неопределено Тогда
		
   ПКО = НайтиПравило(Источник, ИмяПКО);
		
ИначеЕсли (Не ПустаяСтрока(ИмяПКО))
	И ПКО.Имя <> ИмяПКО Тогда
		
	ПКО = НайтиПравило(Источник, ИмяПКО);
				
КонецЕсли;
Показать


Дело в том, что для замены правил конвертации нужно поменять ПКО (ПКО это ссылка на ПравилоКонвертации)
При входе в процедуру ИмяПКО у нас задано И ПКО.Имя = ИмяПКО.

Дальше по коду, поиска ссылки на ПКО нет. В итоге в Правилах конвертации объекта написал код:
Если Источник.Дата > Параметры.ДатаСвертки Тогда
	ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
	ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;


И для второго
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
	ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
	ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;



И всё заработало!
user1141000; FoxDW; temdj; Rokky78; begemot; improg; AgnepuS; Drivingblind; bendarik; Grubly; ivanek; tyfmyl; mysm; kivals; Wrols; nick_krsk; +16 Ответить
6. Wrols 89 16.12.13 10:59 Сейчас в теме
(4) impulse_1010, мне помогло следующее:
ПВД - без изменений: выгружает, к примеру, документы "ПередачаМатериаловВЭксплуатацию" правилом "ПередачаМатериаловВЭксплуатациюДок".

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


Т.е. условие во второе правило вставлять не нужно.
7. impulse_1010 36 16.12.13 16:54 Сейчас в теме
(6) Wrols, должно работать. Но на практике почему то попадались не правильно выгруженные документы. Если в ПКС не указать ПКО, тогда ПКО ищется по типу источника и приемника, может на этом этапе сбоило, конфа была очень древняя.

Кстати, если делаешь правила для переноса остатков, то документы "Передача материалов в эксплуатацию" переноси как есть, которые до даты свертки должны быть без движений. А то при закрытии месяца не будет погашаться стоимость. ("Подводный камень" который сразу не заметишь)

Остальные документы, которые конвертятся в "Документ расчетов с контрагентом (ручной учет)" по алгоритму описанному выше.
9. improg 704 19.06.21 16:51 Сейчас в теме
(4) Отличный кейс, спасибо, помогло.
8. teerain 19.03.14 18:02 Сейчас в теме
Если еще актуально - лучше все-таки вставить в одно из правил код явного вызова выгрузки по другому правилу:
Если НЕ ЗначениеЗаполнено(Источник.Корреспондент) Тогда
	Отказ = Истина;
	ВыгрузитьПоПравилу(Источник,,,,"Оферты_ДоговораКонтрагентов");
КонецЕсли;


т.к. с заменой ИмяПКО и ПКО есть подстава - некоторые параметры правила считываются до выполнения обработчика ПередВыгрузкой (например, флажок "не создавать если не найдено" и др.) - соответственно они для нового правила будут взяты фактически из старого правила.
begemot; itsmith; Drivingblind; Shmell; kivals; Kesak; zoytsa; +7 Ответить
10. improg 704 19.06.21 16:52 Сейчас в теме
приписал "Перед выгрузкой" в ПКО

Если ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Номенклатура") Тогда
	ИмяПКО = "НоменклатураПрисоединенныеФайлы";
	ПКО = НайтиПравило(Источник, ИмяПКО);
ИначеЕсли ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Автомобили") Тогда
	ИмяПКО = "ПрисоединенныеФайлы";
	ПКО = НайтиПравило(Источник, ИмяПКО);
Иначе
	Отказ = Истина;	
КонецЕсли;
Показать
11. serg61 62 05.04.23 22:56 Сейчас в теме
Похоже все перемудрено.
Пришлось "Правило" убрать из формы определения, а заполнять по условию ИмяПКО одну из двух программно. Программно не переопределяется заданное в форме Правило - это не по умолчанию, это навсегда!

Перед выгрузкой:

Если ТипЗнч(Источник) = Тип("СправочникСсылка.Номенклатура") Тогда
ИмяПКО = "Номенклатура";
ИначеЕсли ТипЗнч(Источник) = Тип("СправочникСсылка.ОсновныеСредства") Тогда
ИмяПКО = "ОсновныеСредства";
КонецЕсли;
Оставьте свое сообщение

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