8.х Сумма выбранных значений из столбца в документе.

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Addm, 12 дек 2012.

  1. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте! Как можно реализовать суммирование нужных по условию значений из столбца в документе и помещение этой суммы в поле ввода на форме.
    Если сделать подвал и отображение в нём итогов, то показывается вся сумма.
    Посмотреть вложение 13284
    Я представляю через, например,
    Код:
    Пока Найти(ЭлементыФормы.МоёТП.ТекущиеДанные, "Свердл")
    ...
    а дальше не вижу как "сказать" 1С что бы она суммировала эти строки, где найдёт "Свердл" и вставила в поле ввода на форме.

    Вложения:

    • 123.JPG
      123.JPG
      Размер файла:
      52 КБ
      Просмотров:
      31
  2. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    в принципе можно сделать так...
    Код:
    тз = ЭлементыФормы.ВашаТП.Выгрузить();
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Сумма(Таб.Значение) КАК Сум,
    |Таб.Область
    |ИЗ
    |&Таб КАК Таб
    |ГДЕ
    |Таб.Область Подобно "Свердл%"
    |СГРУППИРОВАТЬ ПО
    |Таб.Область";
    Запрос.УстановитьПараметр("Таб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.ВашеПоле = тз[0].Сум;
    работоспособность проверить надо...
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Как-то так:
    Код:
    Функция ПолучитьСумму(Область)
    Результат = 0;
    
    Отбор = Новый Структура;
    Отбор.Вставить("Наименование", Область);
    ТЗВременная = МоеТП.Скопировать(Отбор, "СуммаОплаты");
    Если ТЗВременная.Количество() > 0 Тогда
    ТЗВременная.Свернуть(,"СуммаОплаты");
    Результат = ТЗВременная[0].СуммаОплаты;
    КонецЕсли;
    ТЗВременная = Неопределено;
    
    Возврат Результат;
    КонецФункции
    Upd:
    Если там табличная часть Скопировать() на Выгрузить() замените.
  4. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    пишет следующие ошибки:
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(10,23)}: Ожидается символ ';'
    |Таб.Область Подобно "<<?>>Свердл%"
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(10,29)}: Неопознанный оператор
    |Таб.Область Подобно "Свердл<<?>>%"
    
    Что означает символ "|", комментирование?
  5. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    "|" - это когда вы в коде запрос размещаете на нескольких строках, каждая строка с него начинается.

    покажите весь ваш код, а то что-то меня вот эта конструкция напрягает немнога
    Код:
    |Таб.Область Подобно "Свердл<>%"
  6. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Код:
    Функция РасчётСуммы()
    тз = ЭлементыФормы.ИнтернетнаФ.Выгрузить();
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Сумма(Таб.Значение) КАК Сум,
    |Таб.Область
    |ИЗ
    |&Таб КАК Таб
    |ГДЕ
    |Таб.Область Подобно "Свердл%"
    |СГРУППИРОВАТЬ ПО
    |Таб.Область";
    Запрос.УстановитьПараметр("Таб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
    КонецФункции
    
    вот как и у вас, только ТП своё добавил и поле вывода.
  7. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а поля в запросе свои кто будет добавлять?

    я за сам запрос не ручаюсь, вам надо его открыть в конструкторе и сделать его рабочим, я же его, что говорится, на коленке делала
  8. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Таб.Значение имеется ввиду Значение табличного поля или это предопределенный синтаксис? Т.е., например, Таб.Значение = ИнтернетнаФ(ТП).Сумма(поле ввода ТП)?
  9. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Таб.Значение - это поле вашего тз, которую вы передадите в запрос. Вы запрос делали когда либо? это же тоже самое, что с обычной таблицей работать, только вы ее загрузите как параметр
  10. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Если Таб.Значение - это поле вашего тз, т.е., например, СуммаОплаты, тогда Таб - это само Табличное поле или тоже поле которое я передаю в запрос?
    Да, дела. В SQL проще всё это/удобней, а тут правила написания синтаксиса и запросов путают меня.
  11. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    внутри запроса у меня Таб - это просто название параметра (таблицы) не так все сложно, может я вас запутала малость...
  12. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Ага, потому что я сейчас уже наткнулся на то что надо временную таблицу для этих действий.
    Попробовал такой код:
    Код:
    Процедура ИнтернетнаФСуммаОплатыПриИзменении(Элемент)
    тз = ИнтернетнаФ.Выгрузить();
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Сумма(Таб.СуммаОплаты) КАК Сум,
    |Таб.Наименование
    |ИЗ
    |&Таб КАК Таб
    |ГДЕ
    |Таб.Наименование Подобно ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    |Таб.Наименование";
    Запрос.УстановитьПараметр("Таб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
    КонецПроцедуры
    
    в ответ получаю:
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(33)}: Ошибка при вызове метода контекста (Выполнить): Содержимое объекта данных может быть выбрано только во временную таблицу
    тз = Запрос.Выполнить().Выгрузить();
    по причине:
    Содержимое объекта данных может быть выбрано только во временную таблицу
    
  13. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    Код:
    "Выбрать
    |Таб.СуммаОплаты КАК Сум,
    |Таб.Наименование
    |ПОМЕСТИТЬ врТаб
    |ИЗ
    |&Таб КАК Таб;
    |///////////////
    |ВЫБРАТЬ
    |Сумма(врТаб.Сум) КАК Сум,
    |врТаб.Наименование
    |ИЗ
    |врТаб
    |ГДЕ
    |врТаб.Наименование Подобно ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    |врТаб.Наименование";
  14. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Если так, то:
    (я изменил значение "тз" на "ТекущиеДанные", т.е. он ругался на
    Код:
    тз = ЭлементыФормы.ИнтернетнаФ.Выгрузить();
    в самом начале выполнения процедуры)
    Код:
    тз = ЭлементыФормы.ИнтернетнаФ.ТекущиеДанные;
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Таб.СуммаОплаты КАК Сум,
    |Таб.Наименование
    |ПОМЕСТИТЬ врТаб
    |ИЗ
    |&Таб КАК Таб;
    |///////////////
    |ВЫБРАТЬ
    |Сумма(врТаб.Сум) КАК Сум,
    |врТаб.Наименование
    |ИЗ
    |врТаб
    |ГДЕ
    |врТаб.Наименование Подобно ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    |врТаб.Наименование";
    Запрос.УстановитьПараметр("врТаб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
    появляется след ошибка:
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(77)}: Ошибка при вызове метода контекста (Выполнить): {(6, 1)}: Не задано значение параметра "Таб"
    <<?>>&Таб КАК Таб;
    тз = Запрос.Выполнить().Выгрузить();
    по причине:
    {(6, 1)}: Не задано значение параметра "Таб"
    <<?>>&Таб КАК Таб;
    Как понял, если здесь делать выборку условием типа как в sql, то тут сначала создаётся запрос с параметрами для виртуальной таблицы потом всё туда помещается, затем что бы что-то далее делать уже надо запрос писать для текущей виртуальной таблицы и поле куда я хочу вернуть значение должно быть типизированным. Зачем столько сложностей... Пока я запутался, какой параметр он просит.
  15. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    нафига вот тут меняли
    Код:
    Запрос.УстановитьПараметр("врТаб", тз);
    верните как было у меня и потестите

    вам надо было только запрос последним действием поправить, а параметр так и остался &Таб. Все параметры в запросе начинаются с &, а врТаб - это временная таблица внутри запроса...
  16. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    не меняется ошибка. Я пробовал и так и так.
  17. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вот так точно пробовали?
    Код:
    тз = ЭлементыФормы.ИнтернетнаФ.ТекущиеДанные;
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Таб.СуммаОплаты КАК Сум,
    |Таб.Наименование
    |ПОМЕСТИТЬ врТаб
    |ИЗ
    |&Таб КАК Таб;
    |///////////////
    |ВЫБРАТЬ
    |Сумма(врТаб.Сум) КАК Сум,
    |врТаб.Наименование
    |ИЗ
    |врТаб
    |ГДЕ
    |врТаб.Наименование Подобно ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    |врТаб.Наименование";
    Запрос.УстановитьПараметр("Таб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
  18. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Да.
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(78)}: Ошибка при вызове метода контекста (Выполнить): {(6, 1)}: Неверные параметры "Таб"
    <<?>>&Таб КАК Таб;
    тз = Запрос.Выполнить().Выгрузить();
    по причине:
    {(6, 1)}: Неверные параметры "Таб"
    <<?>>&Таб КАК Таб;
    
    ещё вот так попробовал:
    Код:
    тз = ИнтернетнаФ.Выгрузить();
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Таб.СуммаОплаты КАК Сум,
    |Таб.Наименование
    |ПОМЕСТИТЬ врТаб
    |ИЗ
    |&Таб КАК Таб;
    |///////////////
    |ВЫБРАТЬ
    |Сумма(врТаб.Сум) КАК Сум,
    |врТаб.Наименование
    |ИЗ
    |врТаб
    |ГДЕ
    |врТаб.Наименование ПОДОБНО ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    |врТаб.Наименование";
    Запрос.УстановитьПараметр("Таб", тз);
    тз = Запрос.Выполнить().Выгрузить();
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
    
    ошибка:
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(78)}: Ошибка при вызове метода контекста (Выполнить): {(14, 1)}: Неверные параметры "ПОДОБНО"
    <<?>>врТаб.Наименование ПОДОБНО "Свердл%"
    тз = Запрос.Выполнить().Выгрузить();
    по причине:
    {(14, 1)}: Неверные параметры "ПОДОБНО"
    <<?>>врТаб.Наименование ПОДОБНО "Свердл%"
    
  19. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    базу выложить можете?

    маловероятно конечно, но попробуйте вот так еще
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать
    |Таб.СуммаОплаты КАК Сум,
    |Таб.Наименование
    |ПОМЕСТИТЬ врТаб
    |ИЗ
    |&Таб КАК Таб;
    |///////////////
    |ВЫБРАТЬ
    |Сумма(врТаб.Сум) КАК Сум,
    |врТаб.Наименование
    |ИЗ
    |врТаб КАК врТаб
    |ГДЕ
    |врТаб.Наименование ПОДОБНО "Свердл%"
    |СГРУППИРОВАТЬ ПО
    |врТаб.Наименование";
  20. TopicStarter Overlay
    Addm
    Offline

    Addm Опытный в 1С

    Регистрация:
    22 ноя 2011
    Сообщения:
    110
    Симпатии:
    0
    Баллы:
    26
    Так ещё проверил:
    Код:
    |врТаб
    |ГДЕ
    |врТаб.Наименование = ""Свердл%""
    |СГРУППИРОВАТЬ ПО
    
    ошибка:
    Код:
    {Документ.ОплатаИнтернет.Форма.ФормаДокументаОплаты(79)}: Индекс находится за границами массива
    ЭлементыФормы.СуммаСвоб = тз[0].Сум;
    
    Могу.

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