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

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

При работе с инструментом 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда предопределенные счета плана счетов переносятся идеально со всеми настройками, а счета, созданные пользователями в режиме «Предприятие», теряют свои виды субконто при загрузке в базу-приемник. Рассмотрим, почему это происходит, и разберем по шагам, как настроить правила обмена для корректного переноса этих данных.

Почему стандартный механизм дает сбой?

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

Выясним причину потери субконто: при выгрузке обычным способом КД 2.1 может не «увидеть» программно добавленные строки в таблице субконто, если не указаны специфические настройки поиска и выгрузки свойств. Кроме того, идентификаторы (UUID) в разных базах у таких счетов будут различаться, что приводит к ошибкам сопоставления.

Шаг 1. Настройка поиска объекта в приемнике

Посмотрим на настройки ПКО для плана счетов. Если мы переносим счета, созданные вручную, поиск по уникальному идентификатору (UUID) не даст результата. Нам необходимо настроить поиск по коду счета.

  1. В ПКО плана счетов перейдем на закладку «Настройки поиска».
  2. Убедимся, что для свойства Код установлен флаг «Поиск».
  3. В самом ПКО установим флаг «Продолжить поиск по полям поиска, если по идентификатору объект не найден». Это позволит системе найти счет по его коду (например, «6255»), если он уже был создан в приемнике вручную, или создать новый, если его нет.

Рассмотрим важный нюанс: если базы имеют разную иерархию, поиск только по коду может привести к коллизиям. Рекомендуется также включать в поиск родителя счета (Родитель).

Шаг 2. Программная выгрузка коллекции субконто

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

Создадим в ПКО плана счетов новое ПКС. В поле «Свойство приемника» выберем ВидыСубконто, а источник оставим пустым. В обработчике «Перед выгрузкой» этого ПКС напишем следующий код:


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

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

    // Передаем таблицу в КоллекцияОбъектов, чтобы КД обработала её автоматически
    КоллекцияОбъектов = ТаблицаСубконто;
Иначе
    // Если субконто нет, можно принудительно очистить коллекцию в приемнике
    КоллекцияОбъектов = Новый ТаблицаЗначений;
КонецЕсли;

Шаг 3. Использование механизма передачи через строку (альтернативный метод)

Рассмотрим ситуацию, которую обсуждали участники форума. Если стандартная коллекция все равно не загружается, можно использовать передачу данных через «Дополнительные свойства» объекта или через сериализацию в строку. Проанализируем пример кода, который формирует таблицу видов субконто и передает её в строковом виде:


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

Для Каждого цСтрока из Таблица Цикл
    // Сохраняем наименование для поиска, если ссылки не сопоставятся
    цСтрока.ВидСубконтоНаименование = цСтрока.ВидСубконто.Наименование;
КонецЦикла;

// Используем ЗначениеВСтрокуВнутр для передачи сложной структуры данных
Значение = ЗначениеВСтрокуВнутр(Таблица);

Важно помнить, что метод ЗначениеВСтрокуВнутр работает только между идентичными конфигурациями 1С. Если версии метаданных различаются, этот способ может вызвать ошибку при чтении в приемнике.

Шаг 4. Обработка загрузки в приемнике

После того как данные выгружены, нам нужно убедиться, что база-приемник правильно их применит. В ПКО плана счетов в обработчике «После загрузки» мы можем программно перезаписать коллекцию видов субконто, если стандартный механизм сопоставления ПКС отработал не полностью.

Рассмотрим пример кода для фиксации изменений:


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

Как избежать «раздувания» модуля отладки?

Одной из проблем, упомянутых в обсуждении, является зависание КД 2.1 при попытке сформировать модуль отладки (модуль объемом более 175 тысяч строк). Это происходит потому, что система пытается включить в него код для всех объектов конфигурации. Для решения этой проблемы можно использовать обработку для выборочной выгрузки структуры метаданных.

Проанализируем решение этой проблемы:

  1. Создавайте минимальные правила: Для отладки переноса плана счетов создайте отдельный файл правил, где будут только ПКО ПланСчетов и ПКО связанных ПВХ (ВидыСубконто).
  2. Используйте внешние обработки: Вместо генерации полного модуля, старайтесь писать код в самих правилах (в файле XML) и отлаживать его через Сообщить() или запись в текстовый лог.
  3. Ограничьте выборку: При выгрузке данных для теста выбирайте только один конкретный счет по коду, чтобы не обрабатывать весь план счетов целиком.

Резюме важных моментов

Подведем итог всему вышесказанному. Для успешного переноса пользовательских счетов с их субконто необходимо:

Соблюдение этих правил позволит вам избежать «пустых субконто» и обеспечит целостность бухгалтерских данных при консолидации баз или миграции между системами. Для быстрой реализации обмена можно использовать готовые правила конвертации хозрасчетного плана счетов в КД 2.1.

← На главную