Как проверить заполнение множества переменных в 1С и вывести имя незаполненной?

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

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

Метод 1: Использование динамического вычисления через функцию Вычислить()

Рассмотрим ситуацию, когда у вас уже есть набор переменных (например, Переменная1, Переменная2 и так далее). Чтобы не писать условие для каждой из них, мы можем использовать список их имен в виде строки и функцию Вычислить(). Этот метод позволяет обращаться к значению переменной, зная только ее текстовое имя.

Разберем алгоритм по шагам:

  1. Создадим строку, в которой перечислим имена всех проверяемых переменных через запятую.
  2. Преобразуем эту строку в массив имен с помощью функции СтрРазделить().
  3. В цикле обойдем полученный массив и для каждого имени проверим значение переменной.

Посмотрим на пример кода:


ИменаЧерезЗапятую = "Переменная1, Переменная2, Переменная3, Товар, Количество, Цена";
МассивИмен = СтрРазделить(ИменаЧерезЗапятую, ",", Ложь);

Для Каждого ИмяПеременной Из МассивИмен Цикл
    // Убираем лишние пробелы из имени, если они есть
    ИмяПеременной = СокрЛП(ИмяПеременной);
    
    // Динамически получаем значение переменной по ее имени
    Значение = Вычислить(ИмяПеременной);
    
    Если Не ЗначениеЗаполнено(Значение) Тогда
        Сообщить("Внимание! Не заполнена обязательная переменная: " + ИмяПеременной);
        // Здесь можно установить флаг ошибки, чтобы прервать дальнейшее выполнение кода
    КонецЕсли;
КонецЦикла;

Важно: Функция Вычислить() работает в контексте того программного модуля, где она вызвана. Если переменная объявлена локально в процедуре, Вычислить() увидит ее без проблем.

Метод 2: Переход от отдельных переменных к Структуре

Более профессиональным и надежным подходом считается отказ от множества разрозненных переменных в пользу использования объекта Структура. Это не только упрощает проверку, но и делает код более структурированным. Вместо Переменная1 мы будем использовать ДанныеДляЗагрузки.Поле1.

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


// Создаем структуру для хранения данных строки Excel
ДанныеСтроки = Новый Структура;
ДанныеСтроки.Вставить("Артикул", СокрЛП(ТекЛист.Cells(СчСтр, 1).Value));
ДанныеСтроки.Вставить("Номенклатура", СокрЛП(ТекЛист.Cells(СчСтр, 2).Value));
ДанныеСтроки.Вставить("Количество", ТекЛист.Cells(СчСтр, 3).Value);

// Универсальная проверка заполнения
Для Каждого Элемент Из ДанныеСтроки Цикл
    Если Не ЗначениеЗаполнено(Элемент.Значение) Тогда
        Сообщить("Ошибка загрузки в строке " + СчСтр + ": не заполнено поле '" + Элемент.Ключ + "'");
    КонецЕсли;
КонецЦикла;

В данном примере Элемент.Ключ — это техническое имя поля, которое мы задали при вставке в структуру. Это гораздо удобнее, так как программа сама "знает", как называется поле, и вам не нужно вручную прописывать тексты ошибок для каждого случая.

Метод 3: Сбор всех ошибок перед остановкой алгоритма

Часто пользователю неудобно получать по одному сообщению об ошибке. Разберем, как собрать все незаполненные поля в один список и вывести его целиком. Для этого используем переменную-флаг Отказ и строковую переменную для накопления текста.


Отказ = Ложь;
СписокОшибок = "";

// Предположим, у нас есть массив имен переменных
Для Каждого Имя Из МассивИменПеременных Цикл
    Значение = Вычислить(Имя);
    Если Не ЗначениеЗаполнено(Значение) Тогда
        Отказ = Истина;
        СписокОшибок = СписокОшибок + Символы.ПС + "- " + Имя;
    КонецЕсли;
КонецЦикла;

Если Отказ Тогда
    Сообщить("Загрузка невозможна. Не заполнены следующие обязательные поля:" + СписокОшибок);
    Возврат; // Прекращаем выполнение процедуры
КонецЕсли;

Особенности функции ЗначениеЗаполнено()

Выясним причину, по которой стандартная проверка может работать не так, как ожидается. Функция ЗначениеЗаполнено() является универсальной, но имеет свои нюансы в зависимости от типа данных, приходящих из внешних источников (Excel через COM-объект):

Рекомендации по использованию СообщениеПользователю

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

Пример использования профессионального вывода:


Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле " + ИмяПоля + " должно быть заполнено!";
// Если проверка идет для реквизита объекта
Сообщение.Поле = ИмяПоля; 
Сообщение.Сообщить();

Подводя итог, можно сказать: если количество переменных невелико (2-3), можно оставить простые условия Если. Однако при работе с большими таблицами и динамическими данными (загрузка из Excel, API, JSON) использование Структур и циклов — это единственный способ сохранить код чистым, понятным и защищенным от ошибок при добавлении новых полей в будущем.

← На главную