
1C-DevGuide83
.pdf
Занятие 27 851
Можно также программно добавить реквизит в массив проверяемых реквизитов (листинг 27.5).
Листинг 27.5. Добавление реквизита в массив проверяемых реквизитов
ПроверяемыеРеквизиты.Добавить("ПереченьНоменклатуры.НаборСвойств");
Использование параметризованных команд
Использование параметризованных команд в формах объектов позволяет при выполнении команды передать в обработчик команды какой-либо параметр, например значение ссылочного реквизита. И затем использовать его, например, открыть с этим параметром форму отчета.
Для примера создадим команду открытия отчета, показывающего остатки материалов по складу, указанному в документе. Отчет будет вызываться из формы документа ОказаниеУслуги, в него будет передаваться значение реквизита документа Склад, и при открытии отчета в настройки отчета будет добавляться отбор по параметру
Склад.
В режиме «Конфигуратор»
Сначала создадим параметризованную команду объекта конфигу-
рации Отчет Материалы.
Для этого откроем окно редактирования этого объекта. На закладке Команды нажмем кнопку Добавить и создадим команду Остат-
киПоСкладу.
В открывшейся палитре свойств зададим Тип параметра команды –
СправочникСсылка.Склады. В свойстве Группа укажем Командная панель формы.Важное (рис. 27.37).
Таким образом, мы создали команду с типом параметра СправочникСсылка.Склады, и теперь во всех формах, имеющих реквизит такого типа, эта команда автоматически будет добавлена в список параметризуемых команд, доступных в форме.


Занятие 27 853
В процедуру ОбработкаКоманды() передается ПараметрКоманды,
содержащий значение типа СправочникСсылка.Склады. Затем создается структура параметров формы (ПараметрыФормы): Отбор,
КлючНазначенияИспользования, СформироватьПриОткрытии.
В параметр Отбор добавляется структура, содержащая элемент Склад со значением, содержащимся в параметре команды
(ПараметрКоманды), параметр КлючНазначенияИспользования –
"ОстаткиПоСкладу" определяет назначение использования формы, а параметру СформироватьПриОткрытии присваивается значение Истина, чтобы отчет формировался сразу после открытия.
Затем структура параметров формы передается в глобальный метод ОткрытьФорму(), и форма, указанная в первом параметре метода, открывается с параметром Склад. Причем поскольку в четвертом параметре Уникальность этого метода передается Истина, то при открытии формы каждый раз будет открываться новая форма отчета и отчет будет заново сформирован с отбором по складу, переданному в параметре команды.
Теперь поместим нашу команду в форму документа.
Как мы уже говорили, в формах документов ПриходнаяНакладная
и ОказаниеУслуги содержится команда ОстаткиПоСкладу, так как они имеют реквизит Склад типа СправочникСсылка.Склады.
Откроем форму документа ОказаниеУслуги.
На закладке Команды перейдем в раздел Глобальные команды. Здесь мы видим список глобальных параметризуемых команд, доступных в форме. В группе Параметризуемые раскроем строку
Объект и перетащим нашу команду Отчет.Материалы.Команда.ОстаткиПоСкладу(Объект.Склад) в командную панель элементов формы.
В скобках у команды указано значение реквизита Склад (Объект.Склад), которое будет передаваться в команду при ее выпол-
нении (рис. 27.38).
Заметьте, что мы не создавали форму отчета и не добавляли в настройки отчета отбор по параметру формы Склад. Система сделает это сама при выполнении обработчика команды ОстаткиПо-
Складу.

854 1С:Предприятие 8.3. Практическое пособие разработчика
Рис. 27.38. Помещение параметризованной команды в форму
В режиме «1С:Предприятие»
Запустим «1С:Предприятие» в режиме отладки и откроем документ
Оказание услуги № ЦБ000000001.
Нажмем кнопку Остатки по складу и вызовем отчет Материалы. Форма отчета генерируется системой автоматически. Отчет будет выполнен сразу при открытии формы с отбором по складу Основной, указанному в форме документа (рис. 27.39).
Закроем отчет. Если в форме документа мы изменим склад на Розничный, а затем выполним отчет нажатием кнопки Остатки по складу, то он будет сформирован с отбором по складу Розничный (в данном случае отчет будет пустой, так как у нас нет движений материалов по этому складу).
Таким образом, мы создали для пользователя очень удобную возможность – открывать отчет, показывающий остатки материалов по складу, прямо из формы документа с отбором по указанному в документе складу.


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).