1с заполнитьзначениясвойств параметры макета

Обновлено: 03.07.2024

Шаблон я заготовил еще на БСП 2.х, сейчас актуальна БСП 3.0.х – шаблон менял с развитием БСП. Сравнивая шаблоны получилось очень наглядно как «1С» реализует концепцию «вести разработку как бы сбоку, оставляя типовые объекты на поддержке, а в идеале на замке». Для этого развивает программный интерфейс подсистем БСП, что позволяет свести к минимуму количество объектов в расширении конфигурации.

Для БСП 2.х и БСП 3.0 макет табличного документа и алгоритм формирования печатной формы располагаю в объекте обработка, расширения конфигурации. «Обычно макет печатной формы располагается при объекте, но если макет является общим для двух и более объектов, то либо его следует располагать в обработке, либо это должен быть общий макет.» [ИТС, БСП гл. 3.38 Печать]. Для меня важно оставить конфигурацию «девственной» и минимум объектов заимствовать в расширение конфигурации, поэтому в обработке.

Если на БСП 2.х укладываемся в 7 шагов:

  1. Создаем Расширение;
  2. Создаем обработку;
  3. Создаем макет в обработке;
  4. Заимствуем сам объект (например, документ), для которого требуется добавить команду печати;
  5. Заимствуем Группу команд – «Печать»;
  6. Создаем команду у обработки и определяем свойства «Тип параметра команды» (шаг 4) и «Группа» (шаг 5);
  7. В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.

После этого в командной панели формы объекта (например, документа) и формы журнала, в меню «Печать» появится созданная команда.


Рис. 1 Расширение конфигурации на БСП 2.х

то на БСП 3.0 получаем желаемое за 4-е шага

  1. Создаем Расширение;
  2. Создаем обработку;
  3. Создаем макет в обработке;
  4. В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.

Благодаря развившемуся программному интерфейсу подсистемы «Печать» в расширении конфигурации ничего заимствовать более не нужно.


Рис. 2 Расширение конфигурации на БСП 3.0

Повинуясь ИТС, подсистему «ПодключаемыеОтчетыИОбработки» заимствуем и в нее включаем созданную обработку.

Вот тот программный интерфейс БСП 3.0, благодаря которому нет более надобности заимствовать «Группу команд», «Документ» и создавать команды у обработки. Следующие процедуры, располагаем в модуле менеджера обработки.

Процедуру формирования печатной формы располагаем в ММ обработки

До процедуры с кодом формирования конкретного табличного документа, я заворачиваю в метод «обертку» ПечатнаяФорма(), в который вынес общие действия характерные для формирования любого табличного документа и обработки массива ссылок, которые нужно распечатать.

В самой процедуре формирования печатной формы я придерживаюсь следующей структуры:

  1. Определяю параметры печати и макет табличного документа;
  2. Запросом выбираю нужные данные;
  3. Результатами выборки заполняю структуру ДанныеПечати и таблицы значений данными табличных частей. Причем, имена ключей структуры и полей таблицы значений совпадают с именами параметров макета;
  4. Области макета собираю в массив и обхожу его заполняя параметры макета из созданных коллекций на предыдущем шаге, на каждом витке цикла выводя в результирующий табличный документ. Для повышения устойчивости кода заполняю методом ЗаполнитьЗначенияСвойств().

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

После того как я себе «зарубил на носу» разрабатывать «так», когда приходят задачи изменить печатные формы не «так» разработанные (например, мной давно) теперь я испытываю когнитивный диссонанс J . Собрал этот паттерн для себя, может, кто еще проникнется.

//тол+ Обновление публикации от 20.02.2020 г.

Клиентский контекст при формировании печатной формы

З арекся, не добавлять клиентский контекст, если не наберет +100, но статья набрала.

«В отдельных случаях для формирования некоторых печатных форм может потребоваться клиентский контекст. Например, для запроса дополнительных параметров печатной формы у пользователя непосредственно перед печатью» [ИТС, БСП гл. 3.38 Печать]

Как (было) на БСП 2.х?

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

Форму(ы) для клиентского контекста, располагаем в той же обработке в расширении. Нужные типы для реквизитов формы, заимствуем из основной конфигурации. Например, справочник «ВидыЦен».

Последовательность действий такая:

  1. Добавляем команду в обработку;
  2. Одной строкой кода, в обработчике команды открываем форму;
  3. Из формы возвращаем параметры;
  4. Передаем управление в метод Печать() модуля менеджера обработки, формируем табличный документ на сервере;


Рис. 3 Заход в клиентский контекст на БСП 2.0

Далее вендор объявил «священную войну» модальности, и я стал под эти знамена. Вроде ничего сложного, но в меня плохо зашел «отказ от модальности», может потому, что это «костыль» от самой 1С что бы подружиться с браузерами.

Отказ от модальности заставил усложнить код реализующий заход в клиентский контекст:

  1. В обработчике команды заменяем модальное открытие на не модальный вызов;
  2. В клиентской форме при создании блокируем окно владельца;


Рис. 4 Заход в клиентский контекст на БСП 2.0 + отказ от модальности

Как теперь можно на БСП 3.х?

  1. Достаточно в процессе создания команды, в модуле менеджера обработки в процедуре «ДобавитьКомандыПечати» определить свойство «Обработчик», указав имя экспортируемой функции модуля клиентской формы.
  2. Если предполагается формирование печатной формы на сервере, из клиентского контекста передаем управление в метод Печать() модуля менеджера обработки.


Рис. 5 Заход в клиентский контекст на БСП 3.х

Реквизит формы в расширении определяем кодом, ну что бы уже «ваще не гадить»


Рис. 6 Программное создание реквизита формы.

БСП 3.х. рулит!

П.С. Попытался сложить окна в EDT вертикально, что бы нарезать скрины … и не смог:( Конфигуратор forever!

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

Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("КолДней", КолДней); //Надо избавится от него.
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Организация", Организация);

Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;

Выборка = Результат.Выбрать();
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");


Пока Выборка.Следующий() Цикл
ОбластьДанных = Макет.ПолучитьОбласть("Данные");
ОбластьДанных.Параметры.Заполнить(Выборка);
Макет.Вывести(ОбластьДанных);
КонецЦикла;

Рассмотрим создание внешнего отчета в 1с 8 без использования системы компоновки данных. Для создания внешнего отчета будем использовать конфигурацию Бухгалтерия 2.0, исходные данные: “Написать отчет по 62 счету бухгалтерского учета в который будут выводится обороты за указанный период в разрезе Контрагентов и Договоров контрагентов.

1. Создание отчета

В первую очередь создадим файл внешнего отчета, для этого зайдем в 1с 8 в режиме Конфигуратор, перейдем в меню Файл -> Новый, либо нажмем на пиктограмму Новый документ.

Пиктограмма Новый документ

В списке выберем пункт Внешний отчет. После создания внешнего отчета зададим ему Имя(например ПростейшийОтчет) и сохраним его на диск. Также добавим два реквизита: НачалоПериода и КонецПериодатипа Дата, они понадобятся нам для ограничения временного интервала выборки данных при формировании отчета.

Создание реквизитов внешнего отчета

2. Создание макета внешнего отчета

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

Конструктор макета 1С 8

В нашем макете будет 4 области:

Приступим к созданию областей макета. Для того что бы создать область в макете выделите нужное количество строк и нажмите Меню Таблица -> Имена -> Назначить имя(Либо Ctrl + Shift + N). В область Шапканапишем наименование отчета: Обороты 62 счета, нарисуем при помощи инструмента Границы шапку отчета, а так же зададим параметры НачалоПериода и КонецПериода. При помощи параметров в отчет можно выводить нужные данные, мы будем заниматься эти на следующем этапе разработки, а именно при написании программного кода отчета. Что бы создать параметр в макете выберите нужную ячейку, напишите в ней наименование параметра(без пробелов), щелкните по ней правой кнопкой мыши, в открывшемся меню выберите пункт Свойства. В свойствах ячейки на закладке Макет выберите заполнение Параметр.

Получите понятные самоучители по 1С бесплатно:

Создание параметра в макете отчета

После этого, в ячейке имя параметра будет заключено в угловые скобки(”<>“). В итоге область Шапкадолжна выглядеть так:

Область Шапка макета отчета

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

Область ДанныеКонтрагент макета отчета

В области ДанныеДоговорКонтрагента создадим параметры для вывода наименования договора, а так же для прихода и расхода по 62 счету, при помощи инструмента Границы оформим область в виде строки таблицы. Сделаем небольшой отступ перед параметром ДоговорКонтрагента(это можно сделать при помощи разбиения и объединения ячеек. Правой кнопкой мыши по ячейке -> Объединить или Разбить ячейку), он нужен для того что бы в отчете было видно, что строка по договору находится ниже по иерархии чем строка по контрагенту.

Область ДанныеДоговорКонтрагента макета отчета

В области Подвал создадим параметры для итогов по приходу и расходу.

Область Подвал макета отчета

В итоге мы должны получить такой макет:

Макет отчета по 62 счету

3. Создание формы отчета

Для вывода данных, задания периода формирования и кнопки Сформировать нашему отчету потребуется форма. Для создания формы найдите в дереве метаданных внешнего отчета пункт Формы и нажмите кнопку Добавить. На первой странице конструктора формы не нужно вносить никаких изменений, следует просто нажать кнопку Далее.

Конструктор формы отчета

На следующей странице конструктора выберем оба доступных реквизита(НачалоПериода, КонецПериода) для расположения на форме.

В итоге у нас получится вот такая форма:

Форма отчета 1с 8

Но в таком виде она нас не устраивает, внесем в нее некоторые изменения:

  • Перетащим кнопку Сформировать из нижней панели отчета на верхнюю(так будет удобнее для пользователя);
  • Растянем форму по вертикали и горизонтали;
  • Расположим поля НачалоПериода и КонецПериода по горизонтали;
  • Добавим на форму элемент управления Поле табличного документа(в него и будет выводиться наш отчет), зададим ему имя ТабДок;
  • Создадим кнопку выбора периода(при ее нажатии будет выводиться диалог с удобным выбором нужного периода). Программный код для нее мы писать пока не будем, поэтому просто расположим кнопку рядом с полями периода.

В итоге наша форма будет иметь такой вид:

4. Программирование

После создания формы отчета приступим к программированию. Для начала создадим процедуру вывода диалога выбора периода(кнопку для этого мы уже создали на предыдущем этапе). Щелкнем правой кнопкой мыши на кнопке и выберем пункт меню Свойства, в свойствах кнопки перейдем на закладку События, где при помощи кнопки со значком лупы создадим процедуру Кнопка1Нажатие в модуле формы.

Создание процедуры отрабатывающей нажатие на кнопку

Переключатся между формой и ее модулем можно при помощи закладок внизу формы

Переключение между формой и ее модулем

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

Получим макет внешнего отчета воспользовавшись функцией ПолучитьМакет(<ИмяМакета>), в параметр ему передадим имя макета, и если такой макет существует, то функция его найдет.

После того как макет получен, создадим переменные для каждой из его областей, воспользуемся для этого методом макета ПолучитьОбласть(<ИмяОбласти>).

Очистим поле табличного документа. Это нужно для того что бы при каждом новом формировании отчета старые данные удалялись.

Теперь, когда инициализация переменных закончена, перейдем к поочередному заполнению и выводу областей макета. Начнем с шапки. Если вы помните мы создали в этой области два параметра НачалоПериода и КонецПериода, передадим туда значения периода формирования отчета, для этого воспользуемcя свойством Параметры области макета.

Больше никаких действий с областью Шапка производитель не надо, поэтому выведем ее поле в табличного документа.

Далее займемся написанием запроса к базе данных, при помощи которого возьмем обороты по счету 62 из регистра бухгалтерии Хозрасчетный. Определим переменную, в которой будет находиться наш запрос.

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

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

Приступим к написанию текста запроса, делать это будем при помощи конструктора запросов. Во многих учебных пособиях пишут, что нужно уметь писать запрос и вручную и используя конструктор, но на практике это не так. В задачах, которые постоянно встречаются перед программистом 1С, приоритетом является быстрое и качественное написание кода, а при составлении запроса к базе в ручную этого достичь практически невозможно, вы будете тратить кучу драгоценного времени на то, что бы правильно воспроизвести все конструкции запроса, найти опечатки которые вы сделали при написании и т.п.. Поэтому не тратьте зря время на попытки писать запросы вручную, а пользуйтесь конструктором запросом. Он сэкономит ваше время и позволит без особых усилий писать сложные запросы. Что бы начать писать текст запроса напишем в коде:

После этого поставим курсор между кавычками, нажмем правую кнопку мыши и выберем пункт Конструктор запроса. Откроется окно конструктора запроса.

Окно конструктора запроса 1С 8

Теперь необходимо выбрать нужную нам таблицу базы данных 1С 8. Нам необходима виртуальная таблица Обороты регистра бухгалтерии Хозрасчетный. Найдем ее в левой части окна конструктора

Выбор виртуальной таблицы Хозрасчетный.Обороты в конструкторе запроса

Переместим ее в область Таблицы и займемся заполнением параметров. Для всех виртуальных таблиц запроса есть специальный набор параметров, позволяющих выбирать нужные данные из основной таблицы(в нашем случае основная таблица Регистр бухгалтерии Хозрасчетный). Откроем окно параметров виртуальной таблицы.

Открытие окна параметров виртуальной таблицы

Заполним параметры, периода которые мы передали в запрос. Что бы в тексте запроса использовать параметр следует перед его именем писать символ амперсанда(&)

Заполнение параметров периода виртуальной таблицы запроса 1С 8

Осталось заполнить условие по счету бух. учета. Для этого найдем в параметрах виртуальной таблицы строку УсловиеСчета и напишем там

Также можно воспользоваться конструктором составления условий нажав на кнопку с тремя точками.

План счетов счет 62

Поэтому из полей виртуальной таблицы выбираем Субконто1 и Субконто2. Так как нам необходим приход и расход по сумме, то выбираем также поля СуммаОборотДт и СуммаОборотКт

Выбор полей таблицы в конструкторе запросов

Заполним псевдонимы выбранных нами полей, для этого перейдем на закладку Объединения/Псевдонимы и зададим нужные имена полей.

Псевдонимы для полей запроса 1С 8

Так как в нашем отчете данные будут выводиться иерархично(Контрагент на первом уровне, а все его договоры на втором), то настроим вывод данных в иерархии при помощи Итогов. Перейдем в конструкторе на закладку Итоги. В группировочные поля перетащим последовательно Контрагент и ДоговорКонтрагента, а в итоговые Приход и Расход.

Создание итогов в конструкторе запросов 1с 8

На этом работа в конструкторе запроса завершена, нажимаем кнопку ОК и видим, что текст нашего запроса появился в программном коде.

После того как мы закончили написание запроса, приступим к заполнению областей ДанныеКонтрагент, ДанныеДоговорКонтрагент и Подвал. Все эти области мы заполним данными полученными при выполнении запроса. Так как наш запрос содержит группировки(Контрагент и ДоговорКонтрагента) выберем из него данные следующим образом:

Таким образом мы получим записи с итогами по всем контрагентам.

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

Для того чтобы данные отчета выводились с иерархией(и разворотами по ”+“) зададим начало автогруппировки строк табличного документа:

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

В начале цикла обнулим параметры Приход и Расход области ДанныеКонтрагент. Для чего это нужно? Представим ситуацию, что по контрагенту Дядя Вася, приход 10, а расход 5, а для за ним следующего контрагента Дядя Петя нет ни прихода ни расхода, в таком случае если мы не обнулим параметры Приход и Расход, то по в строке по контрагенту Дядя Петя попадет приход 5 и расход 10.

После этого заполняем область ДанныеКонтрагент данными элемента выборки

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

Теперь для данного контрагента сделаем выборку по его договорам.

Обход будем осуществлять при помощи цикла Пока.

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

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

На этом вывод данных в области ДанныеКонтрагент, ДанныеДоговорКонтрагент завершен, осталось завершить автогруппировку строк табличного документа.

Полностью циклы отвечающие за вывод данных в области ДанныеКонтрагент и ДанныеДоговорКонтрагент выглядят так:

Осталось вывести итоговые данные в область Подвал и вывести саму область в Табличный документ.

На этом процесс написания внешнего отчета для 1С 8 без использования СКД завершен. Теперь его можно сформировать в режиме 1С:Предприятие 8 и добавить в справочник ВнешниеОбработки Файл отчета рассмотренного в статье вы можете скачать по ссылке.

Смотрите видео по созданию внешней печатной формы для управляемого приложения:

Довольно часто встречаются задачи, когда нужно организовать программное заполнение формы какого-то объекта. Скажем, у нас есть форма документа, на форме есть реквизиты, и нам нужно сделать команду, которая заполнит эти реквизиты. Данные для заполнения предполагается получать запросом.

Если конфигурация типовая, то, наверное, самый простой способ решения такой задачи – создать внешнюю обработку вида "Заполнение объекта".

Заполнение формы объекта с помощью внешней обработки

Строка с соответствующим параметром в модуле обработки:

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

  • ВызовСерверногоМетода – обработчик команды располагается в модуле обработки;
  • ВызовКлиентскогоМетода – обработчик команды располагается в модуле формы обработки;
  • ЗаполнениеФормы – обработчик команды располагается в модуле обработки и позволяет работать с данными формы. Также позволяет вызвать серверную процедуру из модуля формы объекта. При этом можно заполнить форму не записывая объект.

Возможность заполнить форму не записывая объект – это то, что нужно. Ведь пользователь скорее всего ожидает, что по нажатию кнопки форма заполнится, а записываться будет позднее, после проверки результата заполнения. Поэтому выбираем тип команды – ЗаполнениеФормы.

В конечном итоге код в модуле обработки будет выглядеть примерно так:

В общем счёте задача решена. Однако, у такого способа есть небольшой недостаток – команда на форме размещается в определённом месте, а не там, где мы хотим её разместить. К примеру, на форме уже есть группа команд, включающая в себя команды заполнения, и мы хотели бы видеть новую команду в этой группе, но при подключении обработки команда на форме будет расположена отдельно от группы.

В связи с этим можно реализовать другой способ: добавить команду непосредственно в форму объекта – либо в основной конфигурации, либо в расширении – а обработчик команды организовать в модуле формы.

Заполнение формы объекта посредством обработчика команды в модуле формы

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

Над серверной процедурой нужно подумать. В ней у нас будет объект формы с типом "ДанныеФормыСтуктура". Что-либо менять или заполнять в этом объекте не получится, возникнет ошибка "Объект недоступен для изменения".

Можно получить объект документа Объект . Ссылка . ПолучитьОбъект () , и заполнить его данными. Но тогда, чтобы увидеть данные в открытой форме, объект придётся записать, а это не очень хорошо.

Будет лучше, если данные добавятся без записи, и мы можем это сделать с помощью метода РеквизитФормыВЗначение . Этот метод преобразует реквизит формы в объект прикладного типа, и вот этот объект прикладного типа мы можем заполнить, а затем, уже заполненный, преобразовать обратно с помощью метода ЗначениеВРеквизитФормы . Выглядеть это будет примерно так:

Читайте также: