8.х Итоги по списку документов.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем zayaroslava, 6 июн 2011.

  1. TopicStarter Overlay
    zayaroslava
    Offline

    zayaroslava Опытный в 1С

    Регистрация:
    27 янв 2010
    Сообщения:
    329
    Симпатии:
    1
    Баллы:
    26
    Подскажите решение задачи,необходимо в форме списка документов в подвалах выводить итоги по суммам,конкретно в документе заказы поставщикам.
    Нашел процедуру :

    Код:
    //Пример вызова в модуле формы списка (в событии списка)
    
    Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    ИтогиПоСпискуДокументов(Этаформа.ДокументСписок,Этаформа.ЭлементыФормы.ДокументСписок);			
    КонецПроцедуры
    
    //------------------------------------------------------
    
    
    
    
    Процедура  ИтогиПоСпискуДокументов(СписокРеквизит, СписокЭлементФормы) Экспорт 
    Если СписокЭлементФормы.Подвал = Истина <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    СтрокаОтбора = УправлениеОтчетами.СформироватьСтрокуОтборов(СписокРеквизит.Отбор);
    Поля = Новый Структура();
    мКолонки = СписокЭлементФормы.Колонки;
    СтрокаКолонок =""; 
    ТипПолеВвода = Тип("ПолеВвода");
    для каждого тКолонка из мКолонки Цикл
    Если ТипЗнч(тКолонка.ЭлементУправления) = ТипПолеВвода И тКолонка.Имя <> "Дата" И тКолонка.Имя <> "Номер" Тогда
    Поля.Вставить(тКолонка.Данные, тКолонка.Имя);
    КонецЕСли;
    КонецЦикла;	
    
    НачалоПериода    = СписокЭлементФормы.СтандартныйПериод.ДатаНачала;
    ОкончаниеПериода = СписокЭлементФормы.СтандартныйПериод.ДатаОкончания;
    НазваниеДока     = Метаданные.НайтиПоТипу(Тип(СписокЭлементФормы.Значение)).Имя;
    
    
    Запрос = Новый Запрос();
    
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	Документ.Номер,
    |	Документ.Дата,
    |	Документ.Ссылка КАК Документ,";
    
    Для Каждого Ключ Из Поля Цикл
    
    Если Ключ.Значение = Неопределено Тогда
    Запрос.Текст = Запрос.Текст + "	Документ." + Ключ.Ключ + "," + Символы.ПС;
    ИначеЕсли Ключ.Значение = "Отсутствует" Тогда
    Продолжить;
    Иначе
    Запрос.Текст = Запрос.Текст + "	Документ." + Ключ.Ключ +" КАК " + Ключ.Ключ + "," + Символы.ПС;
    КонецЕсли;
    
    КонецЦикла;
    
    Запрос.Текст = Лев(Запрос.Текст, СтрДлина(Запрос.Текст)-2) + Символы.ПС;
    
    Запрос.Текст = Запрос.Текст + 
    "ИЗ
    |	Документ." + НазваниеДока + " КАК Документ" + Символы.ПС;
    
    ТекстДляЗапроса = "";
    
    Для Каждого ЭлементОтбора из СписокРеквизит.Отбор Цикл
    
    Если НЕ ЭлементОтбора.Использование Тогда
    Продолжить;
    КонецЕсли;
    
    Тип = ЭлементОтбора.ВидСравнения;
    Если Тип = Неопределено тогда
    Продолжить;
    КонецЕсли;
    Если Строка(Тип) = "Интервал (>=, <=)" тогда
    
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "С" , ЭлементОтбора.ЗначениеС);
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "ПО", ЭлементОтбора.ЗначениеПо);
    
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса = ТекстДляЗапроса + " И " + Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса = ТекстДляЗапроса + "    Документ." + ЭлементОтбора.Имя + " МЕЖДУ &" + ЭлементОтбора.Имя + "С" + " И &" + ЭлементОтбора.Имя + "ПО"  + Символы.ПС;
    
    Иначе
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "Зн", ЭлементОтбора.Значение);
    
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса = ТекстДляЗапроса + "И " + Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса = ТекстДляЗапроса + "    Документ." + ЭлементОтбора.Имя +" "+ УправлениеОтчетами.ПолучитьВидСравненияСтрокой(Тип) + " &"+ ЭлементОтбора.Имя + "Зн" + Символы.ПС;
    
    КонецЕсли;
    
    КонецЦикла;
    
    Если ТекстДляЗапроса <> "" тогда
    Запрос.Текст = Запрос.Текст + "ГДЕ" + Символы.ПС + ТекстДляЗапроса;
    КонецЕсли;
    
    ТекстДляЗапроса= "";
    Для Каждого ЭлементПорядка из СписокРеквизит.Порядок Цикл
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса =  ТекстДляЗапроса  +  ", " +Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса= ТекстДляЗапроса + ЭлементПорядка.Имя+ " " + ?(Строка(ЭлементПорядка.Направление)="По возрастанию","ВОЗР","УБЫВ");
    КонецЦикла;
    
    Если ТекстДляЗапроса <> "" тогда
    Запрос.Текст = Запрос.Текст + "УПОРЯДОЧИТЬ ПО " + Символы.ПС + ТекстДляЗапроса;
    КонецЕсли;
    
    
    Шапка = Запрос.Выполнить().Выбрать();
    ТабИтог = Запрос.Выполнить().Выгрузить();
    
    
    Для Каждого Ключ Из Поля Цикл
    
    Колонка = Вычислить("СписокЭлементФормы.Колонки."+Ключ.Значение);
    Если Колонка.Видимость <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    Колонка.ЦветТекстаПодвала = ЦветаСтиля.ТекстИнформационнойНадписи;
    Колонка.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право;
    Колонка.ТекстПодвала = ЗаполнениеДокументов.ФорматСумм(ТабИтог.Итог(Ключ.Ключ));
    КонецЕсли;
    
    КонецЦикла;
    
    КонецЕсли;	
    КонецПроцедуры
    
    
    Но получаю ошибку :
    Метод объекта не обнаружен (ФорматСумм) //Может есть аналог в УПП ???

    Попробывал по другому считать суммы ...вот так :

    Код:
    
    Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    // Вставить содержимое обработчика.
    ИтогиПоСпискуДокументов(Этаформа.ДокументСписок,Этаформа.ЭлементыФормы.Список);
    КонецПроцедуры
    
    
    
    Код:
    Процедура  ИтогиПоСпискуДокументов(СписокРеквизит, СписокЭлементФормы) Экспорт 
    Если СписокЭлементФормы.Подвал = Истина <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    СтрокаОтбора = УправлениеОтчетами.СформироватьСтрокуОтборов(СписокРеквизит.Отбор);
    Поля = Новый Структура();
    мКолонки = СписокЭлементФормы.Колонки;
    СтрокаКолонок =""; 
    ТипПолеВвода = Тип("ПолеВвода");
    для каждого тКолонка из мКолонки Цикл
    Если ТипЗнч(тКолонка.ЭлементУправления) = ТипПолеВвода И тКолонка.Имя <> "Дата" И тКолонка.Имя <> "Номер" Тогда
    Поля.Вставить(тКолонка.Данные, тКолонка.Имя);
    КонецЕСли;
    КонецЦикла;	
    
    НачалоПериода    = СписокЭлементФормы.СтандартныйПериод.ДатаНачала;
    ОкончаниеПериода = СписокЭлементФормы.СтандартныйПериод.ДатаОкончания;
    НазваниеДока     = Метаданные.НайтиПоТипу(Тип(СписокЭлементФормы.Значение)).Имя;
    
    
    Запрос = Новый Запрос();
    
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	Документ.Номер,
    |	Документ.Дата,
    |	Документ.Ссылка КАК Документ,";
    
    Для Каждого Ключ Из Поля Цикл
    
    Если Ключ.Значение = Неопределено Тогда
    Запрос.Текст = Запрос.Текст + "	Документ." + Ключ.Ключ + "," + Символы.ПС;
    ИначеЕсли Ключ.Значение = "Отсутствует" Тогда
    Продолжить;
    Иначе
    Запрос.Текст = Запрос.Текст + "	Документ." + Ключ.Ключ +" КАК " + Ключ.Ключ + "," + Символы.ПС;
    КонецЕсли;
    
    КонецЦикла;
    
    Запрос.Текст = Лев(Запрос.Текст, СтрДлина(Запрос.Текст)-2) + Символы.ПС;
    
    Запрос.Текст = Запрос.Текст + 
    "ИЗ
    |	Документ." + НазваниеДока + " КАК Документ" + Символы.ПС;
    
    ТекстДляЗапроса = "";
    
    Для Каждого ЭлементОтбора из СписокРеквизит.Отбор Цикл
    
    Если НЕ ЭлементОтбора.Использование Тогда
    Продолжить;
    КонецЕсли;
    
    Тип = ЭлементОтбора.ВидСравнения;
    Если Тип = Неопределено тогда
    Продолжить;
    КонецЕсли;
    Если Строка(Тип) = "Интервал (>=, <=)" тогда
    
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "С" , ЭлементОтбора.ЗначениеС);
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "ПО", ЭлементОтбора.ЗначениеПо);
    
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса = ТекстДляЗапроса + " И " + Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса = ТекстДляЗапроса + "    Документ." + ЭлементОтбора.Имя + " МЕЖДУ &" + ЭлементОтбора.Имя + "С" + " И &" + ЭлементОтбора.Имя + "ПО"  + Символы.ПС;
    
    Иначе
    Запрос.УстановитьПараметр(ЭлементОтбора.Имя + "Зн", ЭлементОтбора.Значение);
    
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса = ТекстДляЗапроса + "И " + Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса = ТекстДляЗапроса + "    Документ." + ЭлементОтбора.Имя +" "+ ПолучитьВидСравненияСтрокой(Тип) + " &"+ ЭлементОтбора.Имя + "Зн" + Символы.ПС;
    
    КонецЕсли;
    
    КонецЦикла;
    
    Если ТекстДляЗапроса <> "" тогда
    Запрос.Текст = Запрос.Текст + "ГДЕ" + Символы.ПС + ТекстДляЗапроса;
    КонецЕсли;
    
    ТекстДляЗапроса= "";
    Для Каждого ЭлементПорядка из СписокРеквизит.Порядок Цикл
    Если ТекстДляЗапроса <> "" тогда
    ТекстДляЗапроса =  ТекстДляЗапроса  +  ", " +Символы.ПС;
    КонецЕсли;
    ТекстДляЗапроса= ТекстДляЗапроса + ЭлементПорядка.Имя+ " " + ?(Строка(ЭлементПорядка.Направление)="По возрастанию","ВОЗР","УБЫВ");
    КонецЦикла;
    
    Если ТекстДляЗапроса <> "" тогда
    Запрос.Текст = Запрос.Текст + "УПОРЯДОЧИТЬ ПО " + Символы.ПС + ТекстДляЗапроса;
    КонецЕсли;
    
    
    Шапка = Запрос.Выполнить().Выбрать();
    ТабИтог = Запрос.Выполнить().Выгрузить();
    
    
    Для Каждого Ключ Из Поля Цикл
    
    Колонка = Вычислить("СписокЭлементФормы.Колонки."+Ключ.Значение);
    Если Колонка.Видимость <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/тогда')">Тогда	</span>
    Колонка.ЦветТекстаПодвала = ЦветаСтиля.ТекстИнформационнойНадписи;
    Колонка.ГоризонтальноеПоложениеВПодвале = ГоризонтальноеПоложение.Право;
    Колонка.ТекстПодвала = ОбщегоНазначения.ФорматСумм(ТабИтог.Итог(Ключ.Ключ));
    КонецЕсли;
    
    КонецЦикла;
    
    КонецЕсли;	
    КонецПроцедуры
    
    
    Все работает и считает , НО когда делаю отбор и сортировку получается ошибка :

    {Справочник.Контрагенты.Форма.ФормаВыбора(11)}: Значение не является значением объектного типа (Пометка)
    Если мКнопкаПереключенияРежимов.Пометка Тогда

    и Итоги уже не правильно считаются....
    Так как же все таки правильно описать для УПП процедуры подсчета Итогов по суммам... ???
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    эээ....а не проще просто выводить с выводом в "подвал" реквизит документов "СуммаДокумента"? Отбор в этом случае работает....
  3. TopicStarter Overlay
    zayaroslava
    Offline

    zayaroslava Опытный в 1С

    Регистрация:
    27 янв 2010
    Сообщения:
    329
    Симпатии:
    1
    Баллы:
    26
    не совсем понял что вы имеете ввиду.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Прошу прощения, погорячился. Для динамических списков нет возможности вывода итогов в подвал.
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Функция "ФорматСумм" в УПП, выглядит так:

    Код:
    Функция ФорматСумм(Сумма, Валюта = Неопределено, ЧН = "", ЧРГ = "") Экспорт
    
    ФорматнаяСтрока = "ЧЦ=15;ЧДЦ=2" +
    ?(ПустаяСтрока(ЧН), "", ";" + "ЧН=" + ЧН) +
    ?(ПустаяСтрока(ЧРГ),"", ";" + "ЧРГ=" + ЧРГ);
    РезультирующаяСтрока = СокрЛ(Формат(Сумма, ФорматнаяСтрока));
    
    Если Валюта <> Неопределено Тогда
    РезультирующаяСтрока = РезультирующаяСтрока + " " + СокрП(Валюта);
    КонецЕсли;
    
    Возврат РезультирующаяСтрока;
    
    
    
    находится в общем модуле "ОбщегоНазначения"

Поделиться этой страницей