В процессе разработки учетных систем часто возникает задача закрепить материальную ответственность за конкретным человеком. Типичный пример: кассир или экспедитор принимает деньги от клиентов, и система должна четко отслеживать остаток средств именно у этого сотрудника. Если в документе оплаты обнаружится ошибка и он будет исправлен, остаток должен измениться только у того, кто этот документ оформил. В этой статье мы разберем, как правильно спроектировать такую систему в 1С, выберем подходящие типы данных и рассмотрим технические нюансы реализации.
Первый вопрос, с которым сталкивается разработчик: какой справочник использовать в качестве типа для измерения регистра накопления? Технически платформа 1С позволяет выбрать справочник Пользователи. Однако, проанализируем ситуацию глубже. Пользователь — это учетная запись для входа в систему. Сотрудник или Физическое лицо — это объект реального мира, несущий материальную ответственность.
Разберем, почему в профессиональной разработке чаще выбирают справочник Физические лица или Сотрудники:
Если же ваша задача носит чисто оперативный характер внутри узкого контура программы, использование справочника Пользователи допустимо, но требует осторожности.
Рассмотрим ситуацию: сотрудник принял 1000 рублей, сдал их в центральную кассу, его личный баланс стал равен нулю. Позже выяснилось, что сумма в чеке была 1010 рублей. После исправления документа у сотрудника должен возникнуть долг в 10 рублей. Чтобы это работало корректно, мы должны использовать Регистр накопления (вид: Остатки).
Проанализируем структуру регистра:
ОтветственноеЛицо (Тип: СправочникСсылка.ФизическиеЛица или СправочникСсылка.Пользователи).Организация (стандарт для большинства систем).Сумма (Тип: Число, 15, 2).Важный момент: чтобы остаток менялся только у создателя документа, нельзя определять "текущего пользователя" непосредственно в коде проведения через ПараметрыСеанса. Это распространенная ошибка. Если администратор или фоновое задание позже перепроведет документы, все движения "перепрыгнут" на администратора.
Правильный алгоритм:
Ответственный.
Объект.Ответственный = Пользователи.ТекущийПользователь();
// Или через поиск физического лица, связанного с пользователем
ОбработкаПроведения используем именно этот реквизит для записи в регистр.Рассмотрим подробнее сложную модель, которую часто называют "Расчеты через экспедиторов". В полевых условиях это работает так: экспедитор собирает выручку с 50 точек, сдает пачку денег кассиру, а документы — оператору. Оператор забивает данные, кассир считает наличность. Возникает временной разрыв и риск расхождений.
Чтобы поймать эту разницу, мы создаем регистр "Денежные средства у сотрудников". Рассмотрим по шагам:
Экспедитор.Экспедитор и одновременно "Приход" в кассу предприятия.Выясним, как упростить жизнь пользователю. Чтобы каждый сотрудник видел только свои остатки, не обязательно создавать сложные фильтры в отчетах вручную. Можно использовать механизм RLS (Record Level Security). Настроив ограничение доступа к регистру накопления по измерению ОтветственноеЛицо, мы добьемся того, что кассир Иванов при открытии любого отчета увидит только свои 10 рублей долга, а кассир Петров — свои.
Если же вы решите пойти по пути оптимизации и не плодить новые регистры, можно проанализировать возможность использования реквизита Автор или Ответственный в самих документах. Как отмечают эксперты, по этим реквизитам можно строить эффективные запросы и виртуальные таблицы оборотов, не создавая физических записей в регистрах, если вам не нужны остатки на каждую секунду времени.
Однако для задач материальной ответственности регистр остатков предпочтительнее, так как он позволяет:
Подводя итог, можно сказать: использовать пользователя (точнее, связанное с ним физическое лицо) в качестве измерения — это стандартная и полезная практика. Главное — обеспечить неизменность этого значения при перепроведении документов. Рассмотрим финальный пример кода в модуле проведения:
Процедура ОбработкаПроведения(Отказ, Режим)
// Очищаем движения
Движения.ДенежныеСредстваУСотрудников.Записывать = Истина;
Движения.ДенежныеСредстваУСотрудников.Очистить();
// Создаем новую запись
Движение = Движения.ДенежныеСредстваУСотрудников.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
// Используем реквизит документа, а не текущего пользователя системы!
Движение.Сотрудник = ЭтотОбъект.Ответственный;
Движение.Сумма = ЭтотОбъект.СуммаДокумента;
КонецПроцедуры
Такой подход гарантирует, что даже если документ будет изменен спустя месяц другим пользователем, корректировка баланса "прилетит" именно тому сотруднику, который изначально нес ответственность за эти денежные средства. Это делает систему прозрачной, надежной и устойчивой к ошибкам человеческого фактора.