При настройке обмена данными между различными конфигурациями 1С на платформе 8.3 через «Конвертацию данных 2.1» программисты часто сталкиваются с ситуацией, когда структура метаданных в источнике и приемнике существенно различается. Одной из наиболее трудоемких задач является перенос записей регистров сведений, которые в исходной базе подчинены регистратору, а в целевой базе типы этих документов-регистраторов отсутствуют вовсе или их перенос нецелесообразен.
В этой статье мы подробно рассмотрим, как решить данную проблему, направив все записи регистра в один (или несколько) «фиктивных» документов в базе-приемнике. Мы проанализируем настройки Правил Конвертации Объектов (ПКО), разберем особенности поиска и научимся избегать типичных ошибок типизации данных.
Регистр сведений с режимом записи Подчинение регистратору жестко связан с документом. В системе 1С невозможно просто «записать» набор записей такого регистра без указания ссылки на существующий документ. Если в базе-приемнике нет соответствующего типа документа, стандартная выгрузка не сработает — ссылка будет «битой», и записи регистра либо не загрузятся, либо не будут отображаться в интерфейсе.
Рассмотрим решение, при котором мы создаем в приемнике специальный документ (например, ВводОстатковВнеоборотныхАктивов), который будет выступать универсальным «контейнером» для всех переносимых записей регистра.
Первым делом нам необходимо создать Правило Конвертации Объекта (ПКО) для документа, который станет новым регистратором. Особенность этого правила заключается в том, что у него не будет объекта-источника.
ДокументСсылка.ВводОстатковВнеоборотныхАктивов).Чтобы система понимала, в какой именно документ загружать записи, нам нужно жестко задать параметры поиска в Правилах Конвертации Свойств (ПКС). Проанализируем важный нюанс: при написании номера документа в коде новички часто забывают о кавычках, что приводит к ошибкам.
Например, выражение 0000-000001 без кавычек воспринимается платформой как математическая операция вычитания, результатом которой будет число -1. Поэтому значения должны передаваться строго как строки.
В ПКО нашего документа создаем следующие ПКС:
ПередВыгрузкой или напрямую в поле «Значение» указываем "0000-000001". Устанавливаем флаг Поиск.Дата(2022, 1, 1). Устанавливаем флаг Поиск.Истина. Это критично, так как записи регистра часто не учитываются в отчетах, если их регистратор не проведен.Рассмотрим пример настройки ПКС для номера через «Значение»:
Значение = "0000-000001";
Теперь перейдем к самому регистру сведений. В его ПКО нам нужно сопоставить свойство Регистратор с тем правилом, которое мы создали на предыдущем шаге.
Найдите в ПКС регистра свойство Регистратор и в колонке «Правило» выберите созданное ПКО для документа ВводОстатковВнеоборотныхАктивов. Теперь при загрузке каждой записи регистра система будет обращаться к правилу поиска документа, находить наш «фиктивный» документ по номеру/дате и привязывать запись к нему.
Проанализируем ситуацию: если в исходном регистре миллионы записей, и мы все их подчиним одному регистратору в приемнике, мы получим документ с колоссальным набором записей. Такой объект будет невозможно открыть, а попытка его перепроведения приведет к зависанию базы или переполнению памяти сервера.
Чтобы этого избежать, рекомендуем использовать группировку по периодам. Вместо одного жесткого номера документа можно генерировать номера в зависимости от даты записи.
Рассмотрим алгоритм в обработчике ПередВыгрузкой для ПКС Регистратор в регистре сведений:
// Пример формирования уникального ключа для регистратора по месяцам
Год = Формат(ОбъектКоллекции.Период, "ДФ=yyyy");
Месяц = Формат(ОбъектКоллекции.Период, "ДФ=MM");
НомерДокумента = "ПЕРЕНОС-" + Год + "-" + Месяц;
// Передаем эти данные в ПКО регистратора через ВходящиеДанные
ПередатьДанныеВПКС = Новый Структура;
ПередатьДанныеВПКС.Вставить("Номер", НомерДокумента);
ПередатьДанныеВПКС.Вставить("Дата", НачалоМесяца(ОбъектКоллекции.Период));
ВходящиеДанные = ПередатьДанныеВПКС;
В этом случае в ПКО документа в обработчиках поиска нужно будет принимать эти ВходящиеДанные и использовать их для идентификации конкретного документа за конкретный месяц.
При работе с подчиненными регистрами сведений в 1С важно помнить, что по умолчанию загрузка набора записей по регистратору полностью замещает старые данные. Если вы загружаете данные порциями, убедитесь, что в ПВД (Правилах выгрузки данных) или в настройках загрузки не стоит режим, который очистит ранее загруженные записи того же регистратора.
Также выясним причину, почему иногда записи «не видны» после загрузки. Это часто связано с тем, что документ-регистратор был создан, но не записан или не проведен. В ПКО документа в обработчике ПослеЗагрузки полезно добавить принудительную запись:
Если Объект.ЭтоНовый() Тогда
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Однако помните, что для регистра сведений достаточно просто наличия ссылки (объекта в базе), режим проведения важен скорее для бизнес-логики конфигурации-приемника.
Мы рассмотрели механизм «подмены» регистратора при переносе данных. Подведем итог последовательности действий:
Регистратор.ВходящиеДанные для распределения записей по разным документам во избежание проблем с производительностью.Этот метод позволяет гибко обходить ограничения типизации и успешно переносить историю движений или остатков даже в те базы, где исходная логика документов полностью отсутствует.