При настройке обмена данными между базами 1С часто возникает ситуация, когда метаданные источника и приемника не совпадают. Типичный пример — разная длина кода справочника. Например, в исходной базе код имеет длину 15 символов, а в целевой — всего 9. Если попытаться передать данные напрямую, система может выдать ошибку или обрезать данные некорректно, что приведет к нарушению уникальности.
В этой статье мы подробно разберем, как правильно реализовать обрезку строки, почему нельзя менять объект-источник напрямую и какие механизмы в Конвертации данных 2.1 (КД 2.1) позволяют сделать это максимально безопасно.
Рассмотрим типичную ошибку начинающего разработчика. При попытке изменить код в событии Перед выгрузкой или При выгрузке ПКО (Правила конвертации объектов), часто пишут следующий код:
Если СтрДлина(Источник.Код) > 9 Тогда
Источник.Код = Лев(Источник.Код, 9);
КонецЕсли;
Проанализируем ситуацию: при выполнении этого кода система выдаст ошибку "Поле объекта недоступно для записи (Код)". Это происходит потому, что переменная Источник в обработчиках КД 2.1 представляет собой объект, считанный из базы данных в режиме "только для чтения" (или просто ссылку, в зависимости от контекста). КД не предполагает, что процесс выгрузки будет модифицировать данные в исходной базе. Наша задача — изменить передаваемое значение, а не сам объект в базе-источнике.
Самый правильный и гибкий способ — внесение изменений в ПКС (Правило конвертации свойства) для реквизита Код. Для этого необходимо открыть настройки ПКС и в обработчике события Перед выгрузкой переопределить специальную переменную Значение.
Выясним причину, почему это работает: переменная Значение — это то, что фактически будет записано в XML-файл обмена. Если мы присвоим ей результат обработки функции Лев() или Прав(), в приемник уйдет уже модифицированная строка.
Пример программного кода в ПКС:
// Обрезаем код до 9 символов слева
Значение = Лев(Источник.Код, 9);
Иногда логичнее использовать функцию Прав(), если уникальная часть кода находится в конце строки (например, когда в начале стоят префиксы, которые можно отбросить):
// Берем последние 9 символов кода
Значение = Прав(Источник.Код, 9);
Разберем встроенные возможности КД 2.1, которые позволяют обойтись без написания кода. В редакторе ПКС есть флаг "Автоматически приводить значение к длине приемника". Посмотрим, как он работает:
Этот способ предпочтителен для стандартных справочников, где нет сложной логики формирования кода.
Рассмотрим ситуацию, которую часто упускают из виду: в источнике были коды "000000000000001" и "000000000000002". После обрезки до 9 символов слева они оба могут превратиться в "000000000". Это приведет к ошибке нарушения уникальности в базе-приемнике или к тому, что разные объекты источника "склеятся" в один в приемнике.
Проанализируем способы решения этой коллизии:
Код и установите её для свойства Наименование (или комбинации других реквизитов).Иногда задача обратная: код в источнике короче (например, 6 символов), а в приемнике — 9, и нужно сохранить единообразие. Мы можем дополнить строку лидирующими нулями. Посмотрим на пример реализации в ПКС:
// Дополняем код слева нулями до 9 символов
НужнаяДлина = 9;
ТекЗначение = СокрЛП(Источник.Код);
Значение = ТекЗначение;
Пока СтрДлина(Значение) < НужнаяДлина Цикл
Значение = "0" + Значение;
КонецЦикла;
Или более изящный способ через форматную строку (если код числовой):
// Используем форматную строку для заполнения нулями (ЧВН - выводить нули)
Значение = Формат(Число(Источник.Код), "ЧЦ=9; ЧДЦ=0; ЧВН=");
Подводя итог, выделим основные правила работы с длиной строк в КД 2.1:
Источник.Значение в обработчике ПКС -> Перед выгрузкой.Наименование + Родитель).Соблюдение этих правил позволит вам избежать большинства ошибок при обмене данными и обеспечит целостность информации в вашей системе.