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