Имя: Пароль:
1C
 
Перебор табличных частей
0 Wefast
 
30.07.15
16:57
Есть обработка. В ней 12 табличных частей
MOE1A, MOE1B,MOE1C, MOE1D, MOE2A, MOE2B, MOE2C, MOE2D, MOE3A, MOE3B, MOE3C, MOE3D, MOE4A, MOE4B, MOE4C, MOE4D

Как мне их перебрать в цикле?

Процедура СоздатьПеремещение();
    
    Массивчик = Новый Массив;
    Массивчик.Добавить("1A");
    Массивчик.Добавить("1B");
    Массивчик.Добавить("1C");
    Массивчик.Добавить("1D");
    Массивчик.Добавить("2A");
    Массивчик.Добавить("2B");
    Массивчик.Добавить("2C");
    Массивчик.Добавить("2D");
    Массивчик.Добавить("3A");
    Массивчик.Добавить("3B");
    Массивчик.Добавить("3C");
    Массивчик.Добавить("3D");

        
    Для каждого М из Массивчик Цикл
        
        Если Объект["MOE"+М].Количество() >0 Тогда
            
            ТЗ = РеквизитФормыВЗначение("Объект[""MOE"+М]""); // ВОТ ТУТ НЕ ПОЛУЧАЕТСЯ

            Док = Документы.ПеремещениеТоваров.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            Док.СкладОтправитель = ТЗ.СкладОсновной;
            Док.СкладПолучатель = Справочники.Склады.НайтиПоНаименованию("MOE"+М);
            Док.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН",6449074016);
            Док.Статус = Перечисления.СтатусыПеремещенийТоваров.КОтгрузке;
            Для Каждого Строка из ТЗ Цикл
                
                НоваяСтрока = Док.Товары.Добавить();
                НоваяСтрока.Номенклатура = Строка.Номенклатура;
                НоваяСтрока.Количество = Строка.Нужно;
                            
            КонецЦикла;
            
            Док.Записать(РежимЗаписиДокумента.Запись);
                        
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
1 Wefast
 
30.07.15
16:58
А напрямую работать с табличной частью не получается. Она имеет тип данныеформыколлекция
2 Casey1984
 
30.07.15
16:58
ТЗ = РеквизитФормыВЗначение("Объект[""MOE"+М]"");// ВОТ ТУТ НЕ ПОЛУЧАЕТСЯ - зачем Объект в кавычках? Подумай еще раз!
3 Лефмихалыч
 
30.07.15
16:59
>есть обработка. В ней 12 табличных частей
кто-то дальше читал?
4 GROOVY
 
30.07.15
16:59
Нахрена реквизит формы в значение?
5 фобка
 
30.07.15
17:00
Тз = объект["мое"+м].выгрузить();
6 GROOVY
 
30.07.15
17:01
(3) Ну копрокод детектед в (0)
7 фобка
 
30.07.15
17:01
И да - "массивчик" - это автоматом г-код
8 salvator
 
30.07.15
17:02
Для каждого М из Массивчик Цикл
        
        Если Объект["MOE"+М]

Посмотри что у тебя в М хранится и удивись
9 фобка
 
30.07.15
17:03
Док.СкладОтправитель = ТЗ.СкладОсновной
Тут тоже косяк
10 Timon1405
 
30.07.15
17:04
(7) Так-то, наоборот, "массив = новый Массив" и "Запрос = новый Запрос" это г-код, ибо, по-хорошему, не должна переменная совпадать с именем типа, но "так уж сложилось"
11 фобка
 
30.07.15
17:05
Процедура СоздатьПеремещение();
Тут тоже косяк
12 фобка
 
30.07.15
17:06
(10) лучше "запрос" чем "запросик"
13 Timon1405
 
30.07.15
17:09
(12) экий вы суровый, а как же пасхалки в коде?)
14 фобка
 
30.07.15
17:12
(13) чтоб добрым быть, я должен быть жестоким
15 Euguln
 
30.07.15
17:22
А чо бы по метаданным не пробежаться.
16 Wefast
 
30.07.15
17:31
(5) Вот так работает
(3) Как иначе? Так легче, чем создавать 12 таблиц программно
(2) Если сделать ТЗ = РеквизитФормыВЗначение("Объект.МОЕ1А") то нормально все делается
(7) Сначала это было временным решением, а потом осталось. Кроме меня все равно никто не увидит, а если увидит поднимет настроение.
(8) Строка. Получается Строка МОЕ + Строка 1А или 2В. В итоге то что нужно.
17 Wefast
 
30.07.15
17:32
&НаСервере
Процедура  ЗаполнитьНаСервере()
    тДерево = РеквизитФормыВЗначение("Объект.Дерево");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    МаршрутныйЛистПроизводстваМатериалыИУслуги.Номенклатура,
    |    СУММА(МаршрутныйЛистПроизводстваМатериалыИУслуги.Количество) КАК Количество,
    |    МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Подразделение
    |ПОМЕСТИТЬ ВТ_МаршрутныеЛисты
    |ИЗ
    |    Документ.МаршрутныйЛистПроизводства.МатериалыИУслуги КАК МаршрутныйЛистПроизводстваМатериалыИУслуги
    |ГДЕ
    |    МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Проведен = ИСТИНА
    |    И МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.ПометкаУдаления = ЛОЖЬ
    |    И МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Статус <> &Статус
    |    И МаршрутныйЛистПроизводстваМатериалыИУслуги.ПроизводитсяВПроцессе = ЛОЖЬ
    |    И МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Начало >= &НачалоПериода
    |    И МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Окончание <= &КонецПериода
    |
    |СГРУППИРОВАТЬ ПО
    |    МаршрутныйЛистПроизводстваМатериалыИУслуги.Номенклатура,
    |    МаршрутныйЛистПроизводстваМатериалыИУслуги.Ссылка.Подразделение
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ_МаршрутныеЛисты.Номенклатура,
    |    ВТ_МаршрутныеЛисты.Количество,
    |    ВТ_МаршрутныеЛисты.Подразделение,
    |    НастройкаПередачиМатериаловВПроизводство.Склад
    |ПОМЕСТИТЬ ВТ_2
    |ИЗ
    |    ВТ_МаршрутныеЛисты КАК ВТ_МаршрутныеЛисты
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаПередачиМатериаловВПроизводство КАК НастройкаПередачиМатериаловВПроизводство
    |        ПО ВТ_МаршрутныеЛисты.Номенклатура = НастройкаПередачиМатериаловВПроизводство.Номенклатура
    |            И ВТ_МаршрутныеЛисты.Подразделение = НастройкаПередачиМатериаловВПроизводство.Подразделение
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Влож.Номенклатура КАК Номенклатура,
    |    Влож.Количество КАК Количество,
    |    Влож.Подразделение,
    |    Влож.Склад КАК СкладОсновной,
    |    Влож.ВНаличииОстаток КАК ОстатокНаОсновномСкладе,
    |    Влож.Поле1 КАК СкладМОЕ,
    |    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ОстатокНаМОЕ,
    |    Влож.Количество - СвободныеОстаткиОстатки.ВНаличииОстаток КАК Нужно
    |ИЗ
    |    (ВЫБРАТЬ
    |        ВТ_2.Номенклатура КАК Номенклатура,
    |        ВТ_2.Количество КАК Количество,
    |        ВТ_2.Подразделение КАК Подразделение,
    |        ВТ_2.Склад КАК Склад,
    |        СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток,
    |        ВЫБОР
    |            КОГДА ВТ_2.Подразделение.Код = ""00007F008""
    |                    И Склады.Наименование = ""00021 MOE1""
    |                ТОГДА Склады.Ссылка
    |            КОГДА ВТ_2.Подразделение.Код = ""00007F010""
    |                    И Склады.Наименование = ""00022 MOE3""
    |                ТОГДА Склады.Ссылка
    |            КОГДА ВТ_2.Подразделение.Код = ""00007F011""
    |                    И Склады.Наименование = ""00023 MOE3""
    |                ТОГДА Склады.Ссылка
    |            ИНАЧЕ ""0""
    |        КОНЕЦ КАК Поле1
    |    ИЗ
    |        ВТ_2 КАК ВТ_2
    |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&КонецПериода, ) КАК СвободныеОстаткиОстатки
    |            ПО ВТ_2.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    |                И ВТ_2.Склад = СвободныеОстаткиОстатки.Склад,
    |        Справочник.Склады КАК Склады) КАК Влож
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&КонецПериода, ) КАК СвободныеОстаткиОстатки
    |        ПО Влож.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    |            И Влож.Поле1 = СвободныеОстаткиОстатки.Склад
    |ГДЕ
    |    Влож.Поле1 <> ""0""
    |ИТОГИ ПО
    |    СкладМОЕ,
    |    СкладОсновной";
    
    Запрос.УстановитьПараметр("КонецПериода", Объект.ДатаКонца);
    Запрос.УстановитьПараметр("НачалоПериода", Объект.ДатаНачала);
    Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыМаршрутныхЛистовПроизводства.Выполнен);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    тДерево = ВыборкаДетальныеЗаписи;
    
    ЗначениеВРеквизитФормы(тДерево, "Объект.Дерево");
    
КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)
    ЗаполнитьНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
    
    ИДТекущейСтроки = Элементы.Дерево.ТекущаяСтрока;
    
    Если ИДТекущейСтроки <> Неопределено Тогда
        
        ЭлементКоллекции = Объект.Дерево.НайтиПоИдентификатору(ИДТекущейСтроки);
        
        Если ЭлементКоллекции.Галка = 2 Тогда
            ЭлементКоллекции.Галка = 0;
        КонецЕсли;
        
        УстановкаФлажков(ЭлементКоллекции, ЭлементКоллекции.Галка);
        
        Родитель = ЭлементКоллекции.ПолучитьРодителя();
        Пока Родитель <> Неопределено Цикл
            Родитель.Галка = ?(УстановленноДляВсех(ЭлементКоллекции),
            ЭлементКоллекции.Галка, 2);
            ЭлементКоллекции = Родитель;
            Родитель = ЭлементКоллекции.ПолучитьРодителя();
        КонецЦикла;
        
    КонецЕсли;
    
    
КонецПроцедуры

&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
    
    ПодчинЭлементы = ЭлементКоллекции.ПолучитьЭлементы();
    Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
        ТекЭлемент.Галка = ЗначениеПометки;
        УстановкаФлажков(ТекЭлемент, ТекЭлемент.Галка);
    КонецЦикла;
    
КонецПроцедуры

&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
    
    СоседниеЭлементы = ЭлементКоллекции.ПолучитьРодителя().ПолучитьЭлементы();
    Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
        Если ТекЭлемент.Галка <> ЭлементКоллекции.Галка Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
    
КонецФункции

&НаСервере
Процедура СоздатьДокументыНаСервере()
    Дерево = РеквизитФормыВЗначение("Объект.Дерево");
    ОбходДерева(Дерево);    
    СоздатьПеремещение();
    Объект.MOE1A.Очистить();
    Объект.MOE1A.Очистить();
    Объект.MOE1B.Очистить();
    Объект.MOE1C.Очистить();
    Объект.MOE1D.Очистить();
    Объект.MOE2A.Очистить();
    Объект.MOE2B.Очистить();
    Объект.MOE2C.Очистить();
    Объект.MOE2D.Очистить();
    Объект.MOE3A.Очистить();
    Объект.MOE3B.Очистить();
    Объект.MOE3C.Очистить();
    Объект.MOE3D.Очистить();
КонецПроцедуры

&НаКлиенте
Процедура СоздатьДокументы(Команда)
    СоздатьДокументыНаСервере();
КонецПроцедуры


&НаСервере
Процедура ОбходДерева(Дерево)
    
    Для Каждого тСтр Из Дерево.Строки Цикл
        
        
        Если тСтр.СкладМОЕ <> Справочники.Склады.ПустаяСсылка() И тСтр.СкладОсновной <> Справочники.Склады.ПустаяСсылка() И тСтр.Номенклатура  <> Справочники.Номенклатура.ПустаяСсылка() Тогда
            
            Если тСтр.СкладМОЕ         = Справочники.Склады.НайтиПоНаименованию("00021 MOE1") Тогда  // СКЛАД МОЕ1
                ДобавлениеСтроки(тСтр);
            ИначеЕсли тСтр.СкладМОЕ = Справочники.Склады.НайтиПоНаименованию("00022 MOE2") Тогда  // СКЛАД МОЕ2
                ДобавлениеСтроки(тСтр);
            ИначеЕсли тСтр.СкладМОЕ = Справочники.Склады.НайтиПоНаименованию("00023 MOE3") Тогда  // СКЛАД МОЕ3
                ДобавлениеСтроки(тСтр);
            Иначе
                Сообщить("Удалите из обработки справочники кроме МОЕ1 МОЕ2 и МОЕ3");
            КонецЕсли;
            
        КонецЕсли;
        
        Если тСтр.Строки.Количество()>0 Тогда
            ОбходДерева(тСтр);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Процедура ДобавлениеСтроки(тСтр)
    
    Если тСтр.СкладОсновной = Справочники.Склады.НайтиПоНаименованию("Основное Хранение (А)") И тСтр.Галка = 1 Тогда // СКЛАД А
        Если тСтр.ОстатокНаОсновномСкладе < тСтр.Нужно Тогда
            Сообщить("На основном складе не хватает /"+ Строка(тСтр.Нужно - тСтр.ОстатокНаОсновномСкладе) +"/ед. "+ тСтр.Номенклатура.Наименование );
        ИначеЕсли тСтр.Нужно > 0 Тогда
            НоваяСтрока = Объект[ПРав(тСтр.СкладМОЕ.Наименование,4)+"A"].Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСТрока, тСтр);
        Иначе
            Сообщить("Номенклатура "+ тСтр.Номенклатура.Наименование +" на складе "+ тСтр.СкладМОЕ.Наименование + " в избытке и в пополнение не нуждается");
        КонецЕсли
        
    ИначеЕсли тСтр.СкладОсновной = Справочники.Склады.НайтиПоНаименованию("Металл Хранение (B)")  И тСтр.ОстатокНаОсновномСкладе > тСтр.Нужно И тСтр.Галка = 1 Тогда // СКЛАД B
        Если тСтр.ОстатокНаОсновномСкладе < тСтр.Нужно Тогда
            Сообщить("На основном складе не хватает /"+ Строка(тСтр.Нужно - тСтр.ОстатокНаОсновномСкладе) +"/ед. "+ тСтр.Номенклатура.Наименование);
        ИначеЕсли тСтр.Нужно > 0 Тогда
            НоваяСтрока = Объект[ПРав(тСтр.СкладМОЕ.Наименование,4)+"B"].Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСТрока, тСтр);
        Иначе
            Сообщить("Номенклатура "+ тСтр.Номенклатура.Наименование +" на складе "+ тСтр.СкладМОЕ.Наименование + " в избытке и в пополнение не нуждается");
        КонецЕсли
        
    ИначеЕсли тСтр.СкладОсновной = Справочники.Склады.НайтиПоНаименованию("Вспомогательное Хранение (С)")  И тСтр.ОстатокНаОсновномСкладе > тСтр.Нужно И тСтр.Галка = 1 Тогда // СКЛАД C
        Если тСтр.ОстатокНаОсновномСкладе < тСтр.Нужно Тогда
            Сообщить("На основном складе не хватает /"+ Строка(тСтр.Нужно - тСтр.ОстатокНаОсновномСкладе) +"/ед. "+ тСтр.Номенклатура.Наименование );    
        ИначеЕсли тСтр.Нужно > 0 Тогда
            НоваяСтрока = Объект[ПРав(тСтр.СкладМОЕ.Наименование,4)+"C"].Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСТрока, тСтр);
        Иначе
            Сообщить("Номенклатура "+ тСтр.Номенклатура.Наименование +" на складе "+ тСтр.СкладМОЕ.Наименование + " в избытке и в пополнение не нуждается");
        КонецЕсли
    ИначеЕсли тСтр.СкладОсновной = Справочники.Склады.НайтиПоНаименованию("Опасное Хранение (D)") И тСтр.ОстатокНаОсновномСкладе > тСтр.Нужно И тСтр.Галка = 1  Тогда // СКЛАД D
        Если тСтр.ОстатокНаОсновномСкладе < тСтр.Нужно Тогда
            Сообщить("На основном складе не хватает /"+ тСтр.Нужно - тСтр.ОстатокНаОсновномСкладе +"/ед. "+ тСтр.Номенклатура.Наименование );    
        ИначеЕсли тСтр.Нужно > 0 Тогда        
            НоваяСтрока = Объект[ПРав(тСтр.СкладМОЕ.Наименование,4)+"D"].Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСТрока, тСтр);
        Иначе
            Сообщить("Номенклатура "+ тСтр.Номенклатура.Наименование +" на складе "+ тСтр.СкладМОЕ.Наименование + " в избытке и в пополнение не нуждается");
        КонецЕсли
    КонецЕсли;    
КонецПроцедуры

Процедура СоздатьПеремещение();
    
    Массивчик = Новый Массив;
    Массивчик.Добавить("1A");
    Массивчик.Добавить("1B");
    Массивчик.Добавить("1C");
    Массивчик.Добавить("1D");
    Массивчик.Добавить("2A");
    Массивчик.Добавить("2B");
    Массивчик.Добавить("2C");
    Массивчик.Добавить("2D");
    Массивчик.Добавить("3A");
    Массивчик.Добавить("3B");
    Массивчик.Добавить("3C");
    Массивчик.Добавить("3D");
    
    
    Для каждого М из Массивчик Цикл
        
        Если Объект["MOE"+М].Количество() >0 Тогда
            
            ТЗ = Объект["MOE"+М].Выгрузить();
            
            Док = Документы.ПеремещениеТоваров.СоздатьДокумент();
            Док.Дата = ТекущаяДата();
            Док.СкладОтправитель = ТЗ[0].СкладОсновной;
            Док.СкладПолучатель = ТЗ[0].СкладМОЕ;
            Док.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН","6449074016");
            Док.Статус = Перечисления.СтатусыПеремещенийТоваров.КОтгрузке;
            Для Каждого Строка из ТЗ Цикл
                НоваяСтрока = Док.Товары.Добавить();
                НоваяСтрока.Номенклатура = Строка.Номенклатура;
                НоваяСтрока.КоличествоУпаковок = Строка.Нужно;
            КонецЦикла;
            
            Док.Записать(РежимЗаписиДокумента.Запись);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
18 Wefast
 
30.07.15
17:33
Не знаю почему так криво вставляется
19 Wefast
 
30.07.15
17:36
Так все работает как нужно, но эти 12 таблиц жутко раздражают. Постоянно какие то проблемы с ними.

В общем хотелось бы услышать предложения как все это можно улучшить было бы, на будущее
20 Euguln
 
30.07.15
17:44
мОбработка = РеквизитФормыВЗначение("Объект");
ТабличныеЧасти = мОбработка.Метаданные().ТабличныеЧасти;
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
  
   1. Объект[ТабличнаяЧасть.Имя].Очистить();
   2. ТЗ = Объект[ТабличнаяЧасть.Имя].Выгрузить();

КонецЦикла;

Как-то так.
21 фобка
 
31.07.15
08:47
(19) например, одна табличная часть с дополнительным полем идентификатором (имя из (0)) . Если нужно дополнительно визуальное отображение список на форме еще с именами из (0) и отборы тч при активации строки списка