При разработке сложных алгоритмов загрузки данных, например из файлов Excel, программисты часто сталкиваются с необходимостью проверить заполнение большого количества переменных. Использование классической конструкции Если...ИначеЕсли... для каждой переменной приводит к "раздуванию" кода, его трудно читать и поддерживать. В этой статье мы разберем, как автоматизировать проверку любого количества переменных, используя циклы и коллекции, а также научимся выводить понятные сообщения пользователю о том, какой именно реквизит не заполнен.
Рассмотрим ситуацию, когда у вас уже есть набор переменных (например, Переменная1, Переменная2 и так далее). Чтобы не писать условие для каждой из них, мы можем использовать список их имен в виде строки и функцию Вычислить(). Этот метод позволяет обращаться к значению переменной, зная только ее текстовое имя.
Разберем алгоритм по шагам:
СтрРазделить().Посмотрим на пример кода:
ИменаЧерезЗапятую = "Переменная1, Переменная2, Переменная3, Товар, Количество, Цена";
МассивИмен = СтрРазделить(ИменаЧерезЗапятую, ",", Ложь);
Для Каждого ИмяПеременной Из МассивИмен Цикл
// Убираем лишние пробелы из имени, если они есть
ИмяПеременной = СокрЛП(ИмяПеременной);
// Динамически получаем значение переменной по ее имени
Значение = Вычислить(ИмяПеременной);
Если Не ЗначениеЗаполнено(Значение) Тогда
Сообщить("Внимание! Не заполнена обязательная переменная: " + ИмяПеременной);
// Здесь можно установить флаг ошибки, чтобы прервать дальнейшее выполнение кода
КонецЕсли;
КонецЦикла;
Важно: Функция Вычислить() работает в контексте того программного модуля, где она вызвана. Если переменная объявлена локально в процедуре, Вычислить() увидит ее без проблем.
Более профессиональным и надежным подходом считается отказ от множества разрозненных переменных в пользу использования объекта Структура. Это не только упрощает проверку, но и делает код более структурированным. Вместо Переменная1 мы будем использовать ДанныеДляЗагрузки.Поле1.
Проанализируем преимущества этого метода: вам не нужно использовать потенциально опасную функцию Вычислить(), так как структура позволяет обходить свои элементы напрямую. Рассмотрим пример реализации:
// Создаем структуру для хранения данных строки Excel
ДанныеСтроки = Новый Структура;
ДанныеСтроки.Вставить("Артикул", СокрЛП(ТекЛист.Cells(СчСтр, 1).Value));
ДанныеСтроки.Вставить("Номенклатура", СокрЛП(ТекЛист.Cells(СчСтр, 2).Value));
ДанныеСтроки.Вставить("Количество", ТекЛист.Cells(СчСтр, 3).Value);
// Универсальная проверка заполнения
Для Каждого Элемент Из ДанныеСтроки Цикл
Если Не ЗначениеЗаполнено(Элемент.Значение) Тогда
Сообщить("Ошибка загрузки в строке " + СчСтр + ": не заполнено поле '" + Элемент.Ключ + "'");
КонецЕсли;
КонецЦикла;
В данном примере Элемент.Ключ — это техническое имя поля, которое мы задали при вставке в структуру. Это гораздо удобнее, так как программа сама "знает", как называется поле, и вам не нужно вручную прописывать тексты ошибок для каждого случая.
Часто пользователю неудобно получать по одному сообщению об ошибке. Разберем, как собрать все незаполненные поля в один список и вывести его целиком. Для этого используем переменную-флаг Отказ и строковую переменную для накопления текста.
Отказ = Ложь;
СписокОшибок = "";
// Предположим, у нас есть массив имен переменных
Для Каждого Имя Из МассивИменПеременных Цикл
Значение = Вычислить(Имя);
Если Не ЗначениеЗаполнено(Значение) Тогда
Отказ = Истина;
СписокОшибок = СписокОшибок + Символы.ПС + "- " + Имя;
КонецЕсли;
КонецЦикла;
Если Отказ Тогда
Сообщить("Загрузка невозможна. Не заполнены следующие обязательные поля:" + СписокОшибок);
Возврат; // Прекращаем выполнение процедуры
КонецЕсли;
Выясним причину, по которой стандартная проверка может работать не так, как ожидается. Функция ЗначениеЗаполнено() является универсальной, но имеет свои нюансы в зависимости от типа данных, приходящих из внешних источников (Excel через COM-объект):
СокрЛП().0 (ноль) считается пустым значением. Если в вашем алгоритме ноль — это валидное значение (например, цена может быть нулевой в акционных товарах), то ЗначениеЗаполнено() вернет Ложь, и проверка сработает как на ошибку. В таких случаях проверяйте тип значения или используйте сравнение Значение = Неопределено.Ложь считается пустым. Это важно учитывать при проверке различных флагов и переключателей.В современной платформе 1С 8.3 для вывода ошибок рекомендуется использовать объект СообщениеПользователю вместо простого Сообщить(). Хотя в контексте проверки обычных переменных это может показаться избыточным, такой подход позволяет привязывать сообщение к конкретным элементам формы, если проверка происходит в экранной форме.
Пример использования профессионального вывода:
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Поле " + ИмяПоля + " должно быть заполнено!";
// Если проверка идет для реквизита объекта
Сообщение.Поле = ИмяПоля;
Сообщение.Сообщить();
Подводя итог, можно сказать: если количество переменных невелико (2-3), можно оставить простые условия Если. Однако при работе с большими таблицами и динамическими данными (загрузка из Excel, API, JSON) использование Структур и циклов — это единственный способ сохранить код чистым, понятным и защищенным от ошибок при добавлении новых полей в будущем.