Как программно установить значение счета учета или перечисления в 1С:Конвертация данных 2.1

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

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

Использование переменной «Значение» для перечислений

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

Разберем ситуацию на примере. Допустим, при выгрузке документа нам нужно, чтобы в поле «Вид операции» всегда подставлялось значение «Возврат товара». Если в конфигурации-приемнике это перечисление имеет соответствующее имя значения, мы можем написать следующий код:


// В обработчике ПКС "Перед выгрузкой"
Значение = "ВозвратТовара";

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

Установка счета учета через переменную «Выражение»

Вопрос автора темы касался переноса счетов учета. Для ссылочных типов, таких как ПланСчетовСсылка, простая передача строки в Значение не всегда работает так же гладко, как с перечислениями, если только у счета нет предопределенного имени, совпадающего с этой строкой.

Рассмотрим более универсальный и надежный способ — использование переменной Выражение. Разберем по шагам, как это работает:

  1. В ПКС (например, для реквизита «СчетУчета») переходим в обработчик «Перед выгрузкой».
  2. Вместо прямой передачи ссылки (которой может не быть в источнике), мы передаем строковую команду, которая будет выполнена в базе-приемнике.

Пример кода для установки счета по его коду:


// В обработчике ПКС "Перед выгрузкой"
Выражение = "ПланыСчетов.Хозрасчетный.НайтиПоКоду(""41.01"")";

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

Проанализируем преимущества этого подхода:

Использование имен предопределенных элементов

Если в плане счетов или справочнике приемника нужный нам элемент является предопределенным, мы можем воспользоваться его системным именем. Это даже более надежно, чем поиск по коду, так как пользователи в режиме «1С:Предприятие» могут изменить код счета, но системное имя (имя объекта в метаданных) останется неизменным.

Рассмотрим пример установки счета через имя предопределенного элемента:


// В обработчике ПКС "Перед выгрузкой"
Выражение = "ПланыСчетов.Хозрасчетный.Товары"; 

Здесь Товары — это имя предопределенного счета 41.01 в конфигураторе. Такой подход гарантирует, что даже при изменении кодировки плана счетов в учете, программная логика переноса не сломается.

Тонкости работы с составными типами данных

Выясним причину возможных ошибок при использовании Выражение в полях с составным типом (например, реквизит «Субконто», который может быть и справочником, и документом). Если мы просто напишем поиск, 1С может не понять, к какому именно типу привести результат. В таких случаях рекомендуется явное приведение типа.

Посмотрим на пример для сложного реквизита:


// Пример для составного типа в приемнике
Выражение = "ПривестиКТипу(ПланыСчетов.Хозрасчетный.НайтиПоКоду(""10.01""), ""ПланСчетовСсылка.Хозрасчетный"")";

Хотя в КД 2.1 часто достаточно и обычного поиска, явное указание типа через механизмы платформы или специализированные функции БСП помогает избежать «пустых» значений при загрузке в сложные поля.

Оптимизация производительности при выгрузке

Проанализируем ситуацию: если мы переносим 10 000 строк документа, и в каждой строке в обработчике ПКС выполняется Выражение = "ПланыСчетов...НайтиПоКоду(...)", это может привести к замедлению загрузки, так как база данных будет выполнять поиск при обработке каждой строки.

Рассмотрим вариант оптимизации через параметры. Выполним следующие действия:

  1. В правилах обмена создадим «Параметр».
  2. В обработчике «После загрузки параметров» на стороне приемника один раз найдем нужный счет и сохраним его в переменную.
  3. В ПКС будем обращаться к уже готовой ссылке из параметров.

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


// В обработчике ПКС "Перед выгрузкой"
Выражение = "Параметры.МойПредварительноНайденныйСчет";

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

Исключение выгрузки свойства

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


Если Источник.ЭтоСпецСлучай Тогда
    Значение = Неопределено;
КонецЕсли;

В этом случае система либо оставит реквизит пустым, либо применит логику по умолчанию, определенную в конфигурации-приемнике.

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

← На главную