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