Как программно заполнить документ «Акт сверки взаиморасчетов» из внешней обработки в 1С:Бухгалтерия 3.0?

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

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

Разберем подробно, почему возникает эта проблема и какими способами можно программно заполнить акт сверки по данным бухгалтерского учета без необходимости интерактивного открытия формы документа.

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

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

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

Способ 1. Перенос алгоритма заполнения в модуль обработки

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

Разберем по шагам, как реализовать данный подход:

  1. Скопируйте процедуры расчета остатков и оборотов по счетам из модуля формы документа в модуль объекта или модуль формы вашей обработки.
  2. Адаптируйте контекст вызовов: замените обращения к реквизитам формы (Объект.Контрагент, Объект.ПериодДетализации) на параметры вашей обработки или свойства создаваемого документа.
  3. Вызовите подготовленный серверный алгоритм сразу после инициализации шапки документа и перед его записью.

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


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

Способ 2. Использование штатной процедурной схемы и метода Заполнить()

В типовых конфигурациях 1С (включая «Бухгалтерию предприятия 3.0») стандартным механизмом инициализации данных является вызов метода Заполнить(). Этот метод провоцирует выполнение события ОбработкаЗаполнения в модуле объекта документа.

Если в типовой конфигурации алгоритм сбора данных по регистру бухгалтерии Хозрасчетный вынесен в модуль объекта или менеджер документа, достаточно передать структуру параметров заполнения:


&НаСервере
Функция СформироватьАктСверки(СтруктураПараметров)
    
    НовыйДокумент = Документы.АктСверкиВзаиморасчетов.СоздатьДокумент();
    
    // Передаем параметры для штатной обработки заполнения
    НовыйДокумент.Заполнить(СтруктураПараметров);
    
    НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
    Возврат НовыйДокумент.Ссылка;
    
КонецФункции

В структуре параметров передаются ключевые реквизиты: Организация, Контрагент, ПериодНачала, ПериодКонца и списки счетов учета.

Способ 3. Прямая выборка данных запросом к регистру «Хозрасчетный»

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

Выясним, какие данные необходимы для заполнения табличных частей ПоДаннымОрганизации и ПоДаннымКонтрагента:

  1. Начальный остаток взаиморасчетов на дату начала периода по счетам учета расчетов (60, 62, 76 и др.).
  2. Движения (документы) за выбранный период с разбивкой по дебету и кредиту.
  3. Конечный остаток на дату окончания периода.

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

← На главную