При работе с инструментом «1С:Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с необходимостью программного заполнения реквизитов объекта, которых нет в источнике, или которые должны принимать фиксированное значение в базе-приемнике. Типичная ошибка — попытка найти объект в базе-источнике и присвоить его напрямую, когда этого объекта там может не существовать или он имеет другой идентификатор. В этой статье мы разберем, как правильно использовать обработчик Перед выгрузкой в Правилах конвертации свойств (ПКС), разберем разницу между переменными Значение и Выражение, а также научимся оптимизировать процесс загрузки данных.
Прежде всего, проанализируем ситуацию: почему простой код Значение = ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00"); часто не дает результата? Ответ кроется в месте выполнения этого кода. Обработчик «Перед выгрузкой» выполняется в базе-источнике. Это означает, что:
Значение помещается ссылка из источника.Рассмотрим подробнее три основных способа решения этой задачи.
Это один из самых мощных инструментов в КД 2.0. Переменная Выражение позволяет передать в файл выгрузки не готовое значение, а строку программного кода, которая будет выполнена уже на стороне базы-приемника в момент загрузки. Рассмотрим пример кода в ПКС Перед выгрузкой:
// В базе-источнике мы просто передаем строку кода для приемника
Выражение = "ПланыСчетов.ЕПСБУ.НайтиПоКоду(""105.00"")";
Почему это работает? Когда загрузчик в приемнике видит заполненное Выражение, он игнорирует стандартные механизмы поиска по ссылкам и выполняет этот код функцией Вычислить(). Это гарантирует, что поиск счета произойдет именно в базе-приемнике по ее правилам и ее данным. Посмотрим на нюанс с кавычками: так как Выражение — это строка, строковые литералы внутри нее (код счета) должны быть удвоены.
Если для типа данных (например, План счетов) в соответствующем Правиле конвертации объектов (ПКО) установлен флаг «Поиск по коду», мы можем существенно упростить код. Вместо того чтобы искать объект программно, мы просто передаем строку с кодом в переменную Значение.
Разберем, как это реализовать в обработчике ПКС Перед выгрузкой:
// Просто присваиваем строковое значение кода
Значение = "105.00";
В этом случае система выгрузит строку. При загрузке сработает ПКО для планов счетов, система увидит строку и, согласно настройкам поиска, сама выполнит НайтиПоКоду(). Это более «чистый» способ, так как он опирается на штатные механизмы конвертации и не требует написания сложных строковых конструкций.
Выясним причину, по которой первые два способа могут замедлить загрузку при больших объемах данных. Если у вас выгружается 10 000 документов, и в каждом документе в ПКС срабатывает НайтиПоКоду, база данных приемника будет выполнять 10 000 лишних запросов. Это неэффективно.
Проанализируем стратегию оптимизации. Мы можем найти ссылку один раз при начале загрузки и использовать ее повсеместно. Для этого используем глобальный обработчик конверсии «Перед загрузкой данных»:
// В глобальном обработчике на стороне приемника
Параметры.Вставить("СсылкаСчет105", ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00"));
Теперь в ПКС Перед выгрузкой мы можем использовать Выражение, которое обращается к этому параметру:
// Обращаемся к уже найденному значению в памяти
Выражение = "Параметры.СсылкаСчет105";
Такой подход сокращает количество обращений к базе данных до одного, что значительно ускоряет процесс загрузки данных.
Рассмотрим еще несколько технических нюансов, которые помогут избежать ошибок:
Перед выгрузкой все равно будет вызван, и наш программный код сработает.Значение, и Выражение, то приоритет имеет Выражение. Стандартный поиск по ПКО в этом случае будет проигнорирован.НайтиПоКоду("105.00"), убедитесь, что это не группа счетов. Если в приемнике включен учет по субсчетам, попытка подставить группу в реквизит документа может привести к ошибке проведения. В таком случае код поиска должен быть более детальным, например, 105.31.Если логика заполнения реквизита зависит исключительно от правил базы-приемника и не требует никаких данных из источника, можно вообще не трогать ПКС на стороне выгрузки. Вместо этого используем обработчик «При загрузке» в самом ПКС или в ПКО объекта.
Пример кода в ПКС При загрузке (выполняется в приемнике):
// Объект - это загружаемый объект в приемнике
// ИмяРеквизита - имя свойства, которое мы заполняем
Объект.СчетУчета = ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.00");
Этот метод считается наиболее надежным для установки значений «по умолчанию», так как он полностью изолирован от данных файла выгрузки и работает непосредственно с контекстом базы-приемника.
Подведем итог: для решения проблемы автора наиболее эффективным и быстрым способом является использование Выражение = "ПланыСчетов.ЕПСБУ.НайтиПоКоду(""105.00"")";, так как это гарантирует поиск объекта в правильной базе и не требует наличия счета в источнике. Однако для профессиональной разработки рекомендуется использовать кэширование через Параметры, чтобы обеспечить максимальную производительность обмена данными.