При настройке правил обмена в конфигурации «Конвертация данных 2.1» для переноса информации из базы «1С:Предприятие 7.7» в современную конфигурацию «1С:Предприятие 8.3» разработчики нередко сталкиваются с ситуацией, когда связанные справочники загружаются корректно, однако ссылки на них в реквизитах основного объекта остаются пустыми. Разберем типичный пример: при переносе справочника ОсновныеСредства подчиненные классификаторы (например, ЕНАОФ или нормы амортизационных отчислений) успешно создаются в приемнике, но в карточке основного средства соответствующие поля не заполняются.
Проанализируем архитектурную причину такого поведения и рассмотрим несколько надежных способов правильной передачи значений.
Выясним причину проблемы, заглянув во внутреннюю структуру хранения данных «1С:Предприятия 7.7» и механизм работы универсальной обработки выгрузки V8Exchan81.ert. В платформе 1С 7.7 для реквизитов справочника может быть установлен флаг «Периодический». В отличие от обычных реквизитов, значения периодических реквизитов хранятся не в основной таблице справочника, а в системной таблице истории значений.
Когда обработка выгрузки обращается к реквизитам объекта Источник напрямую (через получение атрибута метаданных), чтение периодического реквизита без предварительного позиционирования на дату возвращает не конкретную ссылку на элемент справочника, а неопределенное значение либо объект типа «Периодический». В итоге при формировании XML-файла обмена тег свойства выгружается с признаком пустого значения:
<Свойство Имя="ШифрПоЕНАОФ" Тип="СправочникСсылка...">
<Пусто/>
</Свойство>
Поскольку выгрузка передает явную команду записать пустое значение, в базе-приемнике 1С 8.3 реквизит очищается или остается незаполненным, даже если само правило конвертации настроено абсолютно верно.
Самое прямое и точечное решение задачи — принудительно получить значение периодического реквизита на конкретную дату среза остатков прямо перед выгрузкой свойства. Для этого откроем нужное Правило Конвертации Свойства (ПКС) и в обработчике «Перед выгрузкой» переопределим значение переменной Значение.
Посмотрим на пример кода в ПКС:
Значение = Источник.ШифрПоНормативнымСрокамСлужбы.Получить(Параметры.ДатаОстатков);
Важный момент: крайне не рекомендуется жестко прописывать дату в виде константы (например, Дата(2023, 12, 31)). Правильнее передавать расчетную дату через параметры конвертации или использовать предопределенную переменную даты выгрузки обработки обмена, например ДатаОкончания (или ДатаКонца).
Если справочник содержит несколько периодических реквизитов, прописывать код получения в каждом ПКС вручную нерационально. Платформа 1С 7.7 позволяет позиционировать объект на дату целиком с помощью специального встроенного метода. После вызова этого метода все периодические реквизиты объекта автоматически возвращают срез на установленный момент времени.
Разберем реализацию по шагам:
Источник на дату выгрузки остатков:
Источник.ИспользоватьДату(Параметры.ДатаОстатков);
После добавления этой строки отпадает необходимость настраивать отдельные скрипты в обработчиках «Перед выгрузкой» каждого ПКС — выгрузка свойств сработает в штатном режиме, корректно передавая актуальные ссылки на справочники-классификаторы.
Рассмотрим ситуацию, когда в исходной базе 1С 7.7 периодические значения могли заноситься задним числом или позже официальной даты свертки, а также когда дата среза не охватывает все записи. Вызов стандартного метода Получить(Дата) при отсутствии записей на указанный или предшествующий период может вернуть пустоту. Если нам требуется гарантированно получить самое последнее установленное в истории значение, применим объект Периодический.
В обработчике ПКС «Перед выгрузкой» напишем следующий алгоритм:
Период = СоздатьОбъект("Периодический");
Период.ИспользоватьОбъект("ШифрПоКлассификатору", Источник);
Период.ОбратныйПорядок(1);
Если Период.ВыбратьЗначения() = 1 Тогда
Период.ПолучитьЗначение();
Значение = Период.Значение;
КонецЕсли;
Такой подход обеспечивает гарантированное считывание последней актуальной записи классификатора из истории базы 7.7 независимо от текущей даты среза.
Проанализируем важный нюанс приемника. В типовых конфигурациях 1С 8.3 (включая «Бухгалтерию предприятия» и локализации, такие как «Бухгалтерия для Беларуси») учетные данные основных средств хранятся не только в карточке элемента справочника ОсновныеСредства, но и в соответствующих независимых периодических регистрах сведений.
Если перенос выполняется в рамках ввода остатков, одного лишь заполнения реквизитов справочника может быть недостаточно: параметры начисления амортизации и шифры классификаторов должны транслироваться также в документ ВводНачальныхОстатков или напрямую в регистры сведений по учету ОС. Проверяйте фактическое наличие перенесенных данных не только через форму элемента в режиме предприятия, но и с помощью консоли запросов или универсального отчета.