Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=20475)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Помогите произвести подсчет в табличной части

Автор: kosalex 29.10.14, 12:59

Есть табличная часть РС. на этой же форме есть ТЗ в которую должно заноситься номенклатура и количество этой номенклатуры в списке на форме. К примеру пользователь установил отбор, в форме списка вывелись строки, нужно посчитать сколько строк вывелось и с какой номенклатурой.

пишу вот так:
Пример1:

//Процедура РегистрСведенийСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    ТЧИнформация.Очистить();
    СтрокаТЧ = ТЧИнформация.Добавить();
    СтрокаТЧ.Номенклатура = ОформленияСтрок[0].ДанныеСтроки.НоменклатураПрибытие;
    СтрокаТЧ.Количество = 1;
    ТЧИнформация.Свернуть("Номенклатура","Количество");

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

Пример2:
Процедура РегистрСведенийСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    //ТЧИнформация.Очистить();
    СтрокаТЧ = ТЧИнформация.Добавить();
    СтрокаТЧ.Номенклатура = ДанныеСтроки.НоменклатураПрибытие;
    СтрокаТЧ.Количество = 1;
    ТЧИнформация.Свернуть("Номенклатура","Количество");

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



При открытии формы, вроде бы заносится и считается, НО заносится и считается часть данных, после того как крутишь скроллингом, подсчитываются и остальные.

Как сделать?


Автор: TipsyKID 29.10.14, 13:45

Думаю Вы имеете ввиду вот это : http://pro1c.org.ua/redirect.php?http://kb.mista.ru/article.php?id=471

Автор: kosalex 03.11.14, 12:55

Цитата(TipsyKID @ 29.10.14, 13:45) http://pro1c.org.ua/index.php?act=findpost&pid=92648


Да мне нужно это! Пишу через постоитель запросов, вот код:
Процедура РегистрСведенийСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Источник = Элемент.Значение;
    //Запрос = Новый Запрос;
    ОтборСтрок = Элемент.Значение.Отбор;
        
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
    
    
    // Добавляются необходимые отборы, такие же как в отборы в табличной части.
    Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
        Если ЭлементОтбора.Использование Тогда
            НовыйОтбор = ПостроительЗапроса.Отбор;
            НовыйОтбор.Добавить(ЭлементОтбора.Имя); // ОШИБКА НЕ УДАЕТСЯ ДОБАВИТЬ!
            НовыйОтбор.Использование = Истина;
            НовыйОтбор.ВидСравнения = ЭлементОтбора.ВидСравнения; // нужный вид сравнения
            НовыйОтбор.ЗначениеС = ЭлементОтбора.ЗначениеС;
            НовыйОтбор.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
            НовыйОтбор.Значение = ЭлементОтбора.Значение;
        КонецЕсли;
        
    КонецЦикла;

ПостроительЗапроса.Выполнить ();

Результат = ПостроительЗапроса.Результат.Выгрузить(); // отобранные строки типа РезультатЗапроса

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

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


Как передать отбор с формы списка в отбор построителя запроса?


Описание ошибки:
{РегистрСведений.ПростойВагона.Форма.ФормаСписка.Форма(486)}: Ошибка при вызове метода контекста (Добавить)
НовыйОтбор.Добавить(ЭлементОтбора.Имя);
по причине:
Недопустимое значение параметра (параметр номер '1')



с отбором разобрался, код ниже. Все добавляется. Вопрос другой)) Как в построитель запроса добавить поле со значением "1" - число?
И ещё там где ВидСравнения, ошибка, не могу установить вид сравнения такой как выбран на форме. Почему?

Процедура РегистрСведенийСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Источник = Элемент.Значение;
    ОтборСтрок = Элемент.Значение.Отбор;
    
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
    ПостроительЗапроса.ДоступныеПоля.Добавить("КоличествоВагонов",,,);
    ПостроительЗапроса.ДоступныеПоля.КоличествоВагонов = 1;
    
    Для Каждого НастройкаОтбора Из ПостроительЗапроса.ДоступныеПоля Цикл
        НастройкаОтбора.Отбор = Истина;
    КонецЦикла;
    
    // Добавляются необходимые отборы, такие же как в отборы в табличной части.
    Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
        Если ЭлементОтбора.Использование Тогда
            //Есть = Истина;
            НовыйОтбор = ПостроительЗапроса.Отбор;
            НовыйОтбор.Добавить(Строка(ЭлементОтбора.Имя));
            НовыйОтбор[ЭлементОтбора.Имя].Использование = Истина;
            НовыйОтбор[ЭлементОтбора.Имя].ВидСравнения = ЭлементОтбора.ВидСравнения; // нужный вид сравнения
            НовыйОтбор[ЭлементОтбора.Имя].ЗначениеС = ЭлементОтбора.ЗначениеС;
            НовыйОтбор[ЭлементОтбора.Имя].ЗначениеПо = ЭлементОтбора.ЗначениеПо;
            НовыйОтбор[ЭлементОтбора.Имя].Значение = ЭлементОтбора.Значение;
        КонецЕсли;
    КонецЦикла;
    

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


Автор: alex040269 03.11.14, 13:35

Цитата(kosalex @ 03.11.14, 13:55) *
Как в построитель запроса добавить поле со значением "1" - число?



ПостроительЗапроса = Новый ПостроительЗапроса;
НовыйОтбор = ПостроительЗапроса.Отбор;
НовыйОтбор.Добавить(Строка(ЭлементОтбора.Имя));
НовыйОтбор[ЭлементОтбора.Имя].Использование = Истина;
НовыйОтбор[ЭлементОтбора.Имя].Значение = 1;
НовыйОтбор[ЭлементОтбора.Имя].Использование = Истина;

Автор: kosalex 03.11.14, 14:16

Цитата(alex040269 @ 03.11.14, 13:35) *
ПостроительЗапроса = Новый ПостроительЗапроса;
НовыйОтбор = ПостроительЗапроса.Отбор;
НовыйОтбор.Добавить(Строка(ЭлементОтбора.Имя));
НовыйОтбор[ЭлементОтбора.Имя].Использование = Истина;
НовыйОтбор[ЭлементОтбора.Имя].Значение = 1;
НовыйОтбор[ЭлементОтбора.Имя].Использование = Истина;



Вы меня не поняли. Нужно добавить поле не в отбор а в сам построитель и заполнить это добавленное поле, значение 1

Второй вопрос, это как передать ВидСравнения в построитель запроса из Отбора в форме списка ?

Что хотел:
Из РегистраСведенийСписок по установленному отбору, читать записи и добавлять в ТЗ.

Вот код:
Процедура РегистрСведенийСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Источник = Элемент.Значение;
    ОтборСтрок = Элемент.Значение.Отбор;
    
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
        
    Для Каждого НастройкаОтбора Из ПостроительЗапроса.ДоступныеПоля Цикл
        НастройкаОтбора.Отбор = Истина;
    КонецЦикла;
    
    
    // Добавляются необходимые отборы, такие же как в отборы в табличной части.
    ОтборЗапроса = ПостроительЗапроса.Отбор;
    ОтборЗапроса.Сбросить();
    Для Каждого ЭлементОтбора Из ОтборСтрок Цикл
        Если ЭлементОтбора.Использование Тогда
            
        НовыйОтбор = ОтборЗапроса.Добавить(Строка(ЭлементОтбора.Имя));
    
        КонецЕсли;
    КонецЦикла;

    ПостроительЗапроса.Выполнить ();
    
    Результат = ПостроительЗапроса.Результат.Выгрузить(); // отобранные строки типа РезультатЗапроса
    
    Если ЗначениеЗаполнено(Результат) Тогда
        ТабличноеПолеИнформация = Результат;
        ТабличноеПолеИнформация.Колонки.Добавить("КоличествоВагонов",,"Количество вагонов",);
        
//Вот тут, подскажите как добавить это поле КоличествоВагонов в построитель запросов со значением "1", чтобы потом в цикле не проставлять эту "1"???
Для каждого Строка Из ТабличноеПолеИнформация Цикл
            Строка.КоличествоВагонов = 1;    
        КонецЦикла;

        ТабличноеПолеИнформация.Свернуть("НоменклатураПрибытие","ВесПоПрибытию, КоличествоВагонов");
    КонецЕсли;
    
    
КонецПроцедуры

Автор: alex040269 03.11.14, 14:22

тогда после ВЫБРАТЬ вставить текст

Цитата
1 КАК Поле

ПостроительЗапроса.Запрос.Текст = ....
или
Запрос = ПостроительЗапроса.ПолучитьЗапрос();
Запрос.Текст = ....
Запрос.Выполнить()

Автор: kosalex 03.11.14, 14:24

Цитата(alex040269 @ 03.11.14, 14:22) *
тогда после ВЫБРАТЬ вставить текст
ПостроительЗапроса.Запрос.Текст = ....
или
Запрос = ПостроительЗапроса.ПолучитьЗапрос();
Запрос.Текст = ....
Запрос.Выполнить()


Угу, спасибо smile.gif


Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua