Как правильно перенести субконто документа в ОперациюБух при использовании Конвертации данных 2.1?

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

Перенос данных из одной конфигурации 1С в другую с помощью Конвертации данных 2.1 (КД 2.1) — это стандартная задача, однако выгрузка документов, формирующих проводки напрямую (таких как ОперацияБух), часто вызывает сложности. Основная проблема заключается в специфике хранения субконто в регистрах бухгалтерии и табличных частях. Рассмотрим подробно, как решить проблему возникновения ошибки "Значение не является значением объектного типа (ИмяТипа)" и как корректно передать коллекцию субконто.

Анализ проблемы: почему возникает ошибка при переносе субконто

Ошибка "Значение не является значением объектного типа (ИмяТипа)" в момент анализа строки субконто чаще всего возникает из-за того, что механизм КД 2.1 пытается обработать коллекцию субконто, ожидая определенный формат ключа. Когда мы используем Соответствие (Map) для передачи субконто, программа может некорректно сопоставить ключи соответствия с метаданными Плана видов характеристик (ПВХ) ВидыСубконтоХозрасчетные на стороне приемника.

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

Решение 1: Использование структуры вместо соответствия

Как показывает практика и опыт участников форума, наиболее стабильным решением является использование объекта Структура для хранения субконто одной проводки. Ключом структуры должно выступать техническое описание вида субконто, которое КД сможет сопоставить с объектом ПВХ в приемнике.

Проанализируем пример кода, который формирует данные для выгрузки проводок из документа "Отражение зарплаты в регл учете" в документ ОперацияБух. Основная логика заключается в использовании ИсходящихДанных.

Рассмотрим шаг формирования коллекции проводок в ПВД:


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

// Создаем таблицу значений для табличной части Хозрасчетный (проводки)
ТаблицаХозрасчетный = Новый ТаблицаЗначений;
ТаблицаХозрасчетный.Колонки.Добавить("СчетДт");
ТаблицаХозрасчетный.Колонки.Добавить("СчетКт");
ТаблицаХозрасчетный.Колонки.Добавить("Сумма");
ТаблицаХозрасчетный.Колонки.Добавить("СубконтоДт"); // Здесь будет структура
ТаблицаХозрасчетный.Колонки.Добавить("СубконтоКт"); // Здесь будет структура
ТаблицаХозрасчетный.Колонки.Добавить("Содержание");

Теперь разберем, как наполнить колонки СубконтоДт и СубконтоКт. Вместо Соответствие мы используем Структуру, где ключом является Новый Структура("Наименование", "ИмяВидаСубконто"). Однако в упрощенном и более надежном варианте можно передавать просто структуру с ключами-именами видов субконто, если в ПКО для ПВХ настроен поиск по наименованию.


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

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

Проводка.СубконтоДт = СубконтоДт;

Решение 2: Перенос через параметры и установка в приемнике

Если структура счетов в источнике и приемнике сильно различается, или вы хотите избежать написания сложного кода в КД, можно воспользоваться альтернативным путем. Мы можем выгрузить значения субконто в Параметры строки табличной части, а саму установку выполнить уже в базе-приемнике в обработчике "ПослеЗагрузки".

Рассмотрим этот алгоритм по шагам:

  1. В ПКО документа ОперацияБух для свойств табличной части (или движений регистра) создаем дополнительные параметры, например: СтатьяЗатратДт, КонтрагентДт, ФизЛицоКт.
  2. В ПВД или "Перед выгрузкой" заполняем эти параметры ссылками из источника.
  3. В базе-приемнике, в обработчике "После загрузки" объекта, используем типовые программные механизмы для установки субконто. При использовании созданных правил для постоянной синхронизации обмен удобно настроить через программу автоматического обмена данными по расписанию.

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


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

Этот метод считается более "чистым", так как он не зависит от порядка субконто на счетах (в одной версии БП "Статьи затрат" могут быть первым субконто, в другой — вторым). Функция УстановитьСубконто сама найдет нужную позицию в коллекции.

Оптимизация кода выгрузки

Чтобы не загромождать код десятками условий Если... ИначеЕсли, проанализируем ситуацию и применим цикл. В документе-источнике (например, "Отражение зарплаты") субконто обычно хранятся в отдельных реквизитах: СубконтоДт1, СубконтоДт2, СубконтоДт3. Мы можем обойти их в цикле:


Для НомерСубконто = 1 По 3 Цикл
    ИмяРеквизита = "СубконтоДт" + НомерСубконто;
    ЗначениеСубконто = ВыборкаДетальныеЗаписи[ИмяРеквизита];
    
    Если Не ЗначениеЗаполнено(ЗначениеСубконто) Тогда
        Продолжить;
    КонецЕсли;
    
    ТипСубконто = ТипЗнч(ЗначениеСубконто);
    
    // Сопоставляем типы справочников с именами ПВХ в приемнике
    ИмяВидаПВХ = "";
    Если ТипСубконто = Тип("СправочникСсылка.ФизическиеЛица") Тогда
        ИмяВидаПВХ = "РаботникиОрганизаций";
    ИначеЕсли ТипСубконто = Тип("СправочникСсылка.Контрагенты") Тогда
        ИмяВидаПВХ = "Контрагенты";
    ИначеЕсли ТипСубконто = Тип("СправочникСсылка.СтатьиЗатрат") Тогда
        ИмяВидаПВХ = "СтатьиЗатрат";
    КонецЕсли;
    
    Если ИмяВидаПВХ <> "" Тогда
        СубконтоДт.Вставить(Новый Структура("Наименование", ИмяВидаПВХ), ЗначениеСубконто);
    КонецЕсли;
КонецЦикла;

Важные моменты при настройке ПКО

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

Таким образом, мы выяснили, что ключ к успешному переносу субконто в Конвертации данных 2.1 — это правильное формирование коллекции. Использование структуры с ключом-описанием (через Наименование или Код) позволяет избежать ошибок типизации и корректно сопоставить данные ПВХ между разными конфигурациями 1С.

← На главную