Перенос документа КорректировкаРегистров является одной из наиболее специфических задач в среде 1С:Конвертация данных 2.1. Основная сложность заключается в том, что этот документ по своей сути является «контейнером» для записей практически любых регистров. В типовых конфигурациях, таких как УТ 11, ERP 2 или КА 2, данные внутри этого документа хранятся не в его табличных частях, а непосредственно в наборах записей регистров, где документ выступает в роли регистратора.
В этой статье мы подробно разберем, как правильно настроить правила обмена, чтобы документ не просто переносился как пустая ссылка, а содержал в себе все необходимые движения и корректно отображал их в интерфейсе базы-приемника.
Прежде чем приступать к написанию кода, проанализируем структуру объекта. В базе-приемнике документ КорректировкаРегистров имеет техническую табличную часть (обычно она называется ТаблицаРегистров). В этой табличной части хранится список имен тех регистров, по которым данный документ делает движения. Это необходимо для того, чтобы форма документа «понимала», какие закладки (вкладки регистров) ей нужно отрисовать при открытии.
Важный нюанс: если вы перенесете только движения по регистру накопления, но не заполните эту табличную часть в самом документе, пользователь откроет корректировку и увидит пустой экран, хотя данные в базе будут присутствовать. Наша задача — обеспечить связность этих данных.
Для начала нам необходимо выгрузить описание структуры метаданных обеих конфигураций. Рассмотрим важный момент: при использовании обработки MD83Exp.epf обязательно нужно установить флаг «Выгружать движения». Если этого не сделать, регистры накопления и сведения не попадут в файл описания, и вы не сможете создать для них ПКО (Правила Конвертации Объектов) в базе 1С:Конвертация данных.
После выгрузки и загрузки структуры в КД, убедитесь, что ваш «самописный» или типовой регистр накопления появился в списке доступных объектов для настройки правил.
Разберем ситуацию, когда нам нужно перенести данные конкретного регистра (например, ПродажиИз1С77). Нам необходимо создать правило конвертации для самого регистра.
ПродажиИз1С77).Регистратор. В качестве правила для этого свойства должно быть указано ПКО нашего документа КорректировкаРегистров.В ПКО регистра на закладке «Общие» рекомендуется проверить настройки режима записи. Часто требуется установить флаг «Режим записи — Запись», чтобы набор записей принудительно фиксировался в базе при загрузке.
Теперь рассмотрим ПКО самого документа КорректировкаРегистров. Чтобы в приемнике заполнилась таблица имен регистров, мы можем использовать обработчик «Перед выгрузкой» для ПКС соответствующей табличной части или использовать входящие данные.
Проанализируем программный способ формирования этих данных. В ПВД (Правиле Выгрузки Данных) перед вызовом выгрузки документа мы можем подготовить структуру ИсхДанные. Посмотрим на пример кода:
ИсхДанные = Новый Структура("Дата, Комментарий, ТаблицаРегистров");
ИсхДанные.Дата = ТекущаяДата();
ИсхДанные.Комментарий = "Перенос данных из КД 2.1";
// Формируем таблицу имен регистров для визуального отображения в документе
ТЗ_Регистры = Новый ТаблицаЗначений;
ТЗ_Регистры.Колонки.Добавить("Имя");
НоваяСтрока = ТЗ_Регистры.Добавить();
НоваяСтрока.Имя = "ПродажиИз1С77"; // Имя регистра в метаданных приемника
ИсхДанные.ТаблицаРегистров = ТЗ_Регистры;
// Выгружаем документ
ВыгрузитьПоПравилу(,, ИсхДанные,, "КорректировкаРегистровПродажи1С77");
В самом ПКО документа КорректировкаРегистровПродажи1С77 для ПКС табличной части ТаблицаРегистров нужно указать источник данных — ТаблицаРегистров (из входящих данных).
Часто программисты сталкиваются с ошибкой: Ошибка получения значения свойства подчиненного объекта (по имени свойства приемника) ... СвойствоПриемника = Имя (Строка) ... Поле объекта не обнаружено (Имя). Выясним причину этой ошибки.
Эта проблема возникает, когда КД пытается сопоставить данные из вашей таблицы значений (ТЗ) напрямую со свойствами объекта, но не находит их, либо когда вместо структуры/массива передается вся таблица целиком там, где ожидается строка коллекции. Рассмотрим, как правильно преобразовать данные для передачи в ВыгрузитьПоПравилу, если вы выгружаете набор записей регистра как коллекцию.
Если вы передаете данные регистра через ИсходящиеДанные, воспользуемся функцией преобразования ТЗ в массив структур, так как КД лучше обрабатывает коллекции в таком формате:
Функция ПреобразоватьТаблицуВМассив(ТаблицаЗначений)
РезультатМассив = Новый Массив;
Для Каждого Строка Из ТаблицаЗначений Цикл
СтруктураСтрока = Новый Структура;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
СтруктураСтрока.Вставить(Колонка.Имя, Строка[Колонка.Имя]);
КонецЦикла;
РезультатМассив.Добавить(СтруктураСтрока);
КонецЦикла;
Возврат РезультатМассив;
КонецФункции
Этот массив структур можно передать в качестве источника для ПКО набора записей регистра.
Рассмотрим еще один надежный способ, предложенный опытными разработчиками. Вместо того чтобы пытаться «запихнуть» движения внутрь выгрузки документа, можно сделать следующее:
КорректировкаРегистров.Регистратор. Если документ-регистратор еще не был выгружен, КД выгрузит его автоматически по ссылке (при условии наличия ПКО для документа).Этот подход «от регистра к документу» часто оказывается более стабильным, так как платформа 1С изначально хранит движения отдельно от объектов-регистраторов.
Выясним, всегда ли нужна сложная настройка в КД 2.1. Если вы выполняете перенос между абсолютно идентичными конфигурациями (например, УТ 11.4 -> УТ 11.4) и базы были созданы копированием (имеют одинаковые GUID метаданных), то использование Конвертации Данных может быть избыточным.
В этом случае эффективнее применить стандартную обработку «Выгрузка и загрузка данных XML». При выгрузке документа КорректировкаРегистров достаточно установить флаг «Выгружать движения вместе с документом». Обработка автоматически подтянет все связанные записи регистров и корректно запишет их в приемнике. Это избавит вас от необходимости прописывать алгоритмы заполнения технических табличных частей.
Однако, если стоит задача трансформации данных (например, подмена номенклатуры или изменение аналитики), то путь через КД 2.1 с ручной настройкой ПКО и ПКС остается единственным верным решением.
Подводя итог, напомним: при переносе корректировок в КД 2.1 главное — не забывать про заполнение ТаблицыРегистров в самом документе и корректную передачу набора записей (желательно в виде массива структур через ИсходящиеДанные), если вы используете программный вызов выгрузки.