Как выгрузить подчиненный регистр сведений, если в базе-приемнике нет нужного типа документа-регистратора?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Суть проблемы и архитектурные ограничения

Регистр сведений с режимом записи Подчинение регистратору жестко связан с документом. В системе 1С невозможно просто «записать» набор записей такого регистра без указания ссылки на существующий документ. Если в базе-приемнике нет соответствующего типа документа, стандартная выгрузка не сработает — ссылка будет «битой», и записи регистра либо не загрузятся, либо не будут отображаться в интерфейсе.

Рассмотрим решение, при котором мы создаем в приемнике специальный документ (например, ВводОстатковВнеоборотныхАктивов), который будет выступать универсальным «контейнером» для всех переносимых записей регистра.

Шаг 1: Создание ПКО для «фиктивного» регистратора

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

  1. В конфигурации «Конвертация данных» создаем новое ПКО.
  2. Поле Источник оставляем пустым.
  3. В поле Приемник выбираем нужный тип документа (например, ДокументСсылка.ВводОстатковВнеоборотныхАктивов).
  4. Обязательно снимаем флаг «Искать объект по внутреннему идентификатору (GUID)». Поскольку источника нет, ГУИД передаваться не будет, и поиск должен идти исключительно по полям.

Шаг 2: Настройка поиска документа по номеру и дате

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

Например, выражение 0000-000001 без кавычек воспринимается платформой как математическая операция вычитания, результатом которой будет число -1. Поэтому значения должны передаваться строго как строки.

В ПКО нашего документа создаем следующие ПКС:

Рассмотрим пример настройки ПКС для номера через «Значение»:

Значение = "0000-000001";

Шаг 3: Настройка ПКО для регистра сведений

Теперь перейдем к самому регистру сведений. В его ПКО нам нужно сопоставить свойство Регистратор с тем правилом, которое мы создали на предыдущем шаге.

Найдите в ПКС регистра свойство Регистратор и в колонке «Правило» выберите созданное ПКО для документа ВводОстатковВнеоборотныхАктивов. Теперь при загрузке каждой записи регистра система будет обращаться к правилу поиска документа, находить наш «фиктивный» документ по номеру/дате и привязывать запись к нему.

Проблема «Гигантского документа» и способы оптимизации

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

Чтобы этого избежать, рекомендуем использовать группировку по периодам. Вместо одного жесткого номера документа можно генерировать номера в зависимости от даты записи.

Рассмотрим алгоритм в обработчике ПередВыгрузкой для ПКС Регистратор в регистре сведений:


// Пример формирования уникального ключа для регистратора по месяцам
Год = Формат(ОбъектКоллекции.Период, "ДФ=yyyy");
Месяц = Формат(ОбъектКоллекции.Период, "ДФ=MM");
НомерДокумента = "ПЕРЕНОС-" + Год + "-" + Месяц;

// Передаем эти данные в ПКО регистратора через ВходящиеДанные
ПередатьДанныеВПКС = Новый Структура;
ПередатьДанныеВПКС.Вставить("Номер", НомерДокумента);
ПередатьДанныеВПКС.Вставить("Дата", НачалоМесяца(ОбъектКоллекции.Период));
ВходящиеДанные = ПередатьДанныеВПКС;

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

Важные замечания по загрузке наборов записей

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

Также выясним причину, почему иногда записи «не видны» после загрузки. Это часто связано с тем, что документ-регистратор был создан, но не записан или не проведен. В ПКО документа в обработчике ПослеЗагрузки полезно добавить принудительную запись:


Если Объект.ЭтоНовый() Тогда
    Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;

Однако помните, что для регистра сведений достаточно просто наличия ссылки (объекта в базе), режим проведения важен скорее для бизнес-логики конфигурации-приемника.

Итоги

Мы рассмотрели механизм «подмены» регистратора при переносе данных. Подведем итог последовательности действий:

  1. Создаем ПКО без источника для документа-приемника.
  2. Настраиваем в нем поиск по жестким реквизитам (строковый Номер и Дата), не забывая про кавычки.
  3. В ПКО регистра сведений указываем это правило для свойства Регистратор.
  4. При необходимости используем ВходящиеДанные для распределения записей по разным документам во избежание проблем с производительностью.

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

← На главную