Почему при загрузке документа ОперацияБух в БП 3.0 проводки появляются только после повторной загрузки и как это исправить

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

При настройке правил обмена в конфигурации «Конвертация данных 2.0» (или 2.1) между сторонними конфигурациями (например, «Штрих-М: Торговое предприятие 5») и «1С:Бухгалтерия предприятия 3.0» разработчики нередко сталкиваются с нестандартным поведением: документ ОперацияБух создается в базе-приемнике абсолютно пустым. При этом в самом выгруженном файле XML данные проводок присутствуют, а если повторно загрузить тот же самый файл без каких-либо изменений, то строки в документе благополучно появляются.

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

Архитектурная причина проблемы: специфика документа ОперацияБух

Для понимания сути проблемы выясним, чем документ ОперацияБух отличается от подавляющего большинства типовых первичных документов (таких как ПоступлениеТоваровУслуг или РеализацияТоваровУслуг):

  1. Запрет на проведение: В дереве метаданных конфигурации у документа ОперацияБух свойство «Режим проведения» жестко установлено в значение Запретить. Этот документ физически невозможно «провести» штатным методом платформы Объект.Записать(РежимЗаписиДокумента.Проведение).
  2. Отсутствие табличной части проводок: Таблица с дебетом, кредитом, суммами и субконто, которую бухгалтер видит на экранной форме документа, не является его табличной частью. Это динамическое отображение набора записей регистра бухгалтерии Хозрасчетный, отобранного по регистратору — конкретной ссылке на данный документ.
  3. Механизм регистрации движений: Документ является регистратором. Чтобы в регистре появилась проводка, набор записей должен содержать точную ссылку на уже существующий в информационной базе документ-регистратор.

Проанализируем, что происходит при стандартной выгрузке и загрузке через старые или внешние версии обработки обмена:

  1. Первый проход загрузки: Обработка создает новый элемент документа ОперацияБух. В этот момент его ссылка в базе еще не зафиксирована окончательно или набор записей регистра бухгалтерии считывается обработчиком до того, как регистратор надежно связался с контекстом транзакции. В результате создается пустая «шапка» документа, а движения отбрасываются либо не могут привязаться к новому объекту.
  2. Второй проход загрузки: Так как документ уже физически существует в базе данных и находится по уникальному идентификатору (GUID) или полям поиска, обработка загрузки считывает существующую ссылку Объект.Ссылка и успешно записывает набор записей регистра бухгалтерии Хозрасчетный с указанием найденного регистратора.

Способ 1. Использование актуальной обработки обмена из конфигурации-приемника

Самое быстрое и надежное практическое решение проблемы без переписывания правил — смена инструмента загрузки на стороне базы-приемника.

Внешние обработки обмена (такие как V8Exchan82.epf или V8Exchan83.epf), поставляемые со сторонними решениями, часто содержат устаревшие алгоритмы сериализации данных. В то же время типовая конфигурация «1С:Бухгалтерия предприятия 3.0» содержит встроенный механизм универсального обмена на базе Библиотеки стандартных подсистем (БСП).

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

  1. Откроем «1С:Бухгалтерию предприятия 3.0» в режиме предприятия.
  2. Перейдем в раздел «Администрирование» — «Обслуживание» — «Загрузка данных из XML» (либо откроем через функцию Все функции / Функции для технического специалиста обработку Универсальный обмен данными в формате XML).
  3. На вкладке «Загрузка данных» выберем сформированный файл выгрузки и нажмем кнопку «Загрузить данные».

Встроенные механизмы БСП оптимизированы для работы с непроводимыми регистраторами и выполняют запись движений в рамках единого контура, гарантируя появление проводок с первого раза.

Способ 2. Корректная выгрузка метаданных и настройка ПКО в КД 2.0

Если обмен настраивается как регулярный процесс, необходимо убедиться в правильности структуры правил конвертации данных. Рассмотрим ключевые настройки в конфигурации «Конвертация данных, редакция 2.1»:

  1. Выгрузка структуры метаданных: При формировании файла описания метаданных с помощью обработки MD83Exp.epf обязательно снимем флаг «Не выгружать регистры бухгалтерии». Для оптимизации объема файла можно установить флаг «Выгружать движения только у документов без проведения». Это исключит избыточную передачу движений по обычным первичным документам, но сохранит движения для ОперацияБух.
  2. Настройка правил конвертации объектов (ПКО): В ПКО для документа ОперацияБух перейдем в группу свойств (ПКГС) и убедимся, что включена конвертация движений регистра бухгалтерии Хозрасчетный.
  3. Сопоставление субконто: Обратим внимание на то, чтобы типы счетов и состав субконто на планах счетов источника и приемника совпадали, иначе платформа отклонит запись набора записей регистра из-за несоответствия типов.

Способ 3. Программная запись движений в обработчике «После загрузки»

В сложных сценариях (когда проводки формируются алгоритмически из табличных частей исходных документов источника) самым надежным способом является принудительная фиксация движений в коде обработчика события.

Рассмотрим реализацию через обработчик «После загрузки» в ПКО документа ОперацияБух:


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

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

Если таблица проводок передавалась из источника через произвольную таблицу в структуре ПараметрыОбъекта, мы можем программно инициализировать и записать набор записей регистра бухгалтерии, зная точную ссылку только что загруженного объекта:


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

Итоги и рекомендации

Подведем итог: необходимость повторной загрузки файла обмена возникает из-за рассинхронизации создания шапки непроводимого документа и записи связанного с ним набора записей регистра бухгалтерии.

Для стабильной работы обмена рекомендуем:

  1. Использовать актуальные встроенные обработки БСП в базе-приемнике.
  2. Всегда проверять наличие движений в составе выгружаемых метаданных для документов, у которых отключен режим проведения.
  3. При необходимости применять явную запись набора записей в обработчике «После загрузки» в правилах конвертации.
← На главную