1с динамический список добавление строки. Поиск в динамическом списке

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

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

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


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

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


Для ее устранения необходимо установить значение параметру «Период». Для этого можно воспользоваться методом «УстановитьЗначениеПараметра» коллекции «Параметры» динамического списка. Метод принимает два параметра:
. «Параметр» - Тип: Строка; ПараметрКомпоновкиДанных. Имя параметра или параметр компоновки данных, значение которого нужно установить;
. «Значение» - Тип: Произвольный. Значение, которое нужно установить.
Может быть вызван в обработчике «ПриСозданииНаСервере» формы:

У вас есть вопрос, нужна помощь консультанта?


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


В обработчике «ПриИзменении» элемента формы «Дата» вызовем метод «УстановитьЗначениеПараметра», передав в качестве значения значение связанного реквизита. Аналогичным образом изменим процедуру «ПриСозданииНаСервере» формы. Так как метод доступен на клиенте, вызов сервера не потребуется:


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




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


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


Результат внесенных изменений:



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

Возможности динамических списков в 1С

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

Чтобы посмотреть, как формируется динамический список и какие данные он показывает, необходимо открыть управляемые формы, где он расположен, в конфигураторе: в перечне реквизитов через контекстное меню открыть его свойства и обратить внимание на пункт «ПроизвольныйЗапрос». Если галка отсутствует, то параметр «Основная таблица» отражает таблицу БД, откуда берутся данные. В ином случае, динамический список отражает данные произвольного запроса, который можно увидеть, открыв настройку списка.

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

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

  • Отбор динамического списка;
  • Группировки;
  • Сортировку;
  • Оформление.

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

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

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



ВЫБРАТЬ НоменклатураПеречень.Наименование КАК Наименование, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ Справочник.Номенклатура КАК НоменклатураПеречень ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекухцаяДата,) КАК ТоварыНаСкладахОстатки ПО НоменклатураПеречень.Ссылка = ТоварыНаСкладахОстатки.Номенклатура ГДЕ

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

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


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

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



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

В результате наша форма Динамический список может отражать остатки на любую дату.

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

  1. Подбора;
  2. Списков.

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

Главная Для начинающих разработчиков Учимся программировать

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

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

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

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

ВЫБРАТЬ РегистрСведенийЦеныТоваров.Период, РегистрСведенийЦеныТоваров.Товар, РегистрСведенийЦеныТоваров.Цена ИЗ РегистрСведений.ЦеныТоваров КАК РегистрСведенийЦеныТоваров ГДЕ РегистрСведенийЦеныТоваров.Товар = &Товар И РегистрСведенийЦеныТоваров.Период >= &НачалоПериода И РегистрСведенийЦеныТоваров.Период <= &КонецПериода

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

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

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

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

Итак, создадим у формы списка регистра сведений три параметра: НачалоПериода , КонецПериода (тип Дата ) и Товар (тип СправочникСсылка.Товары ).

Теперь в форме элемента справочника Товары создадим команду ЦеныВДекабре со следующим текстом:

ПараметрыФормы = Новый Структура("НачалоПериода, КонецПериода, Товар", "20121201000000", "20121231235959", Объект.Ссылка); ОткрытьФорму("РегистрСведений.ЦеныТоваров.Форма.ФормаСписка", ПараметрыФормы);

Этой командой мы открываем форму списка регистра сведений и передаем ей значения трех параметров.

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

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