Задача «Продажа товара»

Приветствую! Разберем вопрос одного из наших читателей.

У одного из любимого читателя сайта возникла небольшая трудность с реализацией следующей задачи:

1. Сделать запрос за период по документу: продажа товара;

2. Вынести на форму обработки табличную часть с колонками: контрагент, склад, сумма;

3. Посчитать общую сумму и вынести итог на форму обработки в виде поля;

4. Функционал реализовать в виде "Обработки".

Разрабатывать буду документ и обработку в пустой базе.

Для начала создадим документ "Продажа товара". Рискну предположить, что документ "Продажа товара" имеет такую структуру (в учебных целях все реквизиты, кроме реквизита Сумма будут иметь тип Строка):

prodaja_tovara_1

Теперь зайдем в режиме 1С Предприятие и подготовим тестовые данные.

prodaja_tovara_2

Теперь самое интересное. Конечно, можно для документа "Продажа товара" добавить ещё реквизит СуммаДокумента, который будет хранить сумму табличной части и тогда запрос будет совсем элементарный.

Но мы легких путей не ищем…indecision

Хотя ладно, реквизит тоже добавимlaugh. На форму документа добавлять данный реквизит не будем. В модуле объекта прописываем заполнение данного реквизита в событии ПередЗаписью:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
   
СуммаДокумента = Товары.Итог("Сумма");
КонецПроцедуры

Теперь перепроводим наши документы и убеждаемся, что сумма документа заполняется.

prodaja_tovara_3

Все, тестовые данные готовы, теперь точно в бой!

Создаем обработку и ее форму. Здесь без комментариев.

prodaja_tovara_4

Осталось написать обработчик команды и все, задача решена. Самое сложное позадиlaugh.

1 способ решения задачи (самый простой).

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

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

&НаСервере
Процедура ПодсчитатьПродажиНаСервере()
   
Запрос = Новый Запрос;
   
Запрос.Текст =
       
"ВЫБРАТЬ
        |   ПродажаТовара.Контрагент КАК Контрагент,
        |   ПродажаТовара.Склад КАК Склад,
        |   СУММА(ПродажаТовара.СуммаДокумента) КАК Сумма
        |ИЗ
        |   Документ.ПродажаТовара КАК ПродажаТовара
        |ГДЕ
        |   ПродажаТовара.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |
        |СГРУППИРОВАТЬ ПО
        |   ПродажаТовара.Контрагент,
        |   ПродажаТовара.Склад"
;
   
Запрос.УстановитьПараметр("ДатаНачала", Объект.ДатаНачала);
   
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Объект.ДатаОкончания));
   
РезультатЗапроса = Запрос.Выполнить();
    Если
РезультатЗапроса.Пустой() Тогда
       
Сообщить("Увы! Продаж за указанной период не было!");
        Возврат;
    КонецЕсли;
   
Объект.Продажи.Загрузить(РезультатЗапроса.Выгрузить());
КонецПроцедуры

prodaja_tovara_5

Проверяем результат, например, за период от 06.09.2011 по 22.10.2016.

prodaja_tovara_6

2 способ решения задачи (если бы не было реквизита СуммаДокумента).

Сначала выбираем документы за указанный период, помещаем таблицу во временную таблицу, а далее делаем левое соединение с табличной частью документа, группируем данные и настраиваем общий итогsmiley.

&НаСервере
Процедура ПодсчитатьПродажиНаСервере()
   
Запрос = Новый Запрос;
   
Запрос.Текст =
       
"ВЫБРАТЬ
        |   ПродажаТовара.Ссылка КАК Ссылка,
        |   ПродажаТовара.Склад КАК Склад,
        |   ПродажаТовара.Контрагент КАК Контрагент
        |ПОМЕСТИТЬ ВТ_ПродажаТовара
        |ИЗ
        |   Документ.ПродажаТовара КАК ПродажаТовара
        |ГДЕ
        |   ПродажаТовара.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |;
        |
        |ВЫБРАТЬ
        |   ВТ_ПродажаТовара.Склад КАК Склад,
        |   ВТ_ПродажаТовара.Контрагент КАК Контрагент,
        |   СУММА(ПродажаТовараТовары.Сумма) КАК Сумма
        |ИЗ
        |   ВТ_ПродажаТовара КАК ВТ_ПродажаТовара
        |       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПродажаТовара.Товары КАК ПродажаТовараТовары
        |       ПО ВТ_ПродажаТовара.Ссылка = ПродажаТовараТовары.Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   ВТ_ПродажаТовара.Склад,
        |   ВТ_ПродажаТовара.Контрагент
        |ИТОГИ
        |   СУММА(Сумма)
        |ПО
        |   ОБЩИЕ"
;
   
Запрос.УстановитьПараметр("ДатаНачала", Объект.ДатаНачала);
   
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Объект.ДатаОкончания));
   
РезультатЗапроса = Запрос.Выполнить();
    Если
РезультатЗапроса.Пустой() Тогда
       
Сообщить("Увы! Продаж за указанной период не было!");
        Возврат;
    КонецЕсли;
   
ВыборкаОбщийИтог = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   
ВыборкаОбщийИтог.Следующий();
   
Объект.ОбщаяСуммаПродаж = ВыборкаОбщийИтог.Сумма;
   
Объект.Продажи.Очистить();
   
ВыборкаДетальныеЗаписи = ВыборкаОбщийИтог.Выбрать();
    Пока
ВыборкаДетальныеЗаписи.Следующий() Цикл
       
НоваяСтрока = Объект.Продажи.Добавить();
       
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаДетальныеЗаписи);
    КонецЦикла;
КонецПроцедуры

Проверяем результат, например, за период от 22.10.2016 по 22.10.2016.

prodaja_tovara_7

Вариантов решения данной задачи еще многоindecision. Написал первое, что пришло в головуsmiley.

Если будут какие-то вопросы, то задавайте!

Понравилось? Не забудь поддержать сайт!

Комментарии 4

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *