Управляемая форма и динамический список как ее один из самых эффективных реквизитов, позволяющий быструю реализацию различной списочной информации.
В данный момент реализую разработку в системе ERP, цель которой создания инструмента для корректировки в системе документов "Производство Без Заказа" на предмет изменения количественных показателей израсходованных материалов .
Может возникнуть сразу вопрос для чего это надо? а надо для того что документы по выпуску бетона, создаются ботом на основании данных, выгружаемых с программы обслуживающей бетономешалки.
Документы создаются с комментарием "Создан автоматически" и доступны пользователям только на просмотр. Но производственные реалии иногда идут в разрез с выгружаемой контролерами информации (не работал насос и пластификатор 'Реламикс' отлили с бетономешалки №3 бетон В20 и долили в №4 бетон В30 ведром) соответственно в документах выпуска этот материал подлежит коррекции в двух местах.
Вот тут то и вступит в работу моя обработка корректировки! И эти действия не пройдут бесследно как если бы документ был поправлен в ручную а оставят записи в специально созданном регистре.
Создаем обработку с использование динамических списков
Обработка "Корректировка документов 'Производство Без Заказа'".
Нам необходимо будет работать с списком документов, и табличной частью этих документов, для этой цели в 1С везде применяется динамические списки, будем их использовать!

Производим его настройку выбрав произвольный запрос , и основную таблицу с видом необходимого нам документа и заполняем текст запроса рис 2.
&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
|ИЗ
| Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
|ГДЕ
| ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь
| И ДокументПроизводствоБезЗаказа.Проведен = &Истина
|{ГДЕ
| (ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
| (ДокументПроизводствоБезЗаказа.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
| И КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";
Возврат ТекстЗапроса;
КонецФункции
В произвольном запросе добавляем два параметра (Подразделение выпуска и Дату документа) , как же при открытие формы передать эти параметры первый самый простой способ - это когда наша форма будет открываться из другой формы с уже переданными в форму параметрами. Но мы что бы не останавливаться на этом распространенном способе жестко назначим параметры при открытии формы для этого используется метод - ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) и ниже его код и форма при открытие.
//Это если бы открывали форму с передачей в нее параметров
//СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаВыпуска", Параметры.ДатаРедактирования);
СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",Дата(2025,09,01));
СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",
Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бетоносмесительный цех"))
Фильтры на форме в виде управляемых параметров динамического списка (тихие параметры).
Перейдем к более реальному для наших целей проектированию формы для этого изменим произвольный запрос так чтобы при открытии в списке отражались все документы за все даты для этого будем использовать "тихие параметры".
Модернизируем форму добавив фильтры (Подразделение выпуска и Дата выпуска) которые быстро позволят отобрать нужные документы рис 4.

Запрос списка также изменим..

Вот тут то и вступает в действие волшебство тихих параметров! Заключаем выражение ГДЕ и параметры в фигурные скобки ..
{ГДЕ
(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}это позволит отработать списку при первоначальном открытие без назначение параметров если бы они были не "тихими" мы бы получили ошибку!. В дальнейшем будем передавать например один или два параметра , очищать какой то и выполнять другие манипуляции .

Для программного управления параметрами создадим процедуры создадим процедуры "При изменении" для реквизитов которые будут управлять параметрами код ниже.
&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)
ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
КонецПроцедуры
&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)
ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
КонецПроцедуры
Эти процедуры будут вызывать процедуру на сервере "ОбновлениеПараметровСписка(ПодразделениеВыпуска, ДатаДокумента)" которая и будет управлять параметрами динамического списка код ниже.
&НаСервере
Процедура ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
Если ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",Подразделение);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина И ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина И НЕ ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И НЕ ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
КонецЕсли;
Элементы.СписокДокументовДляРедактирования.Обновить();
КонецПроцедуры
Разберем этот код вот эта конструкция сбрасывает параметры :
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Л��жь;а эта устанавливает и затем обновляет список как "Данные Коллекции Формы" (используем "Элементы.СписокДокументовДляРедактирования.Обновить():
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска); Устанавливаем вначале один параметр Рис 7, а затем и второй рис 8 видим результат.


Программное управление динамическим списком на "Лету"
Динамическим списком также можно управлять используя БСП, выше в коде у меня закомментированы строки (это я применял в другой разработке) приведенные ниже это позволяет на "лету" заменить текс запроса , основную таблицу ДС что очень эффективно !
ТекстЗапроса = ТекстЗапросаДокументы();
СвойстваСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка();
СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
СвойстваСписка.ОсновнаяТаблица = "Документ.ПроизводствоБезЗаказа";
СвойстваСписка.ДинамическоеСчитываниеДанных = Истина;
ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.СписоковДокументовДляРедактирования,СвойстваСписка);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
|ИЗ
| Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
|ГДЕ
| ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска
| И ДокументПроизводствоБезЗаказа.Проведен = &Истина
| И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";
Возврат ТекстЗапроса;
КонецФункции
На это первую часть разработки обработки заканчиваем , ��е забыв упомянуть что динамический список на форме, может также управляться встроенными командами я добавил стандартную команду "Найти" с ее помощью также можно отфильтровать список рис 9


Эта команда позволяет выполнять фильтрацию по реквизитам находящемся в списке, по Дате она уже не сможет отфильтровать.
весь код (Модуль формы):
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокМатериалов.Параметры.УстановитьЗначениеПараметра("ДокументРедактирования",Документы.ПроизводствоБезЗаказа.ПустаяСсылка());
КонецПроцедуры
&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
|ИЗ
| Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
|{ГДЕ
| (ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
| (ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
| (ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";
Возврат ТекстЗапроса;
КонецФункции
&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)
ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
КонецПроцедуры
&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)
ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
КонецПроцедуры
&НаСервере
Процедура ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
Если ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",Подразделение);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина И ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Истина И НЕ ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
ИначеЕсли ЗначениеЗаполнено(ПодразделениеВыпуска) = Ложь И НЕ ДатаДокумента = '00010101' Тогда
СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Истина;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;
//СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеВыпуска);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаДокумента);
КонецЕсли;
Элементы.СписокДокументовДляРедактирования.Обновить();
КонецПроцедуры
&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
|ИЗ
| Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
|ГДЕ
| ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска
| И ДокументПроизводствоБезЗаказа.Проведен = &Истина
| И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";
Возврат ТекстЗапроса;
КонецФункции
Всем спасибо! кто почитал, кому то возможно поможет в разработке!
Планирую написать вторую часть полностью готовую обработку показать ,там будет заполнение табличной части работа с корзиной и перетаскиванием номенклатуры в нее мышью и другое.
До новым встреч ! и Удачного кодирования !
SPS Липецк.
