Как перенести документы с проводками из Бухгалтерии предприятия 2.0 в 3.0 через Конвертацию данных

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

При переходе с конфигурации «Бухгалтерия предприятия 2.0» на версию 3.0 стандартные механизмы часто предлагают перенос только начальных остатков. Однако на практике возникают задачи, когда необходимо перенести всю историю документов за многие годы (например, с 2008 года) со всеми движениями и проводками «как есть», без использования свертки базы. Рассмотрим, как реализовать такой перенос с помощью инструмента «Конвертация данных 2.1», разберем типовые ошибки и напишем эффективный алгоритм выгрузки данных.

Постановка задачи и выбор метода

Основная сложность при переносе документов с движениями заключается в том, что в целевой базе (БП 3.0) документы при загрузке могут попытаться перепровестись. Это может привести к изменению сумм или счетов, если настройки учетной политики или алгоритмы проведения в новой версии отличаются. Наша задача — передать готовые записи регистра Хозрасчетный и «привязать» их к загружаемым документам, исключив автоматический пересчет. Для этого мы будем использовать механизм ВходящиеДанные в правилах конвертации свойств (ПКС).

Разбор алгоритма выгрузки проводок

Рассмотрим по шагам процесс подготовки данных в исходной базе (БП 2.0). Нам необходимо извлечь все записи регистра бухгалтерии, связанные с конкретным документом, и упаковать их в таблицу значений, которую поймет конвертация. Разберем программный код, который размещается в обработчике или отдельном алгоритме правил обмена.

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


Если Источник.ПометкаУдаления Тогда 
    Отказ = Истина; 
    Возврат;
КонецЕсли; 

// Подготавливаем структуру для передачи в ПКС движений
ВходящиеДанные = Новый Структура("Хозрасчетный"); 
Параметры.ТекущийДокумент = Источник; 

// Вызываем алгоритм получения проводок
Выполнить(Алгоритмы.ПолучитьПроводкиДокумента); 
ВходящиеДанные.Хозрасчетный = Параметры.ПроводкиДокумента;

Теперь детально разберем содержимое самого алгоритма ПолучитьПроводкиДокумента. Проанализируем структуру запроса к регистру бухгалтерии. Нам важно получить не только основные поля (счет, сумма, организация), но и все аналитические разрезы — субконто.


// Создаем таблицу значений с колонками, соответствующими структуре регистра в приемнике
Хозрасчетный = Новый ТаблицаЗначений;
Хозрасчетный.Колонки.Добавить("Активность");
Хозрасчетный.Колонки.Добавить("Организация");
Хозрасчетный.Колонки.Добавить("Период");
Хозрасчетный.Колонки.Добавить("Регистратор");
Хозрасчетный.Колонки.Добавить("Содержание");
Хозрасчетный.Колонки.Добавить("СчетДт");
Хозрасчетный.Колонки.Добавить("СчетКт");
Хозрасчетный.Колонки.Добавить("Сумма");
// Добавляем колонки для налогового учета и валют
Хозрасчетный.Колонки.Добавить("СуммаНУДт");
Хозрасчетный.Колонки.Добавить("СуммаНУКт");
Хозрасчетный.Колонки.Добавить("СубконтоДт");
Хозрасчетный.Колонки.Добавить("СубконтоКт");
Хозрасчетный.Колонки.Добавить("ИмяПКОСубконтоДт");
Хозрасчетный.Колонки.Добавить("ИмяПКОСубконтоКт");

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Регистратор", Параметры.ТекущийДокумент);

// Используем виртуальную таблицу ДвиженияССубконто для получения развернутой аналитики
Запрос.Текст = 
"ВЫБРАТЬ
|	Хозрасчетный.Активность,
|	Хозрасчетный.Организация,
|	Хозрасчетный.Период,
|	Хозрасчетный.СчетДт,
|	Хозрасчетный.СчетКт,
|	Хозрасчетный.СубконтоДт1,
|	Хозрасчетный.ВидСубконтоДт1,
|	Хозрасчетный.СубконтоДт2,
|	Хозрасчетный.ВидСубконтоДт2,
|	Хозрасчетный.СубконтоКт1,
|	Хозрасчетный.ВидСубконтоКт1,
|	Хозрасчетный.Сумма,
|	Хозрасчетный.Содержание,
|	Хозрасчетный.СуммаНУДт,
|	Хозрасчетный.СуммаНУКт
|ИЗ
|	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(,, Регистратор = &Регистратор) КАК Хозрасчетный";

Результат = Запрос.Выполнить().Выгрузить();

// Важный этап: преобразование плоских колонок субконто в соответствие (Map)
Для Каждого Строка Из Результат Цикл
    НоваяСтрока = Хозрасчетный.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
    
    // Формируем структуру субконто для Дебета
    СтрСубконтоДт = Новый Соответствие;
    Для к = 1 По 3 Цикл
        Если ЗначениеЗаполнено(Строка["ВидСубконтоДт" + к]) Тогда
            СтрСубконтоДт.Вставить(Строка["ВидСубконтоДт" + к], Строка["СубконтоДт" + к]);
        КонецЕсли;
    КонецЦикла;
    НоваяСтрока.СубконтоДт = СтрСубконтоДт;
    
    // Указываем правила конвертации для субконто (обычно это ВидыСубконтоХозрасчетные)
    НоваяСтрока.ИмяПКОСубконтоДт = "ВидыСубконтоХозрасчетные";
КонецЦикла;

Параметры.ПроводкиДокумента = Хозрасчетный;

Решение ошибки «Таблица не найдена»

Выясним причину часто встречающейся ошибки при выполнении данного кода: Ошибка при вызове метода контекста (Выполнить): {(38, 5)}: Таблица не найдена "РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто". Проанализируем ситуацию подробнее. Эта ошибка возникает в двух случаях:

  1. Неверное имя регистра: В некоторых доработанных базах или отраслевых решениях основной регистр бухгалтерии может называться иначе, например, Типовой или Налоговый. Необходимо зайти в конфигуратор исходной базы и проверить свойство «Имя» у регистра бухгалтерии.
  2. Отсутствие виртуальной таблицы: Виртуальная таблица ДвиженияССубконто доступна только в том случае, если у регистра включена поддержка субконто. В типовой «Бухгалтерии предприятия» она всегда есть, но если вы работаете с кастомным регистром, убедитесь в его настройках.

Важный совет: Исправьте в тексте запроса РегистрБухгалтерии.Хозрасчетный на фактическое имя вашего регистра, которое указано в метаданных.

Настройка правил в Конвертации данных 2.1

Чтобы вышеуказанный код заработал, недостаточно просто написать алгоритм. Разберем настройки в интерфейсе КД:

Предотвращение автоматического перепроведения

Рассмотрим ситуацию загрузки в БП 3.0. По умолчанию 1С пытается выполнить обработчики проведения. Чтобы сохранить перенесенные проводки нетронутыми, проанализируем настройки ПКО документа в приемнике. В обработчике «ПослеЗагрузки» необходимо прописать код:


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

Использование ОбменДанными.Загрузка = Истина блокирует выполнение механизмов платформы, которые могут изменять данные (включая подписки на события и стандартные алгоритмы проведения), что гарантирует идентичность движений в обеих базах.

Особенности налогового учета

При переходе с 2.0 на 3.0 важно помнить, что в версии 2.0 налоговый учет часто велся на отдельном плане счетов или через специальные измерения. В БП 3.0 используется единый план счетов, где налоговая сумма (НУ), постоянные (ПР) и временные разницы (ВР) являются ресурсами того же регистра Хозрасчетный.

Проанализируем ваш запрос еще раз: обязательно убедитесь, что вы выбираете поля СуммаНУДт, СуммаНУКт, СуммаПРДт и т.д. Если в вашей версии БП 2.0 эти данные хранятся в отдельном регистре (например, «Налоговый»), вам придется написать более сложный запрос с соединением (ЛЕВОЕ СОЕДИНЕНИЕ) двух регистров по регистратору и номеру строки, чтобы собрать одну строку проводки для БП 3.0.

Итоги и рекомендации

Мы рассмотрели сложный путь переноса данных «в лоб». Рассмотрим альтернативу: если база слишком большая, работа через КД 2.1 может быть медленной. В таком случае иногда эффективнее перенести остатки, а старую базу БП 2.0 оставить в режиме «только для чтения» как исторический архив. Но если требование «все в одной базе» остается в силе, использование алгоритмов с заполнением ВходящиеДанные — самый надежный способ сохранить корректность бухгалтерских итогов при миграции.

← На главную