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

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

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

Документы создаются с комментарием "Создан автоматически" и доступны пользователям только на просмотр. Но производственные реалии иногда идут в разрез с выгружаемой контролерами информации (не работал насос и пластификатор 'Реламикс' отлили с бетономешалки №3 бетон В20 и долили в №4 бетон В30 ведром) соответственно в документах выпуска этот материал подлежит коррекции в двух местах.

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

Создаем обработку с использование динамических списков

  1. Обработка "Корректировка документов 'Производство Без Заказа'".

    Нам необходимо будет работать с списком документов, и табличной частью этих документов, для этой цели в 1С везде применяется динамические списки, будем их использовать!

Рис 1. Добавляем на форму динамический список
Рис 1. Добавляем на форму динамический список

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

&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	
	ТекстЗапроса = "ВЫБРАТЬ
	|	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	|ГДЕ
	|	ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь
	|	И ДокументПроизводствоБезЗаказа.Проведен = &Истина
	|{ГДЕ
	|	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	|	(ДокументПроизводствоБезЗаказа.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	|	И КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";		
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

//Это если бы открывали форму с передачей в нее параметров
//СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаВыпуска", Параметры.ДатаРедактирования);
    
	СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",Дата(2025,09,01));
	СписоковДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",
	Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бетоносмесительный цех"))
Рис 3. Динамически список по переданным параметрам
Рис 3. Динамически список по переданным параметрам

Фильтры на форме в виде управляемых параметров динамического списка (тихие параметры).

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

Модернизируем форму добавив фильтры (Подразделение выпуска и Дата выпуска) которые быстро позволят отобрать нужные документы рис 4.

Рис 4. Форма с управлением динамическим списком
Рис 4. Форма с управлением динамическим списком

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

рис 5
рис 5

Вот тут то и вступает в действие волшебство тихих параметров! Заключаем выражение ГДЕ и параметры в фигурные скобки ..

{ГДЕ
	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}

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

Рис 6. Открытие формы с ДС без ограничения по параметрам
Рис 6. Открытие формы с ДС без ограничения по параметрам

Для программного управления параметрами создадим процедуры создадим процедуры "При изменении" для реквизитов которые будут управлять параметрами код ниже.

&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)	
	
	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);	
	
КонецПроцедуры 

&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)

	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
	
КонецПроцедуры

Эти процедуры будут вызывать процедуру на сервере "ОбновлениеПараметровСписка(ПодразделениеВыпуска, ДатаДокумента)" которая и будет управлять параметрами динамического списка код ниже.

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

	Элементы.СписокДокументовДляРедактирования.Обновить();
	
КонецПроцедуры	

Разберем этот код вот эта конструкция сбрасывает параметры :

СписокДокументовДляРедактирования.Параметры.Элементы[0].Использование = Ложь;
СписокДокументовДляРедактирования.Параметры.Элементы[1].Использование = Ложь;

а эта устанавливает и затем обновляет список как "Данные Коллекции Формы" (используем "Элементы.СписокДокументовДляРедактирования.Обновить():

СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ПодразделениеВыпуска",ПодразделениеСсылка);
СписокДокументовДляРедактирования.Параметры.УстановитьЗначениеПараметра("ДатаДокумента",ДатаВыпуска);	

Устанавливаем вначале один параметр Рис 7, а затем и второй рис 8 видим результат.

Рис 7. Параметр (Подразделение)
Рис 7. Параметр (Подразделение)
Р��с 8. Два парметра
Рис 8. Два парметра

Программное управление динамическим списком на "Лету"

Динамическим списком также можно управлять используя БСП, выше в коде у меня закомментированы строки (это я применял в другой разработке) приведенные ниже это позволяет на "лету" заменить текс запроса , основную таблицу ДС что очень эффективно !

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

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

Рис 9. Стандартная команда списка Еще-Найти
Рис 9. Стандартная команда списка Еще-Найти
Рис 10. Результат выполнения команды
Рис 10. Результат выполнения команды

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

весь код (Модуль формы):

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

&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	
	ТекстЗапроса = "ВЫБРАТЬ
	|	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	|{ГДЕ
	|	(ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска),
	|	(ДокументПроизводствоБезЗаказа.Дата >= НАЧАЛОПЕРИОДА(&ДатаДокумента, ДЕНЬ)),
	|	(ДокументПроизводствоБезЗаказа.Дата <= КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ))}";		
	
	Возврат ТекстЗа��роса;
	
КонецФункции

&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)	
	
	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);	
	
КонецПроцедуры 

&НаКлиенте
Процедура ДатаДокументаПриИзменении(Элемент)

	ОбновлениеПараметровСписка(ПодразделениеВыпуска,ДатаДокумента);
	
КонецПроцедуры


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

	Элементы.СписокДокументовДляРедактирования.Обновить();
	
КонецПроцедуры	


&НаСервере
Функция ТекстЗапросаДокументы() Экспорт
	ТекстЗапроса = "ВЫБРАТЬ
	               |	ДокументПроизводствоБезЗаказа.Ссылка КАК Ссылка
	               |ИЗ
	               |	Документ.ПроизводствоБезЗаказа КАК ДокументПроизводствоБезЗаказа
	               |ГДЕ
	               |	ДокументПроизводствоБезЗаказа.Подразделение = &ПодразделениеВыпуска
	               |	И ДокументПроизводствоБезЗаказа.Проведен = &Истина
	               |	И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";		
	
	Возврат ТекстЗапроса;
	
КонецФункции

Всем спасибо! кто почитал, кому то возможно поможет в разработке!

Планирую написать вторую часть полно��тью готовую обработку показать ,там будет заполнение табличной части работа с корзиной и перетаскиванием номенклатуры в нее мышью и другое.

До новым встреч ! и Удачного кодирования !

SPS Липецк.