Почему не переносятся периодические реквизиты справочника из 1С 7.7 в 1С 8.3 через Конвертацию данных 2.1?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.1» для переноса информации из базы «1С:Предприятие 7.7» в современную конфигурацию «1С:Предприятие 8.3» разработчики нередко сталкиваются с ситуацией, когда связанные справочники загружаются корректно, однако ссылки на них в реквизитах основного объекта остаются пустыми. Разберем типичный пример: при переносе справочника ОсновныеСредства подчиненные классификаторы (например, ЕНАОФ или нормы амортизационных отчислений) успешно создаются в приемнике, но в карточке основного средства соответствующие поля не заполняются.

Проанализируем архитектурную причину такого поведения и рассмотрим несколько надежных способов правильной передачи значений.

В чем причина формирования пустых значений в выгрузке

Выясним причину проблемы, заглянув во внутреннюю структуру хранения данных «1С:Предприятия 7.7» и механизм работы универсальной обработки выгрузки V8Exchan81.ert. В платформе 1С 7.7 для реквизитов справочника может быть установлен флаг «Периодический». В отличие от обычных реквизитов, значения периодических реквизитов хранятся не в основной таблице справочника, а в системной таблице истории значений.

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


<Свойство Имя="ШифрПоЕНАОФ" Тип="СправочникСсылка...">
    <Пусто/>
</Свойство>

Поскольку выгрузка передает явную команду записать пустое значение, в базе-приемнике 1С 8.3 реквизит очищается или остается незаполненным, даже если само правило конвертации настроено абсолютно верно.

Способ 1. Получение значения на дату в обработчике ПКС

Самое прямое и точечное решение задачи — принудительно получить значение периодического реквизита на конкретную дату среза остатков прямо перед выгрузкой свойства. Для этого откроем нужное Правило Конвертации Свойства (ПКС) и в обработчике «Перед выгрузкой» переопределим значение переменной Значение.

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


Значение = Источник.ШифрПоНормативнымСрокамСлужбы.Получить(Параметры.ДатаОстатков);

Важный момент: крайне не рекомендуется жестко прописывать дату в виде константы (например, Дата(2023, 12, 31)). Правильнее передавать расчетную дату через параметры конвертации или использовать предопределенную переменную даты выгрузки обработки обмена, например ДатаОкончания (или ДатаКонца).

Способ 2. Установка даты для всего объекта в ПКО (рекомендуемый)

Если справочник содержит несколько периодических реквизитов, прописывать код получения в каждом ПКС вручную нерационально. Платформа 1С 7.7 позволяет позиционировать объект на дату целиком с помощью специального встроенного метода. После вызова этого метода все периодические реквизиты объекта автоматически возвращают срез на установленный момент времени.

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

  1. Откроем Правило Конвертации Объекта (ПКО) для нужного справочника (в нашем случае — «ОсновныеСредства»).
  2. Перейдем в обработчик события «Перед выгрузкой» объекта.
  3. Добавим позиционирование объекта Источник на дату выгрузки остатков:

Источник.ИспользоватьДату(Параметры.ДатаОстатков);

После добавления этой строки отпадает необходимость настраивать отдельные скрипты в обработчиках «Перед выгрузкой» каждого ПКС — выгрузка свойств сработает в штатном режиме, корректно передавая актуальные ссылки на справочники-классификаторы.

Способ 3. Безопасное получение последнего актуального значения через объект «Периодический»

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

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


Период = СоздатьОбъект("Периодический");
Период.ИспользоватьОбъект("ШифрПоКлассификатору", Источник);
Период.ОбратныйПорядок(1);
Если Период.ВыбратьЗначения() = 1 Тогда
    Период.ПолучитьЗначение();
    Значение = Период.Значение;
КонецЕсли;

Такой подход обеспечивает гарантированное считывание последней актуальной записи классификатора из истории базы 7.7 независимо от текущей даты среза.

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

Проанализируем важный нюанс приемника. В типовых конфигурациях 1С 8.3 (включая «Бухгалтерию предприятия» и локализации, такие как «Бухгалтерия для Беларуси») учетные данные основных средств хранятся не только в карточке элемента справочника ОсновныеСредства, но и в соответствующих независимых периодических регистрах сведений.

Если перенос выполняется в рамках ввода остатков, одного лишь заполнения реквизитов справочника может быть недостаточно: параметры начисления амортизации и шифры классификаторов должны транслироваться также в документ ВводНачальныхОстатков или напрямую в регистры сведений по учету ОС. Проверяйте фактическое наличие перенесенных данных не только через форму элемента в режиме предприятия, но и с помощью консоли запросов или универсального отчета.

← На главную