Как программно заполнить Акт сверки взаиморасчетов в 1С:УПП 1.3?

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

При автоматизации рутинных операций в конфигурации «Управление производственным предприятием» (УПП 1.3) разработчики часто сталкиваются с задачей группового формирования документов. Одной из таких задач является массовая генерация актов сверки взаиморасчетов по списку контрагентов за определенный период. На первый взгляд, задача кажется тривиальной: создать документ, заполнить реквизиты шапки и запустить стандартный механизм расчета. Однако при попытке реализовать это программно многие сталкиваются с тем, что созданный документ остается пустым, а его табличные части не заполняются.

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

Почему ручной запрос из документа работает некорректно?

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

Выясним причину этого поведения. В регистре бухгалтерии «Хозрасчетный» измерения субконто (такие как Субконто1, Субконто2 и т. д.) имеют составной тип данных. На уровне метаданных система не знает заранее, какой вид субконто будет назначен на конкретном счете учета в конкретной проводке.

Когда мы пишем условие в параметрах виртуальной таблицы:

И Субконто1 = &Контрагент

Платформа 1С на уровне синтаксического анализа текста запроса не может однозначно определить, ссылку на какой именно справочник ожидает разработчик (это могут быть «Контрагенты», «Договоры контрагентов», «Физические лица» или «Номенклатура»). Именно поэтому:

  1. В консоли запросов колонка типа для параметра &Контрагент остается пустой (или принимает значение Неопределено). Чтобы запрос отработал, тип приходится выбирать вручную.
  2. В программном коде эта проблема исчезает сама собой, если в переменную Контрагент передается реальная ссылка на элемент справочника Справочники.Контрагенты. Платформа автоматически выполнит неявное приведение типов во время выполнения запроса.

Если же отладчик показывает, что значение параметра не присвоено, это сигнализирует лишь об одном: на момент вызова метода Запрос.УстановитьПараметр() сама исходная переменная в вашем коде была пустой или содержала значение Неопределено.

Основная причина пустых табличных частей

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

Дело в архитектуре документа «Акт сверки взаиморасчетов» в 1С:УПП. Расчет данных и выборка по регистру бухгалтерии строятся строго на основании списка счетов учета расчетов. Этот список хранится в табличной части самого документа, которая называется СписокСчетов (колонки Счет и УчаствуетВРасчетах).

При интерактивной работе (когда пользователь создает документ в интерфейсе) эта табличная часть заполняется автоматически при выборе контрагента или при открытии формы на основании настроек по умолчанию. Но при программном создании объекта форма документа не открывается, события формы не отрабатывают, и табличная часть СписокСчетов остается абсолютно пустой. Стандартный алгоритм пытается собрать обороты по пустому списку счетов и закономерно возвращает нулевой результат.

Правильный алгоритм программного заполнения документа

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

Рассмотрим подробный пример кода, который решает эту задачу "под ключ":


// Шаг 1. Создаем новый документ программно
НовыйАкт = Документы.АктСверкиВзаиморасчетов.СоздатьДокумент();

// Шаг 2. Заполняем основные реквизиты шапки документа
НовыйАкт.Дата = ТекущаяДата();
НовыйАкт.Организация = ВыбраннаяОрганизация; // Ссылка на справочник Организации
НовыйАкт.Контрагент = ВыбранныйКонтрагент;   // Ссылка на справочник Контрагенты
НовыйАкт.ДатаНачала = ДатаНачалаСверки;
НовыйАкт.ДатаОкончания = КонецДня(ДатаОкончанияСверки);
НовыйАкт.ВалютаДокумента = ВалютаСверки;     // Валюта, по которой будет производиться сверка

// Если требуется произвести сверку по конкретному договору, заполняем реквизит.
// Если оставить его пустым, система соберет данные по всем договорам контрагента в этой валюте.
// НовыйАкт.ДоговорКонтрагента = ВыбранныйДоговор; 

// Шаг 3. Заполняем табличную часть "СписокСчетов"
// Определяем список базовых счетов расчетов, по которым требуется собрать информацию
СписокБазовыхСчетов = Новый Массив;
СписокБазовыхСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками);   // Счет 60
СписокБазовыхСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками);     // Счет 62
СписокБазовыхСчетов.Добавить(ПланыСчетов.Хозрасчетный.РасчетыСРазнымиДебиторамиИКредиторами); // Счет 76

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

// Шаг 4. Вызываем штатный метод заполнения по бухгалтерскому учету
// Эта процедура автоматически рассчитает начальное сальдо и заполнит ТЧ "ПоДаннымОрганизации"
НовыйАкт.ЗаполнитьПоДаннымБухгалтерскогоУчета();

// Шаг 5. Заполняем сторону контрагента
// Как правило, при создании акта сверки табличная часть "ПоДаннымКонтрагента" заполняется теми же данными
НовыйАкт.ПоДаннымКонтрагента.Загрузить(НовыйАкт.ПоДаннымОрганизации.Выгрузить());

// Шаг 6. Записываем готовый документ
// Обратите внимание: Акт сверки взаиморасчетов является информационным документом 
// и не делает движений по регистрам, поэтому проводить его не нужно, достаточно просто записать.
НовыйАкт.Записать(РежимЗаписиДокумента.Запись);

Важные нюансы, которые необходимо учитывать

Для стабильной работы механизма в реальной базе данных обратите внимание на следующие особенности реализации:

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

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

← На главную