Как правильно установить значение реквизита в ПКС «Перед выгрузкой» в 1С:Конвертация данных 2.0

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

При работе с инструментом «1С:Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с необходимостью программного заполнения реквизитов объекта, которых нет в источнике, или которые должны принимать фиксированное значение в базе-приемнике. Типичная ошибка — попытка найти объект в базе-источнике и присвоить его напрямую, когда этого объекта там может не существовать или он имеет другой идентификатор. В этой статье мы разберем, как правильно использовать обработчик Перед выгрузкой в Правилах конвертации свойств (ПКС), разберем разницу между переменными Значение и Выражение, а также научимся оптимизировать процесс загрузки данных.

Понимание контекста выполнения: Источник vs Приемник

Прежде всего, проанализируем ситуацию: почему простой код Значение = ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00"); часто не дает результата? Ответ кроется в месте выполнения этого кода. Обработчик «Перед выгрузкой» выполняется в базе-источнике. Это означает, что:

  1. Система ищет счет «105.00» в справочнике или плане счетов базы-источника.
  2. Если счет найден, в переменную Значение помещается ссылка из источника.
  3. При выгрузке в XML-файл попадает внутренний идентификатор (GUID) этой ссылки.
  4. При загрузке в приемник система пытается найти объект с таким же GUID. Если в приемнике у счета с кодом «105.00» другой GUID, сопоставление не произойдет, и поле останется пустым.

Рассмотрим подробнее три основных способа решения этой задачи.

Способ 1: Использование переменной «Выражение»

Это один из самых мощных инструментов в КД 2.0. Переменная Выражение позволяет передать в файл выгрузки не готовое значение, а строку программного кода, которая будет выполнена уже на стороне базы-приемника в момент загрузки. Рассмотрим пример кода в ПКС Перед выгрузкой:


// В базе-источнике мы просто передаем строку кода для приемника
Выражение = "ПланыСчетов.ЕПСБУ.НайтиПоКоду(""105.00"")";

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

Способ 2: Передача строки и поиск по коду в ПКО

Если для типа данных (например, План счетов) в соответствующем Правиле конвертации объектов (ПКО) установлен флаг «Поиск по коду», мы можем существенно упростить код. Вместо того чтобы искать объект программно, мы просто передаем строку с кодом в переменную Значение.

Разберем, как это реализовать в обработчике ПКС Перед выгрузкой:


// Просто присваиваем строковое значение кода
Значение = "105.00";

В этом случае система выгрузит строку. При загрузке сработает ПКО для планов счетов, система увидит строку и, согласно настройкам поиска, сама выполнит НайтиПоКоду(). Это более «чистый» способ, так как он опирается на штатные механизмы конвертации и не требует написания сложных строковых конструкций.

Способ 3: Оптимизация через параметры (Кэширование)

Выясним причину, по которой первые два способа могут замедлить загрузку при больших объемах данных. Если у вас выгружается 10 000 документов, и в каждом документе в ПКС срабатывает НайтиПоКоду, база данных приемника будет выполнять 10 000 лишних запросов. Это неэффективно.

Проанализируем стратегию оптимизации. Мы можем найти ссылку один раз при начале загрузки и использовать ее повсеместно. Для этого используем глобальный обработчик конверсии «Перед загрузкой данных»:


// В глобальном обработчике на стороне приемника
Параметры.Вставить("СсылкаСчет105", ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00"));

Теперь в ПКС Перед выгрузкой мы можем использовать Выражение, которое обращается к этому параметру:


// Обращаемся к уже найденному значению в памяти
Выражение = "Параметры.СсылкаСчет105";

Такой подход сокращает количество обращений к базе данных до одного, что значительно ускоряет процесс загрузки данных.

Важные замечания по настройке ПКС

Рассмотрим еще несколько технических нюансов, которые помогут избежать ошибок:

Альтернатива: Обработчик «При загрузке»

Если логика заполнения реквизита зависит исключительно от правил базы-приемника и не требует никаких данных из источника, можно вообще не трогать ПКС на стороне выгрузки. Вместо этого используем обработчик «При загрузке» в самом ПКС или в ПКО объекта.

Пример кода в ПКС При загрузке (выполняется в приемнике):


// Объект - это загружаемый объект в приемнике
// ИмяРеквизита - имя свойства, которое мы заполняем
Объект.СчетУчета = ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00");

Этот метод считается наиболее надежным для установки значений «по умолчанию», так как он полностью изолирован от данных файла выгрузки и работает непосредственно с контекстом базы-приемника.

Подведем итог: для решения проблемы автора наиболее эффективным и быстрым способом является использование Выражение = "ПланыСчетов.ЕПСБУ.НайтиПоКоду(""105.00"")";, так как это гарантирует поиск объекта в правильной базе и не требует наличия счета в источнике. Однако для профессиональной разработки рекомендуется использовать кэширование через Параметры, чтобы обеспечить максимальную производительность обмена данными.

← На главную