Дополнительные параметризуемые поля в динамических списках. Остатки и цены в списке номенклатуры

13.05.24

Разработка - Инструментарий разработчика

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Остатки и цены в списках номенлатуры для УТ 11.5 и ЕРП 2.5
.cfe 64,11Kb
24
24 Скачать (2 SM) Купить за 2 150 руб.

Расширение позволяет пользователю, в случае наличия прав, самостоятельно добавить необходимые ему поля в динамических списках, на примере списка номенклатуры, изменять их "на лету", менять их порядок, пользоваться всеми "прелестями" динамических списков - отборами, сортировками, условным оформлением. Выбранные поля сохраняются в пользовательских настройках и доступны при следующем открытии формы. Использовались материалы: Статья уважаемой Евгении Карук

 

 

Установка Расширения:

Расширение устанавливается стандартно, через "НСИ и Администрирование" -> "Печатные формы, отчеты и обработки" -> "Расширения", далее -> "Добавить из файла..." -> выбираем файл расширения, перезапускаем по ссылке сеанс. Расширение работает в безопасном режиме, дополнительно не нужно никаких прав.

 

Как пользоваться расширением:

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

 

 

По нажатию на который, пользователь увидит окно настроек дополнительных полей:

 

 

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

Работает на (проверено, писалось на):

Платформа:

Как минимум не ниже 8.3.16 (установлен режим совместимости "минимум"), ниже не проверял

Конфигурации:

УТ 11.5.8.342

ЕРП 2.5.8.405

Инфа для разработчиков:

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

Пример кода описания полей:

 

Процедура модификации списка:

 

 

Процедура 	МодифицироватьСписокИФорму(ЭтотОбъект)
	ПараметрыСписка = ПолучитьПараметрыСписка(ЭтотОбъект.ИмяФормы);
	ДСписок 		= ПараметрыСписка.ДСписок;
	МассивТаблиц 	= ПараметрыСписка.МассивТаблиц;
	ПолеСсылки 		= ПараметрыСписка.ПолеСсылки; 
	
	Префикс  		= "Расш_ДополнениеСписков";  	//используем только для обозначения таблиц в запросе и полей формы,
												//пользователь не видит, по нему, при обновлении все удаляем
	СхемаЗапроса 	= Новый СхемаЗапроса;
	СхемаЗапроса.УстановитьТекстЗапроса(ЭтотОбъект[ДСписок].ТекстЗапроса);
	
	ПоследнийПакет 	= СхемаЗапроса.ПакетЗапросов.Количество() - 1;
	Пакет = СхемаЗапроса.ПакетЗапросов[ПоследнийПакет];
	Оператор = Пакет.Операторы[0]; 	//в результирующем пакете не должно быть (по идее...) объединений таблиц, поэтому беру 0
	
	//восстановим запрос - удалим источники по префиксу
	Для Сч = -(Оператор.Источники.Количество() - 1) По 0 Цикл
		Если СтрНачинаетсяС(Оператор.Источники[-Сч].Источник.Псевдоним,Префикс) Тогда
			Оператор.Источники.Удалить(-Сч);	
		КонецЕсли;
	КонецЦикла;	

	ИндексСсылки 		= Пакет.Колонки.Индекс(Пакет.Колонки.Найти(ПолеСсылки)); 	//ищем "главное" поле в исходном запросе для последующих соединений
	ГлавноеПоле	 		= Оператор.ВыбираемыеПоля[ИндексСсылки]; 				//наименование поля ссылки на номенлатуру для соединения
	ГлавнаяТаблица 		= СтрРазделить(ГлавноеПоле,".")[0]; 			//наименование таблицы со ссылкойна номенлатуру для поиска ее индекса и условий связей
	Источники 			= Оператор.Источники;
	ИндексГлавнойТаблицы = Источники.Индекс(Источники.НайтиПоПсевдониму(ГлавнаяТаблица)); //к ней по ее индексу и будем соединять
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	//модификация запроса
	/////////////////////////////////////////////////////////////////////////////////////////////////////
	ДобавленныеПараметры 	= Новый Соответствие;  							//храним добавленные таблицы в разрезе значений параметра (Склад, Цена)
	ДобавленныеПараметрыИмя = Новый Соответствие;  							//храним имя параметра в запросе: ПараметрРасширения1,2,3...
	СчетчикИсточников		= 1;                                            //счетчик добавленных Источников для формирования Псевдонима в запросе
	Попытка
		Для каждого СтрокаПоле ИЗ ЭтотОбъект["НастройкиУниверсальные"] Цикл    	//в виде массива структур "Источник,ПсевдонимИсточника" 
			ЗначениеПараметра = СтрокаПоле.Значение;                            //текущее значение параметра (Склад, Цена)
			Если ДобавленныеПараметры[ЗначениеПараметра] = Неопределено Тогда
				ДобавленныеПараметры.Вставить(ЗначениеПараметра, Новый Массив);
				ДобавленныеПараметрыИмя.Вставить(ЗначениеПараметра,"ПараметрРасширения" + ДобавленныеПараметры.Количество());
			КонецЕсли;
			ДобавленныйПараметр 	= ДобавленныеПараметры[ЗначениеПараметра];  	//тут лежат уже добавленные по нему таблицы в виде массива структур
			ДобавленныйПараметрИмя 	= ДобавленныеПараметрыИмя[ЗначениеПараметра];   //так он будет называться в запросе
			
			ИндексНастройки = ЭтотОбъект["НастройкиУниверсальные"].Индекс(СтрокаПоле); //????? вроде без него обошелся
			Настройка = ЭлементПоПредставлениюСервер(СтрокаПоле.ТипПредставление, ЭтотОбъект["СтруктураТипов"]);          //текущая струтура в которой полное описание добавляемого поля
			                                                                                                              
			МассивЗанятыхИмен 	= ЭтотОбъект["НастройкиУниверсальные"].Выгрузить().ВыгрузитьКолонку("ЧеловеческоеИмя");
			ЗначениеСтрока		= ?(ЗначениеЗаполнено(ЗначениеПараметра), Строка(ЗначениеПараметра), Настройка.Ключ); 	  //либо представление параметра, либо ключ структуры: Цена, ОстатокФактический и т.д.
			Представление 		= ?(ПустаяСтрока(СтрокаПоле.Представление), ЗначениеСтрока, СтрокаПоле.Представление);    //приоритет представлению, прописанному вручную
			ЧеловеческоеИмя 	= ПолучитьЧеловеческоеИмя(Представление, МассивЗанятыхИмен);                              //приводим его к "допустимому имени реквизита", добавляем цыфры - если занят
			СтрокаПоле.ЧеловеческоеИмя	= ЧеловеческоеИмя;	                                                              //в дальнейшем это будет поле в запросе и компоновке
		
		    //обходим добавляемые таблицы для поля, ищем их в ДобавленныйПараметр, если не находим - добавляем
			ПсевдонимыИсточников = Новый Массив;        //тут будем хранить псевдонимы добавленных/найденных источников, тобы их подставить в Поле по номеру 
			                                            //в рамках строки настроек (по добавляемому полю)
														
			Если НЕ Настройка.Значение.Свойство("Структура") Тогда
				Сообщить("Свойства не заполнены: " + Настройка.Ключ);												
				Продолжить; //отладка, проверка заполнения свойств
			КонецЕсли;
			
			Для каждого Таблица Из Настройка.Значение.Структура.Источники Цикл 
				ТекущийИсточникТекст 		= Таблица.Источник;
				ТекущийИсточникУсловие 		= Таблица.Условие;
				ТекущийИсточникПараметры	= Таблица.Параметры;
				//поиск среди уже добавленных
				ТекущийПсевдоним = "";
				Для каждого ДобавленныйИсточник из ДобавленныйПараметр Цикл
					Если ДобавленныйИсточник.Источник = ТекущийИсточникТекст Тогда
						ТекущийПсевдоним = ДобавленныйИсточник.ПсевдонимИсточника;
						Прервать;
					КонецЕсли;
				КонецЦикла;
				
				//добавляем Источник, если не нашли в коллекцию добавленных и далее в запрос
				Если ТекущийПсевдоним = "" Тогда
					ТекущийПсевдоним = Префикс + СчетчикИсточников;
					СчетчикИсточников = СчетчикИсточников + 1;
					ДобавленныйПараметр.Добавить(Новый Структура("Источник,ПсевдонимИсточника", ТекущийИсточникТекст, ТекущийПсевдоним));
				Иначе
					ПсевдонимыИсточников.Добавить(ТекущийПсевдоним);
					Прервать; //такой источник с установленным параметром Значение уже добавлен в запрос
				КонецЕсли;    //добавляем в массив ПсевдонимыИсточников для формирования выражения 
				              //ВНИМАНИЕ возможно что при использовании виртуальных табл с разными параметрами они будут считаться ождинаковыми
							  
				ПсевдонимыИсточников.Добавить(ТекущийПсевдоним); //после добавления всех источников по Полю тут будут все псевдонимы
				                                                 //добавленных источников, для формирования выражения поля, в нужном порядке
				//добавляем в запрос
				//проверим ЗначениеПараметра на заполнено, если не заполнено, тогда удалим 
				//из ТекущийИсточникТекст и ТекущийИсточникУсловие все строки из УдалитьПоНезаполнено
				Если НЕ ЗначениеЗаполнено(ЗначениеПараметра) Тогда
					Для Каждого УдаляемыйТекст из Таблица.УдалитьПоНезаполнено Цикл
						ТекущийИсточникТекст 	= СтрЗаменить(ТекущийИсточникТекст, УдаляемыйТекст, "");
						ТекущийИсточникУсловие 	= СтрЗаменить(ТекущийИсточникУсловие, УдаляемыйТекст, "");
					КонецЦикла;
				КонецЕсли;
				
				//подставляем в ТекущийИсточникТекст и ТекущийИсточникУсловие параметр и псевдонимы источников
				//в ТекущийИсточникТекст %1 это ДобавленныйПараметрИмя
				//в ТекущийИсточникУсловие %0 это ДобавленныйПараметрИмя, %1 это ГлавнаяТаблица, %2 это ТекущийПсевдоним 
				ТекущийИсточникТекст 	= СтрЗаменить(ТекущийИсточникТекст, "%1", "&"+ДобавленныйПараметрИмя);
				ТекущийИсточникУсловие 	= СтрЗаменить(ТекущийИсточникУсловие, "%0", "&"+ДобавленныйПараметрИмя);
				ТекущийИсточникУсловие 	= СтрЗаменить(ТекущийИсточникУсловие, "%1", ГлавнаяТаблица);
				ТекущийИсточникУсловие 	= СтрЗаменить(ТекущийИсточникУсловие, "%2", ТекущийПсевдоним);			
				
				Если СтрНачинаетсяС(ТекущийИсточникТекст, "ВЫБРАТЬ") Тогда
					ДобавленныйИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), ТекущийПсевдоним);
					ДобавленныйИсточник.Источник.Запрос.УстановитьТекстЗапроса(ТекущийИсточникТекст);
				Иначе
					ДобавленныйИсточник = Источники.Добавить(ТекущийИсточникТекст, ТекущийПсевдоним);
				КонецЕсли;                   
				
				//установим параметры виртуальных таблиц, в случае их наличия и заполненного параметра
				Если ЗначениеЗаполнено(ЗначениеПараметра) И ТекущийИсточникПараметры.Количество() > 0 Тогда
					Для Сч = 0 По ДобавленныйИсточник.Источник.Параметры.Количество()-1 Цикл
						Если ТекущийИсточникПараметры.Количество() >= Сч+1 Тогда
							ДобавленныйИсточник.Источник.Параметры[Сч].Выражение = Новый ВыражениеСхемыЗапроса(СтрЗаменить(ТекущийИсточникПараметры[Сч],"%1","&"+ДобавленныйПараметрИмя));
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				
				ДобавленныйИсточник.Соединения.Очистить(); //система при добавлении сама генерит условие связи, чаще неверно 
				//добавляем сами
				Оператор.Источники[ИндексГлавнойТаблицы].Соединения.Добавить(ДобавленныйИсточник, ТекущийИсточникУсловие);
			КонецЦикла;
		
		    //добавляем Поле
			Поле = Настройка.Значение.Структура.Поле;
			//подставляем вместо %1 %2 Псевдонимы источников из ПсевдонимыИсточников
			Для Сч = 0 По ПсевдонимыИсточников.ВГраница() Цикл
				Поле = СтрЗаменить(Поле, "%" + (Сч + 1), ПсевдонимыИсточников[Сч]);
			КонецЦикла;
			//вместо 0% ДобавленныйПараметрИмя
			Поле = СтрЗаменить(Поле, "%0", ДобавленныйПараметрИмя);
			
			
			Колонка = Оператор.ВыбираемыеПоля.Добавить(Поле);
			ИндексПоля = Оператор.ВыбираемыеПоля.Индекс(Колонка);
						
			Пакет.Колонки[ИндексПоля].Псевдоним = Настройка.Ключ + "_" + ЧеловеческоеИмя; //если не заполнен параметр и псевдоним то Настройка.Ключ будет 2 раза...
		КонецЦикла;
		
		ЭтотОбъект[ДСписок].ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
		
		//Возврат;
		//установим значения параметров запроса, обходя ДобавленныеПараметрыИмя
		Для каждого Элемент Из ДобавленныеПараметрыИмя Цикл
			Если ЗначениеЗаполнено(Элемент.Ключ) Тогда              //не добавляем пустые ссылки, параметры таблиц с пустыми ссылками должны были быть удалены
				ЭтотОбъект[ДСписок].Параметры.УстановитьЗначениеПараметра(Элемент.Значение, Элемент.Ключ);
			КонецЕсли;
		КонецЦикла;
		
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////
		//модификация формы
		/////////////////////////////////////////////////////////////////////////////////////////////////////	
		
		
		//удалим элементы по префиксу в таблицах из МассивТаблиц
		/////////////////////////////////////////////////////////////////////////////////////////////////////
		МассивУдаляемых = Новый Массив;
		Для каждого ПроверяемаяТаблица из МассивТаблиц Цикл	
			Для каждого Элемент Из ЭтотОбъект.Элементы[ПроверяемаяТаблица].ПодчиненныеЭлементы Цикл
				Если ТипЗнч(Элемент) = Тип("ПолеФормы") И СтрНачинаетсяС(Элемент.Имя, Префикс) тогда	
					МассивУдаляемых.Добавить(Элемент);
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		
		Для Каждого Элемент из МассивУдаляемых Цикл
			ЭтотОбъект.Элементы.Удалить(Элемент);
		КонецЦикла;
		
		//добавим элементы в табличные части
		/////////////////////////////////////////////////////////////////////////////////////////////////////
		Для каждого СтрокаТЗ Из ЭтотОбъект["НастройкиУниверсальные"] Цикл
			ИндексТекСтрока = ЭтотОбъект["НастройкиУниверсальные"].Индекс(СтрокаТЗ);
			ЧеловеческоеИмя = СтрокаТЗ.ЧеловеческоеИмя;
			Настройка 		= ЭлементПоПредставлениюСервер(СтрокаТЗ.ТипПредставление, ЭтотОбъект["СтруктураТипов"]);
			Для каждого ТаблицаФормы Из МассивТаблиц Цикл
				ИндексТаблицыФормы = МассивТаблиц.Найти(ТаблицаФормы);

				Поле = ЭтотОбъект.Элементы.Добавить(Префикс + ИндексТаблицыФормы + ЧеловеческоеИмя, Тип("ПолеФормы"), ЭтотОбъект.Элементы[ТаблицаФормы]);
				Поле.ТолькоПросмотр = Истина;
				Если ЧеловеческоеИмя <> Настройка.Ключ Тогда
					Ключ = Символы.ПС + "(" + Настройка.Ключ + ")";
				Иначе
					Ключ = "";
				КонецЕсли;
				Поле.Заголовок = СтрЗаменить(ЧеловеческоеИмя,"_"," ") + Ключ;//Символы.ПС + Настройка.Ключ;
				Поле.ПутьКДанным = ДСписок + "." + Настройка.Ключ + "_" + ЧеловеческоеИмя;         
			КонецЦикла;
		КонецЦикла;	
		
		Для каждого ТаблицаФормы Из МассивТаблиц Цикл
			ЭтотОбъект.Элементы[ТаблицаФормы].ВысотаШапки = 2;
		КонецЦикла;
		
		
		КоллекцияДляПроверки = ЭтотОбъект[ДСписок].КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
		УдалитьНедоступныеПоля(КоллекцияДляПроверки); ////infostart.ru/1c/articles/1812410/
	Исключение
		Сообщить("Ошибка модификации формы: " + ОписаниеОшибки());
	КонецПопытки;
	
	
КонецПроцедуры

 

 

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.16.115
  • 1С:ERP Управление предприятием 2, релизы 2.5.16.115

номенклатура остатки цены себестоимость динамический список дополнительные поля

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184334    1026    403    

967

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    24484    160    84    

161

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

22200 руб.

06.10.2023    20344    52    19    

86

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    13689    57    33    

77

Инструментарий разработчика Программист Платформа 1С v8.3 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    30574    105    48    

148

Работа с интерфейсом Анализ учета Мониторинг Платформа 1С v8.3 8.3.14 1C:Бухгалтерия 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Платные (руб)

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

9600 руб.

27.03.2025    767    2    5    

7

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    19114    7    32    

43
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1527410 12.05.24 09:08 Сейчас в теме
"{Расш_ДополнениеСписков ОбщаяФорма.Расш_ДополнениеСписковФормаНастроек.Форма(65)}: Метод объекта не обнаружен (ЭкспортнаяСервернаяПроцедураДляПримененияНастроек)"


1С:Комплексная автоматизация 2 (2.5.16.107)
2. dovolos 24 13.05.24 22:20 Сейчас в теме
(1) Здравствуйте, ошибку исправил.
3. user1527410 18.05.24 13:32 Сейчас в теме
(2) Да ошибка пропала. Не показывает цены. Остатки показывает и это круто. Непонимаю какие права назначить пользователям чтобы все у них работало. И есть интерес в доработке функционала. Как мы можем посотрудничать, если конечно у вас есть интерес.
5. dovolos 24 18.05.24 17:51 Сейчас в теме
(3)
цены.
ответ ниже, не прицепил.
4. dovolos 24 18.05.24 17:49 Сейчас в теме
Странно что не показывает цены, на последней УТ проверил - все работает. Возможно у вас подключен учет номенклатуры версии 25, тогда вам нужно в модуле Расш_ДополнениеСписковОбщийМодульСервер в функции ПолучитьСтруктуруТипов заменить
"РегистрСведений.ЦеныНоменклатуры.СрезПоследних"
на
"РегистрСведений.ЦеныНоменклатуры25.СрезПоследних"
Если нужна доработка, то да, я готов, я вроде галку ставил в публикации что готов доработать, ну или напрямую.
Думаю что проблема точно не с правами, но на всякий случай для цен, нужен доступ для справочника ВидыЦен и сами значения храняться в регистре сведений ЦеныНоменклатуры (ЦеныНоменклатуры25).
Прикрепленные файлы:
6. user1527410 30.05.24 15:28 Сейчас в теме
Все хорошо но работает только при активных полных правах, в ином случае выдает ошибку в скриншоте видно
Прикрепленные файлы:
7. dovolos 24 08.08.24 23:22 Сейчас в теме
(6) извините, вот только увидел ваш комментарий. Не могли бы вы уточнить при добавлении чего у пользователя происходит ошибка?
Оставьте свое сообщение