Как программно создать и заполнить акт сверки в 1С:Бухгалтерия 3.0?

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

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

Проблема: Почему стандартные методы не работают

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

Способ 1. Использование современной функции «ЗаполнитьАктСверкиПоДаннымИБ»

В актуальных версиях БП 3.0 разработчики 1С добавили в модуль менеджера документа удобную функцию, которая берет на себя всю тяжелую работу. Это наиболее «правильный» и современный подход.

Рассмотрим пример кода:


// Создаем новый документ
НовыйАкт = Документы.АктСверкиВзаиморасчетов.СоздатьДокумент();
НовыйАкт.Дата = ТекущаяДата();
НовыйАкт.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701234567");
НовыйАкт.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Поставщик Плюс");
НовыйАкт.ДатаНачала = НачалоМесяца(ТекущаяДата());
НовыйАкт.ДатаОкончания = КонецМесяца(ТекущаяДата());
НовыйАкт.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();

// Важно заполнить список счетов, иначе акт будет пустым!
Счет60_01 = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
НоваяСтрокаСчета = НовыйАкт.СписокСчетов.Добавить();
НоваяСтрокаСчета.Счет = Счет60_01;
НоваяСтрокаСчета.УчаствуетВРасчетах = Истина;

// Вызываем заполнение из модуля менеджера
Документы.АктСверкиВзаиморасчетов.ЗаполнитьАктСверкиПоДаннымИБ(НовыйАкт);

// Записываем результат
НовыйАкт.Записать(РежимЗаписиДокумента.Запись);

Важный нюанс: Функция ЗаполнитьАктСверкиПоДаннымИБ может работать асинхронно через механизм длительных операций. Если вы используете её в сложных обработках, убедитесь, что выполнение завершено, прежде чем переходить к следующим шагам.

Способ 2. Заполнение через структуру параметров и фоновое задание

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

Рассмотрим алгоритм по шагам:

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

Посмотрим на пример формирования структуры параметров:


СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ДатаНачала", ПериодДатаНачала);
// Используем Границу для включения документов последней секунды дня
ГраницаОкончания = Новый Граница(КонецДня(ПериодДатаОкончания), ВидГраницы.Включая);
СтруктураПараметров.Вставить("ДатаОкончания", ГраницаОкончания);
СтруктураПараметров.Вставить("Организация", ВыбраннаяОрганизация);
СтруктураПараметров.Вставить("Контрагент", ВыбранныйКонтрагент);
СтруктураПараметров.Вставить("СОбособленнымиПодразделениями", Ложь);
СтруктураПараметров.Вставить("ВыводитьСчетаФактуры", Ложь);
СтруктураПараметров.Вставить("ЗаполнятьДанныеКонтрагента", Истина);
СтруктураПараметров.Вставить("Валюта", Неопределено); // Неопределено для регламентированной валюты

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

// Добавляем аналитику (Контрагенты и Договоры — это стандарт для БП 3.0)
АналитикаРасчетов = Новый Массив;
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
СтруктураПараметров.Вставить("АналитикаРасчетов", АналитикаРасчетов);

Запуск процесса заполнения

После того как структура подготовлена, нам нужно запустить серверный метод подготовки данных. Поскольку расчеты могут быть длительными, 1С выполняет их в фоне. Проанализируем, как получить результат:


НаименованиеЗадания = "ЗаполнитьПоДаннымОрганизации";
РезультатЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
    УникальныйИдентификатор, 
    "Документы.АктСверкиВзаиморасчетов.ПодготовитьДанныеДляЗаполнения", 
    СтруктураПараметров, 
    НаименованиеЗадания
);

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

Критически важные моменты

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

  1. Табличная часть «Список счетов»: Это самая частая ошибка. Разработчики заполняют период и контрагента, но забывают добавить счета (например, 60.01, 62.01) в ТЧ СписокСчетов документа. В этом случае типовые запросы возвращают пустоту.
  2. Объект Граница: При указании даты окончания периода сверки всегда используйте Новый Граница(КонецДня(Дата), ВидГраницы.Включая). Если передать просто дату, документы, созданные «в ту же секунду» (например, в 23:59:59), могут не попасть в выборку.
  3. Валюта: Если акт сверки формируется в рублях, в структуру параметров для поля Валюта часто нужно передавать Неопределено (так работает внутренняя логика запросов БП 3.0), а реквизит ВалютаДокумента у самого объекта должен быть заполнен рублем.
  4. Синхронизация таблиц: В акте сверки есть две таблицы: ПоДаннымОрганизации и ПоДаннымКонтрагента. Если вы хотите, чтобы данные контрагента заполнились автоматически на основании данных организации (как при нажатии кнопки на форме), убедитесь, что в структуре параметров стоит флаг ЗаполнятьДанныеКонтрагента = Истина.

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

← На главную