Как реализовать поэтапную обработку данных и выбор значений в 1С 8.3 без использования модальных окон?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе на управляемые формы и режим работы «Не использовать модальность» в 1С 8.3 разработчики часто сталкиваются с проблемой адаптации линейных алгоритмов. Типичный пример — загрузка прайс-листа поставщика, когда при обходе строк в цикле необходимо запрашивать у пользователя выбор номенклатуры из списка найденных вариантов. Использование модального метода ВыбратьЗначение() или модального открытия форм в таком цикле теперь заблокировано на уровне платформы.

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

Решение 1. Разделение процесса на загрузку, интерактивную корректировку и запись (Рекомендуемый UX-паттерн)

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

Разберем реализацию этого подхода по шагам:

  1. Создание структуры табличной части: В обработке или документе создаем табличную часть (или реквизит формы типа ТаблицаЗначений), содержащую колонки загружаемого файла (например, НаименованиеКонтрагента, Цена) и дополнительную колонку Номенклатура (с типом СправочникСсылка.Номенклатура).
  2. Загрузка и автоматическое предварительное сопоставление: При считывании файла отправляем массив наименований на сервер и одним запросом ищем совпадения в базе данных. Если найдено точное совпадение (1 элемент), колонка Номенклатура заполняется автоматически. Если найдено несколько вариантов или не найдено ничего — колонка остается пустой или помечается флагом ошибки.
  3. Интерактивное редактирование: Загруженные данные выводятся в элемент формы ТаблицаФормы. Пользователь видит всю картину целиком, может с помощью стандартного поля ввода или формы выбора уточнить несовпавшие позиции, изменить ошибочно найденные элементы или вернуться к любой строке в произвольном порядке.
  4. Финальная проверка и проведение: По кнопке «Записать» или «Выполнить загрузку» система проверяет, все ли критичные поля заполнены. Если остались некорректные строки, выводится единое сообщение с указанием ошибок, иначе создаются и записываются итоговые документы.

Решение 2. Использование современного асинхронного синтаксиса (Платформа 8.3.18 и новее)

Если специфика бизнес-процесса требует обязательно обработать строки в последовательном режиме прямо внутри цикла, в современных версиях платформы 1С 8.3 (начиная с 8.3.18) доступен механизм обещаний и асинхронных процедур. Это позволяет сохранять привычную линейную структуру кода с циклом Для каждого, не блокируя при этом поток выполнения платформы.

Проанализируем пример кода с использованием ключевых слов Асинх и Ждать:


&НаКлиенте
Асинх Процедура ОбработатьЗагруженныеСтрокиАсинх()

    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        
        // Если номенклатура не сопоставлена однозначно
        Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            
            // Получаем массив совпадений с сервера
            СписокВариантов = ПолучитьСписокКандидатовНаСервере(СтрокаТЧ.НаименованиеПоставщика);
            
            Если СписокВариантов.Количество() > 1 Тогда
                
                // Вызываем немодальный выбор из списка с асинхронным ожиданием ответа
                ВыбранныйЭлемент = Ждать ПоказатьВыборИзСпискаАсинх(СписокВариантов, "Выберите номенклатуру для: " + СтрокаТЧ.НаименованиеПоставщика);
                
                Если ВыбранныйЭлемент <> Неопределено Тогда
                    СтрокаТЧ.Номенклатура = ВыбранныйЭлемент.Значение;
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

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

Решение 3. Реализация рекурсивного обхода через ОписаниеОповещения (Для старых версий платформы)

В версиях платформы ниже 8.3.18 ключевые слова Асинх и Ждать отсутствуют. Для пошаговой интерактивной обработки без использования табличной части применяется рекурсивный вызов процедуры-обработчика с передачей индекса текущей строки.

Рассмотрим схему работы данного метода:

  1. Создается процедура начала обработки, запускающая поиск для первой строки (индекс 0).
  2. Если для текущей строки требуется выбор пользователя, формируется объект ОписаниеОповещения, указывающий на процедуру-обработчик завершения выбора, и вызывается асинхронный метод (например, ПоказатьВыборИзСписка или ОткрытьФорму). В параметры оповещения передается текущий индекс строки.
  3. В процедуре обработки результата выбора записывается полученное значение, индекс увеличивается на единицу (Индекс + 1), после чего процедура вызывает сам метод обработки для следующей строки.
  4. Рекурсия завершается, когда индекс достигает общего количества строк в таблице.

Из описанных вариантов наиболее предпочтительным с точки зрения архитектуры 1С является первый вариант (с выводом всех данных в табличную часть формы), так как он дает пользователю наибольшую гибкость при работе с файлами большого объема.

← На главную