1с отбор не заполнено
Заполняя форму ввода, мы работаем со связанными данными. Так, выбирая договор контрагента, мы ожидаем увидеть в форме выбора список договоров конкретного контрагента. Пользуясь текстовым поиском в поле реквизита формы, мы также должны увидеть список, удовлетворяющий как критериям введенного поиска, так и ограничениям связей. Так, введя часть номера договора, мы ожидаем увидеть список договоров конкретного контрагента, элементы которого содержат в номере набранный образец поиска. Аналогично система должна контролировать уже введенное значение в поле реквизита формы: значение должно удовлетворять ограничениям связей.
СВЯЗИ ПАРАМЕТРОВ ВЫБОРА
Платформа 1С позволяет описывать связи параметров выбора. По этим связям форма выбора автоматически настраивает фиксированные настройки отбора. Пользователь в форме выбора получает список элементов, соответствующих наложенным ограничениям связей. Аналогично платформа обрабатывает отбор элементов при формировании списка выбора. Когда пользователь вводит в реквизит формы текстовый образец строки поиска, платформа выполняет поиск элементов, соответствующих введенному значению по полям поиска, а также по условиям отбора, соответствующих связям параметров выбора.
Описанное поведение системы вполне нас могло устроить. Однако если, например, нужно настроить отбор по полю реквизита через точку, то такое мы сделать стандартно не сможем. Так же, если ограничение подразумевает использование критериев отбора через поля дополнительных таблиц, соединенных с основной таблицей выбираемого типа, то такой вариант также не предусмотрен платформой. И последнее, в платформе нет средств проверки выбранного значения на соответствие связям параметров выбора.
Однако, об этом мало кто знает, в качестве параметра выбора можно установить фиксированный массив, и тогда отбор будет не на равенство, а на вхождение значения поля основной таблицы в список значений установленного массива. И это полезно знать в рамках представленного решения, чтобы не реализовывать то, что и так поддерживается платформой.
Поясню на конкретных примерах. Представим себе форму, в которой есть два реквизита типа Контрагент. Скажем нужно указать первого контрагента, а потом выбрать второго. Однако второго контрагента можно выбрать только из той же группы контрагентов, в которой находится первый. Здесь условие связи параметров выбора могло бы быть таким: Отбор.Родитель = Контрагент.Родитель. Однако правое выражение через точку не поддерживается платформой и потому такое условие связи ввести нельзя.
Для второго примера представим себе форму, в которой в шапке есть реквизит типа Договор, а в табличной части - реквизит Статья. При этом выбор статей ограничен списком из регистра соответствия статей договору. Такое условие связей могло бы выглядеть так: Отбор.Ссылка = РС.Статья И РС.Договор = ДоговорКонтрагента. Однако в этом случае в условии задействована дополнительная таблица и такое условие также задать стандартно нельзя.
Предлагаемое решение как раз снимает указанные ограничения и позволяет использовать связи параметров как с реквизитами основной таблицы, так и с реквизитами связанных таблиц. Данное решение распространяется на все обозначенные сценарии ввода значения реквизита формы:
- ввод через форму выбора;
- ввод из списка выбора;
- определение однозначного значения выбора (предсказание выбора);
- проверка соответствия значения ограничениям по связям параметров выбора.
ПАРАМЕТРЫ ВЫБОРА
При вызове формы выбора или при подборе из списка платформа передает параметры, определенные по связям. Используя переданные параметры можно сформировать свой собственный запрос к данным и подменить выборку данных. Это нам необходимо для того, чтобы обойти ограничения описания условий связей. Перед рассмотрением указанного способа получения выборки давайте ознакомимся с существующими ограничениями платформы при описании связей.
Платформа накладывает следующие ограничения на создание выражений условий связей параметров. Имя параметра должно удовлетворять условиям написания имен (не содержать пробелов, начинаться может с буквы или символа подчеркивание); в имени можно использовать только одну точку или не использовать точку вообще. Значение параметра должно быть значением реквизита формы без использования подчиненных реквизитов, однако можно указать реквизит табличной части в специальном формате через элементы формы: Элементы.Список.ТекущиеДанные.ИмяРеквизита.
ОБХОД ОГРАНИЧЕНИЙ ПАРАМЕТРОВ ВЫБОРА
Практика
На практике мне попадались следующие решения:
- Передача в параметры формы выбора подготовленного списка ссылок для выбираемого типа данных
- Использование специализированной формы выбора с предопределенным запросом динамического списка
- Выбор из подготовленного списка значений
Недостатками этих решений являются:
- Не универсальность (необходимо разрабатывать специализированные формы выбора)
- Невозможность переиспользования данного подхода для формирования списка выбора
- Невозможность переиспользования для проверки введенного значения
Решение
В рамках наложенных ограничений платформы, недостающие параметры можно передать косвенно через указание реквизита формы. Так, если по приведенному примеру выше, нам нужно указать связь по родителю реквизита Контрагент, то условие связи параметров может быть таким: Отбор.КонтрагентРодителя = Контрагент. Тогда в форму выбора или же в предопределенную процедуру обработки выбора будет передан параметр с именем КонтрагентРодителя и значением реквизита формы Контрагент. Далее нам достаточно отработать условие по этому параметру, а именно использовать этот параметр для получения значения через точку Контрагент.Родитель и уже это, полученное косвенно, значение параметра использовать для установки необходимого отбора по родителю.
Аналогично для второго примера условие связи будет: Отбор.Договор = Договор. Несмотря на то, что условие накладывается на справочник Статьи, в котором отсутствует поле Договор, такое условие в рамках платформы вполне допустимо использовать. В этом случае в форму выбора будет передан параметр Договор со значением из реквизита формы Договор. Далее нам необходимо построить запрос через соединение основной таблицы Статьи с таблицей РегистрСведений.СтатьиДоговора и уже на поле регистра сведений наложить условие отбора по переданному значению договора.
Таким образом можно обойти ограничения платформы и передать в форму выбора необходимые параметры. Далее необходимо исходя из переданных параметров построить текст запроса. Полученный текст запроса можно использовать как в форме выбора, так и в предопределенной процедуре получения данных выбора для формирования списка.
ПОДСИСТЕМА РАБОТА С ДАННЫМИ ВЫБОРА
Рисунок 1. Диаграмма последовательности
Предлагаемая подсистема реализует интерфейс для работы следующих сценариев:
- Быстрый выбор из списка - поддерживается поиск по началу или по вхождению по полям поиска, реализована подсветка найденных фрагментов вхождения текста
- Выбор из формы выбора - поддерживается нестандартная реализация отборов с возможностью вывода иерархии (для иерархических справочников)
Подключение к подсистеме производится через вставку вызова в форме выбора и добавление предопределенной процедуры менеджера объекта ОбработкаПолученияДанныхВыбора.
Обработка параметров, функция ПолучитьТекстЗапроса
В предлагаемое решение строится вокруг реализации функции ПолучитьТекстЗапроса. Реализация данной функции не является обязательной и нужна только для тех типов данных, выборка которых ограничивается не только по реквизитам основной таблицы.
Основное назначение функции - в получении текста запроса по переданным параметрам. В отличии от стандартного поведения платформы, когда в форму выбора передаются параметры, эта функция не имеет ограничений: в ней можно реализовать любые условия выбора. Однако и здесь есть ограничение платформы: результирующий запрос не должен содержать объединений ни в одном из пакетов запроса. Это ограничение накладывается реализацией динамического списка, в котором на текущий момент объединения не поддерживаются (однако объединение можно использовать во вложенном запросе!).
В следующем листинге демонстрируется пример-заготовка реализации такой функции. Данная реализация основана на использовании объектной модели запроса. Работа с объектной моделью осуществляется с использованием подсистемы "Работа со схемой запроса". С шаблонами построения текста запроса при использовании подсистемы можно подробнее ознакомиться в одноименной статье.
Листинг 1. Общая структура функции ПолучитьТекстЗапроса на примере справочника _ДемоНоменклатура
Динамический список формы выбора
После того, как мы разобрались с механизмом получения текста запроса по переданным параметрам, давайте рассмотрим, как его использовать для формирования динамического списка формы выбора.
Подготовка динамического списка может быть осуществлена в предопределенной процедуре модуля формы: ПриСозданииНаСервере. В этой процедуре доступны параметры выбора, которые необходимо передать в функцию формирования текста запроса. Полученный текст запроса необходимо установить в динамическом списке. Для того, чтобы динамический список работал, необходимо также установить параметры отбора динамического списка (это те параметры, которые нельзя установить в условиях отбора данных основной таблицы, но можно использовать в тексте запроса).
Для работа подсистемы необходимо настроить динамический список формы выбора: установить произвольный запрос и изменить псевдоним основной таблицы на имя "Источник".
Разберемся подробнее с параметрами отбора и установкой отбора в динамическом списке. Стандартным образом отбор в динамическом списке платформа устанавливает по параметрам структуры переданного отбора. В нашем случае в этой структуре могут быть как поля основной таблицы, так и параметры, используемые для получения значения отбора косвенно. Параметры второй категории необходимо установить в процедуре ПриСозданииНаСервере и они же должны быть указаны в тексте запроса, а параметры первой категории оставить в структуре отбора. Тогда платформа получит в качестве отбора поля основной таблицы и стандартным образом настроит элементы фиксированного отбора по переданным значениям после открытия формы выбора.
Таким образом, для работы формы выбора с динамическим списком необходимо разделить переданные параметры на отбор по реквизитам основной таблицы и параметры запроса. Первые должны остаться и будут стандартным образом обработаны системой, а вторые необходимо использовать в тексте запроса динамического списка и установить программно в параметрах динамического списка.
Листинг 2. Демонстрация разделения параметров в функции ПолучитьТекстЗапроса
Листинг 3. Подключение формы выбора к подсистеме
Примечание: подключаемая форма выбора должна содержать произвольный текст запроса основной таблицы, при этом псевдоним основной таблицы должен быть предопределенным «Источник». Этот же псевдоним используется в подсистеме для построения текста запроса путем добавления условия и соединений.
Список данных выбора
Рисунок 2. Список выбора
Механизм получения списка данных выбора аналогичен описанному для динамического списка формы выбора.
Как и для формы выбора здесь при вызове предопределенной процедуры ОбработкаДанныхВыбора будут переданы параметры, в том числе и параметры связей выбора. Далее необходимо получить текст запроса и установить значения переданных параметров в запрос программно. К полученному запросу необходимо применить отбор по условию вхождения переданного образца в строке поиска в значения по полям поиска.
После выполнения полученного запроса в процедуре формируется список, который используется платформой для вывода на экран списка выбора.
Листинг 4. Подключение процедуры к подсистеме
Проверка на соответствие условиям параметров выбора. Заполнение по-умолчанию.
Теперь, когда мы умеем формировать текст запроса по условиям связей, мы можем также проверить текущее значение реквизита на соответствие условиям связей. Это может быть полезным, когда меняются связи (топология), либо меняются значения связей, либо производится выбор значения из истории списка.
Если в выборке по условиям связей мы получим единственное значение, то его можно использовать для заполнения реквизита по-умолчанию. В этом случае пользователя не обязательно заставлять сделать выбор, когда выбора то и нет.
Листинг 5. Проверка соответствия переменной СсылкаНаЗначение переданным параметрам выбора из структуры Параметры
СТЕНД "РАБОТА С ДАННЫМИ ВЫБОРА"
Рисунок 3. Форма обработки стенда
Для демонстрации работы подсистемы выбран справочник _ДемоНоменклатура из демо-конфигурации БСП. С помощью расширения конфигурации в справочнике доработан менеджер объекта и форма выбора. В модуль менеджера добавлена функция ПолучитьТекстЗапроса и предопределенная процедура ОбработкаДанныхВыбора. В форме выбора добавлен вызов процедуры ЗаполнитьТекстЗапросаДинамическогоСписка.
В функции ПолучитьТекстЗапроса реализована обработка дополнительных параметров:
- Организация и Контрагент - формируется список номенклатуры, которая использовалась в документах реализации
- Договор контрагента - формируется список номенклатуры, определенный в регистре сведений НоменклатураДоговора
- Дополнительные реквизиты - отбор по реквизитам из табличной части номенклатуры
- Дополнительные свойства - отбор по свойствам, определенным в регистре сведений СвойстваОбъектов
В процедуре используются приемы по формированию текста запроса в объектной модели с использованием подсистемы РаботаСоСхемойЗапроса. Более подробно читайте здесь.
Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х
источник
Разместил: E_Migachev Версии: | 8.x | 8.2 УП | Дата: 13.06.2012 Прочитано: 57759
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Автоматизация обмена данных используя обработку "Универсальный обмен данными в формате XML" 10
Автоматизация обмена между базами используя обработку " Универсальный обмен данными в формате XML" В основу данной публикации положены найденные мною материалы по cозданию обмена между двумя базами с использованием обработки " Универсальный обме Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр Посмотреть все результаты поиска похожих
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 22
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 18
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х
источник
Разместил: E_Migachev Версии: | 8.x | 8.2 УП | Дата: 13.06.2012 Прочитано: 57760
Похожие FAQ
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48
NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 22
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 18
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Я сам новичок в 1С и знаю, как трудно поначалу разобраться в море незнакомой информации и быстро найти нужную для решения какой-либо срочной задачи. Поэтому эту статейку пишу и для себя тоже.
Иногда пользователю нужно быстро отобрать нужные строки в списке по нескольким не точным критериям.
В списках отбор может быть установлен вручную пользователем стандартным способом через контекстное меню списка «Установить отбор и сортировку списка»
Но если отборы часто используемые, то мы можем вынести поля для ввода критериев на форму и устанавливать отборы программно.
1) Рассмотрим установку такого отбора на примере списка справочника Номенклатура.
Открываем в конфигураторе форму списка справочника Номенклатура.
Уменьшим высоту табличного поля «Список».
На освободившееся место над табличным полем разместим 5 элементов:
со следующими именами:
2) фНомер – Булево
3) отбНомер – Строка(20)
4) фНаименование – Булево
5) отбНаименование – Строка(150)
Результат будет выглядеть примерно так:
Сверим список реквизитов формы на закладке «Реквизиты», наши новые обведены красным:
Теперь пишем в модуле формы обработчики событий «При изменении» для флажков и полей ввода.
Для назначения обработчика события элементу формы выбираем мышкой нужный элемент, идем в панель «Свойства» , ищем в разделе «События» событие «ПриИзменении» и щелкаем мышкой по лупе:
И в созданную заготовку процедуры вписываем нужный код:
Вот код этих четырех обработчиков:
// при изменении флажка фНомер
Процедура фНомерПриИзменении ( Элемент )
// если не заполнен Номер для отбора не будем понапрасну дергать Отбор
Если ЗначениеЗаполнено ( отбНомер ) Тогда
УстановитьОтборыФормы ();
КонецЕсли;
КонецПроцедуры
// при изменении поля ввода отбНомер
Процедура отбНомерПриИзменении ( Элемент )
// если не установлен флажок не будем понапрасну дергать Отбор
Если фНомер Тогда
УстановитьОтборыФормы ();
КонецЕсли;
КонецПроцедуры
Процедура фНаименованиеПриИзменении ( Элемент )
// если не заполнено Наименование для отбора не будем понапрасну дергать Отбор
Если ЗначениеЗаполнено ( отбНаименование ) Тогда
УстановитьОтборыФормы ();
КонецЕсли;
КонецПроцедуры
Процедура отбНаименованиеПриИзменении ( Элемент )
// если не установлен флажок не будем понапрасну дергать Отбор
Если фНаименование Тогда
УстановитьОтборыФормы ();
КонецЕсли;
КонецПроцедуры
На двух наших полях ввода включим свойство «КнопкаОчистки».
При очистке поля ввода мы будем сбрасывать соответсвующий флажок и перечитывать отбор:
// при очистке поля ввода отбНомер
Процедура отбНомерОчистка ( Элемент , СтандартнаяОбработка )
фНомер = Ложь;
УстановитьОтборыФормы ();
КонецПроцедуры
// при очистке поля ввода отбНаименование
Процедура отбНаименованиеОчистка ( Элемент , СтандартнаяОбработка )
фНаименование = Ложь;
УстановитьОтборыФормы ();
КонецПроцедуры
Теперь пишем процедуру установки отбора:
Процедура УстановитьОтборыФормы ()
// запомним состояние иерархии
мИерархическийПросмотр = ЭлементыФормы.Список.ИерархическийПросмотр;
Если ( фНомер И НЕ ПустаяСтрока ( отбНомер ))
или ( фНаименование И ЗначениеЗаполнено ( отбНаименование ))
Тогда
// сбросим иерархию
Если ЭлементыФормы . Список . ИерархическийПросмотр Тогда
ЭлементыФормы . Список . ИерархическийПросмотр = Ложь;
КонецЕсли;
// получаем запросом список с установленными критериями отбора
сз = ВернутьСписок ();
// устанавливаем отбор на ссылки, входящие в возвращенный список ссылок
ЭтаФорма . Отбор . Ссылка . ВидСравнения = ВидСравнения . ВСписке ;
ЭтаФорма . Отбор . Ссылка . Значение = сз ;
ЭтаФорма . Отбор . Ссылка . Использование = Истина;
// сбросим отбор
ЭтаФорма . Отбор . Ссылка . Использование = Ложь;
// вернем иерархию взад
Если НЕ мИерархическийПросмотр Тогда
ЭлементыФормы.Список.ИерархическийПросмотр = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
А теперь пишем функцию, выбирающую запросом ссылки по введенным пользователем критериям и возвращающую как результат список отобранных ссылок:
Функция ВернутьСписок ()
Запрос = Новый Запрос ;
// устанавливаем параметры запроса введенными критериями
Запрос . УстановитьПараметр ( "фНомер" , фНомер );
Запрос . УстановитьПараметр ( "фНаименование" , фНаименование );
Запрос . УстановитьПараметр ( "пНомер" , "%" + СокрЛП ( отбНомер ) + "%" );
Запрос . УстановитьПараметр ( "пНаименование" , "%" + СокрЛП ( отбНаименование ) + "%" );
// нам нужна только ссылка для построения списка значений
Запрос . Текст = "ВЫБРАТЬ
| Ссылка
|ИЗ
| Справочник.Номенклатура
|
|ГДЕ
| // 1-ое условие
| (&фНомер = Ложь
| или (&фНомер и НоменклатурныйНомер ПОДОБНО &пНомер)
| )
| // соединим условия союзом И
| И
|
| // 2-ое условие
| (&фНаименование = Ложь
| или (&фНаименование и Наименование ПОДОБНО &пНаименование)
| )
|" ;
Результат = Запрос . Выполнить ();
// создаем новый список значений и выгружаем в него колонку «Ссылка» из результата запроса
сз = Новый СписокЗначений ;
сз . ЗагрузитьЗначения ( Результат . Выгрузить (). ВыгрузитьКолонку ( "Ссылка" ));
// возвращаем результат - полученный список зачений
Возврат сз ;
Вот результат отбора по двум критериям:
Взглянем на форму отборов опять для сравнения и видим на ней установленный наш отбор по ссылке:
2) Рассмотрим более сложный пример со справочником «Основные средства».
Размещаем над списком 7 элементов:
Где 1 – это просто метка, а остальные реквизиты имеют следующие типы:
Добавим в модуль списка новую процедуру ЭлементОтбораПриИзменении и впишем в нее следующий код:
Процедура ЭлементОтбораПриИзменении ( Элемент )
УстановитьОтборыФормы ();
КонецПроцедуры
Всем новым элементам (кроме метки, хе-хе) назначаем этот обработчик, чтобы не плодить их тучу однотипных:
Пишем процедуру установки снятия отбора:
мИерархияВкл = ЭлементыФормы . СправочникСписок . ИерархическийПросмотр ;
Если ( флПоИнвНомеру и НЕ ПустаяСтрока ( отбИнвНомер ))
или ( флПоПодразделению и ЗначениеЗаполнено ( отбПодразделение ))
или ( флПоМОЛ и ЗначениеЗаполнено ( отбМОЛ ))Тогда
Если мИерархияВкл Тогда
ЭлементыФормы . СправочникСписок . ИерархическийПросмотр = Ложь;
КонецЕсли;
ЭтаФорма . Отбор . Ссылка . ВидСравнения = ВидСравнения . ВСписке ;
ЭтаФорма . Отбор . Ссылка . Значение = СписокОС ;
ЭтаФорма . Отбор . Ссылка . Использование = Истина;
Иначе
Если ЭтаФорма . Отбор . Ссылка . Использование Тогда
ЭтаФорма . Отбор . Ссылка . Использование = Ложь;
ЭлементыФормы . СправочникСписок . ИерархическийПросмотр = мИерархияВкл ;
КонецЕсли;
КонецЕсли;
И пишем еще одну процедурку получения списка ссылок запросом.
Здесь мы будем получать последние сведения по ОС из регистров сведений:
- Инвентарный Номер из РС ПервоначальныеСведения
- Подразделение и МОЛ из РС МестонахождениеОС.
Запрос = Новый Запрос ;
Если флПоИнвНомеру и НЕ ( флПоПодразделению или флПоМОЛ ) Тогда
// отбор только по инв. номерам только
Запрос . Текст = "ВЫБРАТЬ
| ПервоначальныеСведенияОССрезПоследних.ОсновноеСредство
|ИЗ
| РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
| &пДата,
| ИнвентарныйНомер ПОДОБНО &пИнвНомер)
|КАК ПервоначальныеСведенияОССрезПоследних" ;
Если флПоПодразделению И ЗначениеЗаполнено ( отбПодразделение ) Тогда
аргУсловие = "МестонахождениеОССрезПоследних.Местонахождение = &пПодразделение"
КонецЕсли;
Если флПоМОЛ И ЗначениеЗаполнено ( отбМОЛ ) Тогда
стрМОЛ = "МестонахождениеОССрезПоследних.МОЛ = &пМОЛ" ;
аргУсловие = ?( ПустаяСтрока ( аргУсловие ), стрМОЛ , аргУсловие + " И " + стрМОЛ );
КонецЕсли;
Если НЕ флПоИнвНомеру Тогда
Запрос . Текст = "ВЫБРАТЬ
| МестонахождениеОССрезПоследних.ОсновноеСредство
|ИЗ
| РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&пДата, )
|КАК МестонахождениеОССрезПоследних
|ГДЕ " + аргУсловие ;
Запрос . Текст = "ВЫБРАТЬ
| ПервоначальныеСведенияОССрезПоследних.ОсновноеСредство
|ИЗ
| РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
| &пДата,
| ИнвентарныйНомер ПОДОБНО &пИнвНомер)
| КАК ПервоначальныеСведенияОССрезПоследних
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&пДата, )
| КАК МестонахождениеОССрезПоследних
| ПО ПервоначальныеСведенияОССрезПоследних.ОсновноеСредство = МестонахождениеОССрезПоследних.ОсновноеСредство
|ГДЕ " + аргУсловие ;
КонецЕсли;
Запрос . УстановитьПараметр ( "пИнвНомер" , "%" + СокрЛП ( отбИнвНомер ) + "%" );
Запрос . УстановитьПараметр ( "пДата" , ТекущаяДата ());
Запрос . УстановитьПараметр ( "пПодразделение" , отбПодразделение );
Запрос . УстановитьПараметр ( "пМОЛ" , отбМОЛ );
Результат = Запрос . Выполнить ();
сз = Новый СписокЗначений ;
сз . ЗагрузитьЗначения ( Результат . Выгрузить (). ВыгрузитьКолонку ( "ОсновноеСредство" ));
Теперь добавляем в список две новых колонки МОЛ и Местонахождение без привязки к данным
Установим их свойства «Видимость» в Ложь, чтобы они не светились в списке сразу. Их заполение мы будем обрабатывать в событии ПриПолученииДанных (см. ниже)
В свойстве ЭлементУправления обоим назначаем «Поле ввода»
В обработчик ПриПолученииДанных добавляем код для отображения значений наших добавленных колонок:
Процедура СправочникСписокПриПолученииДанных ( Элемент , ОформленияСтрок )
…
// создаем структуру для получения сведений из регистра
СтруктураОтбора = Новый Структура ;
СтруктураОтбора . Вставить ( "Организация" , Организация );
СтруктураОтбора . Вставить ( "ОсновноеСредство" , ДанныеСтроки . Ссылка );
// будем запрашивать и выводить данные только при видимости наших колонок
Если ОформлениеСтроки . Ячейки . МОЛ . Видимость
или ОформлениеСтроки . Ячейки . Местонахождение . Видимость Тогда
РегистрыСведений . МестонахождениеОСБухгалтерскийУчет . ПолучитьПоследнее (
ОформлениеСтроки . Ячейки . МОЛ . Значение = МестонахождениеОС . МОЛ ;
ОформлениеСтроки . Ячейки . Местонахождение . Значение =
МестонахождениеОС . Подразделение ;
КонецЕсли;
Открываем список ОС, устанавливаем видимость наших новых колонок МОЛ и Местонахождение, вводим критерии отбора и вуаля:
P . S .
Недостаток рассмотренного подхода в том, что если ранее был каким-либо образом установлен отбор по ссылке, то он будет затерт нашим.
Читайте также: