Имя: Пароль:
1C
1C 7.7
v7: ПоложениеКолонкиТаблицы при смене состава колонок
0 OnePrg
 
10.12.21
12:14
Если колонки создавать ПриОткрытии, а затем при обновлении формы вызывать     

РФорма = СоздатьОбъект("РасширениеФормы");
РФорма.ПоложениеКолонкиТаблицы("тбТовары", 2,2);

то всё работает.

При установке галочки на форме требуется поменять положение колонок.

В начале процедуры Сформировать() добавить код

    тбТовары.УдалитьСтроки();
    
    Пока тбТовары.КоличествоКолонок()<>0 Цикл
        тбТовары.УдалитьКолонку(1);
    КонецЦикла;
    
    Если ПолнаяВедомость = 1 Тогда      
        
        тбТовары.НоваяКолонка("Цвет","Строка");
        тбТовары.ВидимостьКолонки("Цвет",0);
        тбТовары.НоваяКолонка("Товар",,,,,50);
        тбТовары.НоваяКолонка("СуммаНачИнв","Число",12,2,,10);
        .....
        Для инд = 2 по тбТовары.КоличествоКолонок() Цикл
            ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
            тбТовары.ВидимостьКолонки(ИмяКолонки,1);
        КонецЦикла;
    Иначе

        тбТовары.НоваяКолонка("Цвет","Строка");
        тбТовары.ВидимостьКолонки("Цвет",0);
        тбТовары.НоваяКолонка("Товар",,,,,50);
        тбТовары.НоваяКолонка("КвоНач","Число",12,0,,10);
                ...
        Для инд = 2 по тбТовары.КоличествоКолонок() Цикл
            ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
            Если (Найти(ИмяКолонки,"Инв") <> 0) или
                 (Найти(ИмяКолонки,"Приход") <> 0) или
                 (Найти(ИмяКолонки,"Расход") <> 0) Тогда
                тбТовары.ВидимостьКолонки(ИмяКолонки,0);
            КонецЕсли;
        КонецЦикла;
        тбТовары.ВидимостьКолонки("КвоПрод",0);
    КонецЕсли;


Процедура при обновлении формы теперь выглядит так

    РФорма = СоздатьОбъект("РасширениеФормы");
    Если ПолнаяВедомость = 1 Тогда
        РФорма.ПоложениеКолонкиТаблицы("тбТовары", 2,2);
                ...
    Иначе
        РФорма.ПоложениеКолонкиТаблицы("тбТовары", 2,1);
                ...
    КонецЕсли;


При открытии обработка заполняется при ПолнаяВедомость = 1, но при смене флажка ПолнаяВедомость = 0 1С-ка просто вылетает.

Как можно всё-таки и порядок колонок поменять и оставить ПоложениеКолонкиТаблицы?
1 Ёпрст
 
10.12.21
12:16
Положение колонки можно менять и без формекса
2 OnePrg
 
10.12.21
12:18
(1) Как?
3 OnePrg
 
10.12.21
12:20
(0) Вру: 1С-ка не вылетает, но таблица при этом пустая. В процедуру Сформировать не попадает

http://imagizer.imageshack.com/img922/163/eaLimz.jpg
4 Ёпрст
 
10.12.21
12:22
(2) Спросить у мужика в кепке описание метода ВидимостьКолонки
5 Ёпрст
 
10.12.21
12:25
Если тебе нужно менять свойство Положение, как у ТЧ ..типа На следующей строке/в той же колонке, то только тогда нужен метод
ПоложениеКолонкиТаблицы
6 Ёпрст
 
10.12.21
12:25
И больше кода
7 АгентБезопасной Нацио
 
10.12.21
12:28
(4) ну кто ж спрашивает у мужика в кепке, если можно сразу на форуме...
8 OnePrg
 
10.12.21
12:29
(5) именно это мне и нужно, а не просто видимость
9 Ёпрст
 
10.12.21
12:30
(8) тогда больше кода
10 OnePrg
 
10.12.21
12:36
(9)

Перем Инв, ПредИнв;

//*******************************************
Функция ТекстЗапросаПредИнв()
    Возврат
    "SELECT
    |    $ДокС.Товар as Товар,
    |    $ДокС.ИнвСтоимость as СуммаНачИнв,  
    |    $ДокС.ИнвКоличество as КвоНачИнв,  
    |    0 as СуммаНач,  
    |    0 as КвоНач,  
    |    0 as СуммаПриход,  
    |    0 as КвоПриход,  
    |    0 as СуммаРасход,  
    |    0 as КвоРасход,  
    |    0 as СуммаПрод,  
    |    0 as КвоПрод,  
    |    0 as СуммаКон,  
    |    0 as КвоКон,  
    |    0 as СуммаИнв,  
    |    0 as КвоИнв  
    |FROM
    |    $ДокументСтроки.Инвентаризация as ДокС
    |INNER JOIN
    |    $Документ.Инвентаризация as Док ON Док.IDDoc = ДокС.IDDoc
    |WHERE
    |   Док.IDDoc = :ПредИнв";
КонецФункции

//*******************************************
Функция ТекстЗапросаИнв()
    Возврат
    "SELECT
    |    $ДокС.Товар as Товар,
    |    0 as СуммаНачИнв,  
    |    0 as КвоНачИнв,  
    |    0 as СуммаНач,  
    |    0 as КвоНач,  
    |    0 as СуммаПриход,  
    |    0 as КвоПриход,  
    |    0 as СуммаРасход,  
    |    0 as КвоРасход,  
    |    0 as СуммаПрод,  
    |    0 as КвоПрод,  
    |    0 as СуммаКон,  
    |    0 as КвоКон,  
    |    $ДокС.ИнвСтоимость as СуммаИнв,  
    |    $ДокС.ИнвКоличество as КвоИнв  
    |FROM
    |    $ДокументСтроки.Инвентаризация as ДокС
    |INNER JOIN
    |    $Документ.Инвентаризация as Док ON Док.IDDoc = ДокС.IDDoc
    |WHERE
    |   Док.IDDoc = :Инв";
КонецФункции


//*******************************************
Функция ТекстЗапросаОбороты()
    Возврат
    "SELECT
    |    Рег.Товар,
    |    0 as СуммаНачИнв,  
    |    0 as КвоНачИнв,  
    |    Рег.ПродСтоимостьНачальныйОстаток as СуммаНач,  
    |    Рег.ОстатокТовараНачальныйОстаток  as КвоНач,  
    |    Рег.ПродСтоимостьПриход as СуммаПриход,  
    |    Рег.ОстатокТовараПриход as КвоПриход,  
    |    0 as СуммаРасход,  
    |    0 as КвоРасход,  
    |    0 as СуммаПрод,  
    |    0 as КвоПрод,  
    |    Рег.ПродСтоимостьКонечныйОстаток as СуммаКон,  
    |    Рег.ОстатокТовараКонечныйОстаток as КвоКон,  
    |    0 as СуммаИнв,  
    |    0 as КвоИнв  
    |FROM
    |    $РегистрОстаткиОбороты.ПартииТоваров(:ДатаНач,:ДатаКон~,,,,
    |                               Склад = :ВыбСклад,
    |                               (Товар), (ОстатокТовара,ПродСтоимость)) as Рег
    |
    |UNION ALL
    |
    |SELECT
    |    Рег2.Товар,
    |    0 as СуммаНачИнв,  
    |    0 as КвоНачИнв,  
    |    0 as СуммаНач,  
    |    0  as КвоНач,  
    |    0 as СуммаПриход,  
    |    0 as КвоПриход,  
    |    Рег2.ПродСтоимостьРасход as СуммаРасход,  
    |    Рег2.ОстатокТовараРасход as КвоРасход,  
    |    0 as СуммаПрод,  
    |    0 as КвоПрод,  
    |    0 as СуммаКон,  
    |    0 as КвоКон,  
    |    0 as СуммаИнв,  
    |    0 as КвоИнв  
    |FROM
    |    $РегистрОбороты.ПартииТоваров(:ДатаНач,:ДатаКон~,Документ,,
    |                               Склад = :ВыбСклад,
    |                               (Товар), (ОстатокТовара,ПродСтоимость)) as Рег2
    |WHERE
    |    Рег2.ВидДокумента <> $ВидДокумента.КассаЧек
    |    AND Рег2.ВидДокумента <> $ВидДокумента.РасходнаяРозничная
    |
    |UNION ALL
    |
    |SELECT
    |    Рег2.Товар,
    |    0 as СуммаНачИнв,  
    |    0 as КвоНачИнв,  
    |    0 as СуммаНач,  
    |    0  as КвоНач,  
    |    0 as СуммаПриход,  
    |    0 as КвоПриход,  
    |    0 as СуммаРасход,  
    |    0 as КвоРасход,  
    |    Рег2.ПродСтоимостьРасход as СуммаПрод,  
    |    Рег2.ОстатокТовараРасход as КвоПрод,  
    |    0 as СуммаКон,  
    |    0 as КвоКон,  
    |    0 as СуммаИнв,  
    |    0 as КвоИнв  
    |FROM
    |    $РегистрОбороты.ПартииТоваров(:ДатаНач,:ДатаКон~,Документ,,
    |                               Склад = :ВыбСклад,
    |                               (Товар), (ОстатокТовара,ПродСтоимость)) as Рег2
    |WHERE
    |    Рег2.ВидДокумента = $ВидДокумента.КассаЧек
    |    OR Рег2.ВидДокумента = $ВидДокумента.РасходнаяРозничная";
КонецФункции
                                                  

//*******************************************
Процедура НастроитьТбТовары()

    тбТовары.УдалитьСтроки();
    
    Пока тбТовары.КоличествоКолонок()<>2 Цикл
        тбТовары.УдалитьКолонку(1);
    КонецЦикла;
    
    Если ПолнаяВедомость = 1 Тогда      
        
        тбТовары.НоваяКолонка("СуммаНачИнв","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоНачИнв","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаНач","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоНач","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаПриход","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоПриход","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаРасход","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоРасход","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаПрод","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоПрод","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаКон","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоКон","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаИнв","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоИнв","Число",12,0,,10);    
        тбТовары.НоваяКолонка("Ошибки");      
        
        Для инд = 2 по тбТовары.КоличествоКолонок() Цикл
            ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
            тбТовары.ВидимостьКолонки(ИмяКолонки,1);
        КонецЦикла;
    Иначе


        тбТовары.НоваяКолонка("КвоНач","Число",12,0,,10);
        тбТовары.НоваяКолонка("КвоКон","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаНач","Число",12,2,,10);
        тбТовары.НоваяКолонка("СуммаКон","Число",12,2,,10);
        тбТовары.НоваяКолонка("СуммаПрод","Число",12,2,,10);
        тбТовары.НоваяКолонка("СуммаНачИнв","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоНачИнв","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаПриход","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоПриход","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаРасход","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоРасход","Число",12,0,,10);
        тбТовары.НоваяКолонка("КвоПрод","Число",12,0,,10);
        тбТовары.НоваяКолонка("СуммаИнв","Число",12,2,,10);
        тбТовары.НоваяКолонка("КвоИнв","Число",12,0,,10);    
        тбТовары.НоваяКолонка("Ошибки");      

        Для инд = 2 по тбТовары.КоличествоКолонок() Цикл
            ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
            Если (Найти(ИмяКолонки,"Инв") <> 0) или
                 (Найти(ИмяКолонки,"Приход") <> 0) или
                 (Найти(ИмяКолонки,"Расход") <> 0) Тогда
                тбТовары.ВидимостьКолонки(ИмяКолонки,0);
            КонецЕсли;
        КонецЦикла;
        тбТовары.ВидимостьКолонки("КвоПрод",0);
    КонецЕсли;
    
    тбТовары.Фиксировать(0,0);        
    
КонецПроцедуры


//*******************************************
Процедура Сформировать(ТолькоОшибки = 0)
    
    НастроитьТбТовары();
    
    RS = СоздатьОбъект("ODBCRecordset");
    
    ТекстЗапроса = "
    |SELECT
    |    Д.Товар as [Товар $Справочник.Номенклатура],
    |    SUM(Д.СуммаНачИнв) as СуммаНачИнв,  
    |    SUM(Д.КвоНачИнв) as КвоНачИнв,    
    |    SUM(Д.СуммаНач) as СуммаНач,    
    |    SUM(Д.КвоНач) as КвоНач,    
    |    SUM(Д.СуммаПриход) as СуммаПриход,    
    |    SUM(Д.КвоПриход) as КвоПриход,    
    |    SUM(Д.СуммаРасход) as СуммаРасход,    
    |    SUM(Д.КвоРасход) as КвоРасход,    
    |    SUM(Д.СуммаПрод) as СуммаПрод,    
    |    SUM(Д.КвоПрод) as КвоПрод,    
    |    SUM(Д.СуммаКон) as СуммаКон,    
    |    SUM(Д.КвоКон) as КвоКон,    
    |    SUM(Д.СуммаИнв) as СуммаИнв,    
    |    SUM(Д.КвоИнв) as КвоИнв
    |FROM ("+
    ТекстЗапросаПредИнв()+"
    |
    |UNION ALL
    |"+
    ТекстЗапросаОбороты()+"
    |
    |UNION ALL
    |"+
    ТекстЗапросаИнв()+") as Д
    |GROUP BY
    |   Товар"+?(ТолькоОшибки=1,"
    |HAVING
    |      (SUM(Д.СуммаНачИнв)<>SUM(Д.СуммаНач) OR SUM(Д.КвоНачИнв)<>SUM(Д.КвоНач))
    |   OR (SUM(Д.СуммаИнв)<>SUM(Д.СуммаКон) OR SUM(Д.КвоИнв)<>SUM(Д.КвоКон))","")
    ;

    RS.УстановитьТекстовыйПараметр("ПредИнв", ПредИнв);
    RS.УстановитьТекстовыйПараметр("Инв",     Инв.ТекущийДокумент());
    RS.УстановитьТекстовыйПараметр("ДатаНач", ПредИнв.ДатаДок+1);
    RS.УстановитьТекстовыйПараметр("ДатаКон", Инв.ДатаДок);
    RS.УстановитьТекстовыйПараметр("ВыбСклад",Инв.Склад);
    //RS.Отладка(1);                                
    //Сообщить("*********************************************");
    //Сообщить(ТекстЗапроса);
    //Сообщить("*********************************************");
    тб = RS.ВыполнитьИнструкцию(ТекстЗапроса);
    тб.Свернуть("Товар","СуммаНачИнв,КвоНачИнв,СуммаНач,КвоНач,СуммаПриход,КвоПриход,СуммаРасход,КвоРасход,СуммаПрод,КвоПрод,СуммаКон,КвоКон,СуммаИнв,КвоИнв");  
    тб.Сортировать("Товар");  
    тб.НоваяКолонка("Ошибки");  
    
    тб.ВыбратьСтроки();
    Пока тб.ПолучитьСтроку()=1 Цикл
        Ошибки = "";
        Если (тб.СуммаНачИнв <> тб.СуммаНач) или
             (тб.КвоНачИнв <> тб.КвоНач) Тогда
                 Ошибки = "начальный остаток не сходится с пред. инвентаризацией";
        КонецЕсли;
        Если (тб.СуммаИнв <> тб.СуммаКон) или
             (тб.КвоИнв <> тб.КвоКон) Тогда
                 Если Ошибки = "" Тогда
                     Ошибки = "конечный остаток не сходится с инвентаризацией";
                 Иначе
                     Ошибки = Ошибки + "
                     |конечный остаток не сходится с инвентаризацией";
                 КонецЕсли;
        КонецЕсли;  
        тб.Ошибки = Ошибки;          
    КонецЕсли;    
                              
    Если ТолькоОшибки=1 Тогда
        
    КонецЕсли;
    
    тбТовары.НоваяСтрока();
    тбТовары.Товар       = "ВСЕГО:";
    Для инд = 3 по тбТовары.КоличествоКолонок()-1 Цикл
        ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
        тбТовары.УстановитьЗначение(тбТовары.НомерСтроки,ИмяКолонки,тб.Итог(ИмяКолонки));
    КонецЦикла;
    
    тб.ВыбратьСтроки();
    Пока тб.ПолучитьСтроку()=1 Цикл
        тбТовары.НоваяСтрока();
        Для инд = 2 по тбТовары.КоличествоКолонок()-1 Цикл
            ИмяКолонки = тбТовары.ПолучитьПараметрыКолонки(инд);
            Зн = тб.ПолучитьЗначение(тб.НомерСтроки,ИмяКолонки);
            тбТовары.УстановитьЗначение(тбТовары.НомерСтроки,ИмяКолонки,Зн);
        КонецЦикла;
            
        Если тбТовары.Ошибки <>  "" Тогда
            тбТовары.Цвет = "BRUSH[0xECB5FF]";
        КонецЕсли;
    КонецЦикла;

    тбТовары.Фиксировать(1,0);
    
КонецПроцедуры                  

//*******************************************
Функция ПриОбновленииФормы()
    РФорма = СоздатьОбъект("РасширениеФормы");
    Если ПолнаяВедомость = 1 Тогда
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 2,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 4,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 6,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 8,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",10,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",12,2);    
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",14,2);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",16,2);    
    //Иначе
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 2,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 4,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 6,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары", 8,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",10,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",12,1);    
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",14,1);
    //    РФорма.ПоложениеКолонкиТаблицы("тбТовары",16,1);    
    КонецЕсли;
КонецФункции


//*******************************************
Процедура ПриОткрытии()                        

    тбТовары.НоваяКолонка("Цвет","Строка");
    тбТовары.ВидимостьКолонки("Цвет",0);
    тбТовары.НоваяКолонка("Товар",,,,,50);
    
    Инв = Форма.Параметр;

    ДокИнв = СоздатьОбъект("Документ.Инвентаризация");
    ДокИнв.УстановитьФильтр();
    ДокИнв.ОбратныйПорядок(1);
    ДокИнв.ВыбратьДокументы(,Инв.ДатаДок-1);
    Пока ДокИнв.ПолучитьДокумент() = 1 Цикл
        Если ДокИнв.Склад = Инв.Склад Тогда
            ПредИнв = ДокИнв.ТекущийДокумент();
            Прервать;
        КонецЕсли;
    КонецЦикла;
                    
    Если ПустоеЗначение(ПредИнв) = 1 Тогда
        Сообщить("Не найдена предыдущая инвентаризация","!!!");
        Форма.Закрыть();
    КонецЕсли;
    
    Сформировать();
    
КонецПроцедуры
11 Ёпрст
 
10.12.21
12:57
(10) да уж..
1.Текст запроса нужно переписать
Или достать всё сразу c ВТ ОстанкиИОбороты с периодичностью Документ, или хотя бы использовать одну ВТ Остатки + одну ВТ Обороты с периодичностью Документ + открыть для себя Case
2. Открыть для себя методы работы с ТЗ, такие как Заполнить и Очистить.
3.ПоложениеКолонки нужно задавать в ПослеОткрытияФормы, а не в ПриОткрытии, обычно, все методы формекса связанные с формой, нужно делать , когда форма уже открыта
12 Ёпрст
 
10.12.21
12:59
вот это условие, нужно переписать, так форма не закроется, а оператор сформировать будет выполнен

Если ПустоеЗначение(ПредИнв) = 1 Тогда
//        Сообщить("Не найдена предыдущая инвентаризация","!!!");
  //      Форма.Закрыть();
         СтатусВозврата=0;
         Возврат;
    КонецЕсли;
13 Ёпрст
 
10.12.21
13:00
ДокИнв.УстановитьФильтр();//тут нет фильтра, нафига написал ?
14 Злопчинский
 
10.12.21
13:01
(0)  тбТовары.УдалитьСтроки();
    
    Пока тбТовары.КоличествоКолонок()<>0 Цикл
        тбТовары.УдалитьКолонку(1);
    КонецЦикла;
.
тбТовары.Очистить();
15 Злопчинский
 
10.12.21
13:01
хотя Епрст уже все сказал...
16 Ёпрст
 
10.12.21
13:02
И
4.Если колонки задаются в запросе, то достаточно Выгрузить ТЗ полученную из запроса  в ТЗ на форму и добавить колонку расскраски.
17 Kigo_Kigo
 
10.12.21
13:07
Удалить строки и колонки
есть же тупо
Очистить()
18 Kigo_Kigo
 
10.12.21
13:07
А Злоп опередил
19 OnePrg
 
10.12.21
13:17
(12) спасибо
20 Kigo_Kigo
 
10.12.21
13:20
(12)
А не
// СтатусВозврата=0;
      
СтатусВозврата(0);
         Возврат;

? ))))
21 OnePrg
 
10.12.21
13:25
(11)

ПоложениеКолонкиТаблицы сейчас находится при обновлении формы, при открытии всё работает.
Затем на форме меняется флажок ПолнаяВедомость = 1 и таблица пустая

http://imagizer.imageshack.com/img922/163/eaLimz.jpg
22 OnePrg
 
10.12.21
13:26
Все спасибо.
Всё заработало. Видать дело было не в ПоложениеКолонкиТаблицы.
23 OnePrg
 
10.12.21
13:32
(16) в этом случает ругается, что недоступно для записи
24 Arbuz
 
10.12.21
16:41
(12) и, ещё, зачем ты джоинишь таблицы, поля которых не используешь в запросе?
25 Злопчинский
 
10.12.21
17:38
(22) дело в прокладке было!
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.