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

Вот и конец книжечки… T_T

Как связаны данные и
элементы формы?

Никак. Связать данные и элемент формы можно через свойство «ПутьКДанным». Чаще всего это поле заполняется автоматически.

Что такое основной реквизит формы?
Основной реквизит формы – выделен жирным цветом, может быть только одним.
Собственно, он и задает «стиль» всей форме. От основного реквизита определяет
характер, назначение и поведение формы – например, в зависимости от типа
основного реквизита могут изменятся методы и свойства формы. Простейший пример
– если основной реквизит формы является ДокументОбъект.КакойЛибоДокумент, то
при нажатии на кнопку «ОК» будет осуществляться запись и проведение документа.

Что такое расширение
формы и её элементов?
Расширение – набор дополнительных свойств, методов и событий, появляющихся
у формы или у элемента формы.

Какие существуют типы
данных у формы?
—  типы встроенного языка;
— динамический список;
— ДанныеФормыСтруктура, ДанныеФормыКоллекция – типы встроенного языка,
предназначенные для моделирования структуры данных, редактируемых в управляемой
форме.

Как выполнить
преобразование данных прикладных объектов в данные формы?
С помощью методов ЗначениеВДанныеФормы() и ЗначениеВРеквизитФормы()

Что такое связанная информация
и как к ней перейти из формы?
Очевидно, что связанная информация – это та, которая логически связана с
объектом. Примеры – регистры, в которых документ производит движения; объекты,
которые можно ввести на основании и др.
Для перехода к информации из формы используется область «Перейти»

Видимость редактируется в форме документа на закладке Командный интерфейс:

Как настроить условное
оформление строк формы списка?
Данная настройка идет через палитру свойств реквизита ФормыСписка – поле
Настройка списка, а дальше на вкладке «Условное оформление» проводим то
оформление, которое нам нужно.

Как установить форму
выбора для ссылочного реквизита?
Сначала нужно создать форму для данного ссылочного реквизита, потом выбрать
эту форму в палитре свойств реквизита, в графе «Форма выбора»

Как установить
автоматическую и программную проверку заполнения реквизитов?
Автоматическая – установить проверку в палитре свойств реквизита (именно
реквизита объекта, а не формы!!)

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

Что такое
параметризированная команда?
Команда – это объект конфигурации, нужный  для описания каких-либо действий,
предназначенных для выполнения пользователем. Параметризированная команда – та команда,
которая в своем алгоритме может использовать какое-либо передаваемое значение.
Тип этого значения задается в конфигураторе и такая команда будет видна только
в тех формах, у которых есть реквизиты с таким же типом значения.

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

Если вы не создали у объекта форму, то данная команда все равно вынесется
отдельной кнопкой. Например, посмотрим на справочник «Склады» и его форму,
которую платформа создает автоматически:

Занятие 27 861

Рис. 27.42. Окно настройки списка с заданным отбором

При закрытии формы списка этот отбор удаляется.

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

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

Контрольные вопросы

;;

Как связаны данные и элементы формы?

;;

Что такое основной реквизит формы?

;;

Что такое расширения формы и ее элементов?

;; Какие существуют типы данных у формы?

;;

Как выполнить преобразование данных прикладных объектов

;;

в данные формы?

Что такое связанная информация, и как к ней перейти из формы?

;;

Как настроить условное оформление строк формы списка?

;;

Как установить форму выбора для ссылочного реквизита?

;; Как установить автоматическую и программную проверку заполнения реквизитов?

;; Что такое параметризованная команда?

;; Как использовать параметризованные команды в формах? ;; Как открыть форму списка с заданным отбором?

Занятие 28

Приемы редактирования форм

Продолжительность

Ориентировочная продолжительность занятия – 2 часа.

Редактор формы.………………………………………………………………………………………………

864

Разработка произвольной формы

для редактирования документа «Оказание услуги»…………………………………………….

869

Как добавить в форму переключатель – тумблер………………………………………………..

889

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

889

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

891

Как сгруппировать данные в списке……………………………………………………………………

892

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

892

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

893

Контрольные вопросы……………………………………………………………………………………….

894

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

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

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

Редактор формы

Редактор формы вам уже хорошо знаком по предыдущим занятиям. В нем разработчик указывает, из каких элементов (полей, кнопок, таблиц и т. п.) будет состоять форма, какие реквизиты (данные), команды и параметры будут использоваться в ней. Чтобы оживить форму, разработчик устанавливает связь между элементами и  данными формы, а также задает желаемые интерфейсные свойства элементов формы.

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

Окно редактора формы визуально разбито на несколько взаимосвязанных областей (рис. 28.1).

В левой верхней части окна на закладке Элементы можно редактировать состав и порядок элементов формы, группировать их. Задавая различные интерфейсные свойства этих элементов, можно управлять внешним видом формы.

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

иначе – Записать и закрыть и т. д.

Занятие 28 865

Рис. 28.1. Окно редактора формы

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

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

иерархии, и наоборот.

Что касается расположения элементов формы в режиме

1С:Предприятие, то чем выше в дереве находится элемент, тем выше и левее на форме он будет располагаться (рис. 28.2).

Рис. 28.2. Закладка «Элементы» редактора формы

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

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

Влевой верхней части окна редактора формы на закладке Командный

интерфейс можно управлять составом и расположением команд в  панели навигации и в командной панели формы. Например, можно устанавливать видимость у команд открытия связанных списков, команд ввода на основании и т. п. (рис. 28.3).

Рис. 28.3. Закладка «Командный интерфейс» редактора формы

В правой верхней части окна редактора формы на закладке Реквизиты можно задавать состав реквизитов формы и устанавливать их свойства. Основной реквизит формы (у реквизита установлен признак Основной реквизит) выделен жирным шрифтом и расположен первым в списке реквизитов. Он определяет функциональность формы (рис. 28.4).

Рис. 28.4. Закладка «Реквизиты» редактора формы

Занятие 28 867

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

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

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

(закладка Глобальные команды), рис. 28.5.

Рис. 28.5. Закладка «Команды» редактора формы

Команды, созданные разработчиком, в свойстве Действие должны быть связаны с процедурой – обработчиком команды, которая описывается в модуле формы на встроенном языке (см. рис. 28.6).

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

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

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

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

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

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

Рис. 28.6. Модуль формы

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

Занятие 28 869

Разработка произвольной формы для редактирования документа «Оказание услуги»

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

У нас в конфигурации уже существует основная форма документа ОказаниеУслуги. Эта форма была создана еще на четвертом занятии в разделе «Форма документа» на стр. 137 с помощью конструктора формы (рис. 28.7).

Рис. 28.7. Форма документа «ОказаниеУслуги» в редакторе формы

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

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

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

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

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

Для решения этих задач мы разработаем форму для редактирования документа ОказаниеУслуги с нуля. Попутно мы освоим (или повторим) основные приемы разработки форм:

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

как задать свойства группы и сделать группу свертываемой;как добавить в форму многостраничную панель;

как добавить в форму табличную часть и выделить ее строки по условию;

как вывести итог по колонке табличной части. Итак, начнем.

Откроем окно редактирования объекта Документ ОказаниеУслуги и на закладке Формы нажмем кнопку Добавитьнадсписком форм (рис. 28.8).

Рис. 28.8. Создание формы документа

Соседние файлы в папке Учебники

  • #
  • #
  • #
  • #
  • #
  • #

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

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

Справку по методам ввода значений можно найти в разделе «Функции для вызова диалога ввода данных«.

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

  1. имя процедуры – обработчика оповещения, которая будет выполнена после получения ответа пользователя,
  2. в каком модуле расположена эта процедура.
  3. дополнительные параметры — значение любого типа, которое при вызове будет передано в указанную процедуру последним параметром.

Процедура – обработчик оповещения может располагаться в модуле управляемой формы, в общем неглобальном клиентском модуле или модуле команды. Если процедура располагается в модуле формы, то во втором параметре указывают «ЭтотОбъект» или «ЭтаФорма».

Процедура должна быть экспортной, запускаться на клиенте и  иметь 2 параметра: РезультатЗакрытия, ДопПараметры.

РезультатЗакрытия может быть массивом при множественном выборе.

Для модальных окон самый простой способ через ВвестиЗначение()

    Сотрудник = Неопределено;
    ОписаниеСортудник = Новый ОписаниеТипов(«СправочникСсылка.Сотрудники»);
    РезультатВыбора = ВвестиЗначение(Сотрудник,»Выберите ответственное лицо»,ОписаниеСортудник);

Для не модальных окон его аналог ПоказатьВводЗначения()

&НаКлиенте
Процедура ВОГ_ИзменитьВладельцаПосле(Команда)
    Перем ВыбЗнач;
    Массив = Новый Массив;
    Массив.Добавить(Тип(«СправочникСсылка.ФизическиеЛица»));
    Массив.Добавить(Тип(«СправочникСсылка.Контрагенты»));
    ОписаниеТипов = Новый ОписаниеТипов(Массив);

    
    Оповещение = Новый ОписаниеОповещения(«ВОГ_ИзменитьВладельцаПослеНаСервере», ЭтаФорма, Параметры);
    ПоказатьВводЗначения(Оповещение, ВыбЗнач, «Введите значение», ОписаниеТипов);        

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

&НаСервере
Процедура ВОГ_ИзменитьВладельцаПослеНаСервере(НовыйВладелец, ДопПараметры) Экспорт
    Если НовыйВладелец<>Неопределено Тогда
        Объект.ВладелецДоговора = НовыйВладелец;    
    КонецЕсли;
КонецПроцедуры

В описании оповещения указывается экспортная процедура, которая должна иметь 2 параметра: РезультатЗакрытия, ДопПараметры.

РезультатЗакрытия может быть массивом при множественном выборе.

2. Подбор немодально без Описания оповещения

Чтобы открыть форму для выбора, например справочника Номенклатура, надо на клиенте запустить открытие формы выбора:

ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора»,ПараметрыФормы,Элементы.Материалы);    

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

Основные параметры, которые могут потребоваться:

  • ЗакрыватьПриВыборе — если Истина, то после того как будет произведен выбор, форма выбора закроется
  • МножественныйВыбор — можно выбрать сразу несколько позиций. В этом случае будет возвращено не конкретная ссылка, а массив ссылок

ВАЖНО!!! Если не использовать ОписаниеОповещения, то обработка выбора будет выполнятся в событии ОбработкаВыбора() того элемента, который указан третьим параметром метода ОткрытьФорму, т.е. владельца. Событие ОбработкаВыбора имеют все элементы формы, в которые можно ввести значение. Если в качестве владельца будет указана форма (ЭтаФорма), то надо ловить получение результата выбора в событии формы. Если в качестве владельца будет указана таблица фомы, то надо обрабатывать событие ОбработкаВыбора таблицы формы.

Событие ОбработкаВыбора  вызывается в случаях:

  1. когда в вызываемой форме будет выполнен интерактивный отбор
  2. когда в вызываемой форме будет вызван метод ОповеститьОВыборе()

Пример процедуры ОбработкаВыбора  :

&НаКлиенте
Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    Если ТипЗнч(ВыбранноеЗначение) = Тип(«Массив») Тогда
        Для каждого ВыбранныйЭлемент из ВыбранноеЗначение Цикл
            Элементы.Материалы.ДобавитьСтроку();
            Элементы.Материалы.ТекущиеДанные.Материал = ВыбранныйЭлемент;
        КонецЦикла
    Иначе
        Элементы.Материалы.ДобавитьСтроку();
        Элементы.Материалы.ТекущиеДанные.Материал = ВыбранноеЗначение;
    КонецЕсли;
КонецПроцедуры

Здесь мы задаем значение в новую строку прямо на клиенте

Метод ОповеститьОВыборе(ЗначениеВыбора) посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.

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

Надо помнить, что динамический список возвращает ссылку в Список.ТекущаяСтрока, если у списка задано свойство «Основная таблица». В этом случае будет возвращена ссылка на элемент данного справочника.

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

3. способ без отбора.

&НаКлиенте
Процедура ИсправитьУчетныйМесяцАктов(Команда)
    ВыбратьДокументы(«АктВыполненныхРабот», «ИсправитьУчетныйМесяцАктовКонец»)
КонецПроцедуры
 

&НаКлиенте
Процедура ВыбратьДокументы(ТипДокумента, ПроцедураОбработки)
    ПараметрыФормы  = Новый Структура(«РежимВыбора, ЗакрыватьПриВыборе, МножественныйВыбор», Истина, Истина, Истина);
    ОбработкаВыбора = Новый ОписаниеОповещения(ПроцедураОбработки, ЭтаФорма,
    );

    
    ОткрытьФорму(«Документ.» + ТипДокумента + «.ФормаВыбора», ПараметрыФормы,
    ЭтаФорма, , , , ОбработкаВыбора);
КонецПроцедуры

Описание доступных параметров можно посмотреть «Расширение управляемой формы для динамического списка (Managed form extension for dynamic lists) синтакс-помощнике «Интрефейс(Управляемый) / Форма клиентского приложенияРасширение динамического спискаПараметры формы«

Если хотим чтобы был множественный выбор, то указываем параметр «МножественныйВыбор».

Если при отборе хотим встать на заранее определенный элемент, то используем параметр «ТекущаяСтрока»

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

   ПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных();

   ПараметрыФормы  = Новый Структура(«…,ПользовательскиеНастройки», …,ПользовательскиеНастройки);

4. Через параметры формы / отбор (Структура).

При использовании этого способа можно задать только соответствие типа «равно» 

&НаКлиенте
Процедура Способ3(Команда)

    
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыбор»,ЭтаФорма);

    
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить(«Подразделение», Подразделение);

 
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора);

 
ОткрытьФорму(«Справочник.Сотрудники.Форма.ФормаВыбора», ПараметрыФормы, ЭтаФорма,,,,ОписаниеВыбора);
КонецПроцедуры

Процедура ОбработатьВыбор(РезультатЗакрытия,ДопПараметры) Экспорт
    Сообщить(РезультатЗакрытия);
КонецПроцедуры

   Надо учитывать, что если этот метод использовать для замены события «Начало выбора» для элемента, то после отработки процедуры ОбработатьВыбор() событие «ПриИзменении» не наступает и придется добавить нужный код и в процедуру ОбработатьВыбор и в ПриИзменении. Это происходит потому, что элемент может быть заполнен из буфера или из списка ранее выбранных значений, что к открытию формы выбора отношения не имеет.

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

  1.  В форме выбора в обработке «ПриСозданииНаСервере» определяем есть ли параметр отбора. Если есть, то устанавливаем служебный признак ПрограммныйОтбор = Истина; и запоминаем значение параметра отбора.
  2. В методе ПриОткрытии очищаем фиксированные настройки и добавляем аналогичные параметры отбора в обычные настройки.

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

    
    Если Параметры.Отбор.Свойство(«Подразделение») Тогда
        ПрограммныйОтбор = Истина; //ПрограммныйОтбор — реквизит формы
        ПолеОтбора = Новый ПолеКомпоновкиДанных(«Подразделение»); // ПолеОтбора — реквизит формы типа «Произвольный»
        Параметры.Отбор.Свойство(«Подразделение»,ЗначениеОтбора); // ЗначениеОтбора — реквизит формы типа «Произвольный»        
    КонецЕсли

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

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

    
    Если ПрограммныйОтбор = Истина Тогда
        ПрограммныеНастройки = Список.КомпоновщикНастроек.ФиксированныеНастройки;
        Для Каждого ЭлементНастроек Из ПрограммныеНастройки.Отбор.Элементы Цикл
            Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда
                ПрограммныеНастройки.Отбор.Элементы.Удалить(ЭлементНастроек);
            КонецЕсли;
        КонецЦикла;

        
        Настройки = Список.КомпоновщикНастроек.Настройки;        
        ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
        ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = ЗначениеОтбора;        
        Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);        
    КонецЕсли;

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

У этого способа есть один недостаток: при закрытии формы текущие настройки сохраняться, т.е. если потом открыть форму списка обычным способом, то она откроется с таким же отбором, какой был при программном открытии формы. Чтобы этого избежать придется при закрытии формы очистить настройки програмным путем:

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)    
    Если ПрограммныйОтбор = Истина Тогда        
        Настройки = Список.КомпоновщикНастроек.Настройки;
        Для Каждого ЭлементНастроек Из Настройки.Отбор.Элементы Цикл
            Если ЭлементНастроек.ЛевоеЗначение = ПолеОтбора Тогда
                Настройки.Отбор.Элементы.Удалить(ЭлементНастроек);                
            КонецЕсли;            
        КонецЦикла;        
        Список.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);        
    КонецЕсли;    
КонецПроцедуры

5. Через отбор настройки компоновки данных.

При этом способе условия могут принимать значение «в списке», «не равно» и т.д.

&НаКлиенте
Процедура Способ4(Команда)

    
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыбор»,ЭтаФорма);

    
    фиксНастройки = Новый НастройкиКомпоновкиДанных;

 
эОтбор = фиксНастройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
эОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Подразделение»);
эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
эОтбор.ПравоеЗначение =Подразделение;
эОтбор.Использование = Истина;

 
эОтбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

 
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить(«ФиксированныеНастройки», фиксНастройки);

 
ОткрытьФорму(«Справочник.Сотрудники.Форма.ФормаВыбора», ПараметрыФормы, ЭтаФорма,,,,ОписаниеВыбора);
КонецПроцедуры

Процедура ОбработатьВыбор(РезультатЗакрытия,ДопПараметры) Экспорт
    Сообщить(РезультатЗакрытия);
КонецПроцедуры
 

6. Можно открыть форму, на которой расположены элементы выбора, а потом при закрытии этой формы, вернуть значения выбора.

Для модальных форм: 

НовФорма = Документы.Кредит.ПолучитьФорму();
Результ = НовФорма.ОткрытьМодально();
тут Результ — это то, что возвращает метод Закрыть() вызываемой формы. Можешь таким образом, написать часть в документе кредита, а часть дописать в вызывающем документе

Для немодальных форм;

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>) — указать процедуру, которую передать в параметр <ОписаниеОповещенияОЗакрытии>
В самой форме просто выполнить код «ЭтаФорма.Закрыть(Параметры)»
В таком случае будет произведен возврат значений из открытой формы в код модуля, из которого его открыли без необходимости изменять процедуру «ОбработкаОповещения»

7. Произвольная форма выбора при выборе элемента.

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

Как установить отбор через реквизит Ссылочного реквизита в форме списка

Я
   Saruman

04.12.08 — 15:39

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

Есть «Справочник» с реквизитом «Реквизит1», который ссылается на

«Справочник2» у которого соответственно есть свой «Реквизит2»-«Перечисление».

В форме списка колонка с «Реквизит1».

Необходимо организовать через «Реквизит2» отбор

в форме списка «Справочника1» элемент формы «СправочникСписок» — ТЧ.

  

Партнерская программа EFSOL Oblako

   ТелепатБот

1 — 04.12.08 — 15:39

Книга знаний: Размещение колонки с остатками в списке справочника

   Saruman

2 — 04.12.08 — 15:57

хм

   Defender aka LINN

3 — 04.12.08 — 15:59

(0) Язык форума — русский. Сообщения на других языках не допускаются :)

   Saruman

4 — 04.12.08 — 16:02

Хорошо:
Есть реквизит ссылочного реквизита, как по нему отобрать в СправочникеСписке

   НЕА123

5 — 04.12.08 — 16:02

(3) а вот ТелепатБот что-то понял.

   НЕА123

6 — 04.12.08 — 16:04

(4) а че вопрос то задаешь? сам же и ответил.

СправочникСписок.Отбор.Ссылка

   Saruman

7 — 04.12.08 — 16:09

Форма.СправочникСписок.Отбор.Модель.ВидМодели.Установить(ТекВидТехники,Истина);

Так ругаеццо :(

   НЕА123

8 — 04.12.08 — 16:11

(7) есвенно. читай (6)

   Saruman

9 — 04.12.08 — 16:12

Цитата:
Еще раз напомню, что ОтборСтрок входит в расширение табличного поля табличной части, т.е. табличное поле должно быть связано с табличной частью. Если же оно связано с динамическим списком типа СправочникСписок, то здесь нужно использовать свойство Отбор для объекта типа СправочникСписок.

Написано…там…

   Saruman

10 — 04.12.08 — 16:14

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

   НЕА123

11 — 04.12.08 — 16:15

(9) не понял. и как эта цитата противоречит (6)?

   Bober

12 — 04.12.08 — 16:16

Сначало сделвай запрос по справочнику модели и выбери элементы у которых вид модели равен значению «ТекВидТехники». Потом установи отбор в справочнике1 с видом в списке и загрузи список элементов справочника2 (модели).

   НЕА123

13 — 04.12.08 — 16:16

(10)  тут,там… а в чем разница-то?

  

Михаил Козлов

14 — 04.12.08 — 16:19

Наверное, только через получение списка нужных элементов Справочник1 и установку отбора для СправочникСписок с видом сравнения «в списке».

Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn

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

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

Содержание

Использование параметризованной команды для указания отбора

Один из распространенных приемов – создать глобальную параметризуемую команду, и параметр этой команды передать в качестве отбора. В свойствах команды нужно указать тип параметра команды. Можно указать группу “Панель навигации формы”, тогда команда автоматически будет добавляться в командный интерфейс при открытии формы соответствующего объекта.

Параметризованная команда для открытия формы с отбором

Текст команды будет следующий:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрКоманды);
	ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
		ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник,
		ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно,
		ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры

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

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

Параметризуемая команда и передача параметра

Второй вариант – передать параметр команды не в свойство “Отбор”, а в качестве параметра формы. В этом случае платформа не сможет сгенерировать отбор автоматически, и придется добавить немного кода.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ПараметрыФормы= Новый Структура("Контрагент", ПараметрКоманды);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
		ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник,
		ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно,
		ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Список.Отбор.Элементы.Очистить();
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
	ЭлементОтбора.Использование = Истина;
	ЭлементОтбора.ПравоеЗначение = Параметры.Контрагент;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрыВыполненияКоманды.Источник.Объект.Ссылка);
	ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
	ПараметрыФормы,
	ПараметрыВыполненияКоманды.Источник,
	ПараметрыВыполненияКоманды.Уникальность,
	ПараметрыВыполненияКоманды.Окно,
	ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВыбратьДокумент(Команда)
	
	ПараметрыФормы = Новый Структура("Контрагент", Объект.Ссылка);
	ОткрытьФорму("Документ.ПоступленияТоваров.Форма.ФормаВыбораПоКнопке", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

Следует понимать, что мы можем передать в свойство “Отбор” структуру с несколькими ключами, на пример, мы хотим отфильтровать документы не только по контрагенту, но и по организации. И важно учитывать, что платформа стыкует передаваемые параметры и поля отбора по именам ключей. Если переданные ключи не будут соответствовать доступным полям отбора, то автоматически платформа фильтр наложить не сможет.

И еще один момент, о котором стоит упомянуть. Нам никто не запрещает передать больше одного параметра при открытии формы. Например, мы хотим отфильтровать документы по контрагенту и по организации, или реализовать какие-то более сложные фильтры.

Отбор при помощи связи параметров выбора

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

Использование свойства СвязиПараметровВыбора

В свойствах элемента управления (либо в свойствах реквизита объекта, если мы хотим это сделать для всех форм, где доступен этот реквизит) находим СвязиПараметровВыбора, и настраиваем для отбора по текущей ссылке:

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

Отбор при помощи программной установки параметров выбора

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

Делать это можно в обработчике НачалоВыбора. Например, так:

&НаКлиенте
Процедура ОсновнойДокумент2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	НовыйПараметр = Новый ПараметрВыбора("Отбор.Контрагент", Объект.Ссылка);
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НовыйПараметр);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.ОсновнойДокумент2.ПараметрыВыбора = НовыеПараметры;
	
КонецПроцедуры

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

Итак, мы рассмотрели шесть вариантов открытия формы с отбором в 1С 8. Какие-то проще, какие-то сложнее, но все находят свое применение. Пользуйтесь теми, какие удобнее!

Работа с формами

  • Как открыть форму объекта имея ссылку на него?
  • Как открыть форму выбора произвольного объекта?
  • Как открыть форму существующего объекта ссылочного типа?
  • Открыть форму существующей записи регистра?
  • Как открыть форму нового объекта с обработкой заполнения?
  • Как правильно организовать выбор (подбор) в табличную часть?
  • Как открыть форму и установить в ней отбор?
  • Как в форме отобразить картинку, сохраненную в реквизите справочника?
  • Как в журнале документов «УчетКадров» отобрать только документы «ПриемНаРаботу»?
  • Как узнать интервал дат в открытом текущем журнале?
  • Как при открытии справочника сделать отбор по контрагентам, входящим в список?
  • Как обеспечить, чтобы для выбора значения покупателя в расходной накладной справочник контрагенты открывался сразу с открытой группой «Покупатели»?
  • Как в форме обеспечить выбор реквизита, подчиненного Владельцу?
  • Как не открывая форму внешней обработки выполнить ее процедуру для определенного объекта?
  • Как вывести многострочное предупреждение?
  • Как задать вопрос пользователю?
  • Как открыть форму объекта имея ссылку на него?

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ОткрытьЗначение(СсылкаНаОбъект); 
    КонецПроцедуры

    Как открыть форму выбора произвольного объекта?

    &НаКлиенте
    Процедура Команда1(Команда)
        Перем ВыбЗнач;
    
        Массив = Новый Массив;
        Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));
    
        ОписаниеТиповК = Новый ОписаниеТипов(Массив);
    
        Если ВвестиЗначение(ВыбЗнач, "Введите значение", ОписаниеТиповК) Тогда
            Сообщить(ВыбЗнач);
        КонецЕсли;
    КонецПроцедуры

    Как открыть форму существующего объекта ссылочного типа?

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

    Открыть форму существующей записи регистра?

    &НаКлиенте
    Процедура ОткрытьФормуРегистра(Команда)
       КлючЗаписи = Новый Структура;
       КлючЗаписи.Вставить("Период", ТекущаяДата());
       КлючЗаписи.Вставить("ФизЛицо", Сотрудник);
    
       МассивКлюча = Новый Массив;
       МассивКлюча.Добавить(КлючЗаписи);
    
       КлючЗаписиРегистра = Новый("РегистрСведенийКлючЗаписи.ФИОФизЛиц", МассивКлюча);
    
       ПараметрыОткрытия = Новый Структура("Ключ", КлючЗаписиРегистра);
    
       ОткрытьФорму("РегистрСведений.ФИОФизЛиц.ФормаЗаписи", ПараметрыОткрытия);
    КонецПроцедуры

    Как открыть форму нового объекта с обработкой заполнения?

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", ПараметрыОткрытия);
    КонецПроцедуры

    В это случае вызывается процедура «ОбработкаЗаполнения» модуля объекта. Эта процедура имеет единственный параметр «Основание». Если мы в параметры вставим ключ «Основание», то он будет передан в процедуру «ОбработкаЗаполнения»:

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	ПараметрыОткрытия.Вставить("Основание", Проект);
    	ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", ПараметрыОткрытия);
    КонецПроцедуры

    Как правильно организовать выбор (подбор) в табличную часть?

    Все параметры, указанные в параметреметода открыть форму, доступны в событии «ПриСозданииНаСервере» открываемой формы:

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

    В событии «ПриСозданииНаСервере» формы элемента справочника Проекты можно будет получить «ЛюбойПараметр»:

    &НаСервере
    Процедура ПриСозданииНаСервере()
    	Если Параметры.Свойство("ЛюбойПараметр") Тогда
    		ПереданныйПараметр = Параметры.ЛюбойПараметр;
    	    //Программная обработка формы
    	КонецЕсли;
    КонецПроцедуры

    При открытии формы выбора у Владельца сработает событие «ОбработкаВыбора»:

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	ПараметрыОткрытия.Вставить("ЛюбойПараметр", Проект);
    	ВладелецФормыПодбора = Элементы.ПодчиненныеПроекты;
    	ОткрытьФорму("Справочник.Проекты.ФормаВыбора", ПараметрыОткрытия, ВладелецФормыПодбора);
    КонецПроцедуры

    При выборе в произвольной форме стоит использовать метод ОповеститьОВыборе(), при этом установив через параметры свойство открываемой формы ЗакрыватьПриВыборе = Истина:

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	ПараметрыОткрытия.Вставить("НашПараметр", Склад);
    	ПараметрыОткрытия.Вставить("ЗакрыватьПриВыборе", Истина);
    	ВладелецФормыПодбора = Элементы.Товары;
    	ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", ПараметрыОткрытия, ВладелецФормыПодбора);
    КонецПроцедуры

    В самой форме организуем программно выбор таким образом:

    &НаКлиенте
    Процедура Выбрать(Команда)
        РезультатВыбора = ПодготовитьРезультатВыбора();
        ОповеститьОВыборе(РезультатВыбора);
    КонецПроцедуры
    
    
    &НаСервере
    Функция ПодготовитьРезультатВыбора()
    	//Готовим результат выбора
    КонецФункции

    В результате выполнения метода ОповеститьОВыборе форма подбора закроется и вызовется событие «ОбработкаВыбора» элемента управления «Товары».

    Как открыть форму и установить в ней отбор?

    Для организации отбора при открытии формы нужно использовать параметр «Отбор», тип Структура, где Ключ – это Имя поля динамического списока, а значение это собственно то, почему нужно фильтровать данные

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	Отбор = Новый Структура;
    	Отбор.Вставить("Владелец", Контрагент);
    	ПараметрыОткрытия.Вставить("Отбор", Отбор);
    	ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыОткрытия); 
    КонецПроцедуры

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

    &НаКлиенте
    Процедура ОткрытьФорму(Команда)
    	ПараметрыОткрытия = Новый Структура;
    	ПараметрыОткрытия.Вставить("Подразделение", Подразделение);
    	ВладелецФормыПодбора = Элементы.Сотрудник;
    	ОткрытьФорму("Справочник.СотрудникиОрганизаций.ФормаВыбора", ПараметрыОткрытия, ВладелецФормыПодбора); 
    КонецПроцедуры

    В самой форме в событии «ПриСозданииНаСервере» задаем отбор списка:

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        Если Параметры.Свойство("Подразделение") Тогда
            СписокСотрудников = ПодготовитьСписокСотрудниковПодразделения(Параметры.Подразделение);
            НовыйЭлемент = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            НовыйЭлемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
            НовыйЭлемент.ВидСравнения  = ВидСравненияКомпоновкиДанных.ВСписке;
            НовыйЭлемент.ПравоеЗначение   = СписокСотрудников;
            НовыйЭлемент.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
        КонецЕсли;
    КонецПроцедуры

    Как в форме отобразить картинку, сохраненную в реквизите справочника?

    // Значение, сохраненное в реквизите справочника, имеющем тип 
    // ХранилищеЗначения, можно только получить. 
    СохраненнаяКартинка = Фотография.Получить(); 
    
    Если СохраненнаяКартинка <> Неопределено Тогда 
    	// Если в хранилище было что-нибудь заранее записано… 
    	ЭлементыФормы.Фото.Картинка = СохраненнаяКартинка; 
    КонецЕсли;

    Как в журнале документов «УчетКадров» отобрать только документы «ПриемНаРаботу»?

    ЖурналДокументовСписок.Отбор.ВидДокумента.Установить(Метаданные.Документы.ПриемНаРаботу);

    Как узнать интервал дат в открытом текущем журнале?

    Если ЖурналДокументовСписок.Отбор.Дата.Использование Тогда 
    	Сообщить(ЖурналДокументовСписок.Отбор.Дата); 
    Иначе 
    	Сообщить("Без ограничения по датам"); 
    КонецЕсли;

    Как при открытии справочника сделать отбор по контрагентам, входящим в список?

    Процедура ПриОткрытии() 
    
    	СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке; 
    	СправочникСписок.Отбор.Ссылка.Значение = СписокКонтрагентов; 
    	СправочникСписок.Отбор.Ссылка.Использование = Истина; 
    
    КонецПроцедуры

    Как обеспечить, чтобы для выбора значения покупателя в расходной накладной справочник контрагенты открывался сразу с открытой группой «Покупатели»?

    Процедура КонтрагентНачалоВыбора(Элемент, СтандартнаяОбработка) 
    
    	Если Элемент.Значение.Пустая() Тогда 
    		СтандартнаяОбработка = Ложь; 
    		ФормаВыбора = Справочники.Контрагенты.ПолучитьФормуВыбора( , Элемент); 
    		ФормаВыбора.ВыборПокупателя = Истина; 
    		ФормаВыбора.Открыть(); 
    	КонецЕсли; 
    
    КонецПроцедуры 
    
    
    Если ВыборПокупателя Тогда 
    	ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Истина; 
    	ЭлементыФормы.СправочникСписок.ТекущийРодитель = Константы.ГруппаПокупатели.Получить(); 
    КонецЕсли;
    
    
    Если ВыборПокупателя Тогда 
    	ЭлементыФормы.СправочникСписок.ИерархическийПросмотр = Истина; 
    	ЭлементыФормы.СправочникСписок.ТекущийРодитель = Справочники.Контрагенты.Покупатели; 
    КонецЕсли;

    Как в форме обеспечить выбор реквизита, подчиненного Владельцу?

    // При начале выбора реквизита Помещение вызывается процедура:
    Процедура ПомещениеНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    	СтандартнаяОбработка = Ложь; 
    
    	ФормаВыбора = Справочники.ПереченьПомещенийОбъекта.ПолучитьФормуВыбора( , Элемент); 
    	ФормаВыбора.СправочникСписок.Отбор.Владелец.ВидСравнения = ВидСравнения.Равно;
    	ФормаВыбора.СправочникСписок.Отбор.Владелец.Использование = Истина;
    	ФормаВыбора.СправочникСписок.Отбор.Владелец.Значение = Владелец;
    
    	Помещение = ФормаВыбора.ОткрытьМодально();
    	
    	Если Помещение <> неопределено Тогда
    		ЭлементыФормы.Помещения.ТекущаяСтрока.Помещение = Помещение;
    	КонецЕсли;
    
    КонецПроцедуры

    Как не открывая форму внешней обработки выполнить ее процедуру для определенного объекта?

    Обработка = ВнешниеОбработки.Создать(ИмяФайла); 
    Обработка.Печать(Ссылка);

    Как вывести многострочное предупреждение?

    Предупреждение("На складе: " + Остаток + Символы.ПС + "В резерве : " + 
    	Зарезервировано + Символы.ПС + "Свободный остаток: " + 
    	(Остаток - Зарезервировано), 20, "Состояние остатков");

    Как задать вопрос пользователю?

    Если Товары.Количество() > 0 Тогда
    	Ответ = Вопрос("Табличная часть будет очищена! Продолжить?", 
    	РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, "Внимание!");
    	Если Ответ = КодВозвратаДиалога.Нет Тогда
    		Возврат;
    	КонецЕсли;
    КонецЕсли;
    Товары.Очистить();

    Рассмотрим различные варианты установки отбора при выборе объекта на документе ДокументОтборПриемаТовара. У документа имеются следующие реквизиты (см. рисунок 1):

    • ПоставщикОтбор (тип СправочникСсылка.Поставщики);
    • ТоварОтбор (тип СправочникСсылка.Товары);
    • ОтветственныйОтбор (тип СправочникСсылка.Ответственный);
    • ПриемТовара (тип ДокументСсылка.ПриемТовара).
    Рисунок 1. Структура документа ДокументОтборПриемаТовара

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

    Документ ПриемТовара имеет реквизиты (см. рисунок 2):

    • Поставщик (тип СправочникСсылка.Поставщики);
    • Ответственный (тип СправочникСсылка.Ответственный);
    • Комментарий (Тип Строка).

    А так же табличную часть Товары, состоящую из реквизитов Товар (тип СправочникСсылка.Товары) и Количество (тип Число).

    Рисунок 2. Структура документа ПриемТовара

    1. Установка отбора в свойствах реквизита объекта метаданных

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

    Рисунок 3. Отбор в свойствах реквизита объекта метаданных

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

    Рисунок 6. Значение параметра формы выбора Отбор

    2. Установка отбора в свойствах элемента формы

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

    Рисунок 5. Отбор в свойствах элемента формы

    Свойства элемента формы имеют приоритет над свойствами реквизита объекта.

    3. Установка собственного отбора при создании формы выбора на сервере

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

    Рисунок 6. Связь параметра Товар с реквизитом ТоварОтбор

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

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

    Товар = Неопределено;
    ЭтотОбъект.Параметры.Свойство("Товар", Товар);
    Если Товар <> Неопределено Тогда
    ФиксОтбор = ЭтотОбъект.Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор;
    ЭлементОтбора = ФиксОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товары.Товар");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Товар;
    ЭлементОтбора.Использование = Истина;
    КонецЕсли;

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

    4. Программная установка параметров выбора

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

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

    // Создаем связи параметров выбора.
    МассивСвязей = Новый Массив;
    НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Поставщик", "Объект.ПоставщикОтбор");
    МассивСвязей.Добавить(НоваяСвязь);
    НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Ответственный", "Объект.ОтветственныйОтбор");
    МассивСвязей.Добавить(НоваяСвязь);
    НоваяСвязь = Новый СвязьПараметраВыбора("Товар", "Объект.ТоварОтбор");
    МассивСвязей.Добавить(НоваяСвязь);

    // Создаем параметры выбора.
    МассивПараметров = Новый Массив;
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
    МассивПараметров.Добавить(НовыйПараметр);

    // Устанавливаем связи параметров и параметры выбора для элемента формы.
    Элементы.ПриемТовара.СвязиПараметровВыбора = Новый ФиксированныйМассив(МассивСвязей);
    Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

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

    Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

    5. Установка параметров выбора в момент начала выбора

    Этот вариант позволяет «на лету» устанавливать параметры выбора. Усложним задачу и будем устанавливать отбор только по заполненным реквизитам отбора.
    В модуле формы документа ДокументОтборПриемаТовара в событии НачалоВыбора для элемента ПриемТовара, который связан с реквизитом объекта ПриемТовара, напишем код, который будет устанавливать параметры выбора в зависимости от заполненности реквизитов отбора:

      
    &НаКлиенте
    Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    МассивПараметров = Новый Массив;
    Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Поставщик", Объект.ПоставщикОтбор);
    МассивПараметров.Добавить(НовыйПараметр);
    КонецЕсли;
    Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Ответственный", Объект.ОтветственныйОтбор);
    МассивПараметров.Добавить(НовыйПараметр);
    КонецЕсли;
    Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
    НовыйПараметр = Новый ПараметрВыбора("Товар", Объект.ТоварОтбор);
    МассивПараметров.Добавить(НовыйПараметр);
    КонецЕсли;
    НовыйПараметр = Новый ПараметрВыбора("Отбор.Проведен", Истина);
    МассивПараметров.Добавить(НовыйПараметр);
    Элементы.ПриемТовара.ПараметрыВыбора = Новый ФиксированныйМассив(МассивПараметров);

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

    Для корректной работы отборов необходимо создать событие ПриСозданииНаСервере с таким же программным кодом как в варианте №3 у формы выбора документа ПриемТовара.

    6. Открытие формы выбора с установленным параметром формы Отбор в момент начала выбора

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

      
    &НаКлиенте
    Процедура ПриемТовараНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    Отбор = Новый Структура;
    Если ЗначениеЗаполнено(Объект.ПоставщикОтбор) Тогда
    Отбор.Вставить("Поставщик", Объект.ПоставщикОтбор);
    КонецЕсли;
    Если ЗначениеЗаполнено(Объект.ОтветственныйОтбор) Тогда
    Отбор.Вставить("Ответственный", Объект.ОтветственныйОтбор);
    КонецЕсли;
    Если ЗначениеЗаполнено(Объект.ТоварОтбор) Тогда
    Отбор.Вставить("Товары", Новый Структура("Товар", Объект.ТоварОтбор));
    КонецЕсли;
    Отбор.Вставить("Проведен", Истина);
    ПараметрыФормы = Новый Структура("Отбор", Отбор);
    ОткрытьФорму("Документ.ПриемТовара.ФормаВыбора", ПараметрыФормы, Элемент);

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

    Отборы на динамический список платформа наложит сама, писать дополнительно код больше не нужно, как в варианте №3.

    А что будет, если отбор в связях параметров выбора и параметры выбора пересекаются?

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

    Понравилась статья? Поделить с друзьями:
  • Как увеличить время работы вебасто с пульта старлайн
  • Как увеличить время работы экрана на телефоне хуавей
  • Как удалить бизнес чаты в viber на андроид бесплатно
  • Как удалить лишние страницы в фейсбук бизнес аккаунт
  • Как удалить реквизиты банковской карты с алиэкспресс