Цель лекции: научиться разрабатывать печатные формы документов, работать с
В предыдущей лекции мы создали документ ПоступлениеМатериалов, который используется для отражения в учетной системе информации о поступивших материалах. Работа над документом еще не завершена. В частности, обычно документы имеют не только электронные, но и печатные представления.
В реальных учетных системах, построенных на базе 1С:Предприятие 8 работа с некоторыми документами строится следующим образом. Документ заполняют, сохраняют, распечатывают. После распечатки выполняются какие-либо действия, предусмотренные документом, на печатной форме документа собираются необходимые подписи, после чего документ, уже электронный, открывают, проверяют соответствие электронной и печатной версий и проводят.
Для создания печатной формы документа используют
На первом этапе происходит разработка
Второй этап разработки печатной формы - это создание программного кода, который на основе данных документа и
Разработку печатных форм можно ускорить, воспользовавшись так называемым конструктором печати. Для этого откроем в конфигураторе окно редактирования документа ).
(рис 6.1) Вкладка Макеты окна редактирования свойств документаПоявившееся окно конструктора печати, проведет вас через несколько шагов, необходимых для создания печатной формы. А именно, на первом шаге нужно указать имя процедуры печати и ее расположение. По умолчанию процедура называется ) и нажмем на кнопку Далее.
(рис 6.2) Начало работы с конструктором печатиВо втором окне конструктора (рис 6.3) нам предлагается задать, какие реквизиты документа попадут в шапку печатной формы, то есть - в ее верхнюю часть.
(рис 6.3) Конструктор печати документа, задание параметров шапки печатной формыВ правой части формы, которая называется Реквизиты документа можно найти список реквизитов документа, в левой части, которая представляет собой список реквизитов шапки, отображаются реквизиты документа, перенесенные туда либо двойным щелчком, либо - с помощью кнопки с изображением стрелки. Для того, чтобы перенести все реквизиты в шапку - достаточно нажать на кнопку с двумя стрелками. Перенесем в шапку печатной формы все реквизиты документа кроме реквизита СтоимостьМатериалов. Его мы прибережем для того, чтобы вывести в подвале - то есть - в нижней части печатной формы.
Нажав в очередной раз кнопку вы можете видеть состояние третьего окна конструктора печати после того, как мы настроили его таким образом, чтобы на печать выводились все доступные реквизиты табличной части документа.
(рис 6.4) Конструктор печати документа, задание параметров табличной части печатной формыСледующее, четвертое, окно конструктора, содержит набор полей для вывода в подвале. Выберем для отображения в подвале реквизит СтоимостьМатериалов.
Очередное нажатие кнопки .
(рис 6.5) Конструктор печати документа, последнее окно, настройка кнопки вызова процедуры печатиКнопка .
(рис 6.6) Редактор форм и редактор макетовОбратите внимание на то, что на нижней панели управления формы появилась новая кнопка - Печать. Обратите так же внимание на то, что табличный документ, который представляет собой
То, что вы сейчас узнали, сделает достаточно простым знакомство с процедурой печати, которая была сформирована автоматически. Напомним, что при работе конструктора печати мы указали, что хранить эту процедуру следует в модуле формы. Найдем процедуру в модуле формы (вкладка Модуль ). Вот как выглядит текст модуля:
Процедура Печать(Элемент)
//{{_КОНСТРУКТОР_ПЕЧАТИ_ЭЛЕМЕНТ(Печать)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.ПоступлениеМатериалов.ПолучитьМакет("Печать");
// Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
// Шапка
Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.Заполнить(ЭтотОбъект);
ТабДок.Вывести(Шапка);
// Материалы
Область = Макет.ПолучитьОбласть("МатериалыШапка");
ТабДок.Вывести(Область);
ОбластьМатериалы = Макет.ПолучитьОбласть("Материалы");
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
ОбластьМатериалы.Параметры.Заполнить(ТекСтрокаМатериалы);
ТабДок.Вывести(ОбластьМатериалы);
КонецЦикла;
// Подвал
Подвал = Макет.ПолучитьОбласть("Подвал");
Подвал.Параметры.Заполнить(ЭтотОбъект);
ТабДок.Вывести(Подвал);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//}}_КОНСТРУКТОР_ПЕЧАТИ_ЭЛЕМЕНТ
КонецПроцедуры
Поясним программные конструкции, которые были использованы в данной процедуре
ТабДок = Новый ТабличныйДокумент;
В переменную ТабДок записываем ссылку на новый объект типа ТабличныйДокумент. Это именно тот документ, который, после работы процедуры, будет содержать готовую печатную форму. Сразу после создания табличный документ не виден пользователю, то есть все действия, которые мы с ним будем производить дальше, выполняются с невидимым документом. После завершения программного формирования документа, мы сделаем его видимым.
Макет = Документы.ПоступлениеМатериалов.ПолучитьМакет("Печать");
В переменную Макет записываем ссылку на Печать, который принадлежит нашему документу. Будем использовать эту переменную для доступа к
// Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
В этом участке кода мы сначала получаем Заголовок. Фактически, метод ПолучитьОбласть объекта Макет возвращает новый табличный документ, который представляет собой область, полученную по имени или другим способом. Ссылка на документ записывается в переменную Область. Используя метод Вывести объекта ТабДок мы выводим полученную область в наш табличный документ.
// Шапка
Шапка = Макет.ПолучитьОбласть("Шапка");
Шапка.Параметры.Заполнить(ЭтотОбъект);
ТабДок.Вывести(Шапка);
В заголовке, если посмотреть на Шапка.Параметры.Заполнить(ЭтотОбъект); позволяет заполнить ячейки области, содержащие параметры, реквизитами объекта, переданного в качестве параметра (в данном случае мы имеем дело с объектом ЭтотОбъект - он позволяет получить тот документ, с которым мы в данный момент работаем). Соответствия между параметрами и реквизитами документа устанавливаются по именам. Ячейка, содержащая параметр <Номер> будет заполнена реквизитом документа с именем Номер и так далее.
// Материалы
Область = Макет.ПолучитьОбласть("МатериалыШапка");
ТабДок.Вывести(Область);
В данном участке кода мы получаем область, соответствующую шапке таблицы и выводим ее в табличный документ. Далее следует обработка таблицы и ее построчный вывод:
ОбластьМатериалы = Макет.ПолучитьОбласть("Материалы");
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
ОбластьМатериалы.Параметры.Заполнить(ТекСтрокаМатериалы);
ТабДок.Вывести(ОбластьМатериалы);
КонецЦикла;
Здесь мы видим цикл, который перебирает каждую строку табличной части Материалы. На основе каждой из строк (переменная ТекСтрокаМатериалы ) он заполняет параметры области Материалы и выводит ее в табличный документ.
// Подвал
Подвал = Макет.ПолучитьОбласть("Подвал");
Подвал.Параметры.Заполнить(ЭтотОбъект);
ТабДок.Вывести(Подвал);
Подвал выводится уже знакомым вам образом. Далее настраиваются некоторые свойства формируемого документа, влияющие на его внешний вид:
ТабДок.ОтображатьСетку = Ложь; ТабДок.Защита = Ложь; ТабДок.ТолькоПросмотр = Ложь; ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.Показать();
Здесь отключается отображение сетки, обычной для табличных документов, устанавливаются в Ложь свойства документа, отвечающие за его защиту и за запрет редактирования, отключается отображение заголовков, и, после того как все настроено, табличный документ делается видимым - с помощью метода Показать.
Запустим наше
(рис 6.7) Сформированная печатная форма документаДля того чтобы распечатать эту форму, достаточно воспользоваться командой главного меню программы Файл > Печать.
Выше, говоря об устройстве
На данном этапе не будем больше улучшать и дорабатывать документ ПоступлениеМатериалов. Займемся еще одним документом нашей конфигурации.
В соответствии с логикой нашей учетной системы, мы создали документ, который отражает поступление материалов, которые хранятся у определенного материально ответственного лица - сотрудника организации. Теперь создадим документ, который используется для отпуска материалов, вверенных материально-ответственным лицам. Назовем его ОтпускМатериаловМастеру.
Логика бизнес-процесса организации, который мы собираемся автоматизировать с помощью данного документа, такова. К сотруднику, за которым закреплены материалы (назовем его "кладовщик") обращается другой сотрудник (назовем его "мастер"), которому материалы нужны для проведения каких-либо работ. В заказе мастера есть количество требуемых материалов. На основании требования мастера, кладовщик должен передать ему требуемое количество материалов - но не больше, чем за ним числится - и выдать документ, который содержит информацию о количестве и стоимости выданных материалов. Если у одного из кладовщиков не хватает материалов для выдачи мастеру - он может выполнить заказ в пределах своих возможностей, а мастер, в свою очередь, может воспользоваться услугами нескольких кладовщиков.
Материалы отпускают по средней стоимости. Наш документ должен иметь печатную форму, он так же должен проводиться по регистру ОстаткиМатериалов, отражая в нем факт выбытия материалов.
Документ будет иметь следующие реквизиты, табл. 6.1:
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| ПолучательМатериалов | СправочникСсылка.Сотрудники | |
| ОтветственныйСотрудник | СправочникСсылка.Сотрудники | |
| СтоимостьМатериалов | Число | Длина 15, точность 2 |
Документ будет иметь табличную часть Материалы, которая будет иметь следующие реквизиты:
| Имя реквизита | Тип | Параметры типа |
|---|---|---|
| Номенклатура | СправочникСсылка.Номенклатура | |
| Количество | Число | Длина 10, точность 3 |
| Сумма | Число | Длина 10, точность 2 |
Вот как выглядит окно редактирования объекта и форма документа после создания реквизитов и автоматического создания формы, рис 6.8. Напомним, что если какие-либо объекты конфигурации имеют реквизиты, схожие с теми, которые нужны в новых объектах - их можно копировать - это ускоряет работу.
(рис 6.8) Документ Отпуск материалов мастеруПрежде чем заниматься дальнейшей работой над документом, нам нужно модифицировать
(рис 6.9) Дополнительный реквизит регистра накопления ОстаткиМатериаловНе забудем добавить документ ОтпускМатериаловМастеру в список регистраторов регистра ОстаткиМатериалов, установив галочку напротив наименования документа на вкладке Регистраторы окна редактирования свойств регистра.
При вводе информации в табличную часть документа, мы будем заполнять лишь реквизиты Номенклатура и Количество. Сумма для списания будет вычисляться по нажатию специальной кнопки. В частности, при нажатии на эту кнопку будет проверяться, достаточно ли материалов каждого вида числится за ответственным лицом, и, если достаточно - будет рассчитываться средняя стоимость материалов, которые предполагается списать.
Добавим на командную панель формы новую кнопку. Для этого щелкнем мышью по схематичному изображению кнопки в правой части командной панели, в появившемся окне редактирования свойств кнопки введем ее имя - .
(рис 6.10) Добавление и настройка кнопки РассчитатьТеперь заблокируем поле табличной части Сумма от изменений, установим его свойство ТолькоПросмотр. Поле мы собираемся рассчитывать по нажатию на кнопку Рассчитать и заполнять программно.
Если поразмышлять над тем, как реализовать расчет средней стоимости, то, основываясь на тех знаниях, которые у вас уже есть, можно прийти к выводу о том, что нужно выполнить следующую последовательность действий:
Пожалуй, из всех вышеперечисленных операций наибольшую сложность для вас может составить работа с
Процедура ДействияФормыРассчитать(Кнопка)
ОстМатериалов=РегистрыНакопления.ОстаткиМатериалов;
Фильтр=Новый Структура;
Фильтр.Вставить("ЦентрОтветственности", ОтветственныйСотрудник);
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Фильтр.Вставить("Номенклатура", ТекСтрокаМатериалы.Номенклатура);
ТабОстатков = ОстМатериалов.Остатки(,Фильтр,,);
ТекСтрокаТабОстатков = ТабОстатков.Получить(0);
ТекСтрокаМатериалы.Сумма=(ТекСтрокаТабОстатков.Сумма/ТекСтрокаТабОстатков.Количество)
*ТекСтрокаМатериалы.Количество;
КонецЦикла;
СтоимостьМатериалов = Материалы.Итог("Сумма");
КонецПроцедуры
Прежде чем рассматривать процедуру, следует дать некоторые пояснения. Здесь мы пользуемся объектом типа РегистрНакопленияМенеджер, доступ к которому обеспечивается с помощью свойства глобального контекста РегистрыНакопления. То есть, другими словами, для того, чтобы получить доступ к регистру накопления ОстаткиМатериалов, определенному в конфигурации, нам следует обратиться к нему с помощью конструкции РегистрыНакопления.ОстаткиМатериалов. Эта конструкция имеет тип РегистрНакопленияМенеджер.
У менеджера регистра накопления ( ОстМатериалов ) есть различные методы, один из которых - а именно - Остатки() - предназначен для получения остатков. Причем, полный вызов этого метода выглядит так:
Остатки(<Момент времени>, <Отбор>, <Измерения>, <Ресурсы>)
Нас, в данном случае, интересует получение текущих остатков, то есть, остатков на наибольшую дату движения регистра. Поэтому параметр Момент времени мы не используем. Параметры Измерения и Ресурсы мы так же не используем - нам нужно получить остатки по всем измерениям и ресурсам в рамках, заданных параметром Отбор. Параметр Отбор для нас важен, так как мы собираемся получать данные об одном из видов номенклатуры, числящемся за материально ответственным лицом. Параметр Отбор имеет тип Структура. Структура - это набор ключей и соответствующих им значений. В нашем случае структура должна содержать имена измерений регистра, по которым мы хотим получить остатки, и значения, которые нужно отобрать среди указанных измерений. Имена задаются в виде строк, значения имеют тот же тип, что и тип соответствующих измерений.
Данные, полученные из регистра накопления, собраны в таблице значений. Это - таблица, которая имеет несколько строк (в нашем случае это одна строка, нумерация строк начинается с 0) и столбцов. Имена столбцов соответствуют данным, которые хранятся в таблице. В нашем случае таблица будет, кроме прочих, иметь столбцы Сумма и Количество, которые и хранят нужные нам данные.
Теперь рассмотрим процедуру.
ОстМатериалов=РегистрыНакопления.ОстаткиМатериалов;
Записываем в переменную ОстМатериалов ссылку на менеджер регистра ОстаткиМатериалов.
Фильтр=Новый Структура;
В переменную Фильтр запишем ссылку на только что созданную пустую структуру.
Фильтр.Вставить("ЦентрОтветственности", ОтветственныйСотрудник);
Мы планируем получать остатки различных материалов по одному ответственному сотруднику, который указан в шапке документа. Поэтому сразу же вставляем в структуру пару - ключ - "ЦентрОтветственности", значение - ОтветственныйСотрудник.
Обратите внимание на то, что остальные операции процедуры выполняются в цикле.
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Открываем цикл перебора строк табличной части Материалы, записывая ссылку на текущую строку в переменную ТекСтрокаМатериалы.
Фильтр.Вставить("Номенклатура", ТекСтрокаМатериалы.Номенклатура);
Вставляем в структуру еще одну пару Ключ - Значение. Она будет применяться для отбора по номенклатуре, указанной в текущей строке табличной части. Метод Вставить у структур действует следующим образом. Если ключа, указанного при вызове метода, еще нет в структуре, он создается. Если есть - его значение заменяется на то, которое передано при вызове метода. Мы вызываем этот метод столько раз, сколько строк есть в табличной части документа. Получается, что лишь первый вызов создает в структуре ключ "Номенклатура". Последующие вызовы лишь меняют его значение на номенклатуру, указанную в строке.
ТабОстатков = ОстМатериалов.Остатки(,Фильтр,,);
В переменную ТабОстатков попадает результат работы метода Остатки(), который выполняется для регистра накопления ОстаткиМатериалов. В результате в переменной ТабОстатков окажется таблица значений, состоящая из одной строки, а эта строка будет содержать значение остатков материалов указанного ранее вида по ответственному сотруднику.
ТекСтрокаТабОстатков = ТабОстатков.Получить(0);
В переменную ТекСтрокаТабОстатков будет записан результат выполнения метода таблицы значений Получить(). В качестве параметра ему передается номер строки.
ТекСтрокаМатериалы.Сумма=(ТекСтрокаТабОстатков.Сумма/ТекСтрокаТабОстатков.Количество) *ТекСтрокаМатериалы.Количество;
В этом выражении мы сначала получаем среднюю стоимость единицы материалов - делим сумму стоимостного остатков материалов на количество единиц материала. После этого умножаем найденную среднюю стоимость на количество материалов, указанное в строке табличной части и записываем полученное значение в колонку Сумма текущей строки.
КонецЦикла;
Закрываем цикл.
СтоимостьМатериалов = Материалы.Итог("Сумма")
Выводим в реквизит шапки документа итоговую стоимость списываемых материалов.
Проверим работу механизма на практике, рис 6.11.
(рис 6.11) Проверка правильности работы созданного механизмаНа этом мы завершим разработку формы и ее механизмов, хотя, безусловно, здесь можно сделать еще множество доработок, повышающих удобство работы пользователя, предотвращающих возникновение ошибок. Вы можете проделать эти работы самостоятельно.
Напомним, что документ вы можете видеть форму конструктора движений после заполнения ее параметров.
(рис 6.12) Настройка проведения документаПроцедура, сформированная конструктором, списывает материалы, не обращая внимание на их фактическое наличие. Реализация механизма контроля возможности проведения документа в зависимости от фактического наличия материалов, которые нужно списать этим документом, будет рассмотрена в следующих лекциях.
И, наконец, создадим печатную форму документа, воспользовавшись конструктором печати. Проверим правильность работы механизмов (рис 6.13).
(рис 6.13) Проведение документа по регистру накопления, печатная форма документаПосле проведения документа в регистре накопления появились движения с видом движения Расход.
В нашей конфигурации теперь два документа, а это значит, что пришло время научиться пользоваться объектом конфигурации Журнал документов. В
Перейдем на вкладку .
(рис 6.14) Настройка журнала документовТеперь, если мы откроем конфигурацию в режиме 1С:Предприятие и выполним команду меню .
(рис 6.15) Журнал документов в режиме 1С:ПредприятиеКак видите, состав
Если попытаться создать новый элемент журнала, нажав на кнопку .
(рис 6.16) Выбор вида документа при создании нового документа из окна журналаДля создания документа, нужно выбрать его вид и нажать кнопку ОК в окне Выбор вида документа.
Улучшим журнал. Добавим в него две новые
В поле для добавления
(рис 6.17) Настройка свойств новой графы журнала документовВ нашем случае выбраны реквизиты ОтветственныйСотрудник. Каждый документ может отобразить в
Точно так же создадим новую
На рис 6.18 представлен измененный журнал в режиме 1С:Предприятие.
(рис 6.18) Журнал с дополнительными графамиКонфигурация, над которой мы работаем, растет и развивается. Мы создали очередной документ, разработали
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.