Почему при переносе данных из УТ в БП не заполняются счета учета номенклатуры и как это исправить

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

При настройке синхронизации данных между конфигурациями «1С:Управление торговлей» (УТ) и «1С:Бухгалтерия предприятия» (БП) технические специалисты часто сталкиваются с неприятной проблемой: документы (например, «Реализация товаров и услуг» или «Поступление товаров и услуг») переносятся из торговой базы в бухгалтерскую, но табличные части остаются без заполненных счетов учета (счета 41, 10, 20, 90 и т.д.). При этом, если бухгалтер открывает тот же самый документ в БП и добавляет номенклатуру вручную, счета подставляются корректно. Выясним причину этого поведения и разберем по шагам рабочие методы устранения проблемы.

В чем кроется первопричина проблемы?

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

Однако при обмене данными ситуация кардинально меняется. Запись объектов происходит программно, и платформа принудительно устанавливает свойство ОбменДанными.Загрузка = Истина для загружаемого объекта. Этот флаг указывает системе, что объект переносится «как есть» из другой информационной базы, поэтому большинство стандартных проверок, подписок на события и обработчиков заполнения отключаются ради оптимизации скорости и предотвращения конфликтов данных. Программа резонно «предполагает», что раз данные выгружены из источника, они уже должны содержать все необходимые реквизиты. Но в «1С:Управление торговлей» (особенно редакции 11) плана счетов и бухгалтерского учета как такового нет. В результате счета учета в БП остаются незаполненными.

Рассмотрим подробнее три основных способа решения этой задачи: программную доработку правил конвертации, использование современных механизмов БП 3.0 и быстрое групповое исправление данных.

Решение 1. Программный вызов заполнения в правилах конвертации (КД 2.0)

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

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

Пропишем следующий код в обработчике:


// Вызываем типовой метод заполнения счетов учета для табличной части Товары
Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");

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

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

Решение 2. Использование современного общего модуля СчетаУчетаВДокументах (БП 3.0)

В современных релизах «1С:Бухгалтерии предприятия 3.0» разработчики фирмы 1С стандартизировали работу со счетами учета. Теперь вместо разрозненных методов в модулях каждого документа используется единый общий модуль СчетаУчетаВДокументах.

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


// Подготовим структуру отбора для заполнения только незаполненных реквизитов
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("НеЗаполненныеРеквизиты", Истина);

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

Также мы можем использовать встроенный механизм отложенного заполнения, передав системе флаг-команду через дополнительные свойства объекта. Этот способ гарантирует, что счета заполнятся непосредственно перед записью объекта в базу данных:


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

Решение 3. Тонкая настройка регистра «Счета учета номенклатуры» в БП

Очень часто программисты ищут ошибку в коде обмена, тогда как проблема кроется в обычных пользовательских настройках ведения учета в самой «1С:Бухгалтерии». Если правила обмена настроены верно, но счета все равно пустые, проверим настройки регистра.

Дело в том, что при переносе номенклатуры из УТ в БП новые элементы могут создаваться вне привычных папок (иерархии) или им может присваиваться некорректный Вид номенклатуры. Разберем, как правильно настроить регистр:

  1. Перейдем в раздел «Справочники» — «Номенклатура» и откроем гиперссылку «Счета учета номенклатуры».
  2. Проанализируем записи регистра. Если правила привязаны к конкретным папкам (например, к группе «Товары»), а перенесенная номенклатура загрузилась в корень справочника или в новую группу «Загружено из УТ», то правила автозаполнения для нее работать не будут.
  3. Рекомендация: Настраивайте правила счетов учета не для папок справочника, а для Видов номенклатуры (например, для видов «Товары», «Услуги», «Материалы»). Это гораздо более надежный вариант, так как вид номенклатуры жестко привязан к карточке товара и не зависит от того, в какую физическую папку пользователь или обмен положит этот элемент.

Решение 4. Массовое исправление счетов в уже загруженных документах

Что делать, если обмен уже прошел, сотни документов загружены с пустыми счетами учета, а перевыгружать их заново долго или невозможно? Нам не обязательно писать внешние обработки «на коленке». Воспользуемся штатным и безопасным механизмом БП 3.0 — обработкой «Групповое изменение реквизитов».

Выполним следующие шаги:

  1. Перейдем в раздел «Администрирование» — «Обслуживание» — «Групповое изменение реквизитов».
  2. В поле «Выбирать элементы» выберем тип документа, например, Реализация товаров и услуг.
  3. Добавим отбор по нужным критериям (например, по дате загрузки или по признаку «Проведен = Ложь»), чтобы не затронуть старые закрытые периоды.
  4. Нажмем кнопку «Дополнительные параметры» внизу формы. В открывшемся окне установим флаг «Показывать служебные реквизиты» и перейдем на вкладку «Режим разработчика» (это позволит нам выполнить произвольный программный код для каждого документа).
  5. В появившемся поле ввода кода напишем простой и эффективный алгоритм:

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

Подведем итоги

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

← На главную