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