Как открыть список документов с отбором по реквизиту

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

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

Содержание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Код 1C v 8.2 УП

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

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

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

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

Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.

Код 1C v 8.2 УП

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

Второй способ

Можно открыть форму списка без параметров:

Код 1C v 8.2 УП

 ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");   

И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:

Код 1C v 8.2 УП

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

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.

Но у такого способа есть и очень существенный недостаток: с этим отбором форма будет открываться всегда. Откуда бы ее ни вызвали. Поэтому такую форму не следует назначать основной. А если все же она основная — то перед установкой отбора необходимо предусмотреть какой-то анализ того, откуда открывается эта форма. Например, анализируя параметры формы.

Третий способ

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

Например, нам нужно открыть список приходных накладных, в которых присутствует номенклатура, выделенная в списке номенклатуры.

Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные.

Обработчик выполнения этой команды заполним следующим образом:

Код 1C v 8.2 УП

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

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

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

Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.

В поле Запрос введём следующий текст запроса:

Код 1C v 8.2 УП

 ВЫБРАТЬ
ДокументПриходнаяНакладная.Номер,
ДокументПриходнаяНакладная.Дата
ИЗ
Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная
ГДЕ
ДокументПриходнаяНакладная.Товары.Товар = &Товар

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

Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:

Код 1C v 8.2 УП

 &НаКлиенте
Процедура ПриОткрытии(Отказ)
Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.ФильтрПоТовару);
КонецПроцедуры

Здесь Список.Параметры — это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.

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

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

Я
   ogion83

25.09.19 — 14:09

Имеется Документ.ПСА, создал ЖурналДокументов.ЖурналПСА. Как сделать чтобы при открытии журнала в списке были только документы с реквизитом Склад = «Сырье»?

  

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

   ДенисЧ

1 — 25.09.19 — 14:09

ПРи открытии установить отбор…

   ogion83

2 — 25.09.19 — 14:19

Вот так не работает:

ПараметрыОтбора = Новый Структура;    ПараметрыОтбора.Вставить(«МестоХранения»,Справочники.МестаХранения.НайтиПоКоду(«000000018»));

    ПараметрыФормы = Новый Структура;

    ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора);

        ОткрытьФорму(«ЖурналДокументов.ЖурналПСАЮрЛ.ФормаСписка»,ПараметрыФормы);

   ogion83

3 — 25.09.19 — 14:38

Кто то вот так предлагает:

нФормаВыбора = Справочники.ТестСправочник.ПолучитьФормуВыбора(, ЭлементыФормы.тестОбъект);

нФормаВыбора.Отбор.ТестРеквизит.ВидСравнения = ВидСравнения.Равно;

нФормаВыбора.Отбор.ТестРеквизит.Значение = «Тест1»;

нФормаВыбора.Отбор.ТестРеквизит.Использование = Истина;

нФормаВыбора.Открыть();

Но у меня не появляется после нФормаВыбора. в выборе «Отбор»

   ogion83

4 — 25.09.19 — 14:42

Никто не знает значит?

   hhhh

5 — 25.09.19 — 14:45

(4) как в (2) советуют, пробуй

   ogion83

6 — 25.09.19 — 14:56

Процедура ПриОткрытии()

    ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.Значение = Справочники.МестаХранения.НайтиПоКоду(«000000003»);

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

И вот акт не работает.

   hhhh

7 — 25.09.19 — 15:00

(6) что значит «акт не работает» ? Какой акт?

   Ёпрст

8 — 25.09.19 — 15:07

(6) Обычные формы ?

   ogion83

9 — 25.09.19 — 15:07

(7) Опечатка «так» хотел написать.

Вот так сработало наконец:

Процедура ПриОткрытии()

ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.ВидСравнения = ВидСравнения.Равно;

    ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.Использование = Истина;

    ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.Значение = Справочники.МестаХранения.НайтиПоКоду(«000000018»);

   Ёпрст

10 — 25.09.19 — 15:14

(9) не надо такое пихать в ПриОткрытии.

надо всего лишь получить форму, установить отбор в ней и открыть её

  

Ёпрст

11 — 25.09.19 — 15:17

Форма = <нужный объект>.ПолучитьФорму(«нужная форма списка»);

Форма.ДокументСписок.Отбор.МестоХранения.Установить(Справочники.МестаХранения.НайтиПоКоду(«000000018»));

Форма.Открыть();

Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.

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

Открытие формы с отбором в обычном приложении

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

нФормаВыбора = Справочники.ТестСправочник.ПолучитьФормуВыбора(, ЭлементыФормы.тестОбъект);

нФормаВыбора.Отбор.ТестРеквизит.ВидСравнения = ВидСравнения.Равно;

нФормаВыбора.Отбор.ТестРеквизит.Значение = «Тест1»;

нФормаВыбора.Отбор.ТестРеквизит.Использование = Истина;

нФормаВыбора.Открыть();

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

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

Открытие формы с отбором в управляемом приложении

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

ПараметрыОтбора = Новый Структура;

ПараметрыОтбора.Вставить(«ТестРеквизит», «Тест1»);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить(«Отбор», ПараметрыОтбора);

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

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

Второй способ лишен недостатков первого способа, но выглядит значительно более громоздко:

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

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

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

эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

эОтбор.ПравоеЗначение = «Тест2»;

эОтбор.Использование = Истина;

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

ПараметрыФормы = Новый Структура;

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

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

И на всякий случай приведу третий способ, который, на самом деле, мало чем отличается от второго, но смотрите сами:

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

эОтбор = нФормаВыбора.Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

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

эОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;

эОтбор.ПравоеЗначение = «Тест2»;

эОтбор.Использование = Истина;

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

нФормаВыбора.Открыть();

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

В заключение отмечу, что я намеренно не использую модальное открытие формы списка/выбора (1С с некоторых пор приказала отказываться от модальности), но если у Вас есть потребность в модальности, то такое, разумеется, тоже возможно.

На этом все, надеюсь данная статья Вам помогла.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

/// Как выбрать и упорядочить документы за период
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьИУпорядочитьДокументыЗаПериодНаСервере()
 
    // найдём все документы поступления еды за 2014 год
    // упорядочив их по возрастанию даты
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(ВыборкаДокументов.Ссылка);
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти документ по номеру в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоНомеруНаСервере()
 
    // найдём поступление еды № ВМБП-000005 за 2014 год
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Дата МЕЖДУ &НачДата И &КонДата И
        |   Номер = &ВыбНомер";
 
    Запрос.УстановитьПараметр("НачДата", '20140101');
    Запрос.УстановитьПараметр("КонДата", '20141231');
    Запрос.УстановитьПараметр("ВыбНомер", "ВМБП-000005");
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Если ВыборкаДокументов.Следующий() Тогда
        Сообщить(ВыборкаДокументов.Ссылка);        
    Иначе
        Сообщить("Документ с таким номером не существует!");
    КонецЕсли;
 
КонецПроцедуры
 
/// Как найти документы по реквизиту в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиДокументПоРеквизитуНаСервере()
 
    // найдём все документы поступления еды
    // от поставщика ООО "Поле"
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Поставщик
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Поставщик = &ВыбПоставщик
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    Запрос.УстановитьПараметр(
        "ВыбПоставщик",
        Справочники.Поставщики.НайтиПоНаименованию("ООО ""Поле""")
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл        
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Поставщик
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как выбрать все документы, которые не проведены и
/// не помечены на удаление в 1с 8.3, 8.2
 
&НаСервере
Процедура КакВыбратьВсеДокументыКоторыеНеПроведеныИНеПомеченыНаУдалениеНаСервере()
 
    // найдём не проведенные и не помеченные на удаление
    // документы поступления еды
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Ссылка,
        |   Проведен,
        |   ПометкаУдаления        
        |ИЗ
        |   Документ.ПоступлениеЕды КАК ПоступлениеЕды
        |ГДЕ
        |   Проведен = ЛОЖЬ И
        |   ПометкаУдаления = ЛОЖЬ
        |УПОРЯДОЧИТЬ ПО
        |   Дата ВОЗР";
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДокументов = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДокументов.Следующий() Цикл
        Сообщить(
            Строка(ВыборкаДокументов.Ссылка) + " " + 
            ВыборкаДокументов.Проведен + " " +
            ВыборкаДокументов.ПометкаУдаления
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как найти подчиненные документы в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиПодчиненныеДокументыНаСервере()
 
    // Рассмотрим работу с подчиненными (связанными) документами
    // на примере документов: ПоступлениеТоваровУслуг и СчетФактураПолученный.
 
    // Документ СчетФактураПолученный вводится на основании документа
    // ПоступлениеТоваровУслуг, то есть счет фактура является подчиненной
    // по отношению к поступлению.
 
    // Факт подчиненности обычно (в типовых) фиксируется в самом подчиненном
    // документе через табличную часть ДокументыОснования.
    // Почему через табличную часть? Потому что один документ может зависеть
    // (быть подчиненным) сразу от нескольких родителей (оснований).
 
    // Пример №1.
    // У нас есть ссылка на поступление товаров и услуг. Требуется найти
    // счёт-фактуры, которые были введены на основании этого поступления.
    // В дереве подчиненности эти фактуры будут подчинены (зависимы) от
    // документа поступления.
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Ссылка
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.ДокументОснование =
        |    &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", 
        Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру("0000-000004", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        ПодчиненнаяФактура = ВыборкаДетальныеЗаписи.Ссылка;
        Сообщить(ПодчиненнаяФактура);
    КонецЦикла;
 
    // Пример №2.
    // У нас есть ссылка на счет-фактуру полученную. Требуется найти,
    // документы, на основании которых она была введена (родителей).
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ДокументОснование
        |ИЗ
        |    Документ.СчетФактураПолученный.ДокументыОснования КАК
        |    СчетФактураПолученныйДокументыОснования
        |ГДЕ
        |    СчетФактураПолученныйДокументыОснования.Ссылка =
        |    &ВыбСчетФактура";
 
    Запрос.УстановитьПараметр("ВыбСчетФактура",
        Документы.СчетФактураПолученный.НайтиПоНомеру("0000-000007", '20160101')
    );
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        РодительФактуры = ВыборкаДетальныеЗаписи.ДокументОснование;
        Сообщить(РодительФактуры);
    КонецЦикла;
 
КонецПроцедуры
 
///  Как перебрать (перечислить) строки табличной части документа в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПеречислитьСтрокиИзТабличнойЧастиДокументаНаСервере()
 
    // У документа ПоступлениеЕды есть табличная часть 'Еда'.
    // У этой табличной части есть колонки: Номенклатура, Количество,
    // Сумма.
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');    
 
    // перечислим строки табличной части этого документа
 
    // при помощи объектной техники
 
    Для Каждого Строка Из ПоступлениеСсылка.Еда Цикл
        Сообщить(
            Строка.Номенклатура.Наименование + " " +
            Строка.Количество + " шт. " + 
            Строка.Сумма + " руб."
        );
    КонецЦикла;
 
    // при помощи запроса    
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ПоступлениеЕдыЕда.Номенклатура,
        |   ПоступлениеЕдыЕда.Количество,
        |   ПоступлениеЕдыЕда.Сумма
        |ИЗ
        |   Документ.ПоступлениеЕды.Еда КАК ПоступлениеЕдыЕда
        |ГДЕ
        |   ПоступлениеЕдыЕда.Ссылка = &ВыбПоступление";
 
    Запрос.УстановитьПараметр("ВыбПоступление", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
 
        Сообщить(
            ВыборкаДетальныеЗаписи.Номенклатура.Наименование + " " +
            ВыборкаДетальныеЗаписи.Количество + " шт. " + 
            ВыборкаДетальныеЗаписи.Сумма + " руб."
        );
 
    КонецЦикла;
 
КонецПроцедуры
 
&НаСервере
Процедура СозданиеИИзменениеДокументовНаСервере()
 
    /// Как создать новый документ в 1с 8.3, 8.2
 
    // создадим новый документ поступление еды
    Поступление = Документы.ПоступлениеЕды.СоздатьДокумент();
    // заполним шапку документа
    Поступление.Дата = ТекущаяДата();
    Поступление.Поставщик = 
        Справочники.Поставщики.НайтиПоНаименованию(
            "ООО ""Кузбас"""
        );
    Поступление.Склад =
        Справочники.Склады.НайтиПоНаименованию(
            "Основной"
        );
    // заполним табличную часть Еда
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    /// Как записать документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Запись);
 
    /// Как провести документ в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как отменить проведение документа в 1с 8.3, 8.2
 
    Поступление.Записать(РежимЗаписиДокумента.ОтменаПроведения);
 
    /// Как внести изменения в документ по ссылке в 1с 8.3, 8.2
 
    // зачастую у нас есть только ссылка на документ
    // и чтобы по ней получить сам объект документа
    // для изменения нужно вызывать метод ПолучитьОбъект
 
    // найдём документ продажа еды под номером ВМБП-000001
    // для лаконичности примера воспользуемся не запросом,
    // а объектной техникой
 
    СсылкаНаПродажу = Документы.ПродажаЕды.НайтиПоНомеру(
        "ВМБП-000001",
        '20141231' // поиск среди документов 2014 года
     );
    // нам вернули не сам документ, а ссылку (указатель) на него
 
    // проверим - нашёлся ли вообще документ    
    Если СсылкаНаПродажу.Пустая() Тогда
        Сообщить("Документ не найден.");
    Иначе
        // получим сам документ по ссылке
        Продажа = СсылкаНаПродажу.ПолучитьОбъект();
        // вот его уже можно изменять и записывать
        Продажа.Клиент = 
            Справочники.Клиенты.НайтиПоНаименованию(
                "Пётр"
            );
        Продажа.Записать();
    КонецЕсли;
 
    /// Как получить пустую ссылку типа документ в 1с 8.3, 8.2
 
    ПустаяСсылка = Документы.ПродажаЕды.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как скопировать существующий документ в 1с 8.3, 8.2
 
    // скопируем найденный документ на продажу и запишем
    // как новый документ от сегодняшнего числа
 
    КопияПродажи = СсылкаНаПродажу.Скопировать();
    КопияПродажи.Дата = ТекущаяДата();
    КопияПродажи.Комментарий = "Копия документа " + 
        Строка(СсылкаНаПродажу);
    // запишем и проведём документ
    КопияПродажи.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как заблокировать документ перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку документа
    // от изменения другими режимами или пользователями
 
    Продажа = СсылкаНаПродажу.ПолучитьОбъект();
    Если Не Продажа.Заблокирован() Тогда
        Продажа.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Продажа.Комментарий = "Документ изменён.";
        Продажа.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Продажа.Разблокировать();
    КонецЕсли;
 
    /// Как создать новый документ на основании другого объекта
    /// в 1с 8.3, 8.2
 
    // создадим документ продажа на основании поступления
    // скопировав из поступления табличную часть
 
    // в модуле документа ПродажаЕды я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    ПродажаНаОсновании = Документы.ПродажаЕды.СоздатьДокумент();
    ПродажаНаОсновании.Дата = ТекущаяДата();
    ПродажаНаОсновании.Комментарий =
        "Документ введён на основании " + Строка(Поступление.Ссылка);
    ПродажаНаОсновании.Заполнить(Поступление.Ссылка);
    ПродажаНаОсновании.Записать(РежимЗаписиДокумента.Проведение);
 
    /// Как пометить на удаление документ в 1с 8.3, 8.2
 
    ПродажаНаОсновании.УстановитьПометкуУдаления(Истина);
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
/// Как найти и изменить программно движения документа
/// по регистрам в 1с 8.3, 8.2
 
&НаСервере
Процедура КакНайтиИИзменитьДвиженияДокументаНаСервере()
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // наша задача: найти записи по регистру "ЗапасЕды"
    // изменить их (например, удвоим количество)
    // и записать вместо старых
 
    // используем объектную технику получения движений,
    // ведь мы будем их изменять
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    // получим набор записей этого документа в регистр ЗапасыЕды
    НаборЗаписей = Поступление.Движения.ЗапасыЕды;
 
    // прочитаем записи из базы данных
    НаборЗаписей.Прочитать();
 
    Для Каждого Запись Из НаборЗаписей Цикл
 
        // выведем старые значения
        Сообщить(
            Строка(Запись.ВидДвижения) + " " +
            Запись.Еда + " " + Запись.Количество
        );
 
        // изменим запись, удвоив количество
        Запись.Количество = Запись.Количество * 2;
 
    КонецЦикла;
 
    // добавим новую запись
    НоваяЗапись = НаборЗаписей.ДобавитьПриход();    
    НоваяЗапись.Склад = 
        Справочники.Склады.НайтиПоНаименованию("Основной");
    НоваяЗапись.Еда = 
        Справочники.Еда.НайтиПоНаименованию("Банан");
    НоваяЗапись.Количество = 3;
    НоваяЗапись.Период = ТекущаяДата();
 
    // разом запишем набор записей
    НаборЗаписей.Записать(
        Истина // удалим старые движения и запишем вместо них новые
    );
 
    // теперь движения документа № ВМБП-000002 отличаются от тех,
    // что были записаны документом при проведении
    // чтобы вернуть их к начальному виду - нужно
    // перепровести документ
 
КонецПроцедуры
 
/// Как прочитать движения документа по регистрам запросом
/// в 1с 8.3, 8.2
 
&НаСервере
Процедура КакПрочитатьДвиженияДокументаЗапросомНаСервере()
 
    // этот приём используется, если не требуется изменять
    // найденные записи    
 
    // предположим у нас есть ссылка на проведенный
    // документ поступления еды № ВМБП-000002
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000002", '20141231');
 
    // мы знаем, что этот документ делает записи по
    // двум регистрам:
    // - регистр накопления "ЗапасЕды"
    // - регистр бухгалтерии "Хозрасчетный"
 
    // прочитаем записи по регистру "ЗапасЕды" запросом
 
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ЗапасыЕды.НомерСтроки,
        |   ЗапасыЕды.ВидДвижения,
        |   ЗапасыЕды.Еда,
        |   ЗапасыЕды.Количество
        |ИЗ
        |   РегистрНакопления.ЗапасыЕды КАК ЗапасыЕды
        |ГДЕ
        |   ЗапасыЕды.Регистратор = &ВыбРегистратор
        |
        |УПОРЯДОЧИТЬ ПО
        |   ЗапасыЕды.НомерСтроки";
 
    Запрос.УстановитьПараметр("ВыбРегистратор", ПоступлениеСсылка);
 
    РезультатЗапроса = Запрос.Выполнить();
 
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
 
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Сообщить(
            "#" + ВыборкаДетальныеЗаписи.НомерСтроки +
            " " + ВыборкаДетальныеЗаписи.ВидДвижения +
            " " + ВыборкаДетальныеЗаписи.Еда + 
            " " + ВыборкаДетальныеЗаписи.Количество
        );
    КонецЦикла;
 
КонецПроцедуры
 
/// Как изменить проведенный документ, не меняя его
/// движений (проводок) в 1с 8.3, 8.2
 
&НаСервере
Процедура КакИзменитьПроведенныйДокументНеМеняяЕгоДвиженийНаСервере()
 
    // бывает так, что есть проведенный документ
    // в уже закрытом периоде и нужно изменить
    // некоторое поле документа, но так чтобы
    // не поменялись проводки документа
 
    ПоступлениеСсылка = 
        Документы.ПоступлениеЕды.НайтиПоНомеру(
            "ВМБП-000005", '20141231');
 
    // Изменим количество в табличной части этого документа
    // на 1, но чтобы проводки (движения) остались прежними
 
    Поступление = ПоступлениеСсылка.ПолучитьОбъект();
 
    Для Каждого Строка Из Поступление.Еда Цикл
        Строка.Количество = 1;
    КонецЦикла;
 
    // если сейчас просто записать документ
    // изменятся его проводки, ведь он уже проведён
 
    // но если установить флаг Загрузка
    Поступление.ОбменДанными.Загрузка = Истина;    
 
    // то можно записать проведенный документ
    // без повторного проведения
 
    Поступление.Записать();
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПродажуПоНомеру(Номер, Интервал)
 
    Возврат Документы.ПродажаЕды.НайтиПоНомеру(
        Номер, Интервал
    );
 
КонецФункции
 
/// Как открыть форму существующего документа 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоДокумента(Команда)
 
    СсылкаНаДокумент = ПолучитьПродажуПоНомеру("ВМБП-000006", '20141231');
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора документа и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораДокумента(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораДокумента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Документ.ПродажаЕды.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораДокумента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран документ " + Результат);
    КонецЕсли;
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция НайтиПоставщикаПоИмени(Имя)
 
    Возврат Справочники.Поставщики.НайтиПоНаименованию(
        Имя
    );
 
КонецФункции
 
/// Как открыть форму списка (журнал) документов и
/// с отбором по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаДокументовСОтбором(Команда)
 
    // откроем список поступлений, оставив
    // только те, что от поставщика ООО "Поле"
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Поставщик",
        НайтиПоставщикаПоИмени("ООО ""Поле"""));
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Документ.ПоступлениеЕды.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного документа в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоДокумента(Команда)
 
    // получаем форму нового документа
    ФормаНовогоДокумента = ПолучитьФорму(
        "Документ.ПоступлениеЕды.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоДокумента.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);    
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоДокумента.Объект);
 
    // показываем форму нового заполненного
    // документа пользователю
    ФормаНовогоДокумента.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Поступление = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("ДокументОбъект.ПоступлениеЕды"));
 
    // заполним только табличную часть
    НоваяСтрока = Поступление.Еда.Добавить();
    НоваяСтрока.Номенклатура =
        Справочники.Еда.НайтиПоНаименованию(
            "Банан"
        );
    НоваяСтрока.Количество = 10;
    НоваяСтрока.Сумма = 550;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Поступление, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

Содержание:

1.       Как открыть форму списка с отбором

2.       Перемещение условия по отбору в запрос

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

1.      Как открыть форму списка с отбором

Существуют различные варианты в системе 1С для открытия и работы с формами списка, которые содержат какой-то, установленный раннее, отбор. Рассмотрим все способы.

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

Во время запуска формы списка в 1С 8 отбор будет осуществлён по конкретному полю, которое было избрано. В примере кода ниже показано, как открыть список с приходными накладными, которые имеют отбор в поле «Номер», для примера было взят номер «333»:

Рис. 1 Пример отбора в форме списка в 1С

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

Рис. 2 Вариант открытия формы списка в 1С 8

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

Рис. 3 Отбор обычной формы по динамическому перечню

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

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

2.      Перемещение условия по отбору в запрос

Рассмотрим помещение основного условия по отбору в запрос, который будет избирать данные в динамический список. Как пример, необходимо запустить перечень приходных накладных, внутри данной документации есть номенклатура, которая будет выделена во всём общем списке. Внутри самой формы списка при отборе в 1С нужно создать специальную команду и кнопку, которая будет отвечать за неё – «Приходные накладные».

Рис. 4 Перемещение основного условия по отбору в запрос

Далее обработчик, который будет исполнять команду по кнопке, стоит прописать, как показано на скриншоте примера кода:

Рис. 5 Обработчик реализации перемещения основного условия по отбору в запрос

Внутри данного обработчика всё работает так, что в итоге мы выведем форму списка в 1С с приходными накладными, после чего данный список передаётся в параметр формы «ФильтрПоТовару», а также в него передаётся ссылка выбранного элемента внутри перечня с номенклатурой, после чего можно открыть форму с данным параметром.

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

Рис. 6 Работа с формой списка с документами

Внутри поля «Запрос» нужно прописать следующий запрос, который указан ниже:

Рис. 7 Запрос для формы списка с документами

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

Рис. 8 Код в обработчике событий формы списка 1С 8

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

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

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

Специалист компании «Кодерлайн»

Анна Лисовая

Приветствую всех заглянувших на огонёк!  🙂

Тема открытия списка документов, справочников, регистра с отбором на управляемых формах (УФ) давно «избита». Но нюансы как всегда появляются.

Реализация такого функционала возможна несколькими способами. Но в данной заметке я рассмотрю 2 очень похожих и тем не менее несколько различающихся: с отображением примененного отбора на форме и без отображения примененного отбора.

Отбор устанавливается программно.

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

Чаще всего применяется второй способ, но иногда необходим и первый.

На форумах информация есть, но она чаще всего сильно разрозненная и не полная (

А точнее:

Открытие списка с отборомВ первом случае выделенный раздел выводится, во втором случае — нет.

1. Если необходимо отразить примененный отбор на форме списка:

    Форма = ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаВыбора",, Элементы.Товары);  //Здесь указываете свою форму

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

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

    //Этот блок можно повторять столько раз, сколько требуется установить отборов. Идентификатор в каждом отоборе должен быть разный.

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

2. Если необходимо открыть без отображения отбора:

    Форма = ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаВыбора",, Элементы.Товары);  //Здесь указываете свою форму

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

    //Этот блок можно повторять столько раз, сколько требуется установить отборов

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

На этом все, тема Открытие списка с отбором — на мой взгляд раскрыта 🙂

Если есть вопросы, задавайте в комментариях.

PS. А для тех кто занимается поддержкой расчета зарплаты на предприятии (не только программисты), напоминаю что по этой тематике выделен отдельный ресурс Pro-Zup.info.

Если у Вас возникают по этой теме вопросы, Вы заинтересованы в расширении возможностей типовой программы или есть пожелания по устранению проблем — добро пожаловать на ресурс https://pro-zup.info/

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