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