8.х ОБМЕН Документ -> Документ, перенсо таблицы со сверткой

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем chupaka, 24 июн 2010.

  1. TopicStarter Overlay
    chupaka
    Offline

    chupaka

    Регистрация:
    24 июн 2010
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    используется "конвертация данных 2.0"

    Задача:
    при переносе части документов необходимо сворачивать табличные части в 2 позиции "товар" и "услуга" по свойству номенклатуры

    Суть проблемы:
    мне никак не въехать в какой объект надо запихнуть сформированную табличную часть, и в каком именно обработчике это сделать

    скриншот:
    [​IMG]

    код обработчика:
    Код:
     Если Источник.Товары.Количество()=0 тогда
    отказ = истина;
    КонецЕсли;
    
    Товары = новый ТаблицаЗначений;
    Товары.Колонки.Добавить("Номенклатура");
    Товары.Колонки.Добавить("Сумма");
    Товары.Колонки.Добавить("Цена");
    Товары.Колонки.Добавить("Количество");
    Товары.Колонки.Добавить("Коэффициент");
    Товары.Колонки.Добавить("ЕдиницаИзмерения");
    Товары.Колонки.Добавить("СтавкаНДС");
    Товары.Колонки.Добавить("СуммаНДС");
    
    Номенклатура = новый Структура;
    Номенклатура.Вставить("Наименование","Товар");
    
    Строка_Товар = Товары.Добавить();
    Строка_Товар.Номенклатура =  Номенклатура;
    
    Номенклатура = новый Структура;
    Номенклатура.Вставить("Наименование","Услуга");
    
    Строка_услуга = Товары.Добавить();
    Строка_услуга.Номенклатура =  Номенклатура;
    
    Строка_услуга.Сумма = 0;
    Строка_услуга.Количество = 0;
    
    Строка_Товар.Сумма = 0;
    Строка_Товар.Количество = 0;
    
    
    Для каждого строкаТоварыИсточник из Источник.Товары цикл
    если СтрокаТоварыИсточник.Номенклатура.Услуга тогда
    Строка_услуга.Сумма = Строка_услуга.Сумма + строкаТоварыИсточник.Сумма; 
    Строка_услуга.Количество = Строка_услуга.Количество + строкаТоварыИсточник.Количество; 
    Иначе  
    Строка_товар.Сумма = Строка_товар.Сумма + строкаТоварыИсточник.Сумма; 
    Строка_товар.Количество = Строка_товар.Количество + строкаТоварыИсточник.Количество;  
    КонецЕсли;   
    КонецЦикла;
    
    Если Строка_Товар.Количество > 0 тогда
    Строка_товар.Цена =   Строка_товар.Сумма / Строка_товар.количество;
    Иначе
    Товары.Удалить(Строка_товар);
    КонецЕСли;
    
    Если Строка_услуга.Количество > 0 тогда
    Строка_услуга.Цена =   Строка_услуга.Сумма / Строка_услуга.количество;
    Иначе
    Товары.Удалить(Строка_услуга);
    КонецЕСли;
    
    
    Если Товары.Количество()>0 тогда 
    
    ///// ВОТ ЭТО НЕ ПОНИМАЮ КАК СДЕЛАТЬ 	  
    УзелКоллекцииОбъектов =  товары;
    //// КАК  ПРАВИЛЬНО ПОСТАВИТЬ НА МЕСТО ТАБЛИЦУ ТОВАРЫ 
    
    иначе
    отказ = истина;	
    КонецЕсли;
    
    
    
    ошибка при выгрузке:
  2. x-a-d
    Offline

    x-a-d Опытный в 1С

    Регистрация:
    3 сен 2009
    Сообщения:
    184
    Симпатии:
    0
    Баллы:
    26
    не очень понятно написано что хотите и почему именно такое решение, но обращу внимание на следующее:

    Вы пишите код в ПКГС. И если уж у вас есть
    УзелКоллекцииОбъектов = товары;

    то "УзелКоллекцииОбъектов" - это должно быть ПКС внутри вашей ПКГС. И таким методом можно максимум создать 1 строку ПКГС.

    Сразу вопрос, а что вызывает ПКГС ?
    судя по всему это у вас табличная часть одного документа и табличная часть другого документа. И вы при выгрузке одной строчки ТЧ Товары делаете алгоритм по обработке всех строк (при чем я не уверен, что алгоритм правильный). И данный алгоритм у вас будет вызываться столько раз, сколько строк в ТЧ Товары Источника.

    Более правильно - написать ПВД, где вы алгоритмически сформируете для выгрузки Источника как шапку, так и ТЧ Товары, и используйте потом ВыгрузитьПоПравилу(,,,,);
  3. x-a-d
    Offline

    x-a-d Опытный в 1С

    Регистрация:
    3 сен 2009
    Сообщения:
    184
    Симпатии:
    0
    Баллы:
    26
    ПВД должно быть приблизительно такое
    делаете отбор нужных документов и начинаете их обработку.

    Код:
    ВходящиеДанные = Новый СписокЗначений; 
    
    здесь заполняете все реквизиты шапки
    который по составу должны совпадать с вашим ПКО, например

    Код:
    ВходящиеДанные.Добавить(Док.Контрагент, "Контрагент");
    
    где Док - отобранный вами документ, а "Контрагент" - совпадает по названию с одним из ПКС в вашем ПКО

    //далее определяте табличную часть
    Код:
    ТаблицаТоваров  = новый ТаблицаЗначений;
    
    определяете состав полей, который должен совпадать с ПКГС, заполняете поля по вашему алгоритму
    После чего в список значений добавляете табличную часть

    Код:
    ВходящиеДанные.Добавить(ТаблицаТоваров, "Товары");
    
    и выгружаете ваш документ
    Код:
    ВыгрузитьПоПравилу(,,ВходящиеДанные,, "ИмяВашегоПКО");
    
  4. TopicStarter Overlay
    chupaka
    Offline

    chupaka

    Регистрация:
    24 июн 2010
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    спасибо за ответ,
    Я не совсем понял зачем надо переопределять правило выгрузки, сам документ и все его реквизиты выгружеатся нормально, он даже выгружает табличные части в том виде в котором они были в конфигурации источнике, если просто сопоставить реквизиты.
    Я правильно понял что "контрагент" в данном случае используется как ключ? то есть вместо "ВходящиеДанные.Добавить(Док.Контрагент, "Контрагент");" вполне может быть ВходящиеДанные.Добавить(Док.Контрагент, "Велосипед"); при условии что в ПКО Документа будет строчка "Велосипед" с галочкой получить из входящих данных?

    мне нужно в момент выгрузки документа по стандартному ПВД, сделать так, чтобы вместо его табличной части выгрузилась моя которая формируется скриптом, или каким то другим способом это не принципиально, моя проблема в том что я не понимаю до конца как работает "конвертация данных 2.0" и мне не ясно как получить доступ к выгружаемому объекту (куда я должен положить сформированную таблицу)

    ???????УзелКоллекцииОбъектов = товары;
    да, эта строчка не работает об том и речь

    цитата из хелпа:
    я так понял что УзелКоллекцииОбъектов это как раз табличная часть, а строка это ОбъектКоллекции

    скрипт написал в ПКГС таблицыДокумента "товары" где он срабатывает 1 раз при выгрузке в табличной части, я это проверял.


    вот эту часть я не понял, а какое имя у "ИмяВашегоПКО" ?

    я заранее извиняюсь за тупость, к сожалению опыта маловато (((((
  5. TopicStarter Overlay
    chupaka
    Offline

    chupaka

    Регистрация:
    24 июн 2010
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Вопрос открыт, ответ я к сожалению применить не смог, попытаюсь подробнее и четче его сформулировать:

    Есть 2 конфигурации, в которых есть 2 идентичных документа (допустим "Поступление товаров")
    Выгрузка и загрузка работает, документы переносятся, переносятся табличные части

    Но мне нужно что бы при переносе табличная часть сворачивалась по 2-ум позициям номенклатуры (услуги, товары). С получением этих данных проблем нет, проблема только с тем как и в каком обработчике их вставить в файл выгрузки.

    Помогите плс :unsure:
  6. x-a-d
    Offline

    x-a-d Опытный в 1С

    Регистрация:
    3 сен 2009
    Сообщения:
    184
    Симпатии:
    0
    Баллы:
    26
    Еще раз обращаю Ваше внимание, что при выгрузке ПКГС вы обрабатываете полностью табличную часть Источника!!! А выгрузить я так понимаю, вам надо свернутую табличную часть.
    А когда вызывается ПКГС? ПКГС вызывается НА КАЖДУЮ СТРОЧКУ табличной части. Т.е. если у вас 10 строк в "Товары" в Источнике, то у вас ПКГС 10 раз и отработает.
    Если Вам надо свернуть табличную часть и выгрузить всего одну строку, то у вас не получится ни в ПКО, на в ПКС, ни в ПКГС сделать алгоритм, который будет формировать Источник для выгрузки "на лету". в ПКО, ПКС или ПКГС можно только какие-то условия применять для того или иного направления выгрузки, но не полное формирование ИСТОЧНИКА. Т.е. сформировать полностью табличную часть "на лету" для выгрузки не получится. Разве что для Табличной части вы уберете ИСТЧОНИК и оставите только приемник. Но тогда в коде надо использовать "КоллекцияОбъектов". Проще написать ПВД под ваш случай.
    Поэтому Вам и надо писать ПВД алгоритмом, чтобы там провести свертку, т.е. подготовить ИСТОЧНИК в нужном для Вас виде, а потом выгрузить его по правилу.
  7. TopicStarter Overlay
    chupaka
    Offline

    chupaka

    Регистрация:
    24 июн 2010
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    ПКГС для табличной части вызывается 1 раз перед созданием табличной части, проверить просто напишите в "сообщить(""+Источник);" "перед выгрузкой"

    вот ссылка из этого форума, в теме есть правила, где аналогичная задача решается через ПКО
    Тема с выгрузкой через ПКО

    как я понял нужно оформить ПКС и добавить в ПКО соответствующую таблицу в "входящиеДанные" в процедуру "перед выгрузкой"

    Просто эти данные должны там оказаться до начала работы ПКС или ПКГС, по этому и с ПКГС не работало

    Спасибо еще раз, предложенное Вами решение должно работать, но мне кажется нет смысла переопределять ПВД для всего объекта в данной ситуации.
  8. x-a-d
    Offline

    x-a-d Опытный в 1С

    Регистрация:
    3 сен 2009
    Сообщения:
    184
    Симпатии:
    0
    Баллы:
    26
    Вот именно, проверьте. И желательно на документах где несколько строк.
  9. TopicStarter Overlay
    chupaka
    Offline

    chupaka

    Регистрация:
    24 июн 2010
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    Собственно вот тестовый пример, скрипт "перед выгрузкой" в ПКО документ Поступление товаров и услуг, делает новую табличную часть товары, добавляет в нее 2 верхних строки из старой, и оставляет ее во входящих данных для ПГКС "Товары"

    Вложения:

Поделиться этой страницей