Подмена выгружаемого объекта

1. compreSSor 10 18.03.14 22:23 Сейчас в теме
всем доброго дня.
есть задача - перенести справочник.Номенклатура, но не просто перенести, а с подвохом )

есть РегистрСведений, в котором одно измерение и один ресурс = оба - СправочникСсылка.Номенклатура.

Условие - при выгрузке Номенклатуры искать её в этом РегистреСведений и если найдено, то подменять выгружаемый объект на другой.

например, выгружаю номенклатуру "А" - ищу её в РегистреСведений - нахожу - соответственно мне нужно выгрузить номенклатуру "Б".

P.S. возможно я описал задачу некорректно или непонятно...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Andrefan 18.03.14 22:47 Сейчас в теме
Аналоги что ли? Ну в ПКО номенклатуры перед выгрузкой делаешь запрос к РС, получаешь ссылку на аналог и источнику присваиваешь полученную ссылку.
3. compreSSor 10 18.03.14 22:51 Сейчас в теме
а можно подробнее ?
Источник = НоваяСсылка ? - так ?
4. compreSSor 10 18.03.14 22:58 Сейчас в теме
пишу:
Источник = ВыгружаемаяСсылка;

в ответ -
ОписаниеОшибки = Поле объекта недоступно для записи (Ссылка)
6. Andrefan 18.03.14 23:34 Сейчас в теме
Чтобы у справочника был подчиненный регистр сведений - это что-то новенькое...
По поводу (4): как получаешь переменную ВыгружаемаяСсылка?
7. compreSSor 10 18.03.14 23:49 Сейчас в теме
(6) Andrefan,
Чтобы у справочника был подчиненный регистр сведений - это что-то новенькое...

не так выразился

По поводу (4): как получаешь переменную ВыгружаемаяСсылка?


Запрос = Новый Запрос("ВЫБРАТЬ
	|	СверткаНоменклатуры.КУдалению,
	|	СверткаНоменклатуры.Оригинал
	|ИЗ
	|	РегистрСведений.СверткаНоменклатуры КАК СверткаНоменклатуры
	|ГДЕ
	|	СверткаНоменклатуры.КУдалению = &Номенклатура
	|	И НЕ СверткаНоменклатуры.Оригинал = &Номенклатура");
	Запрос.УстановитьПараметр("Номенклатура",Источник.Ссылка);
	ТЧ = Запрос.Выполнить().Выгрузить();
	Сообщить("Количество записей = " + ТЧ.Количество());
	Если НЕ ТЧ.Количество() = 0 Тогда
           ВыгружаемаяСсылка = ТЧ.Получить(0).Оригинал;
           // тут выполняю (точнее пытаюсь выполнять) действия
           //оприоре - только одна запись
        КонецЕсли;  
Показать
9. compreSSor 10 19.03.14 01:03 Сейчас в теме
меня больше всего интересует (4)
как конвертации указать, что текущий объект выгружать не надо и передать ей для выгрузки нужный объект ?
10. m_gin 46 19.03.14 08:56 Сейчас в теме
(9) compreSSor, выгружаешь найденную номенклатуру (ВыгружаемаяСсылка) с помощью ВыгрузитьПоПравилу(). А затем отказ:
...
  ВыгружаемаяСсылка = ТЧ.Получить(0).Оригинал;
  ВыгрузитьПоПравилу(...);
КонецЕсли;
Отказ = Истина;

Правило, по которому будет выгружаться ВыгружаемаяСсылка должно быть другое, надо Вам будет создать новое, в котором не будет отмены выгрузки. И надо будет подумать, чтобы оно срабатывало только на передаваемую номенклатуру, а не всю номенклатуру из справочника выгружала. Думаю, надо передавать в исходных данных какой-то флаг:
ИсхДанные = СоздатьОбъект("СписокЗначений");
ИсхДанные.Установить("ФлагВыгрНом", 0);
ВыгрузитьПоПравилу(ВыгружаемаяСсылка, , ИсхДанные, , "ЭтоНовоеПравилоНоменклатура");
compreSSor; +1 Ответить
11. m_gin 46 19.03.14 09:15 Сейчас в теме
К (10) добавлю, что надо проверять в новом правиле ЭтоНовоеПравилоНоменклатура перед выгрузкой, есть ли этот флаг, что-то вроде этого:
ФлагЕсть = Не ПустоеЗначение(ВходящиеДанные.Получить("ФлагВыгрНом")) = 1;
Ну, и если флага нет, отказ.
compreSSor; +1 Ответить
12. compreSSor 10 19.03.14 20:20 Сейчас в теме
(11) спасибо за подсказку !
5. compreSSor 10 18.03.14 23:14 Сейчас в теме
забыл ещё одну вещь - у Номенклатуры есть подчиненный РегистрСведений.Штрихкоды - так вот было бы ОЧЕНЬ круто перенести и штрихкоды, но под одной номенклатурой.
Номенклатура - А (штрихкод - 123456) = Номенклатура - Х (штрихкод - 999999)
Номенклатура - Б (штрихкод - 123457) = Номенклатура - Х (штрихкод - 999999)
Номенклатура - В (штрихкод - 123458) = Номенклатура - Х (штрихкод - 999999)

Итог - выгружена ТОЛЬКО номенклатура "Х" и у неё 4 штрихкода:
- 999999
- 123456
- 123457
- 123458
8. Andrefan 18.03.14 23:58 Сейчас в теме
Если в отладчике посмотреть и убедиться, что по определенному параметру возвращается тип СправчоникСсылка.Номенклатура, то возможно конвертация ругается на другую номенклатуру, для которой результат запроса пустой, то есть в переменной ВыгружаемаяСсылка = Неопределено. Такое может быть? Если да, то после запроса поставь условие Если ВыгружаемаяСсылка = Неопределено Тогда Отказ = Истина КонецЕсли.
13. olbu 20.03.14 12:00 Сейчас в теме
Доброго времени суток!
у меня справочник контрагенты... Там 2 элемента, с разными УИ соответственно. Как мне при загрузке заменить переносимый элемент на другой? В каком обработчике это можно сделать?
При выгрузке - я понял так:в ПКО перед выгрузкой проверить, что это не тот объект, найти нужный и присвоить его источнику?
а при загрузке? использовать Перед загрузкой?
14. m_gin 46 20.03.14 15:20 Сейчас в теме
(13) olbu, как видно в (4) нельзя изменить значение Источник.
Если compreSSor не против обсуждения Вашего, olbu, вопроса в его теме, тогда вот что.
В правиле перед выгрузкой Вы должны убедится что Источник - это тот неугодный Вам контрагент (например, можно проверить его код). Если это так - отказ от выгрузки.
Как-то так:
Отказ = Источник.Код = "00000001";
15. m_gin 46 20.03.14 15:21 Сейчас в теме
(14) + а вот тот контрагент, выгружать который нужно, выгрузится. Ведь код у него другой, я полагаю.
16. olbu 20.03.14 15:48 Сейчас в теме
(15) _qqq, Спасибо за ответ, но возможно я не полно описал проблемку: есть контр "А" и контр "Б", так вот, при загрузке, если встречается "А", его тупо нужно заменить на "Б", я пробую ПКО после загрузки, при этом результат достигается, но вот выскакивает ошибка: "не найден метод записать"...
17. m_gin 46 20.03.14 16:36 Сейчас в теме
(16) olbu, если нужно заменять контрагента, то может быть Вам подойдет то, что написано в (10) и (11)?
А что у Вас в ПКО после загрузки, если не секрет?
19. olbu 21.03.14 07:29 Сейчас в теме
(17) _qqq,
если сокрлп(Ссылка.Код) = "00108" тогда
	Объект  = справочники.Контрагенты.найтиПоКоду("04875");	
конецесли;
если сокрлп(Ссылка.Код) = "00107" тогда
	Объект  = справочники.Контрагенты.найтиПоКоду("00603");	
конецесли;
21. m_gin 46 21.03.14 10:35 Сейчас в теме
(19) olbu, ну так я и подумала, Объекту присваивается значение с типом ссылка на объект, отсюда и ошибка при записи.
22. olbu 21.03.14 10:47 Сейчас в теме
(21) _qqq, можно было бы сделать ".получитьобъект()", но я не стал рисковать, побоялся, что будет нужный объект перезаписан данными из не нужного...
23. m_gin 46 21.03.14 12:21 Сейчас в теме
(22) olbu, мне всегда казалось логичнее разобраться со всеми вопросами по выгрузке данных перед выгрузкой. После загрузки бывает нужно, например, присвоить некоторым реквизитам значения, которые существуют только в приемнике. Но чтобы объект менять - это как коней менять на переправе - и невозможно, и не логично.
18. compreSSor 10 20.03.14 21:21 Сейчас в теме
(16) olbu, я решил задачу таким образом (только в моём случае не Контрагенты, а Номенклатура):
- создал ПКО - "Номенклатура" - синхронизировал все реквизиты как полагается;
- скопировал это правило и обозвал "НоменклатураВыгрузка";
- в правиле "Номенклатура" в обработчике "ПередВыгрузгой" написал следующее:
Если "Моё условие = ИСТИНА" Тогда
     ВыгрузитьПоПравилу(НовыйИсточник,,,,"НоменклатураВыгрузка");
     //где НовыйИсточник = СправочникНоменклатура.Ссылка - это ссылка на ту номенклатуру, на которую я буду заменять текущую
Иначе
     ВыгрузитьПоПравилу(Источник,,,,"НоменклатураВыгрузка");
     //в этом случае - я выгружу номенклатуру как есть - безовсяких изменений
КонецЕсли;
Отказ = ИСТИНА;
Показать


у меня прокатило на 100% - только ещё нужно помнить, что существует некое количество РегистровСведений, которые содержат информацию по объектам, которые выгружаться не будут, но информацию нужно сохранить...
davdykin; +1 Ответить
20. olbu 21.03.14 07:29 Сейчас в теме
(18) compreSSor, Спасибо, попробую так.
24. Nastyok_Kur 03.06.14 11:41 Сейчас в теме
А не подскажете, как сделать так, чтобы везде при выгрузке номенклатура подменялась на другую, т.е. в документах, регистрах и т.д., т.е. все ссылки? Например, также согласно данным регистра сведений....
25. Nastyok_Kur 18.06.14 06:44 Сейчас в теме
(24) Nastyok_Kur,
отвечу сама себе, может кому пригодится:)

достаточно в ПКО перед выгрузкой написать:

Если Источник.Крупная <> Справочники.Номенклатура.ПустаяСсылка() Тогда
Источник = Источник.Крупная;
КонецЕсли;
GV.; jdo; Legin; +3 Ответить
26. Stivens 35 15.07.16 20:51 Сейчас в теме
Убился с задачей, чтобы во всех случаях один из складов (первый) загружался как другой (второй). Т.е. по сути слияние в приемнике, там "первого" нет, есть только "второй". Узнал интересную вещь - оказывается если менять источник "Перед выгрузкой" - выполняется корректная замена "первого" на "второй", а вот если "При выгрузке", тогда меняются только реквизиты (они получаются из "второго", а ссылка и код приходят из "первого". Создается очень похожий дубль, у которого код и ссылка из "второго".
GV.; jdo; +2 Ответить
Оставьте свое сообщение

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