Имя: Пароль:
1C
1С v8
Конвертация данных 2.1: Два справочника в один
,
0 specproject
 
09.04.20
22:53
Редактирую правила конвертации от обмена УТ*-Розница. По сути от УТ там ничего не осталось и устарело. Обновить возможности нет. Опыт в КД2 не велик.

В УТ* есть два справочника которые переносятся в один справочник Номенклатура в Розницу.
Поступил так: Написал два ПКО:
1. Номенклатура в Номенклатуру с созданием с поиском по ГУИД
2. Справочник2 в Номенклатуру (без создания новых, поиск по ГУИД)

В ПКО1 в обработчик ПослеВыгрузки вставил такой код:

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

Запрос.УстановитьПараметр("Номенклатура", Источник.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Сообщить("Запрос выполнен");
Если Выборка.Следующий() Тогда
    ВыгрузитьПоПравилу(Выборка, , , , "Номенклатура_ДописатьПараметрыИзСправочник2");
    Сообщить("Выгрузили коды по правилам");
Иначе
    Сообщить("Запрос пуст");
КонецЕсли;


Вопрос: На сколько правильно такое решение?
Дело в том, что выгружается два объекта (две секции), т.е. справочник Номенклатуры на Рознице, наверное, пишется два раза.
Второй "неприятный" момент в том, что секция с доп параметрами стоит раньше чем секция Номенклатуры, т.е. я подозреваю, что для новой Номенклатуры доп параметры не пропишутся.

Второй вопрос такой (может он не связан с первым):
У меня не снимается Номенклатура с регистрации в УТ.
Файл обмена из Розницы в УТ содержит такую инфу:

<ДанныеПоОбмену ВерсияОтправителя="2.3.3.19" УдалитьРегистрациюИзменений="true" НомерВходящегоСообщения="53" НомерИсходящегоСообщения="51" ОтКого="РЦЛ" Кому="УТЛ" ПланОбмена="ОбменУправлениеТорговлейРозница"/>
<ИнформацияОРегистрацииОбъекта ПустойНабор="false" ТипПриемника="" ТипИсточника="СправочникСсылка.Номенклатура" УникальныйИдентификаторПриемника="719de88c-7748-11ea-8108-6045cb74c998" УникальныйИдентификаторИсточника="719de88c-7748-11ea-8108-6045cb74c998"/>
<ИнформацияОРегистрацииОбъекта ПустойНабор="false" ТипПриемника="" ТипИсточника="СправочникСсылка.Номенклатура" УникальныйИдентификаторПриемника="719de88d-7748-11ea-8108-6045cb74c998" УникальныйИдентификаторИсточника="719de88d-7748-11ea-8108-6045cb74c998"/>

В последних двух строках идентификаторы моих двух экспериментальных номенклатур. Странность в том, что даже если я убираю все регистрации с двух сторон, то эти последние две строки все равно выгружаются. И Почему в них ТипПриёмника не указан?
1 Ёпрст
 
09.04.20
23:16
(0) если выгрузка одноразовая, через обработку универсального обмена, то 2 пко можно было и не использовать
2 specproject
 
09.04.20
23:35
(1) К сожалению, обмен постоянный.
И не понимаю как в одноразовом можно было бы обойтись одним ПКО? Запрос бы не нужен был - точно.
3 AneJIbcuH
 
10.04.20
07:51
(0) а зачем так сложно ?
Я так понял, у вас во втором справочнике есть данные, которые идут в номенклатуру в Рознице как реквизиты там.

Почему бы вам не сделать Произвольный алгоритм в ПВД для номенклатуры, где будет запрос на все необходимые реквизиты из двух таблиц (левым соединением) ? Тут достаточно одного ПКО.
Ну ещё поправить правила регистрации Справочник2, не его регистрировать, а связанную с ним номенклатуру.
4 specproject
 
10.04.20
08:53
(3) Можете подробней. Слаб в КД2. Считал что ПВД применяются только при разовых обменах.
Подскажите как запрос в ПВД связать с зарегистрированной номенклатурой?
5 specproject
 
10.04.20
08:54
Одним запросом все данные - это просто мечта
6 Ёпрст
 
10.04.20
09:13
(4) никак не связать, пвд в планах обмена не того, вот и спрашивал, про разовую выгрузку.
7 Ёпрст
 
10.04.20
09:15
Но.. выгрузить по правилу тоже можно не делать в первом пко, просто добавить нужные реквизиты от второго справочника инапихать их значениями из запроса
8 AneJIbcuH
 
10.04.20
09:17
Вообще должно работать так: если используется обработка для разового переноса, то произвольный алгоритм накладывается на все данные. Если он-лайн обмен, то произвольный алгоритм на зарегистрированные данные. Тут прям прям не уверен, но где-то именно так читал. Поэтому пробуете в ПВД написать запрос к номенклатуре (левым соединением к ней Справочник2), вытаскиваете необходимые реквизиты и обязательно Ссылка. А далее одно ПКО для номенклатуры, где конвертируете реквизиты.
Если не получится, знаю точно метод, который прокатит: Накопить в массив зарегистрированную номенклатуре и потом запросом выгрузить.
9 specproject
 
10.04.20
10:57
(7) Если бы честным, то ещё один из реквизитов я беру запросом из третьего справочника. Но просто в этом месте этих реквизитов 10. Если каждый реквизит выдергивать запросом, то + 10 запросов в цикле... Работать будет, но вот со скоростью засомневался.
10 specproject
 
10.04.20
11:03
Есть вот такие идеи в голове:

вариант 1: сформировать запрос перед выгрузкой, куда-то сложить (вроде какие-то параметры же есть, только не знаю как работают) и потом вытащить их значения на уровне ПКС

вариант 2: написать ПКО2 по выгрузке сразу всех реквизитов номенклатуры. А в ПКО1 сделать запрос по формированию этих реквизитов и тормозить выгрузку Отказ=Истина; Вот только сомнения у меня что регистрация чистится будет.
11 Ёпрст
 
10.04.20
12:00
(9) зачем каждый ? один запрос на всё, и потом в пкс каждого реквизита значения оттуда
12 specproject
 
10.04.20
16:20
(11) Как это делается?
13 AneJIbcuH
 
10.04.20
17:03
(12) Короче, я тебе в (8) ещё предложил метод..
Описываю, как будет производительно это сделать.

1. Добавляешь новый ключ в глобальную структуру "Параметры" обработчика событий "Перед выгрузкой данных" твоей конвертации.

Параметры.Вставить("НоменклатураВыгрузки",Новый Массив);

2. В ПВД, где объект выборки твой справочник номенклатура ставишь Способ выборки = Стандартная и в обработчике "Перед выгрузкой" пишешь:

Параметры.НоменклатураВыгрузки.Добавить(Объект.Ссылка);
Отказ = Истина;

так ты накапливаешь зарегистрированную номенклатуру к выгрузке в массив, но типовыми средствами не выгружаешь, отказываешься.
Также можешь поставить галку "Выбирать данные для выгрузки одним запросом".

3. В обработчике событий "После выгрузки данных" твоей конвертации пишешь код с тем самым одним красивым запросом!
Начинаешь так:

Если Параметры.НоменклатураВыгрузки.Количество() > 0 Тогда

//Перечисли в строку через запятую реквизиты, которые будешь выгружать
СтрокаРеквизитов = "Артикул,Код,ВидНоменклатуры,СтавкаНДС и тд";

//Тут твой красивый запрос, где собираешь все необходимые реквизиты (как в переменной СтрокаРеквизитов + Ссылка) для выгрузки в розницу (из нужных таблиц базы источника). В Условии запроса у тебя будет Номенклатура.Ссылка В (&МассивНоменклатуры)

//Устанавливаешь Параметр запроса
Запрос.УстановитьПараметр("МассивНоменклатуры",Параметры.НоменклатураВыгрузки);

//Далее формируешь выборку    
    
ВыборкаПоНоменклатуре = Запрос.Выполнить().Выбрать();
   Пока ВыборкаПоНоменклатуре .Следующий() Цикл
        
    Реквизиты = Новый Структура(СтрокаРеквизитов);
    ЗаполнитьЗначенияСвойств(Реквизиты,ВыборкаПоНоменклатуре);        
        
    ВыгрузитьПоПравилу(ВыборкаПоНоменклатуре.Ссылка, , Реквизиты, , "твоё_ПКО_Номенклатура");
        
   КонецЦикла;
КонецЕсли;

В твоём ПКО по номенклатуре "твоё_ПКО_Номенклатура" для реквизитов ставишь галки «Получить из входящих данных».

С тебя пивас :)
14 Ёпрст
 
10.04.20
17:20
(12)

Создаешь одно ПКО..

создаешь в нём, например, новое свойство, Источник - Пусто,Приёмник-Пусто, сдвигаешь его наверх.
ему в Перед выгрузкой пишешь:


Значение="Вася";
ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Наименование","Вася "+ТекущаяДата()); //тут помещаешь нужные значения реквизитов из своего запроса к другому спраочнику
ВходящиеДанные.Вставить("Код","Федя "+ТекущаяДата());


Далее в этом же ПКО определяешь эти реквизиты, Источник-пусто, приёмник - нужный реквизит и ставишь галку - получать из входящих данных.

Всё собственна.
15 Ёпрст
 
10.04.20
17:20
В данном примере, это Код и Наименование
16 Ёпрст
 
10.04.20
17:22
Твоё пко отработает, поместит в структуру нужные значения недостающих атрибутов и проставит их потом как "получить из входящих данных"
17 Маленький Вопросик
 
10.04.20
17:25
да, народ у нас не тянет конвертацию... слабоват...
18 AneJIbcuH
 
10.04.20
17:28
(17) скорее ленивый: поизучать, попрактиковаться, поштудировать интернет.
19 specproject
 
10.04.20
20:19
(18) так это и есть изучение и практика. Штудировать интернет устал... везде практически только простые основы до которых и так чисто на логике можно дойти.

Сегодня сервер с базами лёг. Завтра попробую всё, что здесь увидел.
20 specproject
 
11.04.20
20:48
(13) как пиво передать?
21 specproject
 
12.04.20
08:17
«Хьюстон, у нас проблемы»

У меня отвалилась выгрузка Установки цен. Там есть Номенклатура. Поэтому Отказ=Истина не получается Использовать.
Отдельно правило не стал писать.

И... Что с регистрацией делать? Не чистится. Где мог накосячить?
22 AneJIbcuH
 
12.04.20
08:25
(20) Транспортной компанией ) я так понимаю города не далеко друг от друга )
Шутка, шутка.

(21) Что значит отвалилась ? Если у тебя ПВД сначала для выгрузки Номенклатуры, далее ПВД для выгрузки установки цен. Не вижу зависимости..
И регистрация должна сниматься, если ты именно про справочник Номенклатура.
23 specproject
 
12.04.20
08:28
Со стороны Розница требуется переносить только Отчеты о розничных продажах. Поэтому в регистрации везде прописал Отказ. Все правила на автопилоте созданы.
В регистрации со стороны Розница всё чисто.
24 AneJIbcuH
 
12.04.20
08:30
(21) а погоди, кажется понял. У тебя номенклатура по (13) в самом конце выгружается в обработчике "После выгрузки данных".
Тогда, для каждой номенклатуры формировать реквизиты и сразу выгружать. Примерно так, как советовали в (14), но мне не нравится этот момент в количестве запросов.
Если выгружается не много документов, то можно следовать примеру (13) и для документов.
25 specproject
 
12.04.20
08:42
(24) ага, ссылки тоже перестали отображаться.

В основном правиле оставил только Поиск по ГУИД, Код, Номенклатура, и отключил создание.
26 specproject
 
12.04.20
21:52
Небольшой отчет по лабораторной работе:

Начну с конца. Вот эти строки
<ИнформацияОРегистрацииОбъекта ПустойНабор="false" ТипПриемника="" ТипИсточника="СправочникСсылка.Номенклатура" УникальныйИдентификаторПриемника="719de88c-7748-11ea-8108-6045cb74c998" УникальныйИдентификаторИсточника="719de88c-7748-11ea-8108-6045cb74c998"/>
Это регистр СоответствияОбъектовИнформационныхБаз
То, что ТипПриемника="" это оказалась беда. Во-первых, когда данный регистр заполняется, он передаётся обратно. С пустым ТипПриемника он вызывал ошибку, которая нигде не показывалась. (Не мог создать запись регистра). А при ошибке регистрация не снималась и ...
Во-вторых, когда я выбрал Источник Справочник.Номенклатура, то ничего кроме как заполнения этого реквизита не поменялось. Т.е. получил работающий обмен. Естественно защиту от дурака я в конфигурацию вставил, но это другая история.

С Самой номенклатурой получилось пока так:
ПКО1 для обработки справочника: формирует красивый запрос, отправляет в ПКО2 и Отказ=Истина
ПКО2 просто заполняет и записывает по полученным данным (пока там ещё не всё понятно, Родитель не выгружается, например, а пометка удаления запросто)
ПКО3 для подстановки в документы, так как ПКО1 не подставишь, а то по каждой строке выгружается номенклатура
27 Курцвейл
 
12.04.20
22:03
(26) А что мешает сделать 1но ПКО и привязать к нему алгоритм?
28 specproject
 
13.04.20
05:39
(27) в одном у меня получается 11 запросов для каждого реквизита. Может просто не умею по другому.
Буду рад услышать как реализовать через любые другие варианты
29 Ёпрст
 
13.04.20
10:11
(28) ё..(14) не осилил что ле ? там 1 запрос для одного элемента справочника.
30 Ёпрст
 
13.04.20
10:11
и 1 ПКО
31 Ёпрст
 
13.04.20
10:11
и ПВД (которые могут не работать в ПланахОбмена) не нужны
32 specproject
 
13.04.20
16:46
(29) пробовал, не "взлетело". На ПКС ВходящиеДанные были пустыми. Может упустил чего, может УТ слишком старая.

Сегодня договорился привести Номенклатуру к классическому виду, поэтому ПКО существенно облегчится.
За отзывчивость, Спасибо.
33 Ёпрст
 
13.04.20
16:47
(32) картинуи с правилами покажи. Там всё работает
34 Ёпрст
 
13.04.20
16:47
*картинки
35 specproject
 
13.04.20
16:47
(31) ага, пробовал что-то писать в обработчиках ПВД и получалось, что ПКО переставали срабатывать.
36 specproject
 
13.04.20
16:53
(33) позже смоделирую. Как картинки показать? На файлобменник какой-нить?
37 Ёпрст
 
13.04.20
16:54
38 Ёпрст
 
13.04.20
16:55
Вот так сделай, только в первом ПКС пихай свой запрос на получение нужных реквизитов и привет
39 specproject
 
13.04.20
17:25
(38) Работает!

Или я видимо куда-то не туда запихал инициализацию входящих данных
Или в слове ВходящиеДанные ошибку допустил.

Спасибо
40 specproject
 
13.04.20
17:34
Надеюсь у тебя правильный я-кошелёк был указан.
;-)
41 Ёпрст
 
13.04.20
17:38
(39) не.. там надо еще Значение определить, чтоб точно свойство сработало
42 Ёпрст
 
13.04.20
17:38
вроде как.
43 Ёпрст
 
13.04.20
17:38
И если у тебя его не было, то могло у тебя не работать
44 specproject
 
13.04.20
17:42
(41) Если галка "получать из внешних" данных стоит, то точно работает без Значение=
сейчас попробую без галки...
45 specproject
 
13.04.20
17:51
(44) Без галки "Значение=" обязательно