При работе с инструментом 1С:Конвертация данных 2.1 (КД 2.1) программисты часто сталкиваются с ситуацией, когда предопределенные счета плана счетов переносятся идеально со всеми настройками, а счета, созданные пользователями в режиме «Предприятие», теряют свои виды субконто при загрузке в базу-приемник. Рассмотрим, почему это происходит, и разберем по шагам, как настроить правила обмена для корректного переноса этих данных.
Проанализируем структуру метаданных плана счетов. В отличие от обычных справочников, коллекция ВидыСубконто у плана счетов является специфическим механизмом. Когда мы настраиваем ПКО (Правило конвертации объектов) для плана счетов, система автоматически сопоставляет предопределенные данные по их внутренним именам. Однако для счетов, созданных в пользовательском режиме, внутренних имен не существует.
Выясним причину потери субконто: при выгрузке обычным способом КД 2.1 может не «увидеть» программно добавленные строки в таблице субконто, если не указаны специфические настройки поиска и выгрузки свойств. Кроме того, идентификаторы (UUID) в разных базах у таких счетов будут различаться, что приводит к ошибкам сопоставления.
Посмотрим на настройки ПКО для плана счетов. Если мы переносим счета, созданные вручную, поиск по уникальному идентификатору (UUID) не даст результата. Нам необходимо настроить поиск по коду счета.
Код установлен флаг «Поиск».Рассмотрим важный нюанс: если базы имеют разную иерархию, поиск только по коду может привести к коллизиям. Рекомендуется также включать в поиск родителя счета (Родитель).
Поскольку автоматический перенос коллекции ВидыСубконто для непредопределенных счетов часто дает сбой, мы воспользуемся механизмом ПКС (Правила конвертации свойств) с использованием переменной КоллекцияОбъектов. Это наиболее надежный способ принудительно передать данные в приемник.
Создадим в ПКО плана счетов новое ПКС. В поле «Свойство приемника» выберем ВидыСубконто, а источник оставим пустым. В обработчике «Перед выгрузкой» этого ПКС напишем следующий код:
// Проверим, что объект — это счет, и у него есть коллекция видов субконто
Если Источник.ВидыСубконто.Количество() > 0 Тогда
// Создаем таблицу значений, структуру которой КД поймет как коллекцию субконто
ТаблицаСубконто = Новый ТаблицаЗначений;
ТаблицаСубконто.Колонки.Добавить("ВидСубконто");
ТаблицаСубконто.Колонки.Добавить("Суммовой");
ТаблицаСубконто.Колонки.Добавить("Количественный");
ТаблицаСубконто.Колонки.Добавить("Валютный");
ТаблицаСубконто.Колонки.Добавить("ТолькоОбороты");
Для Каждого СтрокаСубконто Из Источник.ВидыСубконто Цикл
НоваяСтрока = ТаблицаСубконто.Добавить();
НоваяСтрока.ВидСубконто = СтрокаСубконто.ВидСубконто;
// Заполняем признаки учета, это критически важно для корректной работы счета
НоваяСтрока.Суммовой = СтрокаСубконто.Суммовой;
НоваяСтрока.Количественный = СтрокаСубконто.Количественный;
НоваяСтрока.Валютный = СтрокаСубконто.Валютный;
НоваяСтрока.ТолькоОбороты = СтрокаСубконто.ТолькоОбороты;
КонецЦикла;
// Передаем таблицу в КоллекцияОбъектов, чтобы КД обработала её автоматически
КоллекцияОбъектов = ТаблицаСубконто;
Иначе
// Если субконто нет, можно принудительно очистить коллекцию в приемнике
КоллекцияОбъектов = Новый ТаблицаЗначений;
КонецЕсли;
Рассмотрим ситуацию, которую обсуждали участники форума. Если стандартная коллекция все равно не загружается, можно использовать передачу данных через «Дополнительные свойства» объекта или через сериализацию в строку. Проанализируем пример кода, который формирует таблицу видов субконто и передает её в строковом виде:
// В обработчике "Перед выгрузкой" ПКО
Источник1 = ПланыСчетов.Типовой.НайтиПоКоду(Источник.Код);
Таблица = Источник1.ВидыСубконто.Выгрузить();
Таблица.Колонки.Добавить("ВидСубконтоНаименование");
Для Каждого цСтрока из Таблица Цикл
// Сохраняем наименование для поиска, если ссылки не сопоставятся
цСтрока.ВидСубконтоНаименование = цСтрока.ВидСубконто.Наименование;
КонецЦикла;
// Используем ЗначениеВСтрокуВнутр для передачи сложной структуры данных
Значение = ЗначениеВСтрокуВнутр(Таблица);
Важно помнить, что метод ЗначениеВСтрокуВнутр работает только между идентичными конфигурациями 1С. Если версии метаданных различаются, этот способ может вызвать ошибку при чтении в приемнике.
После того как данные выгружены, нам нужно убедиться, что база-приемник правильно их применит. В ПКО плана счетов в обработчике «После загрузки» мы можем программно перезаписать коллекцию видов субконто, если стандартный механизм сопоставления ПКС отработал не полностью.
Рассмотрим пример кода для фиксации изменений:
// Если мы передавали данные через дополнительные свойства
Если Объект.ДополнительныеСвойства.Свойство("ТаблицаСубконто") Тогда
ТаблицаДанных = Объект.ДополнительныеСвойства.ТаблицаСубконто;
Объект.ВидыСубконто.Очистить();
Для Каждого Стр Из ТаблицаДанных Цикл
НоваяСтрока = Объект.ВидыСубконто.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЦикла;
// Не забываем записать объект, так как "После загрузки" происходит до финальной записи
Объект.Записать();
КонецЕсли;
Одной из проблем, упомянутых в обсуждении, является зависание КД 2.1 при попытке сформировать модуль отладки (модуль объемом более 175 тысяч строк). Это происходит потому, что система пытается включить в него код для всех объектов конфигурации. Для решения этой проблемы можно использовать обработку для выборочной выгрузки структуры метаданных.
Проанализируем решение этой проблемы:
ПланСчетов и ПКО связанных ПВХ (ВидыСубконто).Сообщить() или запись в текстовый лог.Подведем итог всему вышесказанному. Для успешного переноса пользовательских счетов с их субконто необходимо:
Суммовой, Количественный и другие. Без них учет по счету в приемнике будет работать некорректно.КоллекцияОбъектов в ПКС является самым гибким и надежным методом.Соблюдение этих правил позволит вам избежать «пустых субконто» и обеспечит целостность бухгалтерских данных при консолидации баз или миграции между системами. Для быстрой реализации обмена можно использовать готовые правила конвертации хозрасчетного плана счетов в КД 2.1.