В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает классическая задача: необходимо проверить, совпадает ли значение реквизита (например, Код справочника) с одним из нескольких заранее заданных эталонов. В современных версиях 1С это решается достаточно быстро, но в версии 7.7 есть свои нюансы, связанные с типами данных и отсутствием некоторых привычных конструкций.
Рассмотрим ситуацию, когда у нас есть код вида расчета (например, "40") и нам нужно определить, относится ли он к группе отпускных (коды "40", "1154", "2121"). Проанализируем несколько способов реализации этой задачи, от самых простых до наиболее эффективных.
Это самый очевидный и простой метод, который подходит, если список сравниваемых значений невелик (2–4 элемента) и он статичен. Проанализируем пример кода:
Если (СокрЛП(Код) = "40") Или (СокрЛП(Код) = "1154") Или (СокрЛП(Код) = "2121") Тогда
// Выполняем действия для отпуска
РассчитатьОтпуск();
КонецЕсли;
Важный нюанс: Обратите внимание на использование функции СокрЛП(). В 1С 7.7 реквизит типа "Строка" в справочниках всегда имеет фиксированную длину. Если длина кода в конфигураторе установлена в 10 символов, то код "40" на самом деле будет храниться как "40" и восемь пробелов. Без функции сокращения пробелов прямое сравнение может вернуть Ложь.
Если список значений большой или может меняться в процессе работы программы, использование длинной цепочки Или становится неудобным. В этом случае мы рекомендуем использовать универсальный объект СписокЗначений. Это наиболее "правильный" с точки зрения платформы 7.7 метод.
Разберем по шагам, как это реализовать:
СписокЗначений.НайтиЗначение() для проверки.
// Создаем список и наполняем его
СписокКодов = СоздатьОбъект("СписокЗначений");
СписокКодов.ДобавитьЗначение("40");
СписокКодов.ДобавитьЗначение("1154");
СписокКодов.ДобавитьЗначение("2121");
// Проверяем вхождение
Если СписокКодов.НайтиЗначение(СокрЛП(Код)) > 0 Тогда
// Код найден в списке, так как метод вернул номер позиции (больше 0)
Сообщить("Код соответствует группе расчета");
КонецЕсли;
Этот метод хорош тем, что список можно сформировать один раз (например, при открытии формы или в глобальном модуле), а затем многократно использовать для проверки. Помните, что поиск в списке в 7.7 чувствителен к типу данных: если вы поместили в список числа, а ищете строку, совпадение найдено не будет.
Существует еще один эффективный прием, который часто использовался опытными разработчиками в 1С 7.7 для оптимизации скорости, чтобы не создавать лишние объекты в памяти. Мы можем объединить все коды в одну длинную строку с разделителями и искать вхождение подстроки.
Рассмотрим пример реализации:
// Формируем эталонную строку с разделителями
// Важно добавить разделители в начало и конец строки!
Эталон = ";40;1154;2121;";
// Проверяем наличие кода внутри строки
Если Найти(Эталон, ";" + СокрЛП(Код) + ";") > 0 Тогда
// Найдено точное совпадение
Сообщить("Выбран верный вид расчета");
КонецЕсли;
Почему это важно: Обратите внимание, что мы ищем не просто Код, а ";" + Код + ";". Если мы будем искать просто "40" в строке "140;400;1154", функция Найти() вернет положительный результат, хотя кода "40" в списке нет. Оборачивание в разделители (точка с запятой, запятая или пробел) гарантирует поиск точного совпадения.
Если вам нужно выполнить сравнение не в программном коде, а при выборке данных из базы (так называемый "Черный запрос" 1С 7.7), используется оператор В. В этом случае аргументом обязательно должен выступать СписокЗначений.
Проанализируем фрагмент текста запроса:
// Предположим, СписокКодов уже создан и заполнен
ТекстЗапроса = "
|Период с ВыбНачПериода по ВыбКонПериода;
|ВидРасчета = ЖурналРасчетов.Зарплата.ВидРасч;
|ТекущийКод = ЖурналРасчетов.Зарплата.ВидРасч.Код;
|Группировка ВидРасчета;
|Условие (ТекущийКод В СписокКодов);
|";
Здесь платформа сама позаботится о том, чтобы проверить каждое значение из выборки на вхождение в ваш список.
При реализации подобных сравнений мы советуем придерживаться нескольких правил профессиональной разработки:
ПринадлежитГруппе().СокрЛП() для строк и приведение к числу для числовых реквизитов — залог стабильной работы.Резюмируя: для простых условий используйте Или, для работы со списками — СписокЗначений, а для быстрого поиска в циклах — метод строковых масок. Каждый из этих инструментов эффективен в своем контексте.