При настройке обмена данными между 1С:Управление торговлей и 1С:Бухгалтерия предприятия 3.0 через Конвертацию данных 2.0 (КД 2.0) программисты часто сталкиваются с тем, что в загруженных документах (например, «Списание товаров») отсутствуют счета учета в табличной части. При этом в других документах, таких как «Оприходование товаров», те же самые методы могут работать корректно. Разберем детально, почему так происходит, и как заставить конфигурацию «Бухгалтерия предприятия» правильно подставлять счета учета при загрузке.
Основная причина, по которой счета учета не заполняются автоматически, заключается в том, что при загрузке через КД 2.0 свойство документа ОбменДанными.Загрузка устанавливается в значение Истина. В типовых конфигурациях на платформе 1С:Предприятие 8 это свойство отключает большинство стандартных проверок и механизмов автоматического заполнения в модуле объекта (в событиях ПередЗаписью и ПриЗаписи). Это сделано для того, чтобы данные загружались ровно в том виде, в котором они были выгружены из источника, без искажений логикой приемника.
Однако, если в базе-источнике (УТ) счета учета не ведутся или не выгружаются, БП 3.0 ожидает, что они заполнятся по правилам регистра сведений «Счета учета номенклатуры». Поскольку автоматика отключена, нам необходимо инициировать процесс заполнения принудительно в коде правил конвертации.
В современных конфигурациях, построенных на базе БСП (Библиотеки стандартных подсистем), предусмотрен механизм, позволяющий обходить ограничения режима загрузки. Мы можем передать специальный флаг в дополнительные свойства объекта, который «скажет» модулю документа, что счета учета все-таки нужно заполнить, даже если это обмен данными.
Рассмотрим, как это реализовать. В ПКО (Правило конвертации объектов) для документа «Списание товаров» в обработчике ПослеЗагрузки добавим следующую строку:
Объект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
Этот способ является наиболее «чистым» с точки зрения архитектуры БП 3.0, так как он использует штатные механизмы конфигурации. Однако важно помнить, что этот флаг должен поддерживаться в коде модуля объекта конкретного документа. Если типовой код документа не проверяет это свойство, счета останутся пустыми.
Если первый способ не сработал или вы хотите иметь полный контроль над процессом, проанализируем использование прямых вызовов процедур заполнения. В старых версиях БП использовались методы менеджера документа, но в БП 3.0 рекомендуется обращаться к специализированным общим модулям.
Посмотрим на пример кода, который необходимо разместить в обработчике ПослеЗагрузки для документа «Списание товаров»:
// Сначала убедимся, что вид операции установлен корректно,
// так как от него зависит алгоритм подбора счетов
Объект.ВидОперации = Перечисления.ВидыОперацийСписаниеТоваров.СписаниеСоСклада;
// Используем актуальный общий модуль для заполнения счетов
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");
// Дополнительно можно вызвать заполнение счетов затрат, если это требуется для данного вида операции
// СчетаУчетаВДокументах.ЗаполнитьСчетаУчета(Объект);
Важный нюанс: для того чтобы метод ЗаполнитьСчетаУчетаВТабличнойЧасти отработал успешно, в объекте уже должны быть заполнены ключевые реквизиты: Организация, Склад и колонки ТЧ Товары (в частности, Номенклатура). Если эти поля еще не проинициализированы, счета учета не будут найдены в регистре.
Выясним причину, по которой счета могут не заполняться, даже если код написан верно. В Конвертации данных 2.0 важен порядок выполнения ПКС (Правил конвертации свойств). Если вызов заполнения счетов происходит в обработчике ПослеЗагрузки, то все поля уже должны быть заполнены. Но если вы пытаетесь вызвать заполнение внутри одного из ПКС, убедитесь, что Склад и Организация в списке ПКС находятся выше, чем текущее свойство.
Проанализируем также ситуацию с документом-основанием (Инвентаризация). Как отмечалось в обсуждении, при ручном перевыборе склада в интерфейсе БП 3.0 счета заполняются, но очищается связь с инвентаризацией. Это происходит из-за работы типовых обработчиков событий формы. При программной загрузке через ПослеЗагрузки мы работаем напрямую с данными (объектом), поэтому связь с документом-основанием сохранится, если мы не будем вызывать методы обновления всей формы, а ограничимся заполнением только пустых счетов учета.
Разберем это различие. Алгоритмы заполнения в БП 3.0 для разных документов отличаются:
ВидОперации. Если это списание на расходы, системе требуются дополнительные данные о счетах затрат и аналитике (подразделение, статья затрат). Если эти данные в объекте отсутствуют или противоречивы, метод заполнения может просто пропустить строки.Чтобы гарантированно решить проблему незаполнения счетов, выполним следующие шаги:
СписаниеТоваров.ПослеЗагрузки пропишем явную установку вида операции (если она не переносится из источника).СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");.Объект.Записать(РежимЗаписиДокумента.Проведение); в тот же обработчик, предварительно проверив заполненность всех обязательных полей.Используя комплексный подход с передачей флага в ДополнительныеСвойства и принудительным вызовом процедур общего модуля, мы обеспечим корректное формирование бухгалтерских проводок и исключим необходимость ручной корректировки документов после обмена.