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

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

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

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

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

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

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

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

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

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

Рис 2. Настройка  списка
Рис 2. Настройка списка

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

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

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

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

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

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

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

рис 5
рис 5

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

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

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

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

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

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

&НаКлиенте
Процедура ПодразделениеВыпускаПриИзменении(Элемент)
	// Вставить содержимое обработчика.
	Сообщить(Элемент.ТекстРедактирования);
	Если Элемент.ТекстРедактирования = "" Тогда
		СбросПараметровСписка();	
	КонецЕсли;	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SPS Липецк.

Комментарии (2)


  1. fosihas
    25.09.2025 18:43

    | И ДокументПроизводствоБезЗаказа.Проведен = &Истина

    | И ДокументПроизводствоБезЗаказа.ПометкаУдаления = &Ложь";

    Такто можно не указывать & для проведения... т.ч. это сказется на производительности.


  1. Temic
    25.09.2025 18:43

    После того как увидел, что автор не использует оператор «МЕЖДУ», для отбора по периоду, закрыл статью.