Как заполнить счета учета в документе БП 3.0 при загрузке через КД 2.0?

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

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

Почему возникает проблема с ДанныеФормыСтруктура?

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

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

Решение 1. Использование ДополнительныхСвойств объекта

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

Посмотрим, как реализовать это в КД 2.0. Нам понадобится обработчик "После загрузки" в правиле конвертации объектов (ПКО) конкретного документа. Рассмотрим пример кода:


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

Как это работает: при записи документа (после завершения загрузки из XML) срабатывают подписки на события или код в модуле объекта. Система видит наличие этого ключа в ДополнительныеСвойства и самостоятельно вызывает процедуру заполнения счетов учета по всем табличным частям. Важно помнить, что для успешного срабатывания этого механизма у объекта уже должны быть заполнены базовые реквизиты: Организация, Контрагент, Договор и номенклатура в строках табличной части.

Решение 2. Вызов специализированных процедур общего модуля

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

Рассмотрим пример программного заполнения счетов для табличной части "Товары" в обработчике "После загрузки":


// Подготавливаем параметры для типового модуля
ПараметрыЗаполнения = СчетаУчетаВДокументах.ПараметрыЗаполнения();
ПараметрыЗаполнения.ЗаполнитьСчетаУчета = Истина;

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

Этот метод хорош тем, что он не требует наличия открытой формы и работает напрямую с ДокументОбъект. Процедура СчетаУчетаВДокументах.Заполнить универсальна и сама определяет, какие счета нужно подставить, исходя из настроек регистра сведений СчетаУчетаНоменклатуры.

Решение 3. Заполнение счетов расчетов с контрагентами

Если ваша задача заключается в заполнении счетов расчетов (60.01, 62.01 и т.д.), которые обычно находятся в шапке документа или на отдельной вкладке, выясним, какой метод использовать для этого. В БП 3.0 за это отвечает модуль СчетаУчетаРасчетов.

Пример кода для заполнения счетов расчетов:


// Заполнение счетов расчетов (например, для документа ПоступлениеТоваровУслуг)
СчетаУчетаРасчетов.ЗаполнитьСчетаРасчетов(Объект);

Данный метод проанализирует реквизиты Организация, Контрагент, ДоговорКонтрагента и подставит счета в соответствии с настройками в регистре СчетаУчетаРасчетовСКонтрагентами.

Важные нюансы при обмене данными

При работе с КД 2.0 необходимо учитывать режим загрузки объекта. По умолчанию, при загрузке устанавливается флаг Объект.ОбменДанными.Загрузка = Истина. Рассмотрим, как это влияет на нашу задачу:

  1. Если установлен флаг Загрузка = Истина, стандартные проверки в модуле объекта (в процедуре ПередЗаписью) могут игнорироваться. Это означает, что способ с ДополнительныеСвойства может не сработать в некоторых документах, если разработчик типовой конфигурации явно не предусмотрел проверку свойств в режиме загрузки.
  2. Если вы вызываете заполнение счетов вручную в "После загрузки", убедитесь, что вы устанавливаете ОбъектМодифицирован = Истина, чтобы система поняла, что данные изменились и их нужно сохранить в базу.
  3. Если счета учета все равно не заполняются, проанализируйте содержимое регистра сведений Счета учета номенклатуры в базе-приемнике. Возможно, там просто не заданы правила для организации или группы номенклатуры, которые вы переносите.

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

← На главную