Перенос бухгалтерских данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные решения на 1С:Предприятие 8.3 (такие как УПП, ERP или Бухгалтерия 3.0) часто сопряжен с архитектурными трудностями. Одной из наиболее заметных проблем является различие в хранении субконто. В "семерке" субконто в проводках или документах (например, в "Бухгалтерской справке") часто представлены набором отдельных реквизитов: СубконтоДт1, СубконтоДт2, СубконтоДт3. В современных же конфигурациях на платформе 8.3 субконто хранятся в виде табличных частей или наборов записей, где есть только одно поле Субконто, тип которого является составным.
В этой статье мы разберем, как правильно настроить Конвертацию данных 2.0 (КД), чтобы элегантно перенести эти данные без написания огромных "портянок" кода и использования громоздких костылей.
При стандартной настройке правил конвертации свойств (ПКС) система КД ожидает сопоставления "один к одному". Однако в нашем случае у нас есть три разных источника (реквизита) и один приемник (строка табличной части или коллекции). Если мы просто направим три реквизита в один, то каждое последующее значение будет затирать предыдущее. Нам же необходимо создать коллекцию на стороне приемника, где каждое субконто из 7.7 станет отдельной строкой в 8.3.
Наиболее технологичным и правильным методом в КД 2.0 является использование ПКГС (Правил конвертации групп свойств). Этот механизм позволяет нам самостоятельно сформировать коллекцию данных в памяти на стороне источника (7.7) и передать ее в приемник как готовую таблицу.
Рассмотрим алгоритм реализации по шагам:
СубконтоХозрасчетный или коллекцию СубконтоДт).Проанализируем пример кода для 1С 7.7, который формирует такую виртуальную коллекцию:
// Создаем временную таблицу значений, которая станет источником данных
ТЗ_Субконто = СоздатьОбъект("ТаблицаЗначений");
ТЗ_Субконто.НоваяКолонка("ВидСубконто"); // Ссылка на ПВХ ВидыСубконтоХозрасчетные
ТЗ_Субконто.НоваяКолонка("Значение"); // Само значение субконто
ТЗ_Субконто.НоваяКолонка("Номер"); // Порядковый номер
// Предположим, мы выгружаем субконто дебета из текущей строки документа
СчетДт = Источник.СчетДт;
Для Ном = 1 По СчетДт.КоличествоСубконто() Цикл
ТекЗначение = Источник.ПолучитьАтрибут("СубконтоДт" + Ном);
Если ПустоеЗначение(ТекЗначение) = 0 Тогда
ТЗ_Субконто.НоваяСтрока();
ТЗ_Субконто.ВидСубконто = СчетДт.ВидСубконто(Ном);
ТЗ_Субконто.Значение = ТекЗначение;
ТЗ_Субконто.Номер = Ном;
КонецЕсли;
КонецЦикла;
// Передаем таблицу в КД через специальную переменную
КоллекцияОбъектов = ТЗ_Субконто;
После этого внутри ПКГС вам останется только создать ПКС для колонок вашей таблицы. КД автоматически сопоставит строки ТЗ_Субконто со строками коллекции приемника.
Одной из проблем при переносе из 7.7 является неопределенный тип субконто. В "семерке" субконто может быть чем угодно, и нам нужно подсказать системе КД, какое правило конвертации объектов (ПКО) использовать для конкретного значения.
В обработчике "Перед выгрузкой" конкретного ПКС для значения субконто мы можем использовать программное определение правила. Выясним, как это сделать:
// Определяем имя ПКО в зависимости от типа значения в 7.7
ТипОбъекта = ТипЗначенияСтр(Источник.Значение);
Если ТипОбъекта = "Справочник" Тогда
ВидСпр = Источник.Значение.Вид();
Если ВидСпр = "Контрагенты" Тогда
ИмяПКО = "Контрагенты";
ИначеЕсли ВидСпр = "Номенклатура" Тогда
ИмяПКО = "Номенклатура";
КонецЕсли;
КонецЕсли;
Такой подход позволяет избежать жесткой привязки и делает перенос гибким. Система будет автоматически подбирать нужное правило для каждого типа субконто, будь то справочник, документ или перечисление.
Если структура документа в 7.7 слишком сложная и ПКГС не ложится в логику, можно использовать ручной вызов функции ВыгрузитьПоПравилу. Это позволяет передать данные в приемник, сформировав их в виде структуры (в 7.7 для этого используется СписокЗначений).
Разберем ситуацию: нам нужно передать субконто в документ 8.3, который создается "на лету". Мы можем упаковать все данные о субконто в СписокЗначений, передать его как ВходящиеДанные, а на стороне приемника в обработчике "После загрузки" программно заполнить движения документа или его табличную часть.
Важный нюанс: при использовании ВыгрузитьПоПравилу из 7.7 обязательно учитывайте, что поиск объектов в 8.3 лучше всего настраивать по внутреннему идентификатору (ЗначениеВСтрокуВнутр). Это избавит вас от дублей, если коды или наименования в старой базе не уникальны.
Проанализируем, как эта задача решена в типовых правилах перехода (например, "Бухгалтерия 7.7 -> Бухгалтерия 2.0"). В них фирма 1С часто отказывается от прямого ПКС. Вместо этого в ПКО документа в обработчике "Перед выгрузкой" вызывается глобальный алгоритм, который формирует таблицу всех проводок документа с уже распределенными видами субконто. Это позволяет выгружать данные одним массивом, что значительно ускоряет процесс загрузки в 8.3, так как сокращается количество обращений к базе данных для поиска метаданных счетов.
Для эффективного переноса субконто из 7.7 в 8.3 следует придерживаться следующих рекомендаций:
ИмяПКО в обработчиках.ВидСубконто, полученный из метаданных счета 7.7 через Счет.ВидСубконто(н).Применяя эти методы, мы превращаем "костыльный" перенос в стройную систему правил, которую легко отлаживать и поддерживать в будущем.