Как перенести несколько субконто из 1С 7.7 в одну коллекцию 1С 8.3 через Конвертацию данных?

Программист 1С v7.7 Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Перенос бухгалтерских данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные решения на 1С:Предприятие 8.3 (такие как УПП, ERP или Бухгалтерия 3.0) часто сопряжен с архитектурными трудностями. Одной из наиболее заметных проблем является различие в хранении субконто. В "семерке" субконто в проводках или документах (например, в "Бухгалтерской справке") часто представлены набором отдельных реквизитов: СубконтоДт1, СубконтоДт2, СубконтоДт3. В современных же конфигурациях на платформе 8.3 субконто хранятся в виде табличных частей или наборов записей, где есть только одно поле Субконто, тип которого является составным.

В этой статье мы разберем, как правильно настроить Конвертацию данных 2.0 (КД), чтобы элегантно перенести эти данные без написания огромных "портянок" кода и использования громоздких костылей.

Разбор ситуации: Почему стандартное сопоставление не работает

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

Решение 1: Использование ПКГС и формирование виртуальной таблицы

Наиболее технологичным и правильным методом в КД 2.0 является использование ПКГС (Правил конвертации групп свойств). Этот механизм позволяет нам самостоятельно сформировать коллекцию данных в памяти на стороне источника (7.7) и передать ее в приемник как готовую таблицу.

Рассмотрим алгоритм реализации по шагам:

  1. В правилах конвертации объекта (ПКО) для вашего документа или операции найдите вкладку "ПКГС".
  2. Создайте новое правило конвертации группы свойств. В качестве приемника укажите коллекцию субконто в 8.3 (например, табличную часть СубконтоХозрасчетный или коллекцию СубконтоДт).
  3. В обработчике "Перед выгрузкой" для этого ПКГС мы напишем код, который соберет данные из плоской структуры 7.7 в таблицу.

Проанализируем пример кода для 1С 7.7, который формирует такую виртуальную коллекцию:


// Создаем временную таблицу значений, которая станет источником данных
ТЗ_Субконто = СоздатьОбъект("ТаблицаЗначений");
ТЗ_Субконто.НоваяКолонка("ВидСубконто"); // Ссылка на ПВХ ВидыСубконтоХозрасчетные
ТЗ_Субконто.НоваяКолонка("Значение");    // Само значение субконто
ТЗ_Субконто.НоваяКолонка("Номер");       // Порядковый номер

// Предположим, мы выгружаем субконто дебета из текущей строки документа
СчетДт = Источник.СчетДт;
Для Ном = 1 По СчетДт.КоличествоСубконто() Цикл
    ТекЗначение = Источник.ПолучитьАтрибут("СубконтоДт" + Ном);
    Если ПустоеЗначение(ТекЗначение) = 0 Тогда
        ТЗ_Субконто.НоваяСтрока();
        ТЗ_Субконто.ВидСубконто = СчетДт.ВидСубконто(Ном);
        ТЗ_Субконто.Значение    = ТекЗначение;
        ТЗ_Субконто.Номер       = Ном;
    КонецЕсли;
КонецЦикла;

// Передаем таблицу в КД через специальную переменную
КоллекцияОбъектов = ТЗ_Субконто;

После этого внутри ПКГС вам останется только создать ПКС для колонок вашей таблицы. КД автоматически сопоставит строки ТЗ_Субконто со строками коллекции приемника.

Решение 2: Динамическое определение ПКО для субконто

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

В обработчике "Перед выгрузкой" конкретного ПКС для значения субконто мы можем использовать программное определение правила. Выясним, как это сделать:


// Определяем имя ПКО в зависимости от типа значения в 7.7
ТипОбъекта = ТипЗначенияСтр(Источник.Значение);
Если ТипОбъекта = "Справочник" Тогда
    ВидСпр = Источник.Значение.Вид();
    Если ВидСпр = "Контрагенты" Тогда
        ИмяПКО = "Контрагенты";
    ИначеЕсли ВидСпр = "Номенклатура" Тогда
        ИмяПКО = "Номенклатура";
    КонецЕсли;
КонецЕсли;

Такой подход позволяет избежать жесткой привязки и делает перенос гибким. Система будет автоматически подбирать нужное правило для каждого типа субконто, будь то справочник, документ или перечисление.

Решение 3: Перенос через "ВыгрузитьПоПравилу" и входящие данные

Если структура документа в 7.7 слишком сложная и ПКГС не ложится в логику, можно использовать ручной вызов функции ВыгрузитьПоПравилу. Это позволяет передать данные в приемник, сформировав их в виде структуры (в 7.7 для этого используется СписокЗначений).

Разберем ситуацию: нам нужно передать субконто в документ 8.3, который создается "на лету". Мы можем упаковать все данные о субконто в СписокЗначений, передать его как ВходящиеДанные, а на стороне приемника в обработчике "После загрузки" программно заполнить движения документа или его табличную часть.

Важный нюанс: при использовании ВыгрузитьПоПравилу из 7.7 обязательно учитывайте, что поиск объектов в 8.3 лучше всего настраивать по внутреннему идентификатору (ЗначениеВСтрокуВнутр). Это избавит вас от дублей, если коды или наименования в старой базе не уникальны.

Анализ типовых решений от 1С

Проанализируем, как эта задача решена в типовых правилах перехода (например, "Бухгалтерия 7.7 -> Бухгалтерия 2.0"). В них фирма 1С часто отказывается от прямого ПКС. Вместо этого в ПКО документа в обработчике "Перед выгрузкой" вызывается глобальный алгоритм, который формирует таблицу всех проводок документа с уже распределенными видами субконто. Это позволяет выгружать данные одним массивом, что значительно ускоряет процесс загрузки в 8.3, так как сокращается количество обращений к базе данных для поиска метаданных счетов.

Подведем итоги

Для эффективного переноса субконто из 7.7 в 8.3 следует придерживаться следующих рекомендаций:

  1. Используйте ПКГС для преобразования плоской структуры реквизитов 7.7 в коллекцию (ТЗ) для 8.3.
  2. Программный поиск ПКО: Не надейтесь на автоматику КД в определении типов субконто из 7.7, используйте переменную ИмяПКО в обработчиках.
  3. Виды субконто: Помните, что в 8.3 субконто — это не просто значение, а пара "Вид + Значение". Всегда передавайте ВидСубконто, полученный из метаданных счета 7.7 через Счет.ВидСубконто(н).
  4. Минимизируйте код в приемнике: Старайтесь подготовить данные на стороне источника так, чтобы загрузка в 8.3 прошла максимально штатными средствами КД.

Применяя эти методы, мы превращаем "костыльный" перенос в стройную систему правил, которую легко отлаживать и поддерживать в будущем.

← На главную