Как запустить процедуру обработки выбора и заполнения реквизитов в КД 2.0 после загрузки объекта?

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

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

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

Понимание проблемы: Клиент vs Сервер

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

Рассмотрим ситуацию, описанную в теме: при заполнении реквизита «Налог» в документе «Списание с расчетного счета» должны заполниться связанные реквизиты. В коде формы это выглядит так:


&НаКлиенте
Процедура НалогПриИзменении(Элемент)
    СписаниеСРасчетногоСчетаФормыКлиент.ИнициализироватьСвойстваПлатежа(ЭтотОбъект); 
    Если ЗначениеЗаполнено(Объект.Налог) Тогда
        НалогПриИзмененииНаСервере(Новый Массив, СтрокаПоискаПоКБК);
    Иначе
        ЭтоУплатаНДФЛ = Ложь;
    КонецЕсли;
    ОтобразитьГиперссылкуПерейтиВТаблицу();
КонецПроцедуры

Попытка вызвать этот код напрямую из обработчика КД ПослеЗагрузки обречена на провал, так как методы ОтобразитьГиперссылку... и обращение к Элементам формы недоступны в серверном контексте объекта.

Решение №1: Использование программного интерфейса общих модулей

Современные типовые конфигурации (БП 3.0, ERP, КА) строятся по принципу выноса бизнес-логики в общие модули. Рассмотрим подробнее, как найти нужный метод. Вместо того чтобы копировать код из формы, проанализируем серверную процедуру НалогПриИзмененииНаСервере.

Как правило, внутри таких процедур вызываются экспортные методы из модулей типа СписаниеСРасчетногоСчетаФормыСервер или СписаниеСРасчетногоСчетаПереопределяемый. Наша задача — найти процедуру, которая принимает в качестве параметра ЭтотОбъект (документ объект) или структуру данных документа.

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


// В обработчике ПКО "После загрузки"
// Объект - это загруженный документ-объект

// Находим типовой метод, который инициализирует реквизиты по налогу
СписаниеСРасчетногоСчетаФормыСервер.ЗаполнитьРеквизитыПоНалогу(Объект);

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

Решение №2: Отключение режима «Загрузка» (DataExchange.Load)

По умолчанию при загрузке через КД у объекта устанавливается признак Объект.ОбменДанными.Загрузка = Истина. Это отключает проверки в модуле объекта. Если логика заполнения прописана в модуле объекта (например, в процедуре ПередЗаписью), она не сработает.

Проанализируем ситуацию: если мы хотим, чтобы объект «повел себя как живой», мы можем временно сбросить этот флаг в обработчике После загрузки:


Объект.ОбменДанными.Загрузка = Ложь;
// Теперь при вызове Объект.Записать() сработают все стандартные проверки модуля объекта
// Но будьте осторожны: это замедляет загрузку и может вызвать ошибки прав доступа

Решение №3: Вызов процедуры «Заполнить»

Многие объекты в БП 3.0 имеют стандартный механизм заполнения. Если основной реквизит (например, «Налог») уже загружен, мы можем инициировать пересчет связанных полей, вызвав метод Заполнить(). Это часто помогает, когда логика заполнения опирается на ДанныеЗаполнения.

Разберем пример вызова в КД:


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

Решение №4: Перенос логики в обработчик КД «После загрузки»

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

Рассмотрим шаги реализации:

  1. Открываем код формы в конфигураторе и находим процедуру заполнения.
  2. Выделяем из нее строки, которые меняют значения реквизитов Объекта.
  3. Игнорируем все, что связано с Элементы, ЭтаФорма, Доступность и Видимость.
  4. Копируем очищенный код в обработчик КД После загрузки.

Пример адаптированного кода для ПКО:


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

Подводные камни и рекомендации

Проанализируем типичные ошибки при попытке «запустить форму» из КД:

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

2. Дублирование кода. Старайтесь избегать копирования больших кусков кода из конфигурации в КД. Если конфигурация обновится, ваш код в КД может стать неактуальным (например, изменится название реквизита или алгоритм расчета налога).

3. Поиск конечной процедуры. Как справедливо замечено на форуме, «все свистелки с изменениями... как правило вынесены в экспорт в различных модулях». Потратьте лишние 10 минут на поиск через Ctrl+F по всей конфигурации названия экспортной процедуры, которая делает расчеты — это сэкономит часы отладки в будущем.

Вывод: Прямого способа «нажать на кнопку формы» из КД не существует. Правильная стратегия — вызов серверных методов API конфигурации или эмуляция их работы в серверных обработчиках КД. Это гарантирует целостность данных и корректное заполнение всех связанных реквизитов документа.

← На главную