Многие технические специалисты и бухгалтеры сталкиваются с ситуацией, когда после обновления конфигурации 1С:Бухгалтерия предприятия 3.0 (например, на релизы ветки 3.0.75 и выше) или после проведения регламентных операций по очистке базы, механизм зачета авансов начинает вести себя непредсказуемо. Вместо того чтобы закрывать реальные документы поступления или реализации, система создает проводки на пустой Документ расчетов с контрагентом, порождая «развернутое» сальдо по счету. В этой статье мы подробно разберем причины этой проблемы, кроющиеся глубоко в архитектуре регистра бухгалтерии, и найдем эффективные способы решения.
Рассмотрим ситуацию: при проведении банковских выписок или первичных документов (актов, накладных), где установлен режим «Зачет авансов: Автоматически», программа не видит существующую задолженность. Вместо этого она формирует новые записи, привязывая их к пустому субконто. Если мы попытаемся перепровести старые документы, ситуация только ухудшается — они также «перескакивают» на пустые документы расчетов.
Первым делом проанализируем состояние базы. Зачастую подозрение падает на платформу или ошибки обновления, однако, как показывает практика, причина обычно кроется в целостности данных. Для начала проверим итоги регистра бухгалтерии. Выполним простой запрос в консоли запросов, чтобы посмотреть остатки в разрезе всех измерений:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет,
ХозрасчетныйОстатки.Субконто1,
ХозрасчетныйОстатки.Субконто2,
ХозрасчетныйОстатки.Субконто3,
ХозрасчетныйОстатки.Организация,
ХозрасчетныйОстатки.Подразделение,
ХозрасчетныйОстатки.СуммаОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки
Если в результате запроса мы видим две строки по одному и тому же контрагенту и договору, где суммы в дебете и кредите одинаковы, но строки не «схлопываются», значит, есть различие в скрытых измерениях или субконто.
Выясним причину такого поведения. В платформе 1С:Предприятие для измерений регистров, таких как Подразделение, существует критическая разница между значением NULL и Пустой ссылкой (СправочникСсылка.ПодразделенияОрганизаций).
Проанализируем механику работы регистра Хозрасчетный:
Проблема возникает тогда, когда сторонняя обработка (чаще всего стандартная «Поиск и удаление дублей» или «Групповое изменение реквизитов») при замене контрагента или договора принудительно перезаписывает движения регистра. В этот момент она может ошибочно записать Пустую ссылку подразделения там, где должен быть NULL. Алгоритм зачета авансов в 1С:Бухгалтерия ищет остатки строго по соответствию всех измерений. Для него запись с подразделением NULL и запись с подразделением Пустая ссылка — это разные аналитические разрезы. В итоге система «не видит» долг и считает, что нужно создать новую запись.
Разберем, как выявить такие записи программным путем. Нам нужно найти проводки по счетам, где не ведется учет по подразделениям, но при этом поле Подразделение заполнено пустой ссылкой вместо положенного NULL. Используем следующий код запроса для поиска ошибок в дебете и кредите:
// Поиск ошибок в Дебете
ВЫБРАТЬ
Хозрасчетный.Регистратор,
Хозрасчетный.НомерСтроки
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.ПодразделениеДт = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И Хозрасчетный.СчетДт <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)
И НЕ Хозрасчетный.СчетДт.УчетПоПодразделениям
// Поиск ошибок в Кредите
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Хозрасчетный.Регистратор,
Хозрасчетный.НомерСтроки
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ГДЕ
Хозрасчетный.ПодразделениеКт = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
И Хозрасчетный.СчетКт <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)
И НЕ Хозрасчетный.СчетКт.УчетПоПодразделениям
Данный запрос покажет все документы (регистраторы), которые создают «неправильные» остатки. Чаще всего это ручные операции или документы, прошедшие через обработку объединения дублей.
Рассмотрим самый простой, но не всегда гарантированный метод. Иногда стандартный механизм Тестирования и исправления может восстановить логическую целостность.
Посмотрим на результат. Если после ТИИ система выдает сообщения вида «Значение должно быть NULL. Изменено на NULL», значит, часть проводок была исправлена автоматически.
Если ТИИ не помогло или записей слишком много, проанализируем программный метод исправления. Нам нужно пройтись по найденным запросом записям и принудительно установить значение NULL. Поскольку в коде 1С мы не можем напрямую присвоить NULL измерению регистра (платформа подставит пустую ссылку типа), эффективнее всего это делать через набор записей с отключением проверок или через прямой SQL-запрос (для клиент-серверных версий).
Для файловых баз можно использовать следующий алгоритм:
УчетПоПодразделениям у счета.ОбменДанными.Загрузка = Истина.В крупных клиент-серверных базах исправление через встроенный язык может занять часы. Разберем, как это сделать быстрее на стороне СУБД. Внимание: данный метод требует высокой квалификации и предварительного бэкапа!
Посмотрим на структуру таблиц. В MS SQL Server поле подразделения в таблице регистра (обычно это _AccRgEDXXX или _AccRgXXX) будет содержать бинарные данные. Нам нужно заменить бинарный идентификатор пустой ссылки (например, 0x00000000000000000000000000000000) на NULL там, где это необходимо.
Пример логики SQL-запроса:
UPDATE [_AccRgXXXX] -- Таблица движений регистра бухгалтерии
SET [_FldYYYY] = NULL -- Поле Подразделение
WHERE [_FldYYYY] = 0x00000000000000000000000000000000 -- Где сейчас пустая ссылка
AND [_AccountDtRRef] IN (SELECT [_IDRef] FROM [_AccXXXX] WHERE [_FldZZZZ] = 0) -- Для счетов без учета подразделений
Чтобы в будущем не сталкиваться с «разбеганием» зачета авансов, проанализируем меры предосторожности:
Хозрасчетный, убедитесь, что в коде корректно обрабатывается заполнение подразделений.Подведем итог. Проблема с «пустыми документами расчетов» — это не ошибка алгоритма самого зачета авансов, а следствие «грязных» данных в регистре бухгалтерии. Причиной является подмена значения NULL на пустую ссылку в измерении Подразделение. Исправив эти значения и восстановив целостность итогов, вы вернете корректную работу механизмов автоматического погашения задолженности в 1С:Бухгалтерия 3.0.