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