Как в 1С 7.7 правильно сравнить значение с несколькими вариантами?

Программист 1С v7.7 Управленческий учет
← На главную

В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает классическая задача: необходимо проверить, совпадает ли значение реквизита (например, Код справочника) с одним из нескольких заранее заданных эталонов. В современных версиях 1С это решается достаточно быстро, но в версии 7.7 есть свои нюансы, связанные с типами данных и отсутствием некоторых привычных конструкций.

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

Способ 1. Использование логического оператора ИЛИ

Это самый очевидный и простой метод, который подходит, если список сравниваемых значений невелик (2–4 элемента) и он статичен. Проанализируем пример кода:


Если (СокрЛП(Код) = "40") Или (СокрЛП(Код) = "1154") Или (СокрЛП(Код) = "2121") Тогда
    // Выполняем действия для отпуска
    РассчитатьОтпуск();
КонецЕсли;

Важный нюанс: Обратите внимание на использование функции СокрЛП(). В 1С 7.7 реквизит типа "Строка" в справочниках всегда имеет фиксированную длину. Если длина кода в конфигураторе установлена в 10 символов, то код "40" на самом деле будет храниться как "40" и восемь пробелов. Без функции сокращения пробелов прямое сравнение может вернуть Ложь.

Способ 2. Использование объекта СписокЗначений

Если список значений большой или может меняться в процессе работы программы, использование длинной цепочки Или становится неудобным. В этом случае мы рекомендуем использовать универсальный объект СписокЗначений. Это наиболее "правильный" с точки зрения платформы 7.7 метод.

Разберем по шагам, как это реализовать:

  1. Создаем объект СписокЗначений.
  2. Добавляем в него все необходимые коды.
  3. Используем метод НайтиЗначение() для проверки.

// Создаем список и наполняем его
СписокКодов = СоздатьОбъект("СписокЗначений");
СписокКодов.ДобавитьЗначение("40");
СписокКодов.ДобавитьЗначение("1154");
СписокКодов.ДобавитьЗначение("2121");

// Проверяем вхождение
Если СписокКодов.НайтиЗначение(СокрЛП(Код)) > 0 Тогда
    // Код найден в списке, так как метод вернул номер позиции (больше 0)
    Сообщить("Код соответствует группе расчета");
КонецЕсли;

Этот метод хорош тем, что список можно сформировать один раз (например, при открытии формы или в глобальном модуле), а затем многократно использовать для проверки. Помните, что поиск в списке в 7.7 чувствителен к типу данных: если вы поместили в список числа, а ищете строку, совпадение найдено не будет.

Способ 3. Метод "Строковой маски" (поиск в строке)

Существует еще один эффективный прием, который часто использовался опытными разработчиками в 1С 7.7 для оптимизации скорости, чтобы не создавать лишние объекты в памяти. Мы можем объединить все коды в одну длинную строку с разделителями и искать вхождение подстроки.

Рассмотрим пример реализации:


// Формируем эталонную строку с разделителями
// Важно добавить разделители в начало и конец строки!
Эталон = ";40;1154;2121;";

// Проверяем наличие кода внутри строки
Если Найти(Эталон, ";" + СокрЛП(Код) + ";") > 0 Тогда
    // Найдено точное совпадение
    Сообщить("Выбран верный вид расчета");
КонецЕсли;

Почему это важно: Обратите внимание, что мы ищем не просто Код, а ";" + Код + ";". Если мы будем искать просто "40" в строке "140;400;1154", функция Найти() вернет положительный результат, хотя кода "40" в списке нет. Оборачивание в разделители (точка с запятой, запятая или пробел) гарантирует поиск точного совпадения.

Способ 4. Работа в запросах (Оператор В)

Если вам нужно выполнить сравнение не в программном коде, а при выборке данных из базы (так называемый "Черный запрос" 1С 7.7), используется оператор В. В этом случае аргументом обязательно должен выступать СписокЗначений.

Проанализируем фрагмент текста запроса:


// Предположим, СписокКодов уже создан и заполнен
ТекстЗапроса = "
|Период с ВыбНачПериода по ВыбКонПериода;
|ВидРасчета = ЖурналРасчетов.Зарплата.ВидРасч;
|ТекущийКод = ЖурналРасчетов.Зарплата.ВидРасч.Код;
|Группировка ВидРасчета;
|Условие (ТекущийКод В СписокКодов);
|";

Здесь платформа сама позаботится о том, чтобы проверить каждое значение из выборки на вхождение в ваш список.

Рекомендации по качеству кода

При реализации подобных сравнений мы советуем придерживаться нескольких правил профессиональной разработки:

Резюмируя: для простых условий используйте Или, для работы со списками — СписокЗначений, а для быстрого поиска в циклах — метод строковых масок. Каждый из этих инструментов эффективен в своем контексте.

← На главную