Как правильно обрезать строку кода при выгрузке данных в Конвертации данных 2.1

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке обмена данными между базами 1С часто возникает ситуация, когда метаданные источника и приемника не совпадают. Типичный пример — разная длина кода справочника. Например, в исходной базе код имеет длину 15 символов, а в целевой — всего 9. Если попытаться передать данные напрямую, система может выдать ошибку или обрезать данные некорректно, что приведет к нарушению уникальности.

В этой статье мы подробно разберем, как правильно реализовать обрезку строки, почему нельзя менять объект-источник напрямую и какие механизмы в Конвертации данных 2.1 (КД 2.1) позволяют сделать это максимально безопасно.

Анализ ошибки: почему нельзя менять Источник

Рассмотрим типичную ошибку начинающего разработчика. При попытке изменить код в событии Перед выгрузкой или При выгрузке ПКО (Правила конвертации объектов), часто пишут следующий код:


Если СтрДлина(Источник.Код) > 9 Тогда
    Источник.Код = Лев(Источник.Код, 9);
КонецЕсли;

Проанализируем ситуацию: при выполнении этого кода система выдаст ошибку "Поле объекта недоступно для записи (Код)". Это происходит потому, что переменная Источник в обработчиках КД 2.1 представляет собой объект, считанный из базы данных в режиме "только для чтения" (или просто ссылку, в зависимости от контекста). КД не предполагает, что процесс выгрузки будет модифицировать данные в исходной базе. Наша задача — изменить передаваемое значение, а не сам объект в базе-источнике.

Решение 1: Использование переменной Значение в ПКС

Самый правильный и гибкий способ — внесение изменений в ПКС (Правило конвертации свойства) для реквизита Код. Для этого необходимо открыть настройки ПКС и в обработчике события Перед выгрузкой переопределить специальную переменную Значение.

Выясним причину, почему это работает: переменная Значение — это то, что фактически будет записано в XML-файл обмена. Если мы присвоим ей результат обработки функции Лев() или Прав(), в приемник уйдет уже модифицированная строка.

Пример программного кода в ПКС:


// Обрезаем код до 9 символов слева
Значение = Лев(Источник.Код, 9);

Иногда логичнее использовать функцию Прав(), если уникальная часть кода находится в конце строки (например, когда в начале стоят префиксы, которые можно отбросить):


// Берем последние 9 символов кода
Значение = Прав(Источник.Код, 9);

Решение 2: Штатный механизм приведения длины

Разберем встроенные возможности КД 2.1, которые позволяют обойтись без написания кода. В редакторе ПКС есть флаг "Автоматически приводить значение к длине приемника". Посмотрим, как он работает:

  1. При включении этого флага система анализирует длину поля в метаданных приемника.
  2. Если передаваемая строка длиннее, КД выполняет обрезку автоматически.
  3. Важный нюанс: этот механизм интеллектуален. Он старается сохранять префиксы, если они заданы, и преобразовывать числовые части под длину поля.

Этот способ предпочтителен для стандартных справочников, где нет сложной логики формирования кода.

Проблема уникальности и поиск объектов

Рассмотрим ситуацию, которую часто упускают из виду: в источнике были коды "000000000000001" и "000000000000002". После обрезки до 9 символов слева они оба могут превратиться в "000000000". Это приведет к ошибке нарушения уникальности в базе-приемнике или к тому, что разные объекты источника "склеятся" в один в приемнике.

Проанализируем способы решения этой коллизии:

  1. Смена полей поиска: Если код после обрезки перестает быть уникальным, откажитесь от поиска по коду. В настройках ПКО снимите галочку "Поиск" у свойства Код и установите её для свойства Наименование (или комбинации других реквизитов).
  2. Автогенерация кода: Если коды в приемнике не обязательно должны совпадать с кодами источника, можно вообще не переносить код. В ПКО установите флаг "Автоматическая генерация кода", а в ПКС кода поставьте галочку "Отключить". Тогда база-приемник сама назначит следующий свободный номер объекту.
  3. Использование GUID: Рекомендуется включить поиск по уникальному идентификатору. В этом случае система сначала попытается сопоставить объекты по внутреннему ID, и только если не найдет — по коду. Это минимизирует риски "склейки" при дублях в обрезанных кодах.

Дополнительная обработка: дополнение нулями

Иногда задача обратная: код в источнике короче (например, 6 символов), а в приемнике — 9, и нужно сохранить единообразие. Мы можем дополнить строку лидирующими нулями. Посмотрим на пример реализации в ПКС:


// Дополняем код слева нулями до 9 символов
НужнаяДлина = 9;
ТекЗначение = СокрЛП(Источник.Код);
Значение = ТекЗначение;

Пока СтрДлина(Значение) < НужнаяДлина Цикл
    Значение = "0" + Значение;
КонецЦикла;

Или более изящный способ через форматную строку (если код числовой):


// Используем форматную строку для заполнения нулями (ЧВН - выводить нули)
Значение = Формат(Число(Источник.Код), "ЧЦ=9; ЧДЦ=0; ЧВН=");

Итоги и рекомендации

Подводя итог, выделим основные правила работы с длиной строк в КД 2.1:

Соблюдение этих правил позволит вам избежать большинства ошибок при обмене данными и обеспечит целостность информации в вашей системе.

← На главную