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

13.05.24

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Остатки и цены в списках номенлатуры для УТ 11.5 и ЕРП 2.5
.cfe 64,11Kb
23
23 Скачать (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С.

12000 руб.

02.09.2020    169314    937    403    

905

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

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

8400 руб.

20.08.2024    12619    99    42    

101

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

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

9360 руб.

17.05.2024    26541    90    48    

134

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

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

22200 руб.

06.10.2023    16833    41    15    

75

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

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

15000 руб.

10.11.2023    11400    40    27    

66

SALE! %

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

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

4800 3840 руб.

14.01.2013    190556    1150    0    

918

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    783    2    0    

4

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

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

5000 руб.

14.01.2016    55303    17    23    

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


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