Каталог решений - Опрос пользователя в цикле с оповещением (управляемые формы)

Опрос пользователя в цикле с оповещением (управляемые формы)

Опрос пользователя в цикле с оповещением (управляемые формы)

В наличии

Пример вопроса пользователю по каждой строке при обходе таблицы значений в цикле с помощью оповещения.

Категория:

Описание

В новых и последних конфигурациях нежелательно использовать модальные окна, но требуется в цикле опрашивать пользователя. Как решить такую задачу и не использовать модальные окна?  Решил поделиться примером обхода таблицы значения и опроса пользователя по оповещению (управляемые формы).

Задача:

1. Проверить в заказе покупателя доступность необходимого количества.

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

Решение: Сделать опрос пользователя в процедуре оповещения.

// Кнопка проверки остатков
&НаКлиенте
Процедура РасшАВ_ПроверитьОстаткиПосле(Команда)	
	
	ТаблицаСОстатками.Очистить();
	РасшАВ_ПроверитьОстаткиПослеНаСервере(); // Заполнение таблицы с остатками
	Если не ТаблицаСОстатками.Количество() = 0 Тогда 
		ПараметрыОбхода = Новый Структура;
		ПараметрыОбхода.Вставить("НомерСтроки", -1);
		ПараметрыОбхода.Вставить("Комплектация",Ложь);
		ПараметрыОбхода.Вставить("Оприходование",Ложь);
		РаботаСОтрицательнымиОстатками(КодВозвратаДиалога.Нет,ПараметрыОбхода);	// Запуск обхода таблицы	
	КонецЕсли;
	
КонецПроцедуры

// Циклическая процедура с вопросами
&НаКлиенте
Процедура РаботаСОтрицательнымиОстатками(Результат, ПараметрыОбхода) Экспорт  
	
	// Пришел ответ "да" - комплектуем или оприходуем
	Если Результат = КодВозвратаДиалога.Да Тогда 
		ст = ТаблицаСОстатками[ПараметрыОбхода.НомерСтроки];
		Если ПараметрыОбхода.Комплектация Тогда // Комплектуем 
			АртикулРулона = Лев(СокрЛП(ст.НоменклатураАртикул),Найти(ст.НоменклатураАртикул,"m")-1);
			Если СоздатьКомплектацию(АртикулРулона) Тогда
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Разукомплектовали для товара: ("+ст.НоменклатураАртикул+") "+ст.НоменклатураНаименование;
				Сообщение.Сообщить();
			КонецЕсли;			
		ИначеЕсли ПараметрыОбхода.Оприходование Тогда // Оприходуем
			КоличествоНужно = ст.Количество - (ст.КоличествоОстаток * ст.Коэффициент);
			Если СоздатьОприходование(ст.НоменклатураАртикул, КоличествоНужно) Тогда
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Оприходовали товар: ("+ст.НоменклатураАртикул+") "+ст.НоменклатураНаименование+" в количестве: "+Строка(КоличествоНужно); 
				Сообщение.Сообщить();
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда 
		Возврат;
	КонецЕсли;
	
	// Это была последняя строка, прерываем выполнение
	Если ПараметрыОбхода.НомерСтроки+1 = ТаблицаСОстатками.Количество() Тогда
		Возврат;
	КонецЕсли;
	
	ст = ТаблицаСОстатками[ПараметрыОбхода.НомерСтроки+1];
	КоличествоНужно = ст.Количество - (ст.КоличествоОстаток * ст.Коэффициент);
	ПараметрыОбходаНовый = Новый Структура;
	Если не СтрНайти(ст.НоменклатураАртикул,"m") = 0 Тогда 
		ОстатокРулона = 0;
		АртикулРулона = Лев(СокрЛП(ст.НоменклатураАртикул),Найти(ст.НоменклатураАртикул,"m")-1);
		ОстатокРулона = ПолучитьОстатокРулоны(АртикулРулона);
		Если не ОстатокРулона = 0 Тогда
			// Спросим разкомплектовать?			
			ПараметрыОбходаНовый.Вставить("НомерСтроки",ТаблицаСОстатками.Индекс(ст));
			ПараметрыОбходаНовый.Вставить("Комплектация",Истина);
			ПараметрыОбходаНовый.Вставить("Оприходование",Ложь);
			Режим = РежимДиалогаВопрос.ДаНетОтмена;
			СтрокаВопроса = "Разукомплектовать для товара: ("+ст.НоменклатураАртикул+") "+ст.НоменклатураНаименование;
			Оповещение = Новый ОписаниеОповещения("РаботаСОтрицательнымиОстатками", ЭтаФорма, ПараметрыОбходаНовый);
			ПоказатьВопрос(Оповещение, СтрокаВопроса, Режим, 0); // Вызываем эту же процедуру и передаем в неё параметры
		Иначе 
			// Спросим оприходовать? 
			ПараметрыОбходаНовый.Вставить("НомерСтроки",ТаблицаСОстатками.Индекс(ст));
			ПараметрыОбходаНовый.Вставить("Комплектация",Ложь);
			ПараметрыОбходаНовый.Вставить("Оприходование",Истина);
			Режим = РежимДиалогаВопрос.ДаНетОтмена; 
			СтрокаВопроса = "Оприходовать товар: ("+ст.НоменклатураАртикул+") "+ст.НоменклатураНаименование+" в количестве: "+Строка(КоличествоНужно); 
			Оповещение = Новый ОписаниеОповещения("РаботаСОтрицательнымиОстатками", ЭтаФорма, ПараметрыОбходаНовый);
			ПоказатьВопрос(Оповещение, СтрокаВопроса, Режим, 0); // Вызываем эту же процедуру и передаем в неё параметры
		КонецЕсли;
	Иначе // Если это не метры
		// Спросим оприходовать? 
		ПараметрыОбходаНовый.Вставить("НомерСтроки",ТаблицаСОстатками.Индекс(ст));
		ПараметрыОбходаНовый.Вставить("Комплектация",Ложь);
		ПараметрыОбходаНовый.Вставить("Оприходование",Истина);
		Режим = РежимДиалогаВопрос.ДаНетОтмена; 
		СтрокаВопроса = "Оприходовать товар: ("+ст.НоменклатураАртикул+") "+ст.НоменклатураНаименование+" в количестве: "+Строка(КоличествоНужно); 
		Оповещение = Новый ОписаниеОповещения("РаботаСОтрицательнымиОстатками", ЭтаФорма, ПараметрыОбходаНовый);
		ПоказатьВопрос(Оповещение, СтрокаВопроса, Режим, 0); // Вызываем эту же процедуру и передаем в неё параметры
	КонецЕсли;		
	
КонецПроцедуры 

Думаю, такой простой пример кому-то пригодится. Если есть какие-то замечания или предложения по улучшению такого кода — комментируйте.

has been added to your cart:
Оформление заказа