При обмене данными между конфигурациями (например, между 1С:ЗУП и 1С:Бухгалтерия) часто возникает ситуация, когда элементы справочников перестают сопоставляться. Одной из распространенных причин является наличие скрытых концевых пробелов в текстовых кодах элементов. В результате код "125 " и код "125" во встроенном языке 1С воспринимаются как две разные строки, что приводит к дублированию или сбоям синхронизации.
Рассмотрим подробно, почему возникают пробелы в кодах, как отфильтровать проблемные элементы с помощью запросов и какие варианты решения позволяют восстановить синхронизацию без риска сломать интеграцию с другими системами.
Проанализируем первую проблему, с которой сталкиваются разработчики при попытке найти пробелы через запрос: обычное операторное сравнение равенства = в языке запросов не всегда помогает. На уровне СУБД по стандарту SQL концевые пробелы при операторе = игнорируются, поэтому выражение Код = "123" вернет Истина и для строки "123 ", и для строки "123".
Чтобы обойти это ограничение и найти строки с пробелами на конце непосредственно в запросе, разберем два основных подхода.
В отличие от обычного равенства, оператор ПОДОБНО производит посимвольное сравнение с учетом концевых пробелов. Если необходимо отфильтровать записи, имеющие пробелы в конце или определенную длину маски, можно применить шаблон со специальными символами подчеркивания или процента.
Посмотрим на пример условия в запросе, которое находит записи, оканчивающиеся на пробел:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.КодЗУП КАК КодЗУП
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
ФизическиеЛица.КодЗУП ПОДОБНО "% "
Если используемая версия платформы 1С:Предприятие — 8.3.20 или выше, в языке запросов доступно прямое вычисление длины строк и удаление концевых пробелов с помощью функций ДЛИНАСТРОКИ() и СОКРП().
Сравним длину исходного кода с длиной кода после удаления концевых пробелов. Если длины различаются, значит, в конце строки присутствуют лишние символы пробела:
ВЫБРАТЬ
ФизическиеЛица.Ссылка КАК Ссылка,
ФизическиеЛица.КодЗУП КАК КодЗУП,
ДЛИНАСТРОКИ(ФизическиеЛица.КодЗУП) КАК ДлинаИсходная,
ДЛИНАСТРОКИ(СОКРП(ФизическиеЛица.КодЗУП)) КАК ДлинаБезПробелов
ИЗ
Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
ДЛИНАСТРОКИ(ФизическиеЛица.КодЗУП) <> ДЛИНАСТРОКИ(СОКРП(ФизическиеЛица.КодЗУП))
Если требуется выявить нестыковки с помощью отчета или внешней обработки, проанализируем строки во встроенном языке 1С. Для этого применим функции СтрДлина(), СокрЛП() и СтрЗаменить().
Рассмотрим пример кода обработки, который находит элементы с пробелами и удаляет их:
Выборка = Справочники.ФизическиеЛица.Выбрать();
Пока Выборка.Следующий() Цикл
ИсходныйКод = Выборка.КодЗУП;
ОчищенныйКод = СокрЛП(ИсходныйКод);
Если СтрДлина(ИсходныйКод) <> СтрДлина(ОчищенныйКод) Тогда
// Найдена строка с лишними пробелами
ОбъектФизЛицо = Выборка.ПолучитьОбъект();
ОбъектФизЛицо.КодЗУП = ОчищенныйКод;
Попытка
ОбъектФизЛицо.Записать();
Исключение
ЗаписьЖурналаРегистрации("ОчисткаКода", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
Важное замечание о метаданных: если у реквизита или кода справочника в конфигураторе задан тип Строка со свойством «Фиксированная длина», платформа 1С при вызове метода Записать() автоматически дополняет строку пробелами справа до максимальной длины. В этом случае очистка кода через СокрЛП() не даст результата — пробелы вернутся сразу после сохранения. Чтобы исправить это, необходимо переключить режим длины реквизита на «Переменная» в конфигураторе.
Когда информационная база активно обменивается данными со множеством сторонних систем, прямое изменение кодов в справочниках может привести к сбоям в других интеграциях. Рассмотрим безопасные подходы, позволяющие решить проблему сопоставления элементов.
СокрЛП() в событии обработки полей поиска очищает код «на лету» в памяти во время обмена.Соответствия объектов информационных баз. После однократной связки элементов обмен перестанет ориентироваться на текстовые коды.