Назад | Начало урока | Вперед
Содержание

Глава 3

Как создать отчет
Отчет можте быть создан как внутри конфигурации, так и отдельно от нее в виде
самостоятельного файла - так называемый внешний отчет.
Надо уметь делать и тот и другой.

Пока делаю отчет внутри конфигурации.
Выбираем в конфигурации: Отчеты - Новый отчет. Открывается конструктор отчета.
В окне конструктора отчета две радиокнопки - Отчет(в составе конфигурации) и
Внешний отчет. Выберем пока отчет в составе конфигурации. Если мы выберем
кнопку Внешний отчет, то откроется вводное поле Имя файла, которое ранее было серым.

Мы выбрали отчет в составе конфигурации, поэтому надо заполнить три поля:
Идентификатор
Синоним
Комментарий

Идентификатор - ОтчетРН (Отчет по расходным накладным), нажимаем Далее.
Ставим галочку в Чек-бокс - вставить команду в пользовательское меню.
Автоматически заполнились еще два поля.

Далее галочку Вызвать конструктор макета отчета.
Далее конструктор предлагает нам новую процедуру Сформировать(). Согласимся.
Далее конструктор предлагает свой макет отчета.

Подсказка

Выберем в нем радиокнопку - циклы по строкам.
Далее в следующем окне отметим количество циклов - 2,
и количество колонок какое будет в таблице - 6.

Разумно подумав и ответив на вопросы, мы при помощи конструктора отчетов
создали форму - окно с двумя кнопками Создать и Открыть.
Конструктор создал модуль, со следующим кодом:

//Конструкции <<...>> необходимо заменить на реальные логические условия
//и значения переменных

Процедура Сформировать()

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);
Пока <<Условие>> Цикл
Таб.ВывестиСекцию("Строка_1");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.Показать("ОтчетРН","");
КонецПроцедуры

В этом модуле конструктор написал код, который создает таблицу. У таблицы есть шапка,
строка и подвал. Мы должны модифицировать код, созданный конструктором так, чтобы он
отражал в отчете нашу расходную накладную.

Таблицы

Теперь используя предыдущий код, созданный конструктором создадим таблицу, при помощи
которой можно вывести всю информацию из документа не в окно сообщений как мы делали ранее,
а в специальную форму в виде виртуального печатного листа, чтобы можно было сохранить
и распечатать результат.

Напишем сначала код, который выводит реквизиты шапки документа,
и сделать он должен это во всех расходных документах:

------------------
Процедура Сформировать()

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);

Док = СоздатьОбъект("Документ.РН");
Док.ВыбратьДокументы(,);

Пока (Док.ПолучитьДокумент() = 1) Цикл
ПчКол1=Док.НомерДок;
ПчКол2=Док.ДатаДок;
ПчКол3=Док.Склад;
Строка_1 = ПчКол1 + ПчКол2+ ПчКол3;
Таб.ВывестиСекцию("Строка_1");
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать","");

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

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

//*******************************************
Процедура Сформировать()

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Шапка");
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);

Док = СоздатьОбъект("Документ.РН");
Док.ВыбратьДокументы();

Пока (Док.ПолучитьДокумент() = 1) Цикл
ПчНом=Док.НомерДок;
ПчДат=Док.ДатаДок;
ПчСклад=Док.Склад;
// Док = ПчНом + ПчДат+ ПчСклад;
Таб.ВывестиСекцию("Док");
Таб.ВывестиСекцию("ШапСтр");

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

КонецЦикла;

Таб.ВывестиСекцию("Подвал");
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать","");

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

Результат:

Запустим 1С и через меню Отчеты посмотрим наш отчет:

Подсказка

Конечно, явно видно, что таблица отчета требует еще доработки.
В частности надо дорисовать рамки там где их не хватает.
Но многое она уже вывела правильно.

При первоначальном запуске программа не показала код товара и единицы измерения.
Вернее вместо кода товара и единиц измерения показывает просто текст, который находится
в ячейках. Причина была в том, что не правильно указан тип ячейки.

Примечание:

Этот код написан правильно. Но если он не будет выводить данные в некоторых полях,
то возможно причина в том, что у каждой ячейки таблицы есть свойства. Попробуйте
в свойстах ячейки, которая не выводит значения выбрать тип ячейки - Выражение,
вместо типа Строка. Тогда ячейка будет восприникать то, что в ней находится как
переменную, а не как строку. И вывод будет правильным.

Наименование ячейкам, секциям таблицы следует делать прямо в таблице вручную.
Работа со столбцами, строками и ячейками примерно такая же как в Excel.

Еще интересное. У нас есть секция СтрДок (Строка документа),
в этой строке несколько ячеек, каждой ячейке присвоена переменная.
В модуле, в каждую переменную положено значение из документа.
Затем все эти переменные присваиваются переменной секции СтрДок
и выводятся:

//действия с очередным элементом
ПчНомТов = Док.НомерСтроки;
ПчТовар = Док.Товар;
ПчЦена = Док.Цена;
ПчКолич = Док.Количество;
ПчЕдИзм = Док.ЕИ;
ПчСумма = Док.Сумма;
СтрДок = ПчТовар+ПчЦена+ПчКолич+ПчЕдИзм+ПчСумма;
Таб.ВывестиСекцию("СтрДок");

Все это прекрасно работает со строками!
А вот с секцией Док документа такой номер уже не проходит:

ПчНом=Док.НомерДок;
ПчДат=Док.ДатаДок;
ПчСклад=Док.Склад;
// Док = ПчНом + ПчДат+ ПчСклад;
Таб.ВывестиСекцию("Док");



То есть здесь в переменную Док не надо ничего складывать.
Эта переменная выведет все сама. Номер документа, Дата документа, Склад не
являются реквизитами табличной части документа. Так же не является
реквизитами табличной части и поля Всего и Кто.

Резюме:

Мы научились создавать отчет по документу РН(Расходная накладная).
Научились получать доступ ко всем реквизитам документа и выводить отчет
в виде таблицы, в которой указаны все документы (все расходные накладные)
и все данные из этих документов - реквизиты шапки и реквизиты табличной части.

Аналогичным образом можно создать отчет по другим документам а так же по регистрам.

Процедуры и функции, которые использовались в этой обработке:

Таб = СоздатьОбъект("Таблица")
Таб.ИсходнаяТаблица("Сформировать")
Таб.ВывестиСекцию("Шапка")
Таб.Опции(0,0,Таб.ВысотаТаблицы(),0)
Таб.ТолькоПросмотр(1)
Таб.Показать("Сформировать","")

Док = СоздатьОбъект("Документ.РН")
Док.ВыбратьДокументы()
Док.ПолучитьДокумент()
Док.ВыбратьСтроки()
Док.ПолучитьСтроку()

Вопросы:

Вопрос: Как написать работающие функции в документе, которые помогают высчитывать Сумма
и Всего в документе? Какие предопределенные функции можно при этом задействовать?
Обработайте таким образом документ РН(Расходная накладная).

Вопрос: Как делать рамки в таблице?
Вопрос: Во первых вся инф выводится в окно сообщений на русском, но когда пытаюсь
скопировать через буфер обмена, вся инфа в файл типа txt попадает на крокозябре.
Такая же проблема - не могу скопировать из окна Помощь.
Конечно, я могу написать специальную программу на С++, которая будет расшифровывать
данную крокозябру.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz