Как настроить автоматическое заполнение счетов учета при обмене между УТ и БП?

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

При организации обмена данными между конфигурациями «Управление торговлей» (УТ) и «Бухгалтерия предприятия» (БП) специалисты часто сталкиваются с проблемой: документы (реализации, поступления, корректировки) успешно переносятся, но счета учета в них остаются пустыми. Это происходит даже в тех случаях, когда в базе-приемнике (БП) корректно заполнены соответствующие регистры сведений: Счета учета номенклатуры и Счета учета расчетов с контрагентами.

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

Выясним причину: почему счета остаются пустыми?

Проанализируем ситуацию с технической точки зрения. В типовых конфигурациях 1С счета учета в документах заполняются при интерактивном действии пользователя (например, при выборе номенклатуры или контрагента в форме документа). Однако при обмене через XML-файл объект создается и записывается программно. Обработка «Универсальный обмен данными» просто загружает значения реквизитов из файла и вызывает метод Объект.Записать().

Поскольку в УТ счетов бухгалтерского учета обычно нет, они не передаются в файле обмена. А программная запись объекта в БП по умолчанию не инициирует процедуры автоматического заполнения счетов, так как они «зашиты» в логику экранных форм или специализированных обработчиков БСП, которые не всегда активны при обычном импорте данных.

Решение №1: Использование дополнительных свойств объекта

Рассмотрим наиболее эффективный и «чистый» способ решения проблемы. В современных конфигурациях на базе БСП (включая БП 3.0) предусмотрены специальные флаги в коллекции ДополнительныеСвойства. Если установить такой флаг перед записью объекта, подсистема учета сама вызовет нужные процедуры заполнения.

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


Объект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);

Посмотрим на расширенный список свойств, которые могут потребоваться в зависимости от версии вашей конфигурации:

  1. ЗаполнитьСчетаУчетаПередЗаписью — основной флаг, инициирующий поиск счетов по регистрам.
  2. ЗаполнитьСчетаУчета — альтернативный флаг для некоторых видов документов.
  3. ПропускатьЗаполнениеСчетовУчета — необходимо убедиться, что этому свойству (если оно используется) не присвоено значение Истина.

Решение №2: Вызов экспортных процедур БП в правилах обмена

Если установка дополнительных свойств не дает результата, разберем более прямой подход — принудительный вызов процедур заполнения счетов прямо в коде правил обмена. Это гарантирует, что алгоритм будет выполнен сразу после загрузки данных в объект.

В том же обработчике «После загрузки» в ПКО мы можем обратиться к общему модулю БП. Пример кода для Бухгалтерии предприятия 3.0:


// Сначала заполним счета расчетов
СчетаУчетаРасчетов.Заполнить(Объект);

// Затем заполним счета учета номенклатуры в табличных частях
СчетаУчетаВДокументах.Заполнить(Объект);

Проанализируем этот метод: его преимущество в том, что счета будут заполнены еще до того, как объект будет окончательно записан в базу. Это позволяет избежать лишних транзакций и гарантирует наличие данных в документе сразу после завершения обмена.

Решение №3: Защита от затирания ручных правок

Рассмотрим ситуацию, описанную в сообщениях форума: бухгалтеры уже поправили счета в ранее загруженных документах, но при повторном обмене (например, при выгрузке за другой период) эти данные затираются пустыми значениями из УТ. Чтобы избежать этого, нужно добавить проверку на «новизну» объекта.

Модернизируем наш код в обработчике «После загрузки»:


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

Также в настройках правил обмена (ПКО) в «Конвертации данных» для конкретных реквизитов (например, СчетУчета, СчетДоходов, СчетРасходов) можно установить флаг «Не замещать значение у существующих объектов в приемнике». В этом случае, если в БП счет уже выбран, загрузка из XML его не изменит.

Важные рекомендации по настройке БП

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

  1. Регистр «Счета учета номенклатуры»: Убедитесь, что записи в нем созданы не только для конкретных позиций, но и для Групп номенклатуры или для Видов номенклатуры. Если система не находит частное правило, она должна иметь возможность подставить общее.
  2. Регистр «Счета учета расчетов с контрагентами»: Проверьте наличие записей для групп контрагентов или общую запись (где не указан конкретный контрагент и организация), которая будет служить «настройкой по умолчанию».
  3. Режим записи: Помните, что обработка «Универсальный обмен данными» по умолчанию записывает объект без проведения. Если ваша логика заполнения счетов завязана на проведение, убедитесь, что в правилах обмена установлен соответствующий режим.

Подведем итог: использование дополнительных свойств объекта ЗаполнитьСчетаУчетаПередЗаписью является рекомендуемым способом для интеграции с конфигурациями на базе БСП. Это позволяет сохранить целостность бизнес-логики программы и минимизировать риск ошибок при обновлении конфигурации.

← На главную