Перенос данных из одной конфигурации 1С в другую с помощью Конвертации данных 2.1 (КД 2.1) — это стандартная задача, однако выгрузка документов, формирующих проводки напрямую (таких как ОперацияБух), часто вызывает сложности. Основная проблема заключается в специфике хранения субконто в регистрах бухгалтерии и табличных частях. Рассмотрим подробно, как решить проблему возникновения ошибки "Значение не является значением объектного типа (ИмяТипа)" и как корректно передать коллекцию субконто.
Ошибка "Значение не является значением объектного типа (ИмяТипа)" в момент анализа строки субконто чаще всего возникает из-за того, что механизм КД 2.1 пытается обработать коллекцию субконто, ожидая определенный формат ключа. Когда мы используем Соответствие (Map) для передачи субконто, программа может некорректно сопоставить ключи соответствия с метаданными Плана видов характеристик (ПВХ) ВидыСубконтоХозрасчетные на стороне приемника.
Разберем ситуацию: в правилах выгрузки данных (ПВД) или в обработчиках ПКО создается таблица значений для проводок. Если в колонки СубконтоДт или СубконтоКт помещается объект, формат которого не "понимает" парсер КД, выгрузка прерывается. Выясним, как сформировать эти данные правильно.
Как показывает практика и опыт участников форума, наиболее стабильным решением является использование объекта Структура для хранения субконто одной проводки. Ключом структуры должно выступать техническое описание вида субконто, которое КД сможет сопоставить с объектом ПВХ в приемнике.
Проанализируем пример кода, который формирует данные для выгрузки проводок из документа "Отражение зарплаты в регл учете" в документ ОперацияБух. Основная логика заключается в использовании ИсходящихДанных.
Рассмотрим шаг формирования коллекции проводок в ПВД:
// Создаем структуру для передачи в правило конвертации объекта
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("Дата", ВыборкаСсылка.Ссылка.Дата);
ИсходящиеДанные.Вставить("Организация", ВыборкаСсылка.Организация);
ИсходящиеДанные.Вставить("СуммаОперации", ВыборкаСсылка.Сумма);
// Создаем таблицу значений для табличной части Хозрасчетный (проводки)
ТаблицаХозрасчетный = Новый ТаблицаЗначений;
ТаблицаХозрасчетный.Колонки.Добавить("СчетДт");
ТаблицаХозрасчетный.Колонки.Добавить("СчетКт");
ТаблицаХозрасчетный.Колонки.Добавить("Сумма");
ТаблицаХозрасчетный.Колонки.Добавить("СубконтоДт"); // Здесь будет структура
ТаблицаХозрасчетный.Колонки.Добавить("СубконтоКт"); // Здесь будет структура
ТаблицаХозрасчетный.Колонки.Добавить("Содержание");
Теперь разберем, как наполнить колонки СубконтоДт и СубконтоКт. Вместо Соответствие мы используем Структуру, где ключом является Новый Структура("Наименование", "ИмяВидаСубконто"). Однако в упрощенном и более надежном варианте можно передавать просто структуру с ключами-именами видов субконто, если в ПКО для ПВХ настроен поиск по наименованию.
// Внутри цикла по проводкам
Проводка = ТаблицаХозрасчетный.Добавить();
Проводка.СчетДт = ВыборкаДетальныеЗаписи.СчетДт;
Проводка.СчетКт = ВыборкаДетальныеЗаписи.СчетКт;
Проводка.Сумма = ВыборкаДетальныеЗаписи.Сумма;
// Формируем субконто Дебета
СубконтоДт = Новый Структура;
Если ТипЗнч(ВыборкаДетальныеЗаписи.СубконтоДт1) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
// Используем структуру для описания ключа (Вида Субконто)
КлючСубконто = Новый Структура("Наименование", "РаботникиОрганизаций");
СубконтоДт.Вставить(КлючСубконто, ВыборкаДетальныеЗаписи.СубконтоДт1);
КонецЕсли;
Проводка.СубконтоДт = СубконтоДт;
Если структура счетов в источнике и приемнике сильно различается, или вы хотите избежать написания сложного кода в КД, можно воспользоваться альтернативным путем. Мы можем выгрузить значения субконто в Параметры строки табличной части, а саму установку выполнить уже в базе-приемнике в обработчике "ПослеЗагрузки".
Рассмотрим этот алгоритм по шагам:
ОперацияБух для свойств табличной части (или движений регистра) создаем дополнительные параметры, например: СтатьяЗатратДт, КонтрагентДт, ФизЛицоКт.Пример кода для обработчика "После загрузки" в приемнике. Чтобы проконтролировать полученный результат, можно автоматически сверить бухгалтерские проводки между базами 1С:
// Проходим по всем строкам созданных проводок
Для Каждого Проводка Из Объект.Движения.Хозрасчетный Цикл
// Используем типовую функцию БухгалтерскийУчет.УстановитьСубконто
// Она автоматически определит нужный индекс субконто на счете
Если ЗначениеЗаполнено(Проводка.Параметры.СтатьяЗатратДт) Тогда
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "СтатьиЗатрат", Проводка.Параметры.СтатьяЗатратДт);
КонецЕсли;
Если ЗначениеЗаполнено(Проводка.Параметры.ФизЛицоДт) Тогда
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "РаботникиОрганизаций", Проводка.Параметры.ФизЛицоДт);
КонецЕсли;
КонецЦикла;
Этот метод считается более "чистым", так как он не зависит от порядка субконто на счетах (в одной версии БП "Статьи затрат" могут быть первым субконто, в другой — вторым). Функция УстановитьСубконто сама найдет нужную позицию в коллекции.
Чтобы не загромождать код десятками условий Если... ИначеЕсли, проанализируем ситуацию и применим цикл. В документе-источнике (например, "Отражение зарплаты") субконто обычно хранятся в отдельных реквизитах: СубконтоДт1, СубконтоДт2, СубконтоДт3. Мы можем обойти их в цикле:
Для НомерСубконто = 1 По 3 Цикл
ИмяРеквизита = "СубконтоДт" + НомерСубконто;
ЗначениеСубконто = ВыборкаДетальныеЗаписи[ИмяРеквизита];
Если Не ЗначениеЗаполнено(ЗначениеСубконто) Тогда
Продолжить;
КонецЕсли;
ТипСубконто = ТипЗнч(ЗначениеСубконто);
// Сопоставляем типы справочников с именами ПВХ в приемнике
ИмяВидаПВХ = "";
Если ТипСубконто = Тип("СправочникСсылка.ФизическиеЛица") Тогда
ИмяВидаПВХ = "РаботникиОрганизаций";
ИначеЕсли ТипСубконто = Тип("СправочникСсылка.Контрагенты") Тогда
ИмяВидаПВХ = "Контрагенты";
ИначеЕсли ТипСубконто = Тип("СправочникСсылка.СтатьиЗатрат") Тогда
ИмяВидаПВХ = "СтатьиЗатрат";
КонецЕсли;
Если ИмяВидаПВХ <> "" Тогда
СубконтоДт.Вставить(Новый Структура("Наименование", ИмяВидаПВХ), ЗначениеСубконто);
КонецЕсли;
КонецЦикла;
Для того чтобы передача через структуру сработала, необходимо убедиться в следующем или изучить раздел с решениями для переноса данных в Бухгалтерию:
ВидыСубконтоХозрасчетные.ВыгрузитьПоПравилу, убедитесь, что имя правила для документа ОперацияБух указано верно и оно ожидает ИсходящиеДанные.70, 69, 73. У них часто специфические наборы субконто (например, "Виды платежей в бюджет"), которые требуют отдельной обработки типов справочников ПлатежиВФонды или ПлатежиВБюджет.Таким образом, мы выяснили, что ключ к успешному переносу субконто в Конвертации данных 2.1 — это правильное формирование коллекции. Использование структуры с ключом-описанием (через Наименование или Код) позволяет избежать ошибок типизации и корректно сопоставить данные ПВХ между разными конфигурациями 1С.