0
- 06.06.2020 - 14:10
|
Удаленное обучение, к сожалению, мало добавило знаний. Помогите, пожалуйста, разобраться с заданием. Выполнять нужно на ТиС. Сам запрос сделали. Работает правильно. Печатную форму тоже создали. Препод всё проверил. Сказал, что норм. Не получается вывести данные отчета на форму. И не могу разобраться с таблицей значений. ЗАДАНИЕ Магазин ведёт учёт продаж и возвратов товара по складам и проектам. В течение дня возникает необходимость проверить продажи в разрезе некоторых учетных единиц. Учёт продаж ведётся документами Реализация и РеализацияРозница. Учёт возвратов с помощью документа ВозвратОтПокупателя. Создайте отчёт, позволяющий учесть продажи по трём выборочным проектам (П1, П2, П3) с группировкой по складам, причём наименования и количество складов зависит от данных, введённых в пользовательском режиме. Результат отчета должен формироваться, с учётом корректирующей величины (Корректировка), вводимой через числовое поле на форме отчета, в таблице значений и выводиться в текстовое поле на форме отчета по следующей формуле. Продажа П1+П2+Корректировка, Возврат П1+П2, Итог (Продажа П1+П2)-(Возврат П1+П2)+Корректировка Продажа П3-Корректировка, Возврат П3, Итог (Продажа П3)-(Возврат П3) Результат ((Продажа П1+П2)-(Возврат П1+П2)+(Продажа П3)-(Возврат П3)-Корректировка) Наименование столбцов Продажа первый этаж - для (Продажа П1+П2) Возврат первый этаж - для (Возврат П1+П2) Итого первый этаж - для (Итог (Продажа П1+П2)-(Возврат П1+П2)) Продажа второй этаж - для (Продажа П3) Возврат второй этаж - для (Возврат П3) Итого второй этаж - для (Итог (Продажа П3)-(Возврат П3)) Всего продаж - для (Результат ((Продажа П1+П2)-(Возврат П1+П2)+(Продажа П3)-(Возврат П3))) Отчёт должен учитывать продажи только за текущий день, без возможности изменения периода на форме. Сделайте кнопку, позволяющую обновлять результат в течение дня, без закрытия формы отчета. Создайте такой же отчёт, с выводом данных в таблицу значений, расположенную на форме. Создайте печатную форму отчета. Модуль отчета Процедура ОтчетКассира() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//**{ЗАПРОС(ОтчетКассира) |Период с (ТекущаяДата()) по (ТекущаяДата()); |Обрабатывать НеПомеченныеНаУдаление; |Реализация = Документ.Реализация.ТекущийДокумент, Документ.РеализацияРозница.ТекущийДокумент; |ВозвратОтПокупателя = Документ.ВозвратОтПокупателя.ТекущийДокумент; |Склад = Документ.Реализация.Склад.Наименование, Документ.ВозвратОтПокупателя.Склад.Наименование, Документ.РеализацияРозница.Склад.Наименование; |Проект = Документ.Реализация.Проект, Документ.ВозвратОтПокупателя.Проект, Документ.РеализацияРозница.Проект; |Фирма = Документ.ВозвратОтПокупателя.Фирма.Наименование, Документ.Реализация.Фирма.Наименование, Документ.РеализацияРозница.Фирма.Наименование; |СуммаВозврат = Документ.ВозвратОтПокупателя.Сумма; |СуммаРеализация = Документ.Реализация.Сумма, Документ.РеализацияРозница.Сумма; |Функция РеализацияП1 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П1""); |Функция РеализацияП2 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П2""); |Функция РеализацияП3 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П3""); |Функция ВозвратП1 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П1""); |Функция ВозвратП2 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П2""); |Функция ВозвратП3 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П3""); |Группировка Склад; |"//****ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм данными запроса Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ОтчетКассира"); // Заполнение полей "Заголовок" Таб.ВывестиСекцию("Заголовок"); Состояние("Заполнение выходной таблицы..."); Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0); Пока Запрос.Группировка(1) = 1 Цикл // Заполнение полей Склад Таб.ВывестиСекцию("Склад"); КонецЦикла; // Заполнение полей "Итого" Таб.ВывестиСекцию("Итого"); // Вывод заполненной формы Таб.ТолькоПросмотр(1); | | |
1
- 06.06.2020 - 14:33
|
Вот создаю таблицу значений ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("Продажа 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Возврат 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Итого 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Продажа 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Возврат 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Итого 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Всего продаж","Число",15,0); | | |
2
- 06.06.2020 - 16:02
| Создай реквизит формы типа ТаблицаЗначений. При открытии формы задавай ей структуру (наполняй колонками). А в процедуре формирования отчета уже заполняй эту таблицу строками. | | |
3
- 06.06.2020 - 16:13
|
2-US1C > Да! Таблица значений на форме есть. Я не могу понять в какой последовательности все в модуле прописывать. Сначала Запрос? Вот это "ТЗ = СоздатьОбъект("ТаблицаЗначений");" в какой момент? | | |
4
- 06.06.2020 - 16:30
|
Вот когда пишу так Процедура ЗаполнитьТаблицу() Итоги.УдалитьСтроки(); КонецПроцедуры Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//**{ЗАПРОС(ОтчетКассира) |Период с (ТекущаяДата()) по (ТекущаяДата()); |Обрабатывать НеПомеченныеНаУдаление; |Реализация = Документ.Реализация.ТекущийДокумент, Документ.РеализацияРозница.ТекущийДокумент; |ВозвратОтПокупателя = Документ.ВозвратОтПокупателя.ТекущийДокумент; |Склад = Документ.Реализация.Склад.Наименование, Документ.ВозвратОтПокупателя.Склад.Наименование, Документ.РеализацияРозница.Склад.Наименование; |Проект = Документ.Реализация.Проект, Документ.ВозвратОтПокупателя.Проект, Документ.РеализацияРозница.Проект; |Фирма = Документ.ВозвратОтПокупателя.Фирма.Наименование, Документ.Реализация.Фирма.Наименование, Документ.РеализацияРозница.Фирма.Наименование; |СуммаВозврат = Документ.ВозвратОтПокупателя.Сумма; |СуммаРеализация = Документ.Реализация.Сумма, Документ.РеализацияРозница.Сумма; |Функция РеализацияП1 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П1""); |Функция РеализацияП2 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П2""); |Функция РеализацияП3 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П3""); |Функция ВозвратП1 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П1""); |Функция ВозвратП2 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П2""); |Функция ВозвратП3 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П3""); |Группировка Склад; |"//****ЗАПРОС ; Запрос.Выполнить(ТекстЗапроса); То таблица на форме заполняется данными. Но столбцы озаглавлены функциями и идут в той последовательности, в какой написаны функции. | | |
5
- 06.06.2020 - 18:26
|
Если ТаблицаЗначений на форме есть, не надо создавать объект "ТаблицаЗначений". Просто заполняешь ее колонками, в той последовательности, которую запланировал: ТЗ.НоваяКолонка("Продажа 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Возврат 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Итого 1 этаж","Число",15,0); ТЗ.НоваяКолонка("Продажа 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Возврат 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Итого 2 этаж","Число",15,0); ТЗ.НоваяКолонка("Всего продаж","Число",15,0); | | |
6
- 06.06.2020 - 18:30
| (5) Не обратил внимание, идентификатор колонок так нельзя указывать. Имя должно быть без пробелов, начинаться с буквы или подчеркивания. Так "123" нельзя, а так "_123" можно. Заголовок колонок на форме идет 5-м параметром метода НоваяКолонка(). | | |
7
- 06.06.2020 - 18:40
|
6-US1C > А ТЗ - это должен быть идентификатор таблицы значений на форме? | | |
8
- 06.06.2020 - 18:45
| (7) Совершенно верно. | | |
9
- 06.06.2020 - 18:49
| Структуру ТаблицыЗначений можешь создать заранее. Либо в процедуре ПриОткрытии(), либо перед выборкой из запроса. Я бы сделал при открытии. Так сразу будет видна понятная таблица, а не пустое одноколоночное поле. А заполнять строки таблицы будешь уже в цикле выборки из запроса. | | |
10
- 06.06.2020 - 19:23
|
9-US1C > А что будет идентификатором колонки служить? Вот в этом случае что будет первым значением? ТЗ.НоваяКолонка(,"Число",15,0,"Продажа 1 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Возврат 1 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Итого 1 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Продажа 2 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Возврат 2 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Итого 2 этаж"); ТЗ.НоваяКолонка(,"Число",15,0,"Всего продаж"); Или тут нужно выводить вообще все колонки, а потом скрывать ненужные? И как обозначить колонки, в которых вычисление? | | |
11
- 06.06.2020 - 19:25
| Не могу найти в сети что-то подробное по семерке почитать по таблице значений. Чтобы с примерами было. | | |
12
- 06.06.2020 - 19:34
|
ТЗ.НоваяКолонка("Продажа","Число",15,2,"Продажа в розницу"); В цикле выборки результата: ТЗ.НоваяСтрока(); ТЗ.Продажа = Запрос.РеализацияП1; | | |
13
- 06.06.2020 - 19:36
|
9-US1C > В Синтаксисе вот так написано УстановитьПараметрыКолонки(,,,,,,,); Означает ли это, что мне нужно также написать в процедуре ПриОткрытии()? Или, все-таки, я пишу ТЗ.НоваяКолонка(,,,,,,,);? Нам ничего из этого не объясняли. Все на самоизучении... | | |
14
- 06.06.2020 - 19:37
| Почитать не могу предложить, а обработку с ТЗ в том числе могу прислать. Напиши мыло в личку. | | |
15
- 06.06.2020 - 19:38
| (13) Это для переназначения параметров уже имеющейся в ТЗ колонки. Новую ТЗ надо создавать через НоваяКолонка(). | | |
16
- 06.06.2020 - 20:05
| Пытаюсь. Появляется сообщение "Вы не можете отправить сообщение US1C, поскольку он(а) не разрешил(а) принимать личные сообщения, либо ему(ей) не разрешено это делать." | | |
17
- 06.06.2020 - 20:09
| А сейчас? | | |
18
- 06.06.2020 - 20:23
| Отправил | | |
19
- 06.06.2020 - 21:09
|
ну. на мисте тоже советы дали.. ;-) если есть понимание ЧТО надо сделать, но трудности с технической реализацией моментов или расскаpать/поучить/показать - стучись в скайп Zlopun | | |
20
- 06.06.2020 - 21:49
|
Ну! На форму уже таблицу как надо вывели. Не могу понять пока, почему не заполняет данными. После Запрос.Выполнить(ТекстЗапроса) что писать? Пока ТЗ.ПолучитьСтроку() = 1 Цикл | | |
21
- 06.06.2020 - 22:13
| 20-tutsi >ну так звони скайпом. а то ту пальцем тыкать мозоль уже | | |
22
- 06.06.2020 - 22:17
|
21-Сергей Че > Пока пробуем разобраться сами. | | |
23
- 06.06.2020 - 22:27
| Цитата:
Возврат; КонецЕсли; Пока Запрос.Группировка(1) = 1 Цикл ТЗ.НоваяСтрока(); ТЗ.Склад = Запрос.Склад; ТЗ.Продажа = Запрос.РеализацияП1; ТЗ.Возврат = Запрос.ВозвратП1; КонецЦикла; | | |
24
- 06.06.2020 - 22:43
|
23-US1C > Оператор Return (Возврат) не может употребляться вне процедуры или функции | | |
25
- 06.06.2020 - 22:48
| Цитата:
Ну и т.д. | | |
26
- 07.06.2020 - 10:14
|
25-US1C > Доброе утро! Сегодня нет возможности проверить правильность отчета в программе. Если не трудно, посмотрите, пожалуйста! Сомневаюсь в правильности суммирования результатов колонок ТЗ и выгрузки итогов в ТЗ на форме. Процедура ПриОткрытии() ТЗ.НоваяКолонка("ПродажаП1П2Корректировка","Число" ,15,2,"Продажа 1 этаж"); ТЗ.НоваяКолонка("ВозвратП1П2","Число",15,2,"Возвра т 1 этаж"); ТЗ.НоваяКолонка("ВсегоП1П2","Число",15,2,"Итого 1 этаж"); ТЗ.НоваяКолонка("ПродажаП3Корректировка","Число",1 5,2,"Продажа 2 этаж"); ТЗ.НоваяКолонка("ВозвратП3","Число",15,2,"Возврат 2 этаж"); ТЗ.НоваяКолонка("ВсегоП3","Число",15,2,"Итого 2 этаж"); ТЗ.НоваяКолонка("Продажи","Число",15,2,"Всего продаж"); ТЗ.УдалитьСтроки(); КонецПроцедуры Процедура ОтчетКассира() Перем Запрос, ТекстЗапроса, Таб; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//**{ЗАПРОС(ОтчетКассира) |Период с (ТекущаяДата()) по (ТекущаяДата()); |Обрабатывать НеПомеченныеНаУдаление; |Реализация = Документ.Реализация.ТекущийДокумент, Документ.РеализацияРозница.ТекущийДокумент; |ВозвратОтПокупателя = Документ.ВозвратОтПокупателя.ТекущийДокумент; |Склад = Документ.Реализация.Склад.Наименование, Документ.ВозвратОтПокупателя.Склад.Наименование, Документ.РеализацияРозница.Склад.Наименование; |Проект = Документ.Реализация.Проект, Документ.ВозвратОтПокупателя.Проект, Документ.РеализацияРозница.Проект; |Фирма = Документ.ВозвратОтПокупателя.Фирма.Наименование, Документ.Реализация.Фирма.Наименование, Документ.РеализацияРозница.Фирма.Наименование; |СуммаВозврат = Документ.ВозвратОтПокупателя.Сумма; |СуммаРеализация = Документ.Реализация.Сумма, Документ.РеализацияРозница.Сумма; |Функция РеализацияП1 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П1""); |Функция РеализацияП2 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П2""); |Функция РеализацияП3 = Сумма(СуммаРеализация) когда(Проект.Наименование = ""П3""); |Функция ВозвратП1 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П1""); |Функция ВозвратП2 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П2""); |Функция ВозвратП3 = Сумма(СуммаВозврат) когда(Проект.Наименование = ""П3""); |Группировка Склад; |"//****ЗАПРОС ; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; Пока ТЗ.ПолучитьСтроку() = 1 Цикл ТЗ.НоваяСтрока(); ТЗ.ПродажаП1П2Корректировка = Запрос.РеализацияП1 + Запрос.РеализацияП2 + Форма.Корректировка; ТЗ.ВозвратП1П2 = Запрос.ВозвратП1 + Запрос.ВозвратП2; ТЗ.ВсегоП1П2 = ТЗ.ПродажаП1П2Корректировка - ТЗ.ВозвратП1П2; ТЗ.ПродажаП3Корректировка = Запрос.РеализацияП3 - Форма.Корректировка; ТЗ.ПродажаП3Возврат = Запрос.ВозвратП3; ТЗ.ВсегоП3 = ТЗ.ПродажаП3Корректировка - ТЗ.ПродажаП3Возврат; ТЗ.Продажи = ТЗ.ВсегоП1П2 + ТЗ.ВсегоП3; Сообщить(ТЗ.Итоги); КонецЦикла; ТЗ.Выгрузить(ТЗ); КонецПроцедуры | | |
27
- 07.06.2020 - 11:58
|
(26) Невнимательно смотрели предыдущие коменты. 1. После выполнения запроса делаем цикл по выборке из запроса, а не по ТЗ. Не "Пока ТЗ.ПолучитьСтроку() = 1 Цикл", а "Пока Запрос.Группировка(1) = 1 Цикл". 2. Выгрузка из ТЗ в неё же бессмыслена:"ТЗ.Выгрузить(ТЗ);". 3. "ТЗ.УдалитьСтроки();" лучше делать при формировании отчета, перед заполнением таблицы. В самом начале там и так нет никаких строк. А вот нажав несколько раз кнопку "СформироватьОтчет" вы получите дублирование данных. 4. Итоги по ТЗ получить можно так: ТЗ.Итог("Продажи"), где "Продажи" - идентификатор колонки ТЗ с данными типа число. | | |
28
- 07.06.2020 - 12:19
| То есть цикл будет только в случае наличия группировки? Итоги получаем для каждого столбца отдельно? | | |
29
- 07.06.2020 - 13:52
| Да. Для этого мы и выполняем запрос, чтобы получить данные и пройтись по ним. А при проверке запроса на пустые данные прерываем процедуру возвратом. Совершенно верно. | | |
30
- 07.06.2020 - 13:53
| А если группировка отсутствует, то как тогда? | | |
31
- 07.06.2020 - 13:54
|
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ПродажаП1П2Корректировка = Запрос.РеализацияП1 + Запрос.РеализацияП2 + Форма.Корректировка; ТЗ.ВозвратП1П2 = Запрос.ВозвратП1 + Запрос.ВозвратП2; ТЗ.ВсегоП1П2 = ТЗ.ПродажаП1П2Корректировка - ТЗ.ВозвратП1П2; ТЗ.ПродажаП3Корректировка = Запрос.РеализацияП3 - Форма.Корректировка; ТЗ.ПродажаП3Возврат = Запрос.ВозвратП3; ТЗ.ВсегоП3 = ТЗ.ПродажаП3Корректировка - ТЗ.ПродажаП3Возврат; ТЗ.Продажи = ТЗ.ВсегоП1П2 + ТЗ.ВсегоП3; | | |
32
- 07.06.2020 - 13:59
|
И дальше ТЗ.Итог("Продажа 1 этаж"); ТЗ.Итог("Возврат 1 этаж"); ТЗ.Итог("Итого 1 этаж"); ТЗ.Итог("Продажа 2 этаж"); ТЗ.Итог("Возврат 2 этаж"); ТЗ.Итог("Итого 2 этаж"); ТЗ.Итог("Всего продаж"); | | |
33
- 07.06.2020 - 13:59
| Тогда у нас нет данных, соответствующих запросу. Отчет пустой. Поэтому ТЗ.УдалитьСтроки(); надо вызывать раньше выполнения запроса. Иначе если таблица не пустая, то может сложится впечатление, что мы получили данные из запроса, который на самом деле пустой. | | |
34
- 07.06.2020 - 14:03
| Так? ТЗ.УдалитьСтроки(); Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; | | |
35
- 07.06.2020 - 14:17
|
ТЗ на форме заполняется, но без учета корректировки. Правильно ли в этих строках указано через Форма.Корректировка? ТЗ.ПродажаП1П2Корректировка = Запрос.РеализацияП1 + Запрос.РеализацияП2 + Форма.Корректировка; ТЗ.ВсегоП3 = ТЗ.ПродажаП3Корректировка - ТЗ.ПродажаП3Возврат; | | |
36
- 07.06.2020 - 14:19
|
Точнее вот в этих строках. ТЗ.ПродажаП1П2Корректировка = Запрос.РеализацияП1 + Запрос.РеализацияП2 + Форма.Корректировка; ТЗ.ПродажаП3Корректировка = Запрос.РеализацияП3 - Форма.Корректировка; | | |
37
- 07.06.2020 - 14:22
|
33-US1C > Всё! Работает! Уважаемый US1C СПАСИБО ОГРОМНОЕ!!! | | |
38
- 07.06.2020 - 14:26
|
Нет, к значению реквизита формы надо обращаться просто по идентификатору: "Корректировка". ТЗ.ПродажаП3Корректировка = Запрос.РеализацияП3 - Корректировка; | | |
39
- 07.06.2020 - 20:38
|
Из неполучающегося. Когда результаты запроса выводятся в текстовое поле на форму, не удается изменить формат отображения. То есть не получается показывать число с двумя знаками после запятой. Делали через "Формат". И вот еще. Есть внешний отчет - "калькулятор". То есть, на форме 11 числовых полей Кол5к1, Кол2к1, Кол1к1, Кол5001, Кол2001, Кол1001, Кол501, Кол101, Кол51, Кол21, Кол11. В эти поля вносится количество купюр. Вопрос такой. Как сохранять настройки этих полей так, чтобы они открывались у любого пользователя? Через СписокЗначений? | |
| Интернет-форум Краснодарского края и Краснодара |