Как проверить и устранить пробелы в кодах справочников 1С при синхронизации?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробно, почему возникают пробелы в кодах, как отфильтровать проблемные элементы с помощью запросов и какие варианты решения позволяют восстановить синхронизацию без риска сломать интеграцию с другими системами.

Особенность сравнения строк в языке запросов и СУБД

Проанализируем первую проблему, с которой сталкиваются разработчики при попытке найти пробелы через запрос: обычное операторное сравнение равенства = в языке запросов не всегда помогает. На уровне СУБД по стандарту SQL концевые пробелы при операторе = игнорируются, поэтому выражение Код = "123" вернет Истина и для строки "123 ", и для строки "123".

Чтобы обойти это ограничение и найти строки с пробелами на конце непосредственно в запросе, разберем два основных подхода.

Вариант 1. Использование оператора ПОДОБНО

В отличие от обычного равенства, оператор ПОДОБНО производит посимвольное сравнение с учетом концевых пробелов. Если необходимо отфильтровать записи, имеющие пробелы в конце или определенную длину маски, можно применить шаблон со специальными символами подчеркивания или процента.

Посмотрим на пример условия в запросе, которое находит записи, оканчивающиеся на пробел:


ВЫБРАТЬ
	ФизическиеЛица.Ссылка КАК Ссылка,
	ФизическиеЛица.КодЗУП КАК КодЗУП
ИЗ
	Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
	ФизическиеЛица.КодЗУП ПОДОБНО "% "

Вариант 2. Использование встроенных функций работы со строками (Платформа 8.3.20 и новее)

Если используемая версия платформы 1С:Предприятие — 8.3.20 или выше, в языке запросов доступно прямое вычисление длины строк и удаление концевых пробелов с помощью функций ДЛИНАСТРОКИ() и СОКРП().

Сравним длину исходного кода с длиной кода после удаления концевых пробелов. Если длины различаются, значит, в конце строки присутствуют лишние символы пробела:


ВЫБРАТЬ
	ФизическиеЛица.Ссылка КАК Ссылка,
	ФизическиеЛица.КодЗУП КАК КодЗУП,
	ДЛИНАСТРОКИ(ФизическиеЛица.КодЗУП) КАК ДлинаИсходная,
	ДЛИНАСТРОКИ(СОКРП(ФизическиеЛица.КодЗУП)) КАК ДлинаБезПробелов
ИЗ
	Справочник.ФизическиеЛица КАК ФизическиеЛица
ГДЕ
	ДЛИНАСТРОКИ(ФизическиеЛица.КодЗУП) <> ДЛИНАСТРОКИ(СОКРП(ФизическиеЛица.КодЗУП))

Вариант 3. Программная проверка и очистка кодов во встроенном языке

Если требуется выявить нестыковки с помощью отчета или внешней обработки, проанализируем строки во встроенном языке 1С. Для этого применим функции СтрДлина(), СокрЛП() и СтрЗаменить().

Рассмотрим пример кода обработки, который находит элементы с пробелами и удаляет их:


Выборка = Справочники.ФизическиеЛица.Выбрать();
Пока Выборка.Следующий() Цикл
	
	ИсходныйКод = Выборка.КодЗУП;
	ОчищенныйКод = СокрЛП(ИсходныйКод);
	
	Если СтрДлина(ИсходныйКод) <> СтрДлина(ОчищенныйКод) Тогда
		// Найдена строка с лишними пробелами
		ОбъектФизЛицо = Выборка.ПолучитьОбъект();
		ОбъектФизЛицо.КодЗУП = ОчищенныйКод;
		
		Попытка
			ОбъектФизЛицо.Записать();
		Исключение
			ЗаписьЖурналаРегистрации("ОчисткаКода", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
		КонецПопытки;
	КонецЕсли;

КонецЦикла;

Важное замечание о метаданных: если у реквизита или кода справочника в конфигураторе задан тип Строка со свойством «Фиксированная длина», платформа 1С при вызове метода Записать() автоматически дополняет строку пробелами справа до максимальной длины. В этом случае очистка кода через СокрЛП() не даст результата — пробелы вернутся сразу после сохранения. Чтобы исправить это, необходимо переключить режим длины реквизита на «Переменная» в конфигураторе.

Безопасные варианты синхронизации без массового изменения баз

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

  1. Выравнивание кодов на стороне источника: можно выгрузить из базы-приемника реестр кодов без пробелов и соответствие им исходных кодов с пробелами. В базе-источнике (например, ЗУП) записать значения кодов в точности так, как они хранятся в приемнике.
  2. Очистка пробелов в правилах обмена (КД / БСП): чтобы не менять физические данные в базах, обрезку пробелов можно вынести в обработчики правил конвертации или правила регистрации объектов. Применение функции СокрЛП() в событии обработки полей поиска очищает код «на лету» в памяти во время обмена.
  3. Использование регистра сопоставления (БСП): при использовании механизмов Библиотеки Стандартных Подсистем сопоставление элементов можно выполнить по внутренним уникальным идентификаторам (GUID) или записям в регистре сведений Соответствия объектов информационных баз. После однократной связки элементов обмен перестанет ориентироваться на текстовые коды.
← На главную