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