Правильный поиск в строке с разделителями
Чтобы понять проблему, как всегда рассмотрим несколько утрированный пример...
При интеграции из другой системы прилетает массив расчетных показателей. Их много. Записывать их отдельно в какой-нибудь таблице в своей базе данных необязательно. Для работы нужны 2-3 из 100, не более. Поэтому такой массив временно хранится в строке с разделителями, примерно так:
СуммаОборота; СуммаОборотаСНДС; ээНачальныеПоказания; ээКонечныеПоказания
Так вот, на каком-то этапе некий парсинг ищет в этой строке. Как искать правильно? Допустим простое решение в лоб:
Если Найти(СтрокаПоказателей, СтрокаПоиска) Тогда
Но ведь косяк же. Видите его? Честно признаюсь, я несколько раз больно натыкался. Например:
Если Найти(СтрокаПоказателей, "СуммаОборота") Тогда
Поиск будет неожиданно успешным если суммы оборота в показателях нет, зато есть сумма оборота с НДС. Обидно. Что делать в таких случаях?
Понятно, что если перед поиском строку переделать в массив и искать в нем, все будет в порядке. Но тратить на это время, особенно если таких строк много и наш парсинг работает в цикле, такое себе решение.
Добавить в строку поиска разделитель? Но у последнего элемента разделителя же нет. Ну так в чем проблема, давайте его добавим и в строку показателей (один раз прямо перед поиском):
СтрокаПоказателей = ХранящаясяСтрокаПоказателей + ";"; Если Найти(СтрокаПоказателей, СтрокаПоиска + ";") Тогда
Еще один важный момент. Понятно, что к поиску надо всегда относится аккуратно. Ну а наименование любых сущностей надо продумывать с удвоенной внимательностью. Что такое эта наша СуммаОборота? Какая она, с НДС или без НДС, ведь это же неочевидно, это почему-то надо помнить, и программистам, и пользователям. А вот если бы было явно: СуммаОборотаБезНДС, СуммаОборотаСНДС, то ошибки поиска бы не возникло. В итоге вырисовывается полезное правило:
Если в наименование какой-либо сущности добавляется уточнение, то тогда не должно быть случаев без этого уточнения.
←35 | заметка 36