Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
21 Янв 2018, 05:19
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Заполнение объекта  (Прочитано 1391 раз)

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

Оффлайн rijen

  • *
  • Сообщений: 2
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-12-11
  • Сайт: 
  • Профессия: Программист 8.1
Здравия.
Есть у меня набор данных на списание, табличка, надо три поля - склад, номенклатура, количество.
Мне приходят данные на подобии
|Склад1|Ном1|10|
|Склад1|Ном2|10|
|Склад2|Ном1|10|

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

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

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

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

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

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

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

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


Оффлайн rijen

  • *
  • Сообщений: 2
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2014-12-11
  • Сайт: 
  • Профессия: Программист 8.1
Немного получался, в итоге корректно работающая функция выглядит так..

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

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

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

Оффлайн LexaK

  • *****
  • Сообщений: 1280
  • РЕПУТАЦИЯ: 352
  • КПД: 28%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
ваш код типичный пример говнокодирования
зачем создавать несколько новых таблиц значений,
зачем что-то лишний раз в них копировать, сворачивать и др.

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

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

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

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

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

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

Помогло? - Нажми СПАСИБО!!!
                       :)


Теги:
 

Заполнение табл. части документа из табл. части другого документа

Автор WillРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 11
Просмотров: 7814
Последний ответ 16 Авг 2012, 21:50
от Will
Заполнение табличной части документа табличной частью из другого документа

Автор PeaceownerРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 2610
Последний ответ 30 Ноя 2011, 07:10
от has
Автоматическое заполнение табличной части документа из табличной части другого

Автор WillРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 6
Просмотров: 16220
Последний ответ 16 Авг 2012, 12:07
от Will
Заполнение поля табличной части документа из табличной части справочника.

Автор Kurt_WagnerРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 4319
Последний ответ 06 Апр 2015, 20:08
от Kurt_Wagner
Заполнение табличной части документа реквизитами табличной части справочника

Автор kaf_infoРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 747
Последний ответ 10 Май 2017, 20:44
от ilnur75

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
99 Сообщений
AIFrame
65 Сообщений
alex0402
32 Сообщений
kiksi
26 Сообщений
pavl_vs
24 Сообщений
alexandr_ll
17 Сообщений
andron81_81
16 Сообщений
Norfolk
15 Сообщений
KOI8-R
14 Сообщений
MuI_I_Ika MuI_I_Ika
13 Сообщений

* Кто онлайн

  • Точка Гостей: 120
  • Точка Скрытых: 0
  • Точка Пользователей: 0

Нет пользователей онлайн.

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal