Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 курс (заочка) / Методические пособия / Пособие для ответов на контрольные вопросы

.pdf
Скачиваний:
159
Добавлен:
15.02.2021
Размер:
46.69 Mб
Скачать

Занятие 27 851

Можно также программно добавить реквизит в массив проверяемых реквизитов (листинг 27.5).

Листинг 27.5. Добавление реквизита в массив проверяемых реквизитов

ПроверяемыеРеквизиты.Добавить("ПереченьНоменклатуры.НаборСвойств");

Использование параметризованных команд

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

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

Склад.

В режиме «Конфигуратор»

Сначала создадим параметризованную команду объекта конфигу-

рации Отчет Материалы.

Для этого откроем окно редактирования этого объекта. На закладке Команды нажмем кнопку Добавить и создадим команду Остат-

киПоСкладу.

В открывшейся палитре свойств зададим Тип параметра команды

СправочникСсылка.Склады. В свойстве Группа укажем Командная панель формы.Важное (рис. 27.37).

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

852 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 27.37. Создание параметризованной команды

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

Листинг 27.6. Обработчик параметризованной команды

&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

ПараметрыФормы = Новый Структура("Отбор, КлючНазначенияИспользования, СформироватьПриОткрытии", Новый Структура("Склад", ПараметрКоманды), "ОстаткиПоСкладу", Истина);

ОткрытьФорму("Отчет.Материалы.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, Истина, ПараметрыВыполненияКоманды.Окно);

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

Прокомментируем этот код.

Занятие 27 853

В процедуру ОбработкаКоманды() передается ПараметрКоманды,

содержащий значение типа СправочникСсылка.Склады. Затем создается структура параметров формы (ПараметрыФормы): Отбор,

КлючНазначенияИспользования, СформироватьПриОткрытии.

В параметр Отбор добавляется структура, содержащая элемент Склад со значением, содержащимся в параметре команды

(ПараметрКоманды), параметр КлючНазначенияИспользования –

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

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

Теперь поместим нашу команду в форму документа.

Как мы уже говорили, в формах документов ПриходнаяНакладная

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

Откроем форму документа ОказаниеУслуги.

На закладке Команды перейдем в раздел Глобальные команды. Здесь мы видим список глобальных параметризуемых команд, доступных в форме. В группе Параметризуемые раскроем строку

Объект и перетащим нашу команду Отчет.Материалы.Команда.ОстаткиПоСкладу(Объект.Склад) в командную панель элементов формы.

В скобках у команды указано значение реквизита Склад (Объект.Склад), которое будет передаваться в команду при ее выпол-

нении (рис. 27.38).

Заметьте, что мы не создавали форму отчета и не добавляли в настройки отчета отбор по параметру формы Склад. Система сделает это сама при выполнении обработчика команды ОстаткиПо-

Складу.

854 1С:Предприятие 8.3. Практическое пособие разработчика

Рис. 27.38. Помещение параметризованной команды в форму

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» в режиме отладки и откроем документ

Оказание услуги № ЦБ000000001.

Нажмем кнопку Остатки по складу и вызовем отчет Материалы. Форма отчета генерируется системой автоматически. Отчет будет выполнен сразу при открытии формы с отбором по складу Основной, указанному в форме документа (рис. 27.39).

Закроем отчет. Если в форме документа мы изменим склад на Розничный, а затем выполним отчет нажатием кнопки Остатки по складу, то он будет сформирован с отбором по складу Розничный (в данном случае отчет будет пустой, так как у нас нет движений материалов по этому складу).

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

Занятие 27 855

Рис. 27.39. Отчет «Материалы» с отбором по складу, указанному в документе

Открытие формы списка с заданным отбором

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

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

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

В режиме «Конфигуратор»

Итак, нам нужно открыть форму списка документов Оказание услуги с отбором по мастеру, в котором поле Мастер будет равно ссылке на текущего сотрудника в списке сотрудников.

Для этого создадим форму списка справочника Сотрудники, затем создадим в ней команду ОказаниеУслуг и перетащим ее в командную

856 1С:Предприятие 8.3. Практическое пособие разработчика

панель формы. В палитре свойств команды ОказаниеУслуг, в строке Действие создадим клиентский обработчик этой команды

(рис. 27.40).

Рис. 27.40. Форма списка справочника «Сотрудники»

В модуле формы заполним обработчик команды следующим образом

(листинг 27.7).

Листинг 27.7. Обработчик команды «Оказание услуг»

&НаКлиенте Процедура ОказаниеУслуг(Команда)

ПараметрыФормы = Новый Структура( "Отбор", Новый Структура("Мастер", Элементы.Список.ТекущаяСтрока));

ОткрытьФорму("Документ.ОказаниеУслуги.ФормаСписка", ПараметрыФормы,, Истина);

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

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

Оказание услуги.

Занятие 27 857

В режиме «1С:Предприятие»

Запустим «1С:Предприятие» и откроем список сотрудников. В форме списка появилась кнопка Оказание услуг. При ее нажатии открывается список документов об оказании услуг, где мастером является текущий сотрудник (рис. 27.41).

Рис. 27.41. Отбор по мастеру в списке документов «Оказание услуги»

Однако не все так просто, как может показаться. Здесь есть одна тонкость, которую нужно знать и учитывать при создании настроек (в частности, отборов) динамических списков.

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

щикНастроек.

Следует различать три вида настроек динамического списка:

Фиксированные настройки, сделанные программным путем, помещаются в свойство динамического списка КомпоновщикНа-

строек.ФиксированныеНастройки;

Настройки, сделанные в конфигураторе, помещаются в свойство динамического списка КомпоновщикНастроек.Настройки;

Пользовательские настройки, сделанные в режиме 1С:Предприятие, помещаются в свойство динамического списка Компо-

новщикНастроек.ПользовательскиеНастройки.

858 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

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

(КомпоновщикНастроек.ФиксированныеНастройки.Отбор) и добавить этот отбор в коллекцию основных настроек списка (КомпоновщикНа-

строек.Настройки.Отбор).

В режиме «Конфигуратор»

Чтобы решить поставленную задачу, откроем форму списка документа ОказаниеУслуги, которую мы создали ранее. В редакторе формы создадим реквизиты формы ПрограммныйОтбор типа Булево и два реквизита произвольного типа – ПолеОтбора и ЗначениеОтбора. Эти реквизиты будут хранить информацию о программном отборе в форме списка.

Затем создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 27.8).

Листинг 27.8. Обработчик события формы «ПриСозданииНаСервере»

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Отбор.Свойство("Мастер") Тогда ПрограммныйОтбор = Истина; ПолеОтбора = Новый ПолеКомпоновкиДанных("Мастер");

Параметры.Отбор.Свойство("Мастер", ЗначениеОтбора); КонецЕсли

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

Занятие 27 859

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

Далее создадим обработчик события формы ПриОткрытии и заполним его следующим образом (листинг 27.9).

Листинг 27.9. Обработчик события формы «ПриОткрытии»

&НаКлиенте Процедура ПриОткрытии(Отказ)

Если ПрограммныйОтбор = Истина Тогда ПрограммныеНастройки = Список.КомпоновщикНастроек.ФиксированныеНастройки;

Для Каждого ЭлементНастроек Из ПрограммныеНастройки.Отбор.Элементы Цикл Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда

ПрограммныеНастройки.Отбор.Элементы.Удалить(ЭлементНастроек); КонецЕсли;

КонецЦикла;

Настройки = Список.КомпоновщикНастроек.Настройки;

ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = ПолеОтбора; ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;

Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); КонецЕсли;

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

Код обработчика выполняется в случае, если форма была открыта с  программным отбором.

Сначала обходится коллекция элементов отбора фиксированных настроек компоновщика настроек динамического списка. Если в  коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора (т. е. установлен программный отбор по полю Мастер), то этот элемент удаляется.

Затем этот же отбор добавляется в коллекцию настроек динамиче-

ского списка КомпоновщикНастроек.Настройки.Отбор, и измененные настройки загружаются в компоновщик настроек.

860 1С:Предприятие 8.3. Практическое пособие разработчика

Теперь осталось только удалить созданный элемент отбора при закрытии формы списка документа ОказаниеУслуги.

Для этого создадим обработчик события формы ПередЗакрытием и заполним его следующим образом (листинг 27.10).

Листинг 27.10. Обработчик события формы «ПередЗакрытием»

&НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)

Если ПрограммныйОтбор = Истина Тогда Настройки = Список.КомпоновщикНастроек.Настройки;

Для Каждого ЭлементНастроек Из Настройки.Отбор.Элементы Цикл Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда

Настройки.Отбор.Элементы.Удалить(ЭлементНастроек); КонецЕсли;

КонецЦикла; Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

КонецЕсли;

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

Код обработчика выполняется в случае, если форма была открыта с программным отбором.

Коллекция элементов отбора настроек компоновщика настроек дина-

мического списка КомпоновщикНастроек.Настройки.Отбор обходится в цикле. Если в коллекции присутствует элемент отбора, в котором ЛевоеЗначение равно значению реквизита ПолеОтбора, то этот элемент удаляется. Затем измененные настройки загружаются в компоновщик настроек.

В режиме «1С:Предприятие»

Запустим «1С:Предприятие», откроем список сотрудников и нажмем кнопку Оказание услуг. Откроется список документов об оказании услуг, где мастером является текущий сотрудник. Вызовем окно настройки списка, выполнив команду Еще Настроить список… В открывшемся окне мы видим добавленный нами отбор по полю Мастер, который пользователь может изменить или очистить

(рис. 27.42).