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