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