Как задать значение реквизиту приемника в КД 2.1, если его нет в источнике?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

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

Анализ ошибки: почему падает выгрузка

Представим типовую настройку правила конвертации свойств (ПКС):

  1. Объект-источник: справочник 1С 7.7, у которого нет требуемого реквизита.
  2. Реквизит-источник в ПКС оставлен пустым.
  3. Реквизит-приемник: СчетДляКурсовыхРазниц.
  4. В обработчике «При выгрузке» прописан код: Значение = "334";.

При выполнении обмена обработка выгрузки прерывается с ошибкой: «Ошибка получения значения свойства объекта. Объект: Рубль, свойство: СчетДляКурсовыхРазниц».

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

  1. Сначала вызывается обработчик «Перед выгрузкой» свойства.
  2. После этого алгоритм проверяет, определена ли переменная Значение. Если переменная пуста или не инициализирована в первом обработчике, механизм конвертации пытается получить данные автоматически.
  3. Если реквизит источника в настройках правила не выбран, механизм пытается прочитать из объекта-источника свойство с точно таким же именем, как у приемника — то есть пытается обратиться к свойству Источник.СчетДляКурсовыхРазниц.
  4. Так как в 1С 7.7 такого реквизита не существует, на этом шаге платформа генерирует исключение и аварийно завершает выгрузку.
  5. До обработчика «При выгрузке» очередь даже не доходит, поскольку он должен выполняться уже после получения исходного значения из объекта.

Способ 1. Перенос инициализации в обработчик «Перед выгрузкой» (Решение проблемы)

Самое простое и быстрое исправление заключается в смене обработчика события в ПКС. Перенесем строку кода из события «При выгрузке» в событие «Перед выгрузкой»:

Значение = "334";

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

Важный нюанс типизации: поскольку мы передаем строку "334" для реквизита типа ПланСчетовСсылка.Основной, для корректного поиска счета в базе-приемнике должно существовать ПКО соответствующего плана счетов, в котором реквизит Код отмечен как поле поиска.

Способ 2. Использование поля «Выражение» в ПКС

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

  1. Открываем строку нужного ПКС в таблице правил.
  2. Оставляем поле источника пустым.
  3. В колонке «Выражение» указываем строковый литерал (обязательно в кавычках): "334".

Механизм конвертации самостоятельно вычислит это выражение до автоматического считывания реквизита из источника, что исключит ошибку.

Способ 3. Заполнение реквизита на стороне приемника (Рекомендуемый подход)

Часто реквизиты, специфичные для конфигурации-приемника, логичнее заполнять уже в момент загрузки данных в 1С 8. Это исключает передачу лишних служебных данных через файл обмена и позволяет использовать все возможности объектной модели платформы 1С 8 (например, предопределенные значения).

Разберем по шагам реализацию этого способа:

  1. Отключаем или полностью удаляем ПКС для реквизита СчетДляКурсовыхРазниц, чтобы он не участвовал в выгрузке из 1С 7.7.
  2. В ПКО справочника Валюты открываем обработчик «После загрузки».
  3. Пишем код на встроенном языке 1С 8, который найдет и подставит нужный счет в загружаемый объект:

// Если счет предопределенный в конфигурации приемника:
Объект.СчетДляКурсовыхРазниц = ПланыСчетов.Основной.КурсовыеРазницы;

// Либо поиск по коду счета, если он не является предопределенным:
НайденныйСчет = ПланыСчетов.Основной.НайтиПоКоду("334");
Если ЗначениеЗаполнено(НайденныйСчет) Тогда
    Объект.СчетДляКурсовыхРазниц = НайденныйСчет;
КонецЕсли;

Обратим внимание: обработчики выгрузки при переносе из 1С 7.7 в 1С 8 исполняются в контексте 1С 7.7 (внутри внешней обработки V77Exp.ert), поэтому там нельзя обращаться к объектам метаданных через конструкции вида Справочники... или ПланыСчетов.... Любые прямые манипуляции с объектной моделью приемника следует выполнять исключительно в обработчиках загрузки («Перед загрузкой», «После загрузки») на стороне 1С 8.

← На главную