Имя: Пароль:
1C
1С v8
Конвертация данных 1с - параметры перед выгрузкой
,
0 cmex
 
17.12.13
13:29
Доброго времени суток.
Как сделать так, чтобы при переносе иерархического справочника, автоматом создавалась папка с названием организации, из которой я переношу данные. Написал ПередВыгрузкой данных:

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

Однако при загрузке в Параметрах пусто. Что не так?Спасибо
1 rmrush
 
17.12.13
13:42
Используй
ПередатьОдинПараметрВПриемник("Организация", Выборка.Наименование, "Организации");
2 cmex
 
17.12.13
14:00
(1) это куда смотреть?
3 cmex
 
17.12.13
14:03
(1) мне надо во много ПКО передать, как это сделать? То есть я переношу в 1 базу много разных организаций, и хочу чтоб данные не смешались, где возможно создать папку с именем организации и туда создавать новые элементы
4 rmrush
 
17.12.13
14:05
(3) что тогда в этом ПКО мешает передать эту организацию в качестве параметра и при загрузке уже подставлять ему родителя с именем этой организации (если такого нет - создавать)
5 cmex
 
17.12.13
14:08
(4) не совсем понял, как это организовать?
6 cmex
 
17.12.13
14:12
(4) захожу в нужно мне ПКО, в событии перед выгрузкой пишу Параметры.Вставить("Организация", НаименовиеОрг), а в событии после загрузки из Параметр выбрать наименованиеорг?
7 rmrush
 
17.12.13
14:18
(6) в ПКС этого ПКО добавляешь строку, которая будет грузиться в параметр (при выборе поля приемника выбирается либо параметр, либо поле-приемник). Или я не правильно тебя понял?
8 rmrush
 
17.12.13
14:21
9 cmex
 
17.12.13
14:23
(8) щас объясню, что мне надо
10 cmex
 
17.12.13
14:31
база 1, организация "Организация1", Справочник "Номенклатура",  элементы -Группа1
               - Группа2
                     -Номенклатура1,
мне надо перекинуть этот справочник в базу 2, где уже есть организация "Организация2", причем в справочнике Номенклатура создать папку "Орагнизация1" и туда перекинуть иерархию, то есть в базе 2 получится следующее:
   -Организация1
       -Группа1
            -Группа2
                -Номенклатура1
11 fisher
 
17.12.13
14:32
(0) На стороне приемника что-то руками надо делать только в исключительных случаях (например - данных для принятия решения вообще нет в источнике).
Правильно задача решается так (один из вариантов навскидку):
1. Создаешь отдельное ПКО "ПапкаОрганизацииМоегоСправочника", источником у которой организация, а приемником твой справочник. Оно будет только создавать папку (на основании источника подставляешь нужные значения в ПКС "Код" и "Наименование" и "ЭтаГруппа".
2. А в ПКС "Родитель" твоего справочника пишешь
Если НЕ ЗначениеЗаполнено(Источник.Родитель) Тогда
    ИмяПКО = "ПапкаОрганизацииМоегоСправочника";
    Значение = НужнаяОрганизация;
КонецЕсли;
12 cmex
 
17.12.13
14:34
(11) а если несколько таких справочников в приемнике? Например, "СтатьиЗатрат", "НГ"
13 fisher
 
17.12.13
14:35
(12) В чем проблема? То же самое делаешь и для них.
14 fisher
 
17.12.13
14:36
В идеале ВСЯ конвертация должна происходить в источнике. Вся идеология КД на это заточена. Это и прозрачнее и максимальная производительность при этом будет.
15 fisher
 
17.12.13
14:37
В приемник только загружаются готовые образы объектов оптимизированно. Без лишних обращений к БД.
16 cmex
 
17.12.13
14:43
(15) спасибо, щас попробую
17 cmex
 
17.12.13
16:16
все получилось,спасибо
только вот как бы избавиться от частого обращения к БД:

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


можно где то перед обработкой общий параметр задать?
18 fisher
 
17.12.13
17:28
(17) Можно и нужно.
1) Добавляешь общий параметр конвертации "ТекущаяОрганизация" (в свойствах конвертации). Галку диалога не ставишь - типа интерактивно его править не надо.
2) Там же в событии "После загрузки правил обмена" устанавливаешь его, юзая УстановитьЗначениеПараметраКонвертации()
3) Везде, где надо, обращаешься к нему через Параметры.ТекущаяОрганизация
19 fisher
 
17.12.13
17:31
Аналогично можно кэшировать любые значения на время всей конвертации. Если не устанавливать тип параметра - можно присваивать любые значения (в т.ч. коллекции)
20 fisher
 
17.12.13
17:32
Если надо кэшировать на момент старта конвертации, тогда событие "Перед выгрузкой данных" подойдет (событие самой конвертации)
21 fisher
 
17.12.13
17:34
Прогнал. УстановитьЗначениеПараметраКонвертации() только для семерки надо юзать и только в "После загрузки правил обмена", если именно оно нужно.
22 acsent
 
17.12.13
17:44
(14) для больших баз как раз удобней по максимуму выносить работу в постобработку.
Ибо файлы получаются по 10 ГБ
23 Йохохо
 
17.12.13
17:56
(22) это та же байда, что нормализация / денормализация. Тут, при определенных условиях, можно обойтись полями поиска вообще
24 fisher
 
17.12.13
17:58
(22) "Не верю". Особой экономии, ИМХО, так не добиться. А в десятки раз замедлить загрузку - как два пальца.
25 fisher
 
17.12.13
18:00
При очень больших объемах выгоднее бить на порции.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан