Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 15:27

Заполнение объекта

Автор rijen, 11 дек 2014, 20:11

0 Пользователей и 1 гость просматривают эту тему.

rijen

Здравия.
Есть у меня набор данных на списание, табличка, надо три поля - склад, номенклатура, количество.
Мне приходят данные на подобии
|Склад1|Ном1|10|
|Склад1|Ном2|10|
|Склад2|Ном1|10|

Почесав за ухом я набросал такую процедуру

Процедура СписаниеЛот(Товары,КонецПериода)
Товары2 = товары;//Фикс баги со ссылками
ТМЗ = Новый ТаблицаЗначений;             
ТМЗ.Колонки.Добавить("ТабНом");
ТМЗ.Колонки.Добавить("Склад");

ЭТН = Новый ТаблицаЗначений;
ЭТН.Колонки.Добавить("Номенклатура");
ЭТН.Колонки.Добавить("Количество");

Для каждого товар из товары2 цикл

СущСклад = ТМЗ.Найти(Товар.Склад,"Склад");
Если НЕ СущСклад=Неопределено тогда
ЭЭТН = ЭТН.Добавить();
ЭЭТН.Номенклатура = товар.Номенклатура;
ЭЭТН.Количество = товар.Количество;

СущСклад.ТабНом = ЭТН;
иначе
ЭТН = Неопределено;
ЭЭТН = ЭТН.Добавить();
ЭЭТН.Номенклатура = товар.Номенклатура;
ЭЭТН.Количество = товар.Количество;

ЭТМЗ = ТМЗ.Добавить();
ЭТМЗ.Склад = Товар.Склад;
ЭТМЗ.ТабНом = ЭТН;
конецЕсли;
КонецЦикла;
Для каждого ЭлСписания из ТМЗ цикл
НовДок = Документы.СписаниеТоваров.СоздатьДокумент();
НовДок.Склад = ЭлСписания.Склад;
НовДок.Дата = КонецПериода;
Для каждого НомСписания из ЭлСписания.ТабНом  цикл
НовСтрока = НовДок.Товары.Добавить();
НовСтрока.Номенклатура = НомСписания.Номенклатура;
НовСтрока.Количество =НомСписания.Количество;
КонецЦикла;
НовДок.Записать();
КонецЦикла;

КонецПроцедуры


Но в итоге в документ попадают только последние номенклатуры по каждому из складов.
Что я сделал не так?

rijen

Немного получался, в итоге корректно работающая функция выглядит так..


Процедура СписаниеЛот(Товары,КонецПериода)
    ТЗ1 = Новый ТаблицаЗначений;     
    ТЗ1.Колонки.Добавить("Склад"); ;
   
    Для каждого товар из товары цикл
        новТЗ1 = ТЗ1.Добавить();
        новТЗ1.Склад =    товар.Склад      ;
    КонецЦикла;
   
    ТЗ2 = Новый ТаблицаЗначений;
    ТЗ2.Колонки.Добавить("Номенклатура");
    ТЗ2.Колонки.Добавить("Склад");
    ТЗ2.Колонки.Добавить("Количество");
   
    Для каждого товар из товары цикл
        новТЗ2 = ТЗ2.Добавить();
        новТЗ2.Номенклатура =товар.Номенклатура  ;
        новТЗ2.Склад =    товар.Склад      ;
        новТЗ2.Количество =   товар.Количество ;
    КонецЦикла;

    ТЗ1.Свернуть("Склад");
   
    Для Каждого т из ТЗ1 Цикл
        НовДок = Документы.СписаниеТоваров.СоздатьДокумент();
        НовДок.Склад = т.Склад;
        НовДок.Дата = КонецПериода;
       
        Для Каждого т1 из ТЗ2 Цикл
            Если т1.Склад = т.Склад тогда
                НовСтрока = НовДок.Товары.Добавить();
                НовСтрока.Номенклатура = т1.Номенклатура;
                НовСтрока.Количество = т1.Количество;
            конецЕсли;
        КонецЦикла;
       
        НовДок.Записать();
    КонецЦикла;
   
КонецПроцедуры


Это нормальная реализация? Меня смущает копирование объекта, но иначе не получается..

LexaK

ваш код типичный пример говнокодирования
зачем создавать несколько новых таблиц значений,
зачем что-то лишний раз в них копировать, сворачивать и др.

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


Процедура СписаниеЛот(Товары,КонецПериода)

//для уверенности сортируем по полю Склад
//если таблицу Товары получаете из запроса,
//то отсортируйте в запросе по Складу, тогда здесь сортировать не надо!!!
Товары.Сортировать("Склад");

лкСклад = 0;
лкДок   = 0;

Для каждого лкСтр из Товары цикл

Если лкСклад <> лкСтр.Склад Тогда
лкСклад = лкСтр.Склад;
//смена склада, инициализируем документ
Если лкДок <> 0 Тогда
лкДок.Записать();
КонецЕсли;
//создаем новый документ, заполняем шапку
        лкДок = Документы.СписаниеТоваров.СоздатьДокумент();
        лкДок.Склад = лкСтр.Склад;
        лкДок.Дата = КонецПериода;
КонецЕсли;
//добавляем товара и количество
        НовСтрока = лкДок.Товары.Добавить();
        НовСтрока.Номенклатура = лкСтр.Номенклатура;
        НовСтрока.Количество   = лкСтр.Количество;
    КонецЦикла;
   
Если лкДок <> 0 Тогда
лкДок.Записать();
КонецЕсли;
   
КонецПроцедуры

если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск