Установить параметры динамического списка 1с программно.
Наконец-то осуществилась мечта любого «семерошника». Как часто пользователи программы 7.7 просили сделать нормальный подбор номенклатуры. Чтобы и остатки можно было видеть, и цены, и установить фильтры. Приходилось придумывать разные хитрости, вплоть до написания внешних компонентов. В 1С 8.2 появились динамические списки. Предлагаю рассмотреть, что это такое и что они нам могут дать в 1С 8.3.
За основу возьмем некую тестовую конфигурацию 1С:»Бухгалтерия предприятия 3.0″. Не будем сейчас делать подбор, просто в справочнике «Номенклатура» добавим еще одну форму выбора и сделаем ее временно основной:
При создании система по умолчанию добавит на форму табличное поле с типом «Динамический список».
Зайдем в его свойства и посмотрим, что там.
В первую очередь нас интересует флажок «Произвольный запрос». Он-то и откроет нам все преимущества динамического списка. У нас появится возможность написать собственный запрос, причем с параметрами. Устанавливаем флажок и нажимаем ссылку «Открыть»:
Откроется окно с уже готовым кодом на . Пока что там просто перечислены все поля справочника «Номенклатура».
Получите 267 видеоуроков по 1С бесплатно:
Как видим, имеется кнопка вызова « » и флажок, который дает возможность динамически изменять содержимое списка. То есть когда другой пользователь меняет что-то в справочнике, в нашем списке это тоже изменится. Кроме того, имеется закладка «Настройки», но ее мы коснемся позже.
Собственный запрос в динамическом списке
Сначала создадим нужный нам запрос с остатками и ценами. Примерно так:
Закладка «Настройки»
И вот теперь самое вкусное! Переходим на закладку «Настройки». И сразу видим, что на первой вкладке мы можем делать любые отборы по любому полю в запросе:
Программная установка параметров запроса в динамическом списке 1С 8.3
Не забываем, что в запросе у нас присутствуют два параметра: «Период» и «Тип цен». Мы должны передать их в запрос, иначе будет ошибка.
Пропишем эти параметры в параметрах формы, а в модуле формы добавим следующие строки:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список. Параметры. УстановитьЗначениеПараметра("Период" , Параметры. Дата) ; Список. Параметры. УстановитьЗначениеПараметра("ТипЦен" , Параметры. ТипЦен) ; КонецПроцедурыВ процессе доработки конфигураций каждый программист 1С сталкивается с динамическими списками.
Динамический список - это интерфейсный объект, использующийся для отображения различных списков объектов базы данных или необъектных данных - записей регистров.
Например, динамический список используется для отображения списка номенклатуры:
Для демонстрации возможностей динамического списка создадим внешнюю обработку, добавим основную форму. На форму добавим новый реквизит с типом «Динамический список». Зайдем в его свойства и посмотрим, что там.
Нас интересует свойство «Произвольный запрос». Его включение продемонстрирует нам все возможности динамического списка. Мы сможем написать запрос, используя практически все возможности языка запросов системы 1С: Предприятие. Устанавливаем флажок и нажимаем ссылку «Открыть»:
По умолчанию в наш список будут выводиться список номенклатуры с общим остатком по всем складам. Для реализации такого списка добавим следующий запрос:
В качестве основной таблицы выберем «Справочник.Номенклатура», это позволит нам работать с динамическим списком, как со списком номенклатуры - добавлять, изменять, помечать на удаление элементы справочника. Так же, установка основной таблицы делает доступным возможность динамического считывания данных - это означает, что выборка будет производиться порциями, по мере необходимости.
Далее необходимо создать элементы формы для нашего списка:
Если мы попробуем запустить нашу обработку в таком виде, то получим ошибку:
Для ее устранения необходимо установить значение параметру «Период». Для этого можно воспользоваться методом «УстановитьЗначениеПараметра» коллекции «Параметры» динамического списка. Метод принимает два параметра:
. «Параметр» - Тип: Строка; ПараметрКомпоновкиДанных. Имя параметра или параметр компоновки данных, значение которого нужно установить;
. «Значение» - Тип: Произвольный. Значение, которое нужно установить.
Может быть вызван в обработчике «ПриСозданииНаСервере» формы:
У вас есть вопрос, нужна помощь консультанта?
Предоставим пользователю возможность изменять период получения остатков. Для этого добавим реквизит и связанный с ним элемент формы «Дата»:
В обработчике «ПриИзменении» элемента формы «Дата» вызовем метод «УстановитьЗначениеПараметра», передав в качестве значения значение связанного реквизита. Аналогичным образом изменим процедуру «ПриСозданииНаСервере» формы. Так как метод доступен на клиенте, вызов сервера не потребуется:
Теперь при изменении даты, будут автоматически обновляться остатки:
Предположим, что пользователи хотят видеть либо текущие остатки, либо планируемые поступления. Рассмотрим один из вариантов реализации. Добавим реквизит формы булевого типа и связанный с ним переключатель:
При изменении значения переключателя будем менять текст запроса. Для этого воспользуемся обработчиком события «ПриИзменении» элемента формы «ОтображатьКоличествоКПоступлению». Нам необходимо изменить свойство «ТекстЗапроса» динамического списка в зависимости от значения реквизита. Так как данное свойство недоступно на клиенте необходим вызов серверной процедуры:
Результат внесенных изменений:
Есть форма, содержащая динамический список с произвольным запросом. Как при открытии формы установить нужные параметры в этом запросе?
Одна из задач, возникающих при открытии формы, может заключаться в том, что динамический список в открываемой форме содержит произвольный запрос с параметрами. И при открытии такой формы нужно передавать в этот список конкретные значения параметров.
Эта задача решается с помощью создания дополнительных параметров формы, передачи в них необходимых значений и установки их в параметры запроса в обработчике события формы ПриСозданииНаСервере .
Предположим, что имеется регистр ЦеныТоваров . В форме списка этого регистра содержится динамический список с произвольным запросом:
ВЫБРАТЬ РегистрСведенийЦеныТоваров.Период, РегистрСведенийЦеныТоваров.Товар, РегистрСведенийЦеныТоваров.Цена ИЗ РегистрСведений.ЦеныТоваров КАК РегистрСведенийЦеныТоваров ГДЕ РегистрСведенийЦеныТоваров.Товар = &Товар И РегистрСведенийЦеныТоваров.Период >= &НачалоПериода И РегистрСведенийЦеныТоваров.Период <= &КонецПериода
Как видно из текста запроса, у запроса есть три параметра: Товар , НачалоПериода и КонецПериода . Для нормального функционирования формы значения этих параметров должны быть заданы при открытии формы, иначе в результате открытия формы будет получена ошибка.
Чтобы передать собственные параметры в форму, желательно создать их в редакторе формы.
Вообще говоря, делать это не обязательно. Любые параметры, переданные в функцию ОткрытьФорму() , будут доступны в обработчике события формы ПриСозданииНаСервере . Но все же лучше создать их у формы в явном виде.
Тогда, во-первых, в модуле формы не придется проверять, существуют такие параметры или нет. А во-вторых, явное создание параметров формы облегчает поддержку прикладного решения теми разработчиками, которые не участвовали в его создании.
Итак, создадим у формы списка регистра сведений три параметра: НачалоПериода , КонецПериода (тип Дата ) и Товар (тип СправочникСсылка.Товары ).
Теперь в форме элемента справочника Товары создадим команду ЦеныВДекабре со следующим текстом:
ПараметрыФормы = Новый Структура("НачалоПериода, КонецПериода, Товар", "20121201000000", "20121231235959", Объект.Ссылка); ОткрытьФорму("РегистрСведений.ЦеныТоваров.Форма.ФормаСписка", ПараметрыФормы);
Этой командой мы открываем форму списка регистра сведений и передаем ей значения трех параметров.
В самой форме регистра сведений, в обработчике события формы ПриСозданииНаСервере , установим переданные значения в качестве параметров произвольного запроса динамического списка следующим образом:
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("НачалоПериода", Параметры.НачалоПериода); Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", Параметры.КонецПериода); Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.Товар); КонецПроцедуры