При переходе с конфигурации «Бухгалтерия предприятия 2.0» на версию 3.0 стандартные механизмы часто предлагают перенос только начальных остатков. Однако на практике возникают задачи, когда необходимо перенести всю историю документов за многие годы (например, с 2008 года) со всеми движениями и проводками «как есть», без использования свертки базы. Рассмотрим, как реализовать такой перенос с помощью инструмента «Конвертация данных 2.1», разберем типовые ошибки и напишем эффективный алгоритм выгрузки данных.
Основная сложность при переносе документов с движениями заключается в том, что в целевой базе (БП 3.0) документы при загрузке могут попытаться перепровестись. Это может привести к изменению сумм или счетов, если настройки учетной политики или алгоритмы проведения в новой версии отличаются. Наша задача — передать готовые записи регистра Хозрасчетный и «привязать» их к загружаемым документам, исключив автоматический пересчет. Для этого мы будем использовать механизм ВходящиеДанные в правилах конвертации свойств (ПКС).
Рассмотрим по шагам процесс подготовки данных в исходной базе (БП 2.0). Нам необходимо извлечь все записи регистра бухгалтерии, связанные с конкретным документом, и упаковать их в таблицу значений, которую поймет конвертация. Разберем программный код, который размещается в обработчике или отдельном алгоритме правил обмена.
Для начала проанализируем ситуацию: нам нужно создать структуру, которая будет содержать коллекцию движений. В ПКО (Правило Конвертации Объекта) для документа в обработчике ПередВыгрузкой мы инициализируем этот процесс.
Если Источник.ПометкаУдаления Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
// Подготавливаем структуру для передачи в ПКС движений
ВходящиеДанные = Новый Структура("Хозрасчетный");
Параметры.ТекущийДокумент = Источник;
// Вызываем алгоритм получения проводок
Выполнить(Алгоритмы.ПолучитьПроводкиДокумента);
ВходящиеДанные.Хозрасчетный = Параметры.ПроводкиДокумента;
Теперь детально разберем содержимое самого алгоритма ПолучитьПроводкиДокумента. Проанализируем структуру запроса к регистру бухгалтерии. Нам важно получить не только основные поля (счет, сумма, организация), но и все аналитические разрезы — субконто.
// Создаем таблицу значений с колонками, соответствующими структуре регистра в приемнике
Хозрасчетный = Новый ТаблицаЗначений;
Хозрасчетный.Колонки.Добавить("Активность");
Хозрасчетный.Колонки.Добавить("Организация");
Хозрасчетный.Колонки.Добавить("Период");
Хозрасчетный.Колонки.Добавить("Регистратор");
Хозрасчетный.Колонки.Добавить("Содержание");
Хозрасчетный.Колонки.Добавить("СчетДт");
Хозрасчетный.Колонки.Добавить("СчетКт");
Хозрасчетный.Колонки.Добавить("Сумма");
// Добавляем колонки для налогового учета и валют
Хозрасчетный.Колонки.Добавить("СуммаНУДт");
Хозрасчетный.Колонки.Добавить("СуммаНУКт");
Хозрасчетный.Колонки.Добавить("СубконтоДт");
Хозрасчетный.Колонки.Добавить("СубконтоКт");
Хозрасчетный.Колонки.Добавить("ИмяПКОСубконтоДт");
Хозрасчетный.Колонки.Добавить("ИмяПКОСубконтоКт");
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Регистратор", Параметры.ТекущийДокумент);
// Используем виртуальную таблицу ДвиженияССубконто для получения развернутой аналитики
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.Активность,
| Хозрасчетный.Организация,
| Хозрасчетный.Период,
| Хозрасчетный.СчетДт,
| Хозрасчетный.СчетКт,
| Хозрасчетный.СубконтоДт1,
| Хозрасчетный.ВидСубконтоДт1,
| Хозрасчетный.СубконтоДт2,
| Хозрасчетный.ВидСубконтоДт2,
| Хозрасчетный.СубконтоКт1,
| Хозрасчетный.ВидСубконтоКт1,
| Хозрасчетный.Сумма,
| Хозрасчетный.Содержание,
| Хозрасчетный.СуммаНУДт,
| Хозрасчетный.СуммаНУКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(,, Регистратор = &Регистратор) КАК Хозрасчетный";
Результат = Запрос.Выполнить().Выгрузить();
// Важный этап: преобразование плоских колонок субконто в соответствие (Map)
Для Каждого Строка Из Результат Цикл
НоваяСтрока = Хозрасчетный.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
// Формируем структуру субконто для Дебета
СтрСубконтоДт = Новый Соответствие;
Для к = 1 По 3 Цикл
Если ЗначениеЗаполнено(Строка["ВидСубконтоДт" + к]) Тогда
СтрСубконтоДт.Вставить(Строка["ВидСубконтоДт" + к], Строка["СубконтоДт" + к]);
КонецЕсли;
КонецЦикла;
НоваяСтрока.СубконтоДт = СтрСубконтоДт;
// Указываем правила конвертации для субконто (обычно это ВидыСубконтоХозрасчетные)
НоваяСтрока.ИмяПКОСубконтоДт = "ВидыСубконтоХозрасчетные";
КонецЦикла;
Параметры.ПроводкиДокумента = Хозрасчетный;
Выясним причину часто встречающейся ошибки при выполнении данного кода: Ошибка при вызове метода контекста (Выполнить): {(38, 5)}: Таблица не найдена "РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто". Проанализируем ситуацию подробнее. Эта ошибка возникает в двух случаях:
Типовой или Налоговый. Необходимо зайти в конфигуратор исходной базы и проверить свойство «Имя» у регистра бухгалтерии.ДвиженияССубконто доступна только в том случае, если у регистра включена поддержка субконто. В типовой «Бухгалтерии предприятия» она всегда есть, но если вы работаете с кастомным регистром, убедитесь в его настройках.Важный совет: Исправьте в тексте запроса РегистрБухгалтерии.Хозрасчетный на фактическое имя вашего регистра, которое указано в метаданных.
Чтобы вышеуказанный код заработал, недостаточно просто написать алгоритм. Разберем настройки в интерфейсе КД:
Движения (или конкретно Хозрасчетный).ВходящиеДанные.Хозрасчетный.Рассмотрим ситуацию загрузки в БП 3.0. По умолчанию 1С пытается выполнить обработчики проведения. Чтобы сохранить перенесенные проводки нетронутыми, проанализируем настройки ПКО документа в приемнике. В обработчике «ПослеЗагрузки» необходимо прописать код:
Объект.ОбменДанными.Загрузка = Истина;
Если Объект.Проведен Тогда
Объект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
Использование ОбменДанными.Загрузка = Истина блокирует выполнение механизмов платформы, которые могут изменять данные (включая подписки на события и стандартные алгоритмы проведения), что гарантирует идентичность движений в обеих базах.
При переходе с 2.0 на 3.0 важно помнить, что в версии 2.0 налоговый учет часто велся на отдельном плане счетов или через специальные измерения. В БП 3.0 используется единый план счетов, где налоговая сумма (НУ), постоянные (ПР) и временные разницы (ВР) являются ресурсами того же регистра Хозрасчетный.
Проанализируем ваш запрос еще раз: обязательно убедитесь, что вы выбираете поля СуммаНУДт, СуммаНУКт, СуммаПРДт и т.д. Если в вашей версии БП 2.0 эти данные хранятся в отдельном регистре (например, «Налоговый»), вам придется написать более сложный запрос с соединением (ЛЕВОЕ СОЕДИНЕНИЕ) двух регистров по регистратору и номеру строки, чтобы собрать одну строку проводки для БП 3.0.
Мы рассмотрели сложный путь переноса данных «в лоб». Рассмотрим альтернативу: если база слишком большая, работа через КД 2.1 может быть медленной. В таком случае иногда эффективнее перенести остатки, а старую базу БП 2.0 оставить в режиме «только для чтения» как исторический архив. Но если требование «все в одной базе» остается в силе, использование алгоритмов с заполнением ВходящиеДанные — самый надежный способ сохранить корректность бухгалтерских итогов при миграции.