Как правильно перенести проводки и субконто в документ «Операция» с помощью Конвертации данных 2.0?

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

Перенос бухгалтерских проводок в документ ОперацияБух (или операции, введенные вручную) — одна из наиболее часто встречающихся и в то же время трудоемких задач при настройке обмена в программе «1С:Конвертация данных 2.0» (КД 2.0 / 2.1). Сложность заключается в том, что субконто на счетах учета представляют собой сложный составной тип данных. Обычное сопоставление свойств «один к одному» здесь не работает, особенно если нужной аналитики физически нет в базе-источнике, и её требуется «создать» или «подставить» прямо на лету в процессе переноса.

В данной статье мы подробно проанализируем причины типичных ошибок, которые возникают при попытках переноса субконто, разберем, почему платформа выдает системные сбои, и изучим два проверенных практических метода решения этой задачи.

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

При настройке правил конвертации свойств (ПКС) для субконто разработчики часто сталкиваются с двумя критическими ошибками:

  1. Ошибка «Поле объекта недоступно для записи (Ссылка)». Эта ошибка чаще всего возникает в обработчике события ПередВыгрузкой свойства. Причина кроется в попытке напрямую переопределить системные переменные, такие как Источник или Значение, присвоив им простые типы (например, пустую строку или строку с кодом элемента). В контексте выгрузки субконто, которые представляют собой табличную часть или набор движений регистра, переменная Источник может быть защищена от записи, либо система ожидает от нее строго определенный объектный тип.
  2. Ошибка «Итератор для значения не определен». Это классический сбой ядра КД 2.0 при обработке правил конвертации объектов (ПКО) вида ВидыСубконтоХозрасчетные. Движок обмена УниверсальныйОбменДаннымиXML на этапе выгрузки субконто ожидает коллекцию (соответствие или структуру), состоящую из пар «Ключ» (Вид субконто) и «Значение» (Аналитика). Если разработчик пытается переопределить ПКС Код или само значение субконто простым строковым кодом (например, "000000018"), то внутренний алгоритм КД пытается обойти это значение циклом Для каждого, что и вызывает фатальное исключение.

Рассмотрим детально, как обойти эти ограничения и корректно передать данные.

Вариант А. Настройка переноса на стороне источника (Динамическое сопоставление)

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

Разберем по шагам, как настроить правила выгрузки:

Шаг 1. Формирование структуры данных в источнике. В том месте, где вы формируете коллекцию проводок (это может быть ПВД или обработчик выгрузки табличной части документа), нам необходимо программно инициализировать структуру субконто. Напишем следующий код:


// Создаем соответствие для субконто дебета
СубконтоДт = Новый Соответствие;

// 1. Формируем Ключ (Вид субконто в базе-приемнике)
// Задаем структуру поиска вида субконто по его коду в ПВХ "ВидыСубконтоХозрасчетные"
КлючСубконто = Новый Структура("Код", "00021"); 

// 2. Формируем Значение субконто (объект аналитики)
// Поскольку объекта нет в источнике, мы будем искать его по коду в справочнике приемника
ЗначениеСубконто = Новый Структура;
ЗначениеСубконто.Вставить("Код", "000000018"); // Код нужной статьи в приемнике

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

// Заполняем соответствие и передаем его в строку нашей коллекции проводок
СубконтоДт.Вставить(КлючСубконто, ЗначениеСубконто);
СтрокаКоллекции.СубконтоДт = СубконтоДт;

Шаг 2. Настройка обработчиков в правилах конвертации свойств (ПКС). Перейдем в настройки правил для свойства СубконтоДт (или СубконтоКт). В обработчике события При выгрузке нам необходимо переопределить имя ПКО для значения субконто, чтобы система знала, по какому правилу обрабатывать нашу структуру.


// Указываем правило для поиска вида субконто (ключа)
ИмяПКОВидСубконто = "ВидыСубконтоХозрасчетные";

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

Благодаря этому подходу движок конвертации корректно распознает структуру, найдет вид субконто в ПВХ по коду "00021", а затем, используя ПКО СтатьиДвиженияДенежныхСредств, найдет нужную статью по коду "000000018" в базе-приемнике.

Вариант Б. Заполнение субконто на стороне приемника (Рекомендуемый и надежный способ)

Несмотря на изящество первого варианта, он требует кропотливой отладки XML-сериализации. Существует более простой, надежный и быстродействующий способ — постобработка данных в базе-приемнике. Мы можем перенести счета и ту аналитику, которая есть в источнике, а специфические субконто (которые жестко привязаны к определенным счетам и статичны) заполнить на чистом коде 1С сразу после загрузки документа.

Этот способ полностью исключает ошибки выгрузки и позволяет использовать привычные инструменты отладки в конфигураторе приемника.

Разберем по шагам реализацию этого метода:

Шаг 1. Перенос основных данных. Настройте правила обмена так, чтобы документ ОперацияБух создавался, в него переносились счета учета, суммы и доступная аналитика (например, склад или магазин).

Шаг 2. Настройка обработчика «После загрузки» в ПКО документа. Откройте ПКО вашего документа (например, ОперацияБух) в Конвертации данных, перейдите на вкладку «Обработчики событий» и выберите событие ПослеЗагрузки. Напишем код, который обойдет все созданные проводки и программно заполнит недостающие субконто:


// Нам нужно обработать движения по регистру бухгалтерии загруженного документа
Для каждого Проводка Из Объект.Движения.Хозрасчетный Цикл
    
    // Проверяем счет дебета. Например, если это счет "Операционная касса"
    Если Проводка.ShetDt = ПланыСчетов.Хозрасчетный.ОперационнаяКасса Тогда
        
        // Получаем ссылку на вид субконто "Статьи движения денежных средств" в приемнике
        ВидСубк = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств;
        
        // Ищем конкретную статью по коду непосредственно в базе-приемнике
        ЗначениеСубк = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000018");
        
        // Если статья найдена, записываем её в субконто проводки
        Если ЗначениеЗаполнено(ЗначениеСубк) Тогда
            Проводка.СубконтоДт.Вставить(ВидСубк, ЗначениеСубк);
        КонецЕсли;
        
    // Аналогично обрабатываем счет "Продажи по платежным картам"
    ИначеЕсли Проводка.ShetDt = ПланыСчетов.Хозрасчетный.ПродажиПоПлатежнымКартам Тогда
        
        ВидСубк = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты;
        ЗначениеСубк = Справочники.Контрагенты.НайтиПоКоду("00-000059");
        
        Если ЗначениеЗаполнено(ValueSubk) Тогда
            Проводка.СубконтоДт.Вставить(ВидСубк, ЗначениеСубк);
        КонецЕсли;
        
    КонецЕсли;
    
КонецЦикла;

// Включаем флаг записи движений, чтобы платформа сохранила наши изменения в базе данных
Объект.Движения.Хозрасчетный.Записывать = Истина;

Преимущества использования Варианта Б:

Таким образом, мы детально разобрали особенности выгрузки субконто в КД 2.0. Выбор конкретного метода зависит от архитектуры вашего обмена, но для большинства практических задач перенос с постобработкой в приемнике (Вариант Б) является наиболее предпочтительным и стабильным решением.

← На главную