Как правильно при выгрузке по ссылке заменить ИмяПКО
Пишу перенос остатков и документов (свертка) средствами конвертации.
Столкнулся со следующей проблемой:
К примеру, в исходной базе имеем документы "Передача материалов в эксплуатацию" на которые в остатках будут ссылки.
Нужно выгрузить по условию: Если дата документа <= ДатаСвёртки Тогда конвертируем в документ "Партия материалов в эксплуатации (ручной учет)" иначе, в "Передача материалов в эксплуатацию"
Создаю 2 ПКО:
1. "ПередачаМатериаловВЭксплуатацию" (Конвертируем в "Партия материалов в эксплуатации (ручной учет)")
- Для тех у которых Дата <= ДатаСвёртки
В обработчике событий "Перед выгрузкой"
2. "ПередачаМатериаловВЭксплуатациюДок" (Конвертируем в ""Передача материалов в эксплуатацию"")
- Для тех которые выгружаю как есть
В обработчике событий "Перед выгрузкой"
В результате, если объект выгружается по ссылке, то встречаются документы с датой < ДатаСвертки, выгруженные по правилу "ПередачаМатериаловВЭксплуатациюДок". Как я понял событие в каких то случаях не обрабатывается.
Подскажите где ещё ИмяПКО можно установить? Или может что то не правильно делаю?
Столкнулся со следующей проблемой:
К примеру, в исходной базе имеем документы "Передача материалов в эксплуатацию" на которые в остатках будут ссылки.
Нужно выгрузить по условию: Если дата документа <= ДатаСвёртки Тогда конвертируем в документ "Партия материалов в эксплуатации (ручной учет)" иначе, в "Передача материалов в эксплуатацию"
Создаю 2 ПКО:
1. "ПередачаМатериаловВЭксплуатацию" (Конвертируем в "Партия материалов в эксплуатации (ручной учет)")
- Для тех у которых Дата <= ДатаСвёртки
В обработчике событий "Перед выгрузкой"
Если Источник.Дата > Параметры.ДатаСвертки Тогда
ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
Иначе
ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
КонецЕсли;
2. "ПередачаМатериаловВЭксплуатациюДок" (Конвертируем в ""Передача материалов в эксплуатацию"")
- Для тех которые выгружаю как есть
В обработчике событий "Перед выгрузкой"
Если Источник.Дата > Параметры.ДатаСвертки Тогда
ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
Иначе
ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
КонецЕсли;
В результате, если объект выгружается по ссылке, то встречаются документы с датой < ДатаСвертки, выгруженные по правилу "ПередачаМатериаловВЭксплуатациюДок". Как я понял событие в каких то случаях не обрабатывается.
Подскажите где ещё ИмяПКО можно установить? Или может что то не правильно делаю?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Все верно, создаем 2 ПКО. Но в обработчике Перед выгрузкой 1го ПКО пишешь
В обработчике 2го ПКО пишешь
ПВД (правило выгрузки данных) этого дока в обработчике "Перед выгрузкой" пишешь
Возможно что в этих двух ПКО обработчики лишние, не знаю. Поэкспериментируйте.
Если Источник.Дата > Параметры.ДатаСвертки Тогда
Отказ = ИСТИНА;
КонецЕсли;
В обработчике 2го ПКО пишешь
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
Отказ = ИСТИНА;
КонецЕсли;
ПВД (правило выгрузки данных) этого дока в обработчике "Перед выгрузкой" пишешь
Если Объект..Дата > Параметры.ДатаСвертки Тогда
ВыгрузитьПоПравилу(Объект.Ссылка, , , , "ПередачаМатериаловВЭксплуатациюДок");
Иначе
ВыгрузитьПоПравилу(Объект.Ссылка, , , , "ПередачаМатериаловВЭксплуатацию");
КонецЕсли;
Возможно что в этих двух ПКО обработчики лишние, не знаю. Поэкспериментируйте.
(2) ZergKRSK, Спасибо за ответ.
когда вставляем условие в ПВД выгружается нормально. Но не работает при выгрузке по ссылке. Единственный рабочий способ который мне удалось найти, это указывать ИмяПКО в правилах конвертации свойств при выгрузке. Но это очень большой объём работы, так как предстоит ещё кучу документов конвертировать в "Документ расчетов с контрагентом (ручной учет)".
когда вставляем условие в ПВД выгружается нормально. Но не работает при выгрузке по ссылке. Единственный рабочий способ который мне удалось найти, это указывать ИмяПКО в правилах конвертации свойств при выгрузке. Но это очень большой объём работы, так как предстоит ещё кучу документов конвертировать в "Документ расчетов с контрагентом (ручной учет)".
Разобрался.
Может кому пригодится.
Пошарив в обработке УниверсальныйОбменДаннымиВФорматеХML в процедуре ВыгрузитьПоПравилу, наткнулся на код в самом начале процедуры:
Дело в том, что для замены правил конвертации нужно поменять ПКО (ПКО это ссылка на ПравилоКонвертации)
При входе в процедуру ИмяПКО у нас задано И ПКО.Имя = ИмяПКО.
Дальше по коду, поиска ссылки на ПКО нет. В итоге в Правилах конвертации объекта написал код:
И для второго
И всё заработало!
Может кому пригодится.
Пошарив в обработке УниверсальныйОбменДаннымиВФорматеХML в процедуре ВыгрузитьПоПравилу, наткнулся на код в самом начале процедуры:
Если ПКО = Неопределено Тогда
ПКО = НайтиПравило(Источник, ИмяПКО);
ИначеЕсли (Не ПустаяСтрока(ИмяПКО))
И ПКО.Имя <> ИмяПКО Тогда
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
ПоказатьДело в том, что для замены правил конвертации нужно поменять ПКО (ПКО это ссылка на ПравилоКонвертации)
При входе в процедуру ИмяПКО у нас задано И ПКО.Имя = ИмяПКО.
Дальше по коду, поиска ссылки на ПКО нет. В итоге в Правилах конвертации объекта написал код:
Если Источник.Дата > Параметры.ДатаСвертки Тогда
ИмяПКО = "ПередачаМатериаловВЭксплуатациюДок";
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
И для второго
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
И всё заработало!
(4) impulse_1010, мне помогло следующее:
ПВД - без изменений: выгружает, к примеру, документы "ПередачаМатериаловВЭксплуатацию" правилом "ПередачаМатериаловВЭксплуатациюДок".
В ПКО "ПередачаМатериаловВЭксплуатациюДок" в обработчике "Перед выгрузкой":
Т.е. условие во второе правило вставлять не нужно.
ПВД - без изменений: выгружает, к примеру, документы "ПередачаМатериаловВЭксплуатацию" правилом "ПередачаМатериаловВЭксплуатациюДок".
В ПКО "ПередачаМатериаловВЭксплуатациюДок" в обработчике "Перед выгрузкой":
Если Источник.Дата <= Параметры.ДатаСвертки Тогда
ИмяПКО = "ПередачаМатериаловВЭксплуатацию";
ПКО = НайтиПравило(Источник, ИмяПКО);
КонецЕсли;
Т.е. условие во второе правило вставлять не нужно.
(6) Wrols, должно работать. Но на практике почему то попадались не правильно выгруженные документы. Если в ПКС не указать ПКО, тогда ПКО ищется по типу источника и приемника, может на этом этапе сбоило, конфа была очень древняя.
Кстати, если делаешь правила для переноса остатков, то документы "Передача материалов в эксплуатацию" переноси как есть, которые до даты свертки должны быть без движений. А то при закрытии месяца не будет погашаться стоимость. ("Подводный камень" который сразу не заметишь)
Остальные документы, которые конвертятся в "Документ расчетов с контрагентом (ручной учет)" по алгоритму описанному выше.
Кстати, если делаешь правила для переноса остатков, то документы "Передача материалов в эксплуатацию" переноси как есть, которые до даты свертки должны быть без движений. А то при закрытии месяца не будет погашаться стоимость. ("Подводный камень" который сразу не заметишь)
Остальные документы, которые конвертятся в "Документ расчетов с контрагентом (ручной учет)" по алгоритму описанному выше.
Если еще актуально - лучше все-таки вставить в одно из правил код явного вызова выгрузки по другому правилу:
т.к. с заменой ИмяПКО и ПКО есть подстава - некоторые параметры правила считываются до выполнения обработчика ПередВыгрузкой (например, флажок "не создавать если не найдено" и др.) - соответственно они для нового правила будут взяты фактически из старого правила.
Если НЕ ЗначениеЗаполнено(Источник.Корреспондент) Тогда
Отказ = Истина;
ВыгрузитьПоПравилу(Источник,,,,"Оферты_ДоговораКонтрагентов");
КонецЕсли;
т.к. с заменой ИмяПКО и ПКО есть подстава - некоторые параметры правила считываются до выполнения обработчика ПередВыгрузкой (например, флажок "не создавать если не найдено" и др.) - соответственно они для нового правила будут взяты фактически из старого правила.
приписал "Перед выгрузкой" в ПКО
Если ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Номенклатура") Тогда
ИмяПКО = "НоменклатураПрисоединенныеФайлы";
ПКО = НайтиПравило(Источник, ИмяПКО);
ИначеЕсли ТипЗнч(Источник.Объект) = Тип("СправочникСсылка.Автомобили") Тогда
ИмяПКО = "ПрисоединенныеФайлы";
ПКО = НайтиПравило(Источник, ИмяПКО);
Иначе
Отказ = Истина;
КонецЕсли;
Показать
Похоже все перемудрено.
Пришлось "Правило" убрать из формы определения, а заполнять по условию ИмяПКО одну из двух программно. Программно не переопределяется заданное в форме Правило - это не по умолчанию, это навсегда!
Перед выгрузкой:
Если ТипЗнч(Источник) = Тип("СправочникСсылка.Номенклатура") Тогда
ИмяПКО = "Номенклатура";
ИначеЕсли ТипЗнч(Источник) = Тип("СправочникСсылка.ОсновныеСредства") Тогда
ИмяПКО = "ОсновныеСредства";
КонецЕсли;
Пришлось "Правило" убрать из формы определения, а заполнять по условию ИмяПКО одну из двух программно. Программно не переопределяется заданное в форме Правило - это не по умолчанию, это навсегда!
Перед выгрузкой:
Если ТипЗнч(Источник) = Тип("СправочникСсылка.Номенклатура") Тогда
ИмяПКО = "Номенклатура";
ИначеЕсли ТипЗнч(Источник) = Тип("СправочникСсылка.ОсновныеСредства") Тогда
ИмяПКО = "ОсновныеСредства";
КонецЕсли;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот