1с отчет без скд
Прошу прощение за создание отдельной темы, но как создать отчет без СКД, что-бы был виден код, т.к. в процедуру формирования отчета, нужно передать объекты, для создания правильного селекта. Книга "Разработка сложных отчетов" она под СКР :(
Габец А.П., Гончаров Д.И., Козырев Д.В., Кухлевский Д.С., Радченко М.Г. - Профессиональная разработка в системе 1С: Предприятие 8.
Там очень много занимают параметры. Они булевы. И нельзя сделать недоступным один параметр, при выборе другого. Нельзя посмотреть выбран ли параметр вообще. Т.е. мб и можно, но надо достать до когда.
почему нельзя? можете в тексте запроса проверять или программно передавать параметры в скд
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра);
то есть порядок действий такой: 1. размещаем на форме реквизиты соответствующие параметрам. Описываем проверки и зависимости; 2. в процедуре формирования отчета пишем КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра); СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки); 3. профит
Благодарю. А статей покомпактней? Просто о проф разработке в данный момент речи не идет
опляк, это горячее. Т.е. создаю отчет в СКД, но не беру параметры, а реквизиты добавляю на форму, и в хз какую переопределенную процедуру запихиваю свои параметры, эквивалентные параметрам запроса?
Курс «Практическое применение системы компоновки данных» Методическое пособие, очень хорошая штука, рекомендую.
да. то есть берешь скд стандартную схему пишешь свои параметры в скд. делаешь их доступными в настройке и далее программно передаешь параметры
В какой из трех книг описано какой метод нужно переопределять?
Формирование отчета выполняется в предопределенной процедуре ПриКомпоновкеРезультата Именно там можно подсунуть СКД любые параметры, которые ты хочешь, да и вообще, полностью программно сваять весь отчет
-Разработка сложных отчетов -Профессиональная разработка в системе 1С: Предприятие 8 -Практическое применение системы компоновки данных Метод вызова формирования отчета. Т.е. Кнопочка "Сформировать" на форме отчета. Я не могу найти ее метод, а модуле пусто, и модуле объекта и менеджера, везде все пусто. Каким образом добавить параметры для селекта из формы вообще уже хз голова раскалывается. Яндекс адекватного ничего не выдает на "создание отчета с параметрами без скд", одни ссылки на форумы, где само-собой пустоне то.
Такое ощущение что процедура обработки расшифровки не срабатывает. Вы точно назначили эту процедуру для обработчика табличного документа? Если отладка туда не попадает, то мне кажется что вы забыли это сделать.а в поле расшифровку положили?
в принципе вот тут можно посмотреть Расшифровка табличного документа
(2)Да, все на месте. По ману по ссылке разбирают справочник, а вот как передать в отчет. (3) в момент формирования в параметр расшифровки что помещаете? (4)У меня в макете, для ячеек заданы ПараметрРасшифровки, в текстовом виде, в роде "ВаловыСбор" итп. Вы об этом?(5) ну а в коде вы эти параметры заполняете?
Который берется из результата запроса:
(8) а зачем вы в параметр расшифровки записываете число? по вашему коду там должна быть структура:Такое ощущение что процедура обработки расшифровки не срабатывает. Вы точно назначили эту процедуру для обработчика табличного документа? Если отладка туда не попадает, то мне кажется что вы забыли это сделать.
(7)Все так! Вы правы!
Осталось разобраться с исполнением, т.к. на клиенте выходит ошибка:
: Переменная не определена (Отчеты)
ФормаРасшифровка = <<?>>Отчеты.ОтчетПоПроводкамТиповой.ПолучитьФорму(,, Новый УникальныйИдентификатор); (Проверка: Тонкий клиент)
Спасибо Вам огромное!
(10) На клиенте не получится получить форму.
Нужно использовать "ОткрытьФорму"
Код |
---|
Показать полностью |
Я бы сделал так:
А в форме ОтчетПоПроводкамТиповой при создании на сервере:
(13)Дело в том, что конфигурация на поддержке, снимать не вариант.
Я делал так:
ФормаРасшифровка = Новый Структура(,, Новый УникальныйИдентификатор);
ФормаРасшифровка.РежимРасшифровки = Истина;
Если Расшифровка.ВидРасшифровки = "ВаловыйСбор" тогда
Поле = "СубконтоДт1.ВидНоменклатуры";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Субконто1;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "КорСчет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.КорСчет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Счет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Счет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Организация";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.Организация;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
ИначеЕсли Расшифровка.ВидРасшифровки = "ЗасыпкаСемян" тогда
Поле = "СубконтоКт1.ВидНоменклатуры";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Субконто1;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "КорСчет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.КорСчет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Счет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Счет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Организация";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.Организация;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
ИначеЕсли Расшифровка.ВидРасшифровки = "ПокупноеЗерно" тогда
Поле = "СубконтоДт1.ВидНоменклатуры";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Субконто1;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "КорСчет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.СчетаПоставщик;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Счет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Счет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Организация";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.Организация;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
ИначеЕсли Расшифровка.ВидРасшифровки = "Переработка" тогда
Поле = "СубконтоКт1.ВидНоменклатуры";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Субконто1;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "КорСчет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.КорСчет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Счет";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.ВСписке;
Значение = Расшифровка.Счет;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
Поле = "Организация";
Поле = Новый ПолеКомпоновкиДанных(Поле);
Отбор = ФормаРасшифровка.КомпоновщикНастроек.Настройки.Отбор;
ВидСрав = ВидСравненияКомпоновкиДанных.Равно;
Значение = Расшифровка.Организация;
Использование = Истина;
НовыйЭлемент = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлемент.Использование = Использование;
НовыйЭлемент.ЛевоеЗначение = Поле;
НовыйЭлемент.ВидСравнения = ВидСрав;
НовыйЭлемент.ПравоеЗначение = Значение;
ФормаРасшифровка.ПРедставлениеСпискаОрганизаций = Строка(Расшифровка.Организация);
ФормаРасшифровка.ПРедставлениеСпискаПодразделений = Строка(Расшифровка.Организация);
ФормаРасшифровка.НачалоПериода = Расшифровка.ДатаНачала;
ФормаРасшифровка.КонецПериода = Расшифровка.ДатаКонца;
ФормаРасшифровка.Настроить();
Для Каждого ЭлементСтруктуры Из ФормаРасшифровка.ДанныеОтчета.ПоказателиОтчета Цикл
ЭлементСтруктуры.Значение.Значение = Ложь;
КонецЦикла;
ФормаРасшифровка.ДанныеОтчета.ПоказателиОтчета.Количество.Значение = Истина;
//ФормаРасшифровка.Открыть();
ОткрытьФорму("Отчет.ОтчетПоПроводкам.Форма.Форма", ФормаРасшифровка, ЭтаФорма);
Прошу прощение за создание отдельной темы, но как создать отчет без СКД, что-бы был виден код, т.к. в процедуру формирования отчета, нужно передать объекты, для создания правильного селекта.
Книга "Разработка сложных отчетов" она под СКР :(
(0) Габец А.П., Гончаров Д.И., Козырев Д.В., Кухлевский Д.С., Радченко М.Г. - Профессиональная разработка в системе 1С: Предприятие 8.
Там очень много занимают параметры. Они булевы. И нельзя сделать недоступным один параметр, при выборе другого. Нельзя посмотреть выбран ли параметр вообще. Т.е. мб и можно, но надо достать до когда.
(3) почему нельзя? можете в тексте запроса проверять или программно передавать параметры в скд
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИмяПараметра",ЗначениеПараметра);
(2) Благодарю. А статей покомпактней?
Просто о проф разработке в данный момент речи не идет
(7) опляк, это горячее.
Т.е. создаю отчет в СКД, но не беру параметры, а реквизиты добавляю на форму, и в хз какую переопределенную процедуру запихиваю свои параметры, эквивалентные параметрам запроса?
(10) Курс «Практическое применение системы компоновки данных» Методическое пособие, очень хорошая штука, рекомендую.
(10) да. то есть берешь скд стандартную схему пишешь свои параметры в скд. делаешь их доступными в настройке и далее программно передаешь параметры
(14) В какой из трех книг описано какой метод нужно переопределять?
(17) Формирование отчета выполняется в предопределенной процедуре ПриКомпоновкеРезультата() Именно там можно подсунуть СКД любые параметры, которые ты хочешь, да и вообще, полностью программно сваять весь отчет
(18)
-Разработка сложных отчетов
Метод вызова формирования отчета.
Т.е. Кнопочка "Сформировать" на форме отчета. Я не могу найти ее метод, а модуле пусто, и модуле объекта и менеджера, везде все пусто. Каким образом добавить параметры для селекта из формы вообще уже хз голова раскалывается. Яндекс адекватного ничего не выдает на "создание отчета с параметрами без скд", одни ссылки на форумы, где само-собой пусто\не то.
Как сделать отчет без СКД - печатные формы делал когда-нибудь? Без СКД отчет делается по такому же принципу.
А СКД, но программно задавая свои параметры, см (19). Открываешь модуль объекта, открываешь список процедур и видишь там две надписи с вот такими скобочками <> Это предопределенные процедуры. Их можно прописать в модуле, если ты хочешь изменить их поведение.
(22) Да я уже понял что формирую отчет благодаря СКД, прописываю в запросе все параметры. Проблемы что стандартными параметрами некрасивы и не подходят. Реквизиты формы куда больше нравятся.
(24)ну так в чем проблема-то? передай значения реквизитов в параметры формы и делов.
Рассмотрим создание внешнего отчета в 1с 8 без использования системы компоновки данных. Для создания внешнего отчета будем использовать конфигурацию Бухгалтерия 2.0, исходные данные: “Написать отчет по 62 счету бухгалтерского учета в который будут выводится обороты за указанный период в разрезе Контрагентов и Договоров контрагентов.
1. Создание отчета
В первую очередь создадим файл внешнего отчета, для этого зайдем в 1с 8 в режиме Конфигуратор, перейдем в меню Файл -> Новый, либо нажмем на пиктограмму Новый документ.
В списке выберем пункт Внешний отчет. После создания внешнего отчета зададим ему Имя(например ПростейшийОтчет) и сохраним его на диск. Также добавим два реквизита: НачалоПериода и КонецПериодатипа Дата, они понадобятся нам для ограничения временного интервала выборки данных при формировании отчета.
2. Создание макета внешнего отчета
Для формирования отчета в 1с 8 нужен макет, это шаблон для вывода данных в котором задаются все нужные параметры, рисуются таблицы и т.д. Добавим новый макет, для этого в дереве метаданных отчета выберем пункт Макеты и нажмем кнопку Добавить, при создании выберем для макета тип Табличный документ.
В нашем макете будет 4 области:
Приступим к созданию областей макета. Для того что бы создать область в макете выделите нужное количество строк и нажмите Меню Таблица -> Имена -> Назначить имя(Либо Ctrl + Shift + N). В область Шапканапишем наименование отчета: Обороты 62 счета, нарисуем при помощи инструмента Границы шапку отчета, а так же зададим параметры НачалоПериода и КонецПериода. При помощи параметров в отчет можно выводить нужные данные, мы будем заниматься эти на следующем этапе разработки, а именно при написании программного кода отчета. Что бы создать параметр в макете выберите нужную ячейку, напишите в ней наименование параметра(без пробелов), щелкните по ней правой кнопкой мыши, в открывшемся меню выберите пункт Свойства. В свойствах ячейки на закладке Макет выберите заполнение Параметр.
Получите понятные самоучители по 1С бесплатно:
После этого, в ячейке имя параметра будет заключено в угловые скобки(”<>“). В итоге область Шапкадолжна выглядеть так:
В области ДанныеКонтрагент создадим параметры для вывода наименования контрагента, а так же для прихода и расхода по 62 счету, при помощи инструмента Границы оформим область в виде строки таблицы.
В области ДанныеДоговорКонтрагента создадим параметры для вывода наименования договора, а так же для прихода и расхода по 62 счету, при помощи инструмента Границы оформим область в виде строки таблицы. Сделаем небольшой отступ перед параметром ДоговорКонтрагента(это можно сделать при помощи разбиения и объединения ячеек. Правой кнопкой мыши по ячейке -> Объединить или Разбить ячейку), он нужен для того что бы в отчете было видно, что строка по договору находится ниже по иерархии чем строка по контрагенту.
В области Подвал создадим параметры для итогов по приходу и расходу.
В итоге мы должны получить такой макет:
3. Создание формы отчета
Для вывода данных, задания периода формирования и кнопки Сформировать нашему отчету потребуется форма. Для создания формы найдите в дереве метаданных внешнего отчета пункт Формы и нажмите кнопку Добавить. На первой странице конструктора формы не нужно вносить никаких изменений, следует просто нажать кнопку Далее.
На следующей странице конструктора выберем оба доступных реквизита(НачалоПериода, КонецПериода) для расположения на форме.
В итоге у нас получится вот такая форма:
Но в таком виде она нас не устраивает, внесем в нее некоторые изменения:
- Перетащим кнопку Сформировать из нижней панели отчета на верхнюю(так будет удобнее для пользователя);
- Растянем форму по вертикали и горизонтали;
- Расположим поля НачалоПериода и КонецПериода по горизонтали;
- Добавим на форму элемент управления Поле табличного документа(в него и будет выводиться наш отчет), зададим ему имя ТабДок;
- Создадим кнопку выбора периода(при ее нажатии будет выводиться диалог с удобным выбором нужного периода). Программный код для нее мы писать пока не будем, поэтому просто расположим кнопку рядом с полями периода.
В итоге наша форма будет иметь такой вид:
4. Программирование
После создания формы отчета приступим к программированию. Для начала создадим процедуру вывода диалога выбора периода(кнопку для этого мы уже создали на предыдущем этапе). Щелкнем правой кнопкой мыши на кнопке и выберем пункт меню Свойства, в свойствах кнопки перейдем на закладку События, где при помощи кнопки со значком лупы создадим процедуру Кнопка1Нажатие в модуле формы.
Переключатся между формой и ее модулем можно при помощи закладок внизу формы
Теперь перейдем к написанию кода, который будет формировать и выводить наш отчет. В модуле формы уже есть процедура КнопкаСформироватьНажатие, которая будет выполняться при нажатии кнопки Сформировать, там то мы и будем писать наш код. Начнем с инициализации нужных переменных. В первую очередь создадим переменную для поля табличного документа в которое мы будем выводить данные, это не обязательно, просто запись обращений к нему станет короче, а значит программный код будет более понятен для чтения.
Получим макет внешнего отчета воспользовавшись функцией ПолучитьМакет(<ИмяМакета>), в параметр ему передадим имя макета, и если такой макет существует, то функция его найдет.
После того как макет получен, создадим переменные для каждой из его областей, воспользуемся для этого методом макета ПолучитьОбласть(<ИмяОбласти>).
Очистим поле табличного документа. Это нужно для того что бы при каждом новом формировании отчета старые данные удалялись.
Теперь, когда инициализация переменных закончена, перейдем к поочередному заполнению и выводу областей макета. Начнем с шапки. Если вы помните мы создали в этой области два параметра НачалоПериода и КонецПериода, передадим туда значения периода формирования отчета, для этого воспользуемcя свойством Параметры области макета.
Больше никаких действий с областью Шапка производитель не надо, поэтому выведем ее поле в табличного документа.
Далее займемся написанием запроса к базе данных, при помощи которого возьмем обороты по счету 62 из регистра бухгалтерии Хозрасчетный. Определим переменную, в которой будет находиться наш запрос.
Перед тем как приступить к написанию текста запроса передадим в него нужные параметры. Так как мы пишем запрос по счету 62 бухгалтерского учета, то в первую очередь создадим параметр для него
Так же в запрос необходимо передать период формирования отчета. Не забываем, что для периода формирования у нас есть специальные реквизиты отчета, их и передаем в качестве параметров.
Приступим к написанию текста запроса, делать это будем при помощи конструктора запросов. Во многих учебных пособиях пишут, что нужно уметь писать запрос и вручную и используя конструктор, но на практике это не так. В задачах, которые постоянно встречаются перед программистом 1С, приоритетом является быстрое и качественное написание кода, а при составлении запроса к базе в ручную этого достичь практически невозможно, вы будете тратить кучу драгоценного времени на то, что бы правильно воспроизвести все конструкции запроса, найти опечатки которые вы сделали при написании и т.п.. Поэтому не тратьте зря время на попытки писать запросы вручную, а пользуйтесь конструктором запросом. Он сэкономит ваше время и позволит без особых усилий писать сложные запросы. Что бы начать писать текст запроса напишем в коде:
После этого поставим курсор между кавычками, нажмем правую кнопку мыши и выберем пункт Конструктор запроса. Откроется окно конструктора запроса.
Теперь необходимо выбрать нужную нам таблицу базы данных 1С 8. Нам необходима виртуальная таблица Обороты регистра бухгалтерии Хозрасчетный. Найдем ее в левой части окна конструктора
Переместим ее в область Таблицы и займемся заполнением параметров. Для всех виртуальных таблиц запроса есть специальный набор параметров, позволяющих выбирать нужные данные из основной таблицы(в нашем случае основная таблица Регистр бухгалтерии Хозрасчетный). Откроем окно параметров виртуальной таблицы.
Заполним параметры, периода которые мы передали в запрос. Что бы в тексте запроса использовать параметр следует перед его именем писать символ амперсанда(&)
Осталось заполнить условие по счету бух. учета. Для этого найдем в параметрах виртуальной таблицы строку УсловиеСчета и напишем там
Также можно воспользоваться конструктором составления условий нажав на кнопку с тремя точками.
Поэтому из полей виртуальной таблицы выбираем Субконто1 и Субконто2. Так как нам необходим приход и расход по сумме, то выбираем также поля СуммаОборотДт и СуммаОборотКт
Заполним псевдонимы выбранных нами полей, для этого перейдем на закладку Объединения/Псевдонимы и зададим нужные имена полей.
Так как в нашем отчете данные будут выводиться иерархично(Контрагент на первом уровне, а все его договоры на втором), то настроим вывод данных в иерархии при помощи Итогов. Перейдем в конструкторе на закладку Итоги. В группировочные поля перетащим последовательно Контрагент и ДоговорКонтрагента, а в итоговые Приход и Расход.
На этом работа в конструкторе запроса завершена, нажимаем кнопку ОК и видим, что текст нашего запроса появился в программном коде.
После того как мы закончили написание запроса, приступим к заполнению областей ДанныеКонтрагент, ДанныеДоговорКонтрагент и Подвал. Все эти области мы заполним данными полученными при выполнении запроса. Так как наш запрос содержит группировки(Контрагент и ДоговорКонтрагента) выберем из него данные следующим образом:
Таким образом мы получим записи с итогами по всем контрагентам.
Перед тем как обходить данные выборки при помощи цикла инициализируем переменные предназначенные для подсчета общих итогов по отчету:
Для того чтобы данные отчета выводились с иерархией(и разворотами по ”+“) зададим начало автогруппировки строк табличного документа:
Все приготовления закончены, теперь приступим к обходу результатов запроса. Обход будем осуществлять при помощи цикла Пока
В начале цикла обнулим параметры Приход и Расход области ДанныеКонтрагент. Для чего это нужно? Представим ситуацию, что по контрагенту Дядя Вася, приход 10, а расход 5, а для за ним следующего контрагента Дядя Петя нет ни прихода ни расхода, в таком случае если мы не обнулим параметры Приход и Расход, то по в строке по контрагенту Дядя Петя попадет приход 5 и расход 10.
После этого заполняем область ДанныеКонтрагент данными элемента выборки
После заполнения данным можно выводить область в Табличный документ, Так как мы используем автогруппировку строк, то нужно указать уровень строки в группировке(в нашем отчете будет два уровня, для контрагентов первый для договоров второй).
Теперь для данного контрагента сделаем выборку по его договорам.
Обход будем осуществлять при помощи цикла Пока.
В цикле по договорам контрагентов обнулим параметры Приход и Расход, заполним область ДанныеДоговориз выборки и выведем ее в табличный документ на второй уровень записей.
Также в этом цикле к переменным расчета итоговых значений по приходу и расходу прибавим текущие значения.
На этом вывод данных в области ДанныеКонтрагент, ДанныеДоговорКонтрагент завершен, осталось завершить автогруппировку строк табличного документа.
Полностью циклы отвечающие за вывод данных в области ДанныеКонтрагент и ДанныеДоговорКонтрагент выглядят так:
Осталось вывести итоговые данные в область Подвал и вывести саму область в Табличный документ.
На этом процесс написания внешнего отчета для 1С 8 без использования СКД завершен. Теперь его можно сформировать в режиме 1С:Предприятие 8 и добавить в справочник ВнешниеОбработки Файл отчета рассмотренного в статье вы можете скачать по ссылке.
Смотрите видео по созданию внешней печатной формы для управляемого приложения:
Поговорим об особенностях формирования внешних отчетов в программе 1С Бухгалтерия 8 без применения схемы компоновки информации. За исходную информацию примем необходимость: «Составить отчет по сч. 62 бухучета , в котором в разрезе Контрагентов и их Договоров станут отражаться обороты за определенный период».
Создание внешнего отчета
Прежде всего, перейдем в режим Конфигуратора , выберем подраздел Файл, после кликнем на значок Новый документ или слово Новый, и создадим файл внешнего отчета.
Выберем строку Внешний отчет в перечне. После формирования файлы, укажем его Наименование (допустим, ПростейшийОтвет ) и выполним сохранение на диск. Кроме того, внесем несколько реквизитов вида Дата – КонецПериода и НачалоПериода . Они потребуются для выставления временных рамок при выборке информации в процессе создания отчета.
Создание макета внешнего отчета
Для создания отчета в 1С Бухгалтерия 2.0 понадобится шаблон для вывода информации, или, другими словами, макет, в котором будут составляться таблицы, задаваться необходимые параметры и т.д. Для добавки шаблона кликаем на раздел Макеты, находящийся в дереве мета-данных отчета, после – на Добавить. При формировании макета определяем вид Табличный документ.
В шаблоне – четыре основных части:
- Шапка – в которой станет располагаться название отчета, временной отрезок, за который он создан, шапка таблицы.
- ДанныеКонтрагент – здесь будет находиться информация по контрагентам в таблице.
- ДанныеДоговорКонтрагента – тут мы станем указывать информацию по соглашению с контрагентом, также в таблице.
- Подвал – часть предназначается для указания итоговых параметров по всему отчету для Расхода и Прихода.
Начнем формировать части шаблона. Для этого выделяем необходимое число строк, после чего:
- Нажимаем одновременно сочетание клавиш «N + Shift + Ctrl»;
- Или кликаем на Назначить имя, расположенное в меню Имена в разделе Меню Таблица.
В Шапке прописываем название документа: Обороты сч. 62. Используя инструмент Границы, рисуем шапку отчета, после – задаем параметры. Последние позволяют указывать в отчете необходимые сведения. Но об этом мы поговорим позднее.
Параметр в шаблоне создается путем выбора необходимой ячейки и указания в ней (без пробелов) названия параметра. После нужно будет нажать на ячейку, используя правую кнопку мышки, и в выпавшем списке кликнуть на строчку Свойства. Выберите заполнение Параметр в закладке Макета в свойствах ячейки.
В результате название параметра в ячейке окажется окруженным скобками (<>). Вид получившейся Шапки должен быть таким:
В части ДанныеКонтрагент задаем параметры для указания названия контрагента, и для Расхода и Прихода по сч. 62. С этой целью используем инструмент Границы, оформляя часть как строку таблицы.
В части ДанныеДоговорКонтагент определяем парамаметры для указания названия соглашения, Расхода и Прихода по сч. 62. С этой целью используем инструмент Границы, оформляя часть как строку таблицы. Выполняем незначительный отступ перед параметром ДоговорКонтрагент (разбейте и соедините ячейки, работая с правой кпонкой мышки). Отступ потребуется для того, чтобы в документе было заметно, что строчка по соглашению располагается ниже по иерархии, в сравнении со строчкой по контагенту .
В части Подвал указываем параметры для результатов Расхода и Прихода.
В результате должен появиться шаблон следующего вида:
Создание формы отчета
Форма необходима для появления кнопки Формировать, указания срока формирования и внесения информации. Получить ее можно, перейдя к дереву с мета-данными и выбрав в нем раздел Форма. Кликайте на Добавить. На 1-ой странице конструктора для создания форм никакие корректировки не нужны. Кликайте сразу на Далее.
На новой странице указывайте для размещения на форме два реквизита – КонецПериода и НачалоПериода .
В результате будет показана форма следующего вида:
Этот вид формы нам не подходит, изменим его:
- Перенесем в верхнюю часть панели кнопку Сформировать, пока что расположенную внизу;
- Вытянем форму горизонтально и вертикально;
- Разместим по горизонтили КонецПериода и НачалоПериода ;
- Добавим Поле табличного документа (элемент управления) в форму. Поле потребуется нам для вывода отчета. Укажем его название – ТабДок ;
- Создадим кнопку для определения периода (при клике на нее станет показываться окно выбора необходимого периода). Заниматься написанием программного кода для этой кнопки мы сейчас не станем. Размещаем ее около полей периода.
В результате указанных действий форма выглядит так:
Программирование
Переходить к программированию можно после формирования формы. Выводим окно выбора периода. Нажимаем на кнопку правой кнопкой мышки, переходим в раздел Свойства – здесь выбираем События (в этом меню, используя символ лупы, в модуле формы мы создадим процедуру Кнопка-1Нажатие).
Для переключения между модулем и самой формой можно использовать расположенные в нижней части закладки.
Вызвать окно выбора периода можно, используя стандартный модуль ОбработчикНастройкаПериодаНажатие , расположенный в меню РаботаСДиалогами . Здесь в качестве параметров необходимо передать отчетные реквизиты КонецПериода и НачалоПериода .
Приступаем к программированию – нам нужен код для формирования и вывода отчета. Используем уже имеющуюся процедуру КнопкаСформироватьНажатие . Она станет осуществляться при клике на Сформировать.
Прежде всего, нам нужна переменная для поля таблицы-документа, в котором будут указываться данные.
ТабДок = ЭлементыФормы . ТабДок
Создался шаблон. Используя ПолучитьМакет (< ИмяМакета >), в параметр ему присвоим имя шаблона. При существовании такого шаблона, система отыщет его.
Макет = ПолучитьМакет («Макет»)
Оформляем переменные для всех областей шаблона. Используем макет ПолучитьОбласть (< ИмяОбласти >).
ОбластьШапка = Макет. ПолучитьОбласть («Шапка»)
ОбластьПодвал = Макет. ПолучитьОбласть («Подвал»);
ОбластьДанныеДоговор =Макет. ПолучитьОбласть (« ДанныеДоговор »)
ОбластьДанныеКонтрагент = Макет. ПолучитьОбласть (« ДанныеКонтрагент »).
Проводим очистку поля таблицы-документа. После этого каждый новый сформированный отчет станет удалять прежнюю информацию.
По завершению инициализации переменных, начинаем по очереди заполнять и выводить части шаблона – с Шапки. У Шапки есть КонецПериода и НачалоПериода – зададим тут показатели периода формирования документа. С этой целью используем Параметры области макета.
КонецПериода = ОбластьШапка .Параметры. КонецПериода
НачалоПериода = ОбластьШапка .Параметры. НачалоПериода
Другие действия с частью не нужны: убираем Шапку в поле таблицы-документа.
ТабДок .Вывести( ОбластьШапка )
Пишем запрос для базы данных, который позволит получать обороты по сч. 62 из бух . регистра Хозрасчетный. Указываем переменную для расположения запроса.
Запрос = новый Запрос.
Перенесем необходимые параметры в запрос перед написанием текста. Мы создаем запрос по сч. 62 бухучета , значит, прежде всего, нам нужен параметр для него.
Запрос. УстановитьПараметр («Счет62», ПланыСчетов .Хозрасчетный. НайтиПоКоду («62»)).
Теперь в запрос нужно перенести период создания отчета. Помните, что для периода формирования существуют соответствующие реквизиты. Перенесем их как параметры.
Запрос. УстановитьПараметр (« КонецПериода », КонецПериода )
Запрос. УстановитьПараметр (« НачалоПериода », НачалоПериода )
Используя конструктор запросов, создаем текст запроса. Рекомендуем отказаться от попытки написания запросов вручную, и всегда использовать конструктор, который не может допустить ошибку и опечатку. Вы сэкономите силы и время даже при создании наиболее сложных запросов. В коде указываем:
Далее наводим курсор мышки между кавычками, кликаем правой клавишей мышки и определяем строку Конструктор запроса. Откроется нужное нам окошко.
Сейчас нужно указать необходимую таблицу базы данных утилиты. Наша таблица должна быть виртуальной - Обороты регистра бухгалтерии Хозрасчетный. В окошке конструктора она располагается слева.
Переносим таблицу в часть Таблица и приступим к вводу параметров. Для любой виртуальной таблицы запроса имеется особый комплект параметров, воспользовавшись которыми, можно находить необходимые сведения в главной таблице. В нашем примере главной таблицей будет Регистр бухгалтерии Хозрасчетный. Открываем окошко параметров виртуальной таблицы.
Указываем параметры и периоды , которые ранее переносились в запрос. Для того, чтобы в тексте запроса можно было применить параметр, необходимо перед его названием указывать & (знак амперсанда ).
Теперь нужно оформить условие по сч. 62 бухгалтерского учета. С этой целью ищем УсловиеСчета в параметрах виртуальной таблицы, и пишем условие в нем.
Счет В ИЕРАРХИИ (&Счет62)
Кроме того, можно использовать Конструктор для формирования условий. Кликните на кнопку с 3 точками.
После этого на виртуальную таблицу больше не нужно будет накладывать никаких условий. Дальше кликаем на кнопку ОК, расположенную в окошке с параметрами виртуальной таблицы. После – определяем необходимые нам поля из таблички Хозрасчетной.Обороты. в частности требуются Расход и Приход, Договор контрагента и Контрагент. Просмотреть перечень полей, возможных в выбранной сейчас таблице, можно, кликнув на значок «+» (он располагается около наименования таблицы). Переносим необходимые поля в правую часть конструктора запросов (название части аналогичное – ПОЛЯ). Если вы перейдете в план счетов бухучета , то обнаружите, что для сч. 62 аналитика по ДоговоруКонтрагента — Субконто2, а по Контрагенту — это Субконто1.
Соответственно, из полей виртуальной таблички нам нужны Субконто2 и Субконто1. В связи с необходимостью Расхода и Прихода по сумме, дополнительно треуются поля СуммаОборотКт и СуммаОборотДт .
Оформив наименования определенных сейчас полей. С этой целью необходимо открыть меню Объединения/Псевдонимы, и указать необходимые названия полей.
В связи с тем, что в формируемом нами отчете информация станет указываться в соответствии с иерархией (соглашения с контрагентами будут выходить на уровне, перед которым будет располагаться уровень самих контрагентов), нужно настроить демонстрацию информации в иерархии, используя Итоги. Открываем подраздел Итоги в конструкторе. Переносим в поля группировок один за другим Контрагент и ДоговорКонтрагента , далее - итоговые Приход и Расход.
Все необходимые процедуры в редакторе выполнены. Остается кликнуть на кнопку ОК и убедиться в том, что в программном коде отражается текст только что сформированного запроса. Вид текста должен быть следующим:
| ХозрасчетныйОбороты .Субконто1 КАК Контрагент,
| ХозрасчетныйОбороты .Субконто2 КАК ДоговорКонтрагента ,
| ХозрасчетныйОбороты . СуммаОборотДт КАК Приход,
| ХозрасчетныйОбороты . СуммаОборотКт КАК Расход
| РегистрБухгалтерии .Хозрасчетный.Обороты(& НачалоПериода , & КонецПериода , , Счет В ИЕРАРХИИ (&Счет62), , , , ) КАК ХозрасчетныйОбороты
По окончанию формирования запроса, необходимо оформить части Подвал, ДанныеДоговорКонтрагент и ДанныеКонтрагент . Все указанные части нужно оформлять, указывая информацию, полученную при проведении запроса. В связи с тем, что в запросе есть группирование (в частности, ДоговорКонтрагента и Контрагент), указываем для него информацию таким путем:
ВыборкаКонтрагент = Запрос.Выполнить().Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
В результате у нас будут записи с результатом по каждому контрагенту.
Прежде, чем обходить информацию выборки, используя цикл, инициализируем переменные, которые предназначаются для расчета всех результатов отчета:
Для корректного вывода данных с учетом иерархии и разворотами по знаку «+», указываем начало автоматической группировки строчек документа-таблицы:
Все предварительные работы завершены. Следует начать обходить итоги запроса. Для обхода потребуется использовать цикл Пока:
Пока ВыборкаКонтрагент .Следующий() Цикл
Аннулируем параметры Расход и Приход области ДанныеКонтрагент в самом начале цикла. Что это нам даст? Предположим, что по поставщику, назовем его Х, расход составляет 10, а приход 20. У следующего за ним поставщика, назовем его Н, расход и приход отсутствуют полностью. При аннулировании параметров Расхода и Прихода в такой ситуации в строке по поставщику Н окажутся данные поставщика Х – расход 10 и приход 20.
ОбластьДанныеКонтрагент .Параметры.Приход = 0;
ОбластьДанныеКонтрагент .Параметры.Расход = 0;
Теперь оформляем данными элемента выборки часть ДанныеКонтрагент
ЗаполнитьЗначенияСвойств ( ОбластьДанныеКонтрагент .Параметры, ВыборкаКонтрагент );
Оформив данные, можно выводить часть в Табличный документ. Т.к. мы работаем с автоматическим группированием строчек, необходимо определить степень строки в группировке (в нашем случае у отчета окажется 2 степени, для договоров контрагентов – второго уровня, для самих контрагентов – первого уровня).
ТабДок .Вывести( ОбластьДанныеКонтрагент ,1);
После для указанного контрагента нужно выполнить выборку по его соглашениям:
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент .Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
Используем цикл Пока для выполнения обхода:
Пока ВыборкаДоговорКонтрагента .Следующий() Цикл
Обнуляем параметры Расход и Приход в цикле по соглашениям контрагентов. Оформляем часть ДанныеДоговора из выборки и выносим эту часть на 2-ой уровень записей в таблицу-документ:
ОбластьДанныеДоговор .Параметры.Приход = 0;
ОбластьДанныеДоговор .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеДоговор .Параметры, ВыборкаДоговорКонтрагента );
ТабДок .Вывести( ОбластьДанныеДоговор ,2);
Кроме того, к переменным расчета итоговых показателей по Расходу и Приходу в данном цикле присоединим нынешние показатели.
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента .Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента .Расход;
После этого вынос данных в части ДанныеДоговорКонтрагент и ДанныеКонтрагент будет закончен. Потребуется только окончить автоматическую группировку строчек таблицы-документа:
Циклы, ответственные за демонстрацию информации в частях документа ДанныеДоговорКонтрагент и ДанныеКонтрагент , целиком станут иметь следующий вид:
Пока ВыборкаКонтрагент .Следующий() Цикл
ОбластьДанныеКонтрагент .Параметры.Приход = 0;
ОбластьДанныеКонтрагент .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеКонтрагент .Параметры, ВыборкаКонтрагент );
ТабДок .Вывести( ОбластьДанныеКонтрагент ,1);
ВыборкаДоговорКонтрагента = ВыборкаКонтрагент .Выбрать( ОбходРезультатаЗапроса . ПоГруппировкам );
Пока ВыборкаДоговорКонтрагента .Следующий() Цикл
ОбластьДанныеДоговор .Параметры.Приход = 0;
ОбластьДанныеДоговор .Параметры.Расход = 0;
ЗаполнитьЗначенияСвойств ( ОбластьДанныеДоговор .Параметры, ВыборкаДоговорКонтрагента );
ТабДок .Вывести( ОбластьДанныеДоговор ,2);
ИтогоПриход = ИтогоПриход + ВыборкаДоговорКонтрагента .Приход;
ИтогоРасход = ИтогоРасход + ВыборкаДоговорКонтрагента .Расход;
На завершающем этапе необходимо перенести итоговые сведения в часть Подвал и перевести сам Подвал в таблицу-документ:
ОбластьПодвал .Параметры. ИтогоПриход = ИтогоПриход ;
ОбластьПодвал .Параметры. ИтогоРасход = ИтогоРасход ;
ТабДок .Вывести( ОбластьПодвал );
После этого процедура формирования внешнего отчета в программе 1С Бухгалтерия 2.0 версия 8 без применения схемы компоновки данных будет полностью окончена. С этой минуты отчет можно будет создавать, используя рабочий режим утилиты 1С версия 8, и добавлять в справочник ВнешниеОбработки .
Читайте также: