Как сформировать Акт сверки взаиморасчетов без учета Организации в 1С:Бухгалтерия 3.0

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

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

Зачем нужен акт сверки без организации

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

Разбор технической проблемы при заполнении

При попытке самостоятельно написать алгоритм заполнения через запрос к регистру бухгалтерии Хозрасчетный, разработчики часто сталкиваются с ошибкой: «Значение не является значением объектного типа (Метаданные)». Выясним причину этой ошибки на примере кода, который часто используют для определения типа документа.

Проанализируем фрагмент кода, вызывающий исключение:


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

Эта ошибка возникает по причине того, что в выборку запроса могут попадать записи, где поле Регистратор не заполнено. Например, при получении итоговых записей или начальных остатков из виртуальных таблиц. Если Регистратор равен NULL или Неопределено, обращение к свойству Метаданные логично приводит к краху программы. Посмотрим, как правильно написать проверку.

Правильная работа с регистратором в запросе

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

  1. В тексте запроса обязательно выбирайте поле Регистратор.
  2. В цикле обхода выборки добавьте проверку на заполненность ссылки.
  3. Вместо строкового сравнения имен метаданных используйте оператор ТипЗнч().

Пример исправленного кода:


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

Реализация через расширение: обход типовых процедур

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

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

Шаг 2. Использование метода «Вместо». В расширении создайте процедуру-преемник. Скопируйте в нее типовой код, но удалите или закомментируйте условие фильтрации по организации:


// В типовом коде:
// Запрос.УстановитьПараметр("Организация", Параметры.Организация);
// ТекстЗапроса = ТекстЗапроса + "ГДЕ Хозрасчетный.Организация = &Организация";

// В вашем расширении просто пропускаем это условие, оставляя отбор только по контрагенту
Запрос.УстановитьПараметр("Контрагент", Параметры.Контрагент);

Шаг 3. Обработка прав доступа (RLS). Помните, что если в базе настроены права доступа на уровне записей (RLS) по организациям, то обычный бухгалтер может не увидеть данные по «чужим» компаниям холдинга даже после изменения кода. В этом случае может потребоваться выполнение запроса в привилегированном модуле.

Альтернативные способы решения задачи

Иногда программирование — не самый быстрый путь. Если бухгалтеру нужно просто увидеть цифры, разберем более простые инструменты:

Важные замечания по печати

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

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

← На главную