Код &НаКлиенте Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент) Если НЕ ПроверитьЗаполнениеРеквизита() Тогда Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента."); КонецЕсли; КонецПроцедуры
&НаСервере Функция ПроверитьЗаполнениеРеквизита() Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает); КонецФункции &НаСервере Процедура УстановитьНомерПредставителя()
Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; КонецПроцедуры При проверке выдает ошибку: {Справочник.Контрагенты.Форма.ФормаСписка.Форма(12,11)}: Переменная не определена (Объект)
работаю на версии 1С:Предприятие 8.3 (8.3.10.2650) |
Программная работа со справочниками, обработки, простые отчеты
Для построения отчета мы должны будем получать данные из справочника. Это можно сделать с помощью уже знакомого вам объекта СправочникВыборка, можно получить данные с помощью запроса. В любом случае, это предусматривает работу с базой данных, то есть, нам понадобится процедура, выполняемая на сервере. До настоящего времени мы пользовались лишь директивой компиляции &НаСервере – при вызове методов, объявленных с этой директивой, мы имеем доступ к контексту формы, при этом между клиентом и сервером происходит передача дополнительных данных – как при вызове серверного метода с клиента на сервер, так и в обратном направлении. Сейчас мы воспользуемся серверным внеконтекстным методом для формирования отчета. В этом методе мы собираемся формировать табличный документ, содержащий данные отчета.
При реализации метода в виде процедуры, нам придется передать в него в качестве параметра наш реквизит ТабличныйДокумент. По умолчанию параметры передаются по ссылке, то есть, работать процедура будет непосредственно с нашим реквизитом.
При реализации метода в виде функции мы можем ничего не передавать в него, сформировать внутри функции табличный документ и вернуть уже заполненный документ в точку вызова, присвоив его нашему реквизиту ТабличныйДокумент.
Реализуем метод в виде функции. Готовый код формирования отчета ( рис. 5.19) будет выглядеть следующим образом:
&НаКлиенте Процедура СформироватьОтчет(Команда) ТабличныйДокумент=СформироватьОтчетНаСервере(); КонецПроцедуры &НаСервереБезКонтекста Функция СформироватьОтчетНаСервере() ТабличныйДокумент=Новый ТабличныйДокумент(); Макет=Отчеты.СписокКонтрагентов.ПолучитьМакет("Макет"); Шапка=Макет.ПолучитьОбласть("Шапка"); Элемент=Макет.ПолучитьОбласть("Элемент"); Группа=Макет.ПолучитьОбласть("Группа"); Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата(); ТабличныйДокумент.Вывести(Шапка); Выборка=Справочники.Контрагенты.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Область=Группа; Иначе Область=Элемент; КонецЕсли; Область.Параметры.Заполнить(Выборка); ТабличныйДокумент.Вывести(Область); КонецЦикла; Возврат (ТабличныйДокумент); КонецФункции
В клиентской процедуре СформироватьОтчет() мы вызываем серверную внеконтекстную функцию СформироватьОтчетНаСервере(), присваивая возвращаемое ей значение реквизиту ТабличныйДокумент.
В серверной функции мы создаем новую переменную с типом ТабличныйДокумент и именем ТабличныйДокумент. Именно в него мы будем выводить данные и именно его будем возвращать в точку вызова. Несмотря на то, что имя реквизита формы и имя данной переменной совпадают, между ними нет никакой связи. Это – отдельные объекты.
Далее, мы получаем макет из нашего отчета, пользуясь методом ПолучитьМакет() и задавая имя макета. Отчет может иметь несколько макетов, их выбор осуществляется по имени.
В переменную Шапка мы записываем область макета Шапка, соответственно поступаем с переменными Элемент и Группа.
Командой Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата(); мы заполняем ранее заданный в макете параметр ДатаФормированияОтчета, записав в него текущую дату. Дата, возвращаемая функцией ТекущаяДата, содержит, помимо года, месяца и дня, так же часы, минуты и секунды. При необходимости дату перед выводом можно отформатировать при помощи функции Формат().
После того, как параметр, находящийся в шапке, заполнен, мы можем вывести шапку в табличный документ командой ТабличныйДокумент.Вывести(Шапка);
Следующим этапом нашей работы будет получение иерархической выборки справочника. Такая выборка позволяет получить элементы и группы справочника в иерархическом порядке, учитывая родительские отношения между элементами.
В цикле обхода выборки мы сначала проверяем, является ли текущий элемент справочника группой. Если является, присваиваем переменной Область ранее полученную область отчета Группа. Если не является – присваиваем ей область Элемент.
Благодаря совпадению имен параметров и имен реквизитов справочника, для помещения данных из выборки в область макета, достаточно воспользоваться конструкцией Область.Параметры.Заполнить(Выборка);. После заполнения параметров мы выводим сформированную область в табличный документ.
Когда цикл перебора выборки будет завершен, мы возвращаем сформированный табличный документ в точку вызова и пользователь видит готовый отчет.
Для формирования простейших отчетов, пользователь может воспользоваться стандартной функциональностью, присутствующей в 1С:Предприятие 8. Для этого, открыв, например, список справочника, он может выполнить команду Все действия > Вывести список. Появится окно Вывести список, рис. 5.20, где в поле Выводить в можно выбрать либо Табличный документ (его обычно и используют), либо – Текстовый документ.
В поле Выводить колонки можно настроить состав выводимых в документ колонок (в нашем случае команда выполнена для справочника ФизическиеЛица). После нажатия на ОК выбранные данные оформляются в виде табличного документа, а с помощью команды Файл > Сохранить как, рис. 5.21., этот документ можно сохранить в нужном формате для дальнейшей обработки в других приложениях.