Как программно получить долг контрагента в 1С:УНФ с учетом организации и ограничений RLS

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

При разработке в среде 1С:Управление нашей фирмой (УНФ) программисты часто сталкиваются с задачей вывода текущего сальдо взаиморасчетов в различных формах или обработках. Типичная ошибка — использование методов, встроенных в документы (например, СверкаВзаиморасчетов). Разберем, почему это не работает под ограниченными правами и как правильно реализовать получение долга, чтобы система работала корректно даже при включенном RLS (ограничение доступа на уровне записей).

Почему стандартные функции документов не подходят?

Рассмотрим ситуацию: автор темы пытался использовать метод Документы.СверкаВзаиморасчетов.ПолучитьВыборкуДанныхОрганизации(ДанныеДокумента). Эта функция предназначена для формирования детального отчета о движениях. Проблема заключается в том, что внутри таких функций часто выполняются запросы, которые пытаются прочитать объекты (документы-регистраторы), на которые у пользователя (например, менеджера по продажам) нет прав. При включенном RLS это приводит к ошибке доступа.

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

Вариант 1. Использование универсального регистра «Взаиморасчеты»

В современных версиях 1С:УНФ расчеты с покупателями и поставщиками консолидированы в едином регистре накопления — Взаиморасчеты. Это «золотой стандарт» для получения оперативных данных. Выясним, как составить запрос правильно.

Для получения чистого остатка нам достаточно обратиться к виртуальной таблице Остатки. Рассмотрим пример кода:


Функция ПолучитьОстатокДолга(Контрагент, Организация) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаДолга
        |ИЗ
        |	РегистрНакопления.Взаиморасчеты.Остатки(, Контрагент = &Контрагент И Организация = &Организация) КАК ВзаиморасчетыОстатки";
    
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("Организация", Организация);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.СуммаДолга;
    КонецЕсли;
    
    Возврат 0;
КонецФункции

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

Вариант 2. Обход ограничений через привилегированный модуль

Если бизнес-логика предполагает, что пользователь должен видеть сумму долга, но прав на чтение регистра у него нет (или они ограничены RLS), мы должны вынести код получения остатка в привилегированный общий модуль. Рассмотрим по шагам:

  1. Создадим (или найдем) общий модуль, у которого в свойствах установлена галочка «Привилегированный».
  2. Разместим в нем функцию запроса к остаткам.
  3. При вызове этой функции из формы или другого модуля, 1С проигнорирует ограничения прав доступа и выполнит запрос с правами администратора, вернув только конечное число.

Это абсолютно безопасный метод, так как мы возвращаем не ссылки на секретные документы, а просто агрегированную сумму, необходимую для оперативной работы менеджера.

Вариант 3. Использование встроенного модуля «ВзаиморасчетыСервер»

В УНФ уже существуют мощные инструменты для работы с задолженностью. Разберем работу с модулем ВзаиморасчетыСервер. В нем есть экспортные функции, которые учитывают специфику учета (валюты, авансы, заказы).

Наиболее полезная функция — ВзаиморасчетыСервер.ПолучитьОстаткиВзаиморасчетов. Она принимает структуру параметров, что делает ее крайне гибкой. Посмотрим на пример использования:


Параметры = Новый Структура;
Параметры.Вставить("Контрагент", Объект.Контрагент);
Параметры.Вставить("Организация", Объект.Организация);
Параметры.Вставить("Период", ТекущаяДата());

ТаблицаОстатков = ВзаиморасчетыСервер.ПолучитьОстаткиВзаиморасчетов(Параметры);
// На выходе получаем таблицу со всеми разрезами учета

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

Вариант 4. Механизм «Состояние взаиморасчетов»

В типовых формах списков контрагентов УНФ часто используются цветные индикаторы долга. Этот механизм работает через обработку СостояниеВзаиморасчетов. Если нам нужно получить данные в том же виде, в котором их видит пользователь в интерфейсе программы, мы можем вызвать методы менеджера этой обработки.

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

Рекомендации по реализации

Подведем итог. При выборе метода получения долга в УНФ следуйте этим правилам:

Соблюдение этих принципов позволит вам создавать быстрые и надежные механизмы проверки задолженности, которые не будут «падать» при изменении прав доступа пользователей.

← На главную