Имя: Пароль:
1C
1С v8
КД: Перенос одного документа в несколько документов
,
0 Reclaim
 
17.02.16
06:28
Здравствуйте! Суть вопроса: Есть документ в УПП, есть две табличные части, на 3 реквизитах которых базируется перенос. Переносим этот документ в УТ, у которого эти три реквизита находятся в реквизитах документа, а не табличной части. Проблема: Т.к. в УПП реквизиты находятся в табличных частях, то соответственно строк с этими реквизитами может быть много. И в зависимости от того, сколько этих реквизитах в строках ТЧ, нужно создать столько же документов в УТ (т.е. может быть нужно создать как 1 документ, так и 8 и более).

Кто-нибудь такое реализовал? Поделитесь опытом
1 ИсчадиеADO
 
17.02.16
06:33
В пвд выбирай тч и передавай в качестве входящих данных реквизит
2 ИсчадиеADO
 
17.02.16
06:45
Соответственно у тебя 2 проблемы: распределить суммы и что подставлять при конвертации по ссылке
3 Reclaim
 
17.02.16
06:48
А можно немного подробнее? И если можно с каким-нибудь примером кода.

Не совсем понял как это будет происходить на деле... Нужно сделать что-то в это роде?

ВходящиеДанные = Новый Структура("Номенклатура");
ВходящиеДанные.Номенклатура = Новый ТаблицаЗначений;
ВходящиеДанные.Номенклатура.Колонки.Добавить("Номенклатура");
ВходящиеДанные.Номенклатура.Колонки.Добавить("Процент");

И таким образом занесутся реквизиты в таблицу значений, из которой я смогу вытащить нужные мне данные?

А вот как и что подставлять при конвертации по ссылке пока не понял. Если можно и тут разжевать
4 ИсчадиеADO
 
17.02.16
07:26
(3) поиска по ссылке не будет. Что и как переносить при конвертации по ссылке ты должен решить сам тк никто не знает твоих вводных. Подробнее не могу, сорри, с телефона
5 Reclaim
 
17.02.16
07:38
Если будет сегодня возможность расписать подробнее, то буду очень благодарен. Но и за наводку большое спасибо!
6 sonne666
 
17.02.16
11:59
(3) В ПВД к цикле заполняешь структуру ВходящиеДанные и выгружаешь по правилу:
ВыгрузитьПоПравилу(,, ВходящиеДанные,, <ИмяПКО>);
Поля этой структуры должны совпадать со свойствами приемника из ПКО этого объекта (у них должен стоять флаг "Получить из входящих данных").
Непонятно, в каких случаях эти доки будешь переносить по ссылке. Если из одного документа создаешь 8, то какой укажешь вместо ссылки?
7 Reclaim
 
19.02.16
07:55
(6) А вот это очень хороший вопрос... Пока точно не решил как это лучше сделать
8 Reclaim
 
19.02.16
08:11
(6) Пишу вот такой код в ПВД, чтобы получить реквизит и ТЧ из входящих данных (Ставлю галки "Получить из входящих данных" у ПГКС и у реквизитов этой ТЧ):


ВходящиеДанные = Новый Структура("Номенклатура, ФорматТТ");
ВходящиеДанные.Номенклатура = Новый ТаблицаЗначений;
ВходящиеДанные.Номенклатура.Колонки.Добавить("Номенклатура");
ВходящиеДанные.Номенклатура.Колонки.Добавить("Процент");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
    |    ПланированиеАктивностей.Ссылка,
    |    ПланированиеАктивностей.Грузополучатели.ФорматТТ КАК ФорматТТ,
    |   ПланированиеАктивностей.Акции.Номенклатура КАК Номенклатура,
    |    ПланированиеАктивностей.Акции.Скидка КАК Процент
    |ИЗ
    |    Документ.АП_ПланированиеАктивностей КАК ПланированиеАктивностей";
ВыборкаДанных = Запрос.Выполнить().Выбрать();

Пока ВыборкаДанных.СледующийПоЗначениюПоля("ФорматТТ") Цикл
    ВходящиеДанные.ФорматТТ = ВыборкаДанных.ФорматТТ;
    Пока ВыборкаДанных.Следующий() Цикл
        СтрокаТЗ = ВходящиеДанные.Номенклатура.Добавить();
        СтрокаТЗ.Номенклатура = ВыборкаДанных.Номенклатура;
        СтрокаТЗ.Процент = ВыборкаДанных.Процент;
    КонецЦикла;
    ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ПланированиеАктивностей");
КонецЦикла;


1С ругается на реквизит:

Ошибка получения свойства подчиненного объекта из входящих данных
    ПКО                    =  ПланированиеАктивностей  (Документ: (АП) Планирование активностей)
    ПКС                    =  6  ( --> Процент)
    Объект                 =    (Не определено)
    СвойствоПриемника      =  Процент  (Число)
    ОписаниеОшибки         =  Поле объекта не обнаружено (Процент)
    ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(8323)
    КодСообщения           =  67

Не пойму почему не находится поле у объекта... И ПВД я выгружаю "стандартной выборкой" или "произвольным алгоритмом"?
9 Reclaim
 
19.02.16
09:30
(6) ПВД немного подправил, получилось вот так:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    ПланированиеАктивностей.Ссылка,
|    ПланированиеАктивностей.Грузополучатели.ФорматТТ КАК ФорматТТ,
|   ПланированиеАктивностей.Акции.Номенклатура КАК Номенклатура,
|    ПланированиеАктивностей.Акции.Скидка КАК Процент
|ИЗ
|    Документ.АП_ПланированиеАктивностей КАК ПланированиеАктивностей
|ГДЕ
|    ПланированиеАктивностей.Грузополучатели.ФорматТТ <> Значение(Справочник.АП_ФорматыТорговыхТочек.ПустаяСсылка)
|   И ПланированиеАктивностей.Акции.Номенклатура <> Значение(Справочник.АП_ФорматыТорговыхТочек.ПустаяСсылка)
|    И ПланированиеАктивностей.Акции.Скидка ЕСТЬ NULL";
ВыборкаДанных = Запрос.Выполнить().Выбрать();

Пока ВыборкаДанных.СледующийПоЗначениюПоля("ФорматТТ") Цикл    
    
    ВходящиеДанные = Новый Структура("Номенклатура, ФорматТТ");
    ВходящиеДанные.Номенклатура = Новый ТаблицаЗначений;
    ВходящиеДанные.Номенклатура.Колонки.Добавить("Номенклатура");
    ВходящиеДанные.Номенклатура.Колонки.Добавить("Процент");
    
    ВходящиеДанные.ФорматТТ = ВыборкаДанных.ФорматТТ;
    
    Пока ВыборкаДанных.Следующий() Цикл
        СтрокаТЗ = ВходящиеДанные.Номенклатура.Добавить();
        СтрокаТЗ.Номенклатура = ВыборкаДанных.Номенклатура;
        СтрокаТЗ.Процент = ВыборкаДанных.Процент;
    КонецЦикла;
    
    ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ПланированиеАктивностей");    
    
КонецЦикла;


Но теперь лезет вот такая ошибка:

Ошибка получения коллекции подчиненных объектов из входящих данных
    ПКО                    =  ПланированиеАктивностей  (Документ: (АП) Планирование активностей)
    ПКГС                   =  4  ( --> Номенклатура)
    Объект                 =  (АП) Планирование активностей 000000001 от 28.01.2016 11:13:23  ((АП) Планирование активностей)
    ОписаниеОшибки         =  Получение элемента по индексу для значения не определено
    ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7968)
    КодСообщения           =  66

Ошибка при выгрузке данных: {ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7991)}: Ошибка получения коллекции подчиненных объектов из входящих данных
    ПКО                    =  ПланированиеАктивностей  (Документ: (АП) Планирование активностей)
    ПКГС                   =  4  ( --> Номенклатура)
    Объект                 =  (АП) Планирование активностей 000000001 от 28.01.2016 11:13:23  ((АП) Планирование активностей)
    ОписаниеОшибки         =  Получение элемента по индексу для значения не определено
    ПозицияМодуля          =  ВнешняяОбработка.УниверсальныйОбменДаннымиXML.МодульОбъекта(7968)
    КодСообщения           =  66

Подскажите, что это может быть?
10 sonne666
 
20.02.16
12:33
(9) у вас табличная часть "Номенклатура" и ее реквизит "Номенклатура"?
Выложи картинку с ПКС этого документа.
11 sonne666
 
20.02.16
13:26
(9) У ПКГС Номенклатура должна стоять галочка "Получить из входящих данных", у реквизитов ТЧ такой галочки быть не должно.
Может, в каких-то документах получается пустая таблица значений Номенклатура для выгрузки? Вот КД и не может получить коллекцию объектов, т.к. ее нет.
12 Reclaim
 
24.02.16
13:51
Вопрос решил. Создаем ПКО: не указываем источник, указываем необходимый приемник. Создаем необходимые ПКС, на каждом ставим "Получить из входящих данных". При переносе ТЧ ставим "Получить из входящих данных" только у самой ТЧ, реквизиты не трогаем. Создаем ПВД, указываем "Произвольный алгоритм" выборки. В обработчике "Перед обработкой" пишем код:


V8 = Новый COMОбъект("V83.ComConnector");
В8 = V8.Connect("Srvr="+символ(34)+"тут указываем сервер"+символ(34)+";Ref="+символ(34)+"наименование сервера"+символ(34)+";Usr="+символ(34)+"пользователь"+символ(34)+";Pwd=пароль пользователя;");

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

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|    Акции.Ссылка,
|   Акции.Ссылка.НачалоПериода КАК ДатаНачалаАкции,
|   Акции.Ссылка.КонецПериода КАК ДатаЗавершенияАкции,
|   Акции.Ссылка.Комментарий КАК Комментарий,
|   Акции.Номенклатура КАК Номенклатура,
|    Акции.Скидка КАК Процент,
|    Акции.МеханикаАктивности КАК МеханикаАкции
|ИЗ
|    Документ.АП_ПланированиеАктивностей.Акции КАК Акции";
ВыборкаТЧАкции = Запрос.Выполнить().Выбрать();

Пока ВыборкаТЧГрузополучатели.СледующийПоЗначениюПоля("Ссылка") Цикл    
    
    УИУПП = Строка(ВыборкаТЧГрузополучатели.Ссылка.УникальныйИдентификатор());
    
    Запрос = В8.NewObject("Запрос");
    Запрос.УстановитьПараметр("УИУПП", УИУПП);
    Запрос.Текст = "ВЫБРАТЬ
    |    СоблюдениеАкций.Ссылка,
    |    СоблюдениеАкций.УИУПП
    |ИЗ
    |    Документ.СоблюдениеАкций КАК СоблюдениеАкций
    |ГДЕ
    |    СоблюдениеАкций.УИУПП = &УИУПП";
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        Документ = Выборка.Ссылка.ПолучитьОбъект();
        Документ.УстановитьПометкуУдаления(Истина);
        Документ.Записать();
    КонецЦикла;
    
    Пока ВыборкаТЧГрузополучатели.Следующий() Цикл    
        
        ВыборкаТЧАкции.Сбросить();
        Пока ВыборкаТЧАкции.СледующийПоЗначениюПоля("МеханикаАкции") Цикл
            
            ВходящиеДанные = Новый Структура("Номенклатура, ДатаНачалаАкции, ДатаЗавершенияАкции, Комментарий, МеханикаАкции, ФорматТТ, Партнер, УИУПП");    
            ВходящиеДанные.Номенклатура = Новый ТаблицаЗначений;
            ВходящиеДанные.Номенклатура.Колонки.Добавить("Номенклатура");
            ВходящиеДанные.Номенклатура.Колонки.Добавить("Процент");
            
            ВходящиеДанные.МеханикаАкции = ВыборкаТЧАкции.МеханикаАкции;
            ВходящиеДанные.ФорматТТ = ВыборкаТЧГрузополучатели.ФорматТТ;
            ВходящиеДанные.ДатаНачалаАкции = ВыборкаТЧГрузополучатели.ДатаНачалаАкции;
            ВходящиеДанные.ДатаЗавершенияАкции = ВыборкаТЧГрузополучатели.ДатаЗавершенияАкции;
            ВходящиеДанные.Комментарий = ВыборкаТЧГрузополучатели.Комментарий;
            ВходящиеДанные.Партнер = ВыборкаТЧГрузополучатели.Партнер;
            ВходящиеДанные.УИУПП = УИУПП;
            
            Пока ВыборкаТЧАкции.Следующий() Цикл            
                СтрокаТЗ = ВходящиеДанные.Номенклатура.Добавить();
                СтрокаТЗ.Номенклатура = ВыборкаТЧАкции.Номенклатура;
                СтрокаТЗ.Процент = ВыборкаТЧАкции.Процент;
            КонецЦикла;
            
            ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ПланированиеАктивностей");
            
        КонецЦикла;
    КонецЦикла;    
КонецЦикла;
13 Reclaim
 
24.02.16
13:51
Может кому-то пригодится
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн