Программное создание документа АктСверкиВзаиморасчетов в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) часто вызывает затруднения у начинающих разработчиков. Основная сложность заключается в том, что логика заполнения табличных частей этого документа традиционно «зашита» в модуле формы, а не в модуле объекта. Это делает невозможным простой вызов метода ДокументОбъект.Заполнить(). В данной статье мы подробно рассмотрим, как обойти это ограничение, разберем структуру необходимых параметров и изучим современные методы, появившиеся в последних релизах программы.
Когда мы пытаемся вызвать метод ЗаполнитьПоДаннымБухгалтерскогоУчета непосредственно у объекта документа, система выдает ошибку: «Метод объекта не обнаружен». Это происходит потому, что данная процедура определена в модуле формы документа. Для решения задачи нам необходимо либо имитировать действия формы, подготавливая данные через фоновые задания, либо использовать экспортные методы модуля менеджера.
В актуальных версиях БП 3.0 разработчики 1С добавили в модуль менеджера документа удобную функцию, которая берет на себя всю тяжелую работу. Это наиболее «правильный» и современный подход.
Рассмотрим пример кода:
// Создаем новый документ
НовыйАкт = Документы.АктСверкиВзаиморасчетов.СоздатьДокумент();
НовыйАкт.Дата = ТекущаяДата();
НовыйАкт.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701234567");
НовыйАкт.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Поставщик Плюс");
НовыйАкт.ДатаНачала = НачалоМесяца(ТекущаяДата());
НовыйАкт.ДатаОкончания = КонецМесяца(ТекущаяДата());
НовыйАкт.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
// Важно заполнить список счетов, иначе акт будет пустым!
Счет60_01 = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
НоваяСтрокаСчета = НовыйАкт.СписокСчетов.Добавить();
НоваяСтрокаСчета.Счет = Счет60_01;
НоваяСтрокаСчета.УчаствуетВРасчетах = Истина;
// Вызываем заполнение из модуля менеджера
Документы.АктСверкиВзаиморасчетов.ЗаполнитьАктСверкиПоДаннымИБ(НовыйАкт);
// Записываем результат
НовыйАкт.Записать(РежимЗаписиДокумента.Запись);
Важный нюанс: Функция ЗаполнитьАктСверкиПоДаннымИБ может работать асинхронно через механизм длительных операций. Если вы используете её в сложных обработках, убедитесь, что выполнение завершено, прежде чем переходить к следующим шагам.
Если вам требуется более гибкий контроль над процессом или вы работаете в версии, где вышеуказанная функция еще недоступна, проанализируем ручной способ заполнения. Этот метод основан на использовании процедуры ПодготовитьДанныеДляЗаполнения, которая находится в модуле менеджера и является экспортной.
Рассмотрим алгоритм по шагам:
СписокСчетов. Внимание: Без этой таблицы запрос к базе данных вернет пустой результат, так как система не будет знать, по каким счетам собирать остатки и обороты.СтруктурыПараметров, которая в точности повторяет требования типового алгоритма.Посмотрим на пример формирования структуры параметров:
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ДатаНачала", ПериодДатаНачала);
// Используем Границу для включения документов последней секунды дня
ГраницаОкончания = Новый Граница(КонецДня(ПериодДатаОкончания), ВидГраницы.Включая);
СтруктураПараметров.Вставить("ДатаОкончания", ГраницаОкончания);
СтруктураПараметров.Вставить("Организация", ВыбраннаяОрганизация);
СтруктураПараметров.Вставить("Контрагент", ВыбранныйКонтрагент);
СтруктураПараметров.Вставить("СОбособленнымиПодразделениями", Ложь);
СтруктураПараметров.Вставить("ВыводитьСчетаФактуры", Ложь);
СтруктураПараметров.Вставить("ЗаполнятьДанныеКонтрагента", Истина);
СтруктураПараметров.Вставить("Валюта", Неопределено); // Неопределено для регламентированной валюты
// Собираем массив счетов из табличной части документа
ФильтрСписокСчетов = Новый Массив;
Для Каждого Стр Из ДокументОбъект.СписокСчетов Цикл
Если Стр.УчаствуетВРасчетах Тогда
ФильтрСписокСчетов.Добавить(Стр.Счет);
КонецЕсли;
КонецЦикла;
СтруктураПараметров.Вставить("ФильтрСписокСчетов", ФильтрСписокСчетов);
// Добавляем аналитику (Контрагенты и Договоры — это стандарт для БП 3.0)
АналитикаРасчетов = Новый Массив;
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
АналитикаРасчетов.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
СтруктураПараметров.Вставить("АналитикаРасчетов", АналитикаРасчетов);
После того как структура подготовлена, нам нужно запустить серверный метод подготовки данных. Поскольку расчеты могут быть длительными, 1С выполняет их в фоне. Проанализируем, как получить результат:
НаименованиеЗадания = "ЗаполнитьПоДаннымОрганизации";
РезультатЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"Документы.АктСверкиВзаиморасчетов.ПодготовитьДанныеДляЗаполнения",
СтруктураПараметров,
НаименованиеЗадания
);
Если РезультатЗадания.ЗаданиеВыполнено Тогда
ДанныеИзХранилища = ПолучитьИзВременногоХранилища(РезультатЗадания.АдресХранилища);
// Заполняем реквизиты и таблицы объекта
ДокументОбъект.ОстатокНаНачало = ДанныеИзХранилища.ОстатокНаНачало;
ДокументОбъект.ПоДаннымОрганизации.Загрузить(ДанныеИзХранилища.ПоДаннымОрганизации);
// Если нужно зеркально заполнить данные контрагента
Если ДанныеИзХранилища.Свойство("ПоДаннымКонтрагента") Тогда
ДокументОбъект.ПоДаннымКонтрагента.Загрузить(ДанныеИзХранилища.ПоДаннымКонтрагента);
КонецЕсли;
КонецЕсли;
Разберем несколько нюансов, без которых программное создание акта сверки может работать некорректно:
СписокСчетов документа. В этом случае типовые запросы возвращают пустоту.Новый Граница(КонецДня(Дата), ВидГраницы.Включая). Если передать просто дату, документы, созданные «в ту же секунду» (например, в 23:59:59), могут не попасть в выборку.Валюта часто нужно передавать Неопределено (так работает внутренняя логика запросов БП 3.0), а реквизит ВалютаДокумента у самого объекта должен быть заполнен рублем.ПоДаннымОрганизации и ПоДаннымКонтрагента. Если вы хотите, чтобы данные контрагента заполнились автоматически на основании данных организации (как при нажатии кнопки на форме), убедитесь, что в структуре параметров стоит флаг ЗаполнятьДанныеКонтрагента = Истина.Выяснив эти особенности, мы можем создать надежный инструмент для массового формирования актов сверки, что значительно сэкономит время бухгалтерии. Рассмотренные методы позволяют корректно инициализировать документ, заполнить его согласно данным бухгалтерского учета и подготовить к печати или отправке через ЭДО.