Почему не обновляется статус оплаты счета в 1С:Бухгалтерия 3.0 и как это исправить?

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

Многие пользователи и разработчики при работе в программе «1С:Бухгалтерия предприятия 3.0» (БП 3.0) сталкиваются с неприятной ситуацией: оплата по счету фактически поступила, в базе зарегистрированы все платежные поручения или кассовые ордера, но в списке документов «Счета покупателям» статус по-прежнему отображается как «Не оплачен». Статус обновляется только в том случае, если открыть документ вручную и заново его перепровести. При этом стандартное групповое перепроведение документов за период не приносит никакого результата.

В этой статье мы подробно разберем внутреннюю архитектуру учета статусов оплаты в 1С, выясним технические причины возникновения этой проблемы и рассмотрим практические способы ее решения как для обычных пользователей, так и для программистов.


Архитектурное устройство: почему в 1С:БП 3.0 разделены регистры оплаты

Для начала проанализируем, как именно платформа хранит информацию об оплатах. В старых версиях конфигураций статус оплаты мог храниться непосредственно в реквизите самого документа «Счет на оплату покупателю». Однако в современных редакциях БП 3.0 разработчики фирмы «1С» полностью отказались от этой схемы в пользу более гибкой, но сложной двухзвенной архитектуры.

Сегодня за контроль и отображение оплаты отвечают два абсолютно разных регистра:

  1. Регистр накопления ОплатаСчетов. Это классический остаточный (или приходно-расходный) регистр. Движения по нему делают исключительно документы-регистраторы: «Поступление на расчетный счет», «Приходный кассовый ордер», «Операция Бух», а также сам «Счет на оплату» при выставлении. В этом регистре хранятся точные числовые данные о суммах взаиморасчетов в разрезе договоров, контрагентов и счетов.
  2. Регистр сведений СтатусыДокументов. Это независимый (не подчиненный регистратору) регистр сведений. Именно из него система считывает текущее текстовое или визуальное состояние документа («Оплачен», «Не оплачен», «Частично оплачен») при открытии формы списка или формы самого счета. В форме документа при инициализации на сервере (процедура ПриСозданииНаСервере) значение статуса считывается именно из этой таблицы БД.

Как они взаимодействуют в штатном режиме:

Когда вы проводите платежный документ (например, поступление на расчетный счет), система делает две вещи:


Почему групповое перепроведение документов «ломает» статусы?

Выясним причину, почему при массовом перепроведении документов статусы часто остаются «зависшими» в неактуальном состоянии.

Поскольку регистр сведений СтатусыДокументов является независимым, записи в нем не привязаны жестко к транзакции проведения конкретного платежного документа на уровне платформы. При выполнении стандартного группового перепроведения (особенно через специализированные обработки или при загрузке данных через механизмы синхронизации) система часто использует оптимизированные режимы записи данных:

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


Как исправить статусы без ручного перепроведения документов

Рассмотрим несколько эффективных способов решения проблемы рассинхронизации данных.

Способ 1. Групповое изменение статуса через форму списка

Самый простой интерактивный метод, не требующий программирования:

  1. Перейдите в список документов «Счета покупателям».
  2. Выделите нужные счета (используя комбинации клавиш Ctrl + A для выделения всех или удерживая Shift/Ctrl для выборочного выделения).
  3. Нажмите на панели кнопку «Еще» и выберите пункт «Изменить статус».
  4. Выберите необходимый статус вручную. Программа принудительно перезапишет данные в регистре сведений СтатусыДокументов для всех выбранных объектов.

Способ 2. Программный пересчет статусов (для разработчиков)

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


Процедура АктуализироватьСтатусыСчетовНаСервере() Экспорт
    
    // Выбираем все счета, у которых есть расхождения между оплатой и статусом
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СчетНаОплату.Ссылка КАК Ссылка,
        |	ЕСТЬNULL(ОплатаОстатки.СуммаОстаток, 0) КАК ОстатокОплаты,
        |	ЕСТЬNULL(Статусы.Статус, ЗНАЧЕНИЕ(Перечисление.СтатусыОплатыСчетов.НеОплачен)) КАК ТекущийСтатус
        |ИЗ
        |	Документ.СчетНаОплатуПокупателю КАК СчетНаОплату
        |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОплатаСчетов.Остатки КАК ОплатаОстатки
        |		ПО ОплатаОстатки.СчетОплаты = СчетНаОплату.Ссылка
        |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыДокументов КАК Статусы
        |		ПО Статусы.Документ = СчетНаОплату.Ссылка
        |ГДЕ
        |	СчетНаОплату.Проведен = ИСТИНА";
        
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Определяем, какой статус должен быть фактически
        Если Выборка.ОстатокОплаты <= 0 Тогда
            ПравильныйСтатус = ПредопределенноеЗначение("Перечисление.СтатусыОплатыСчетов.Оплачен");
        ИначеЕсли Выборка.ОстатокОплаты < Выборка.Ссылка.СуммаДокумента Тогда
            ПравильныйСтатус = ...; // Логика для частично оплаченного
        Иначе
            ПравильныйСтатус = ПредопределенноеЗначение("Перечисление.СтатусыОплатыСчетов.НеОплачен");
        КонецЕсли;
        
        // Если статус в регистре сведений не совпадает с расчетным - перезаписываем его
        Если Выборка.ТекущийСтатус <> ПравильныйСтатус Тогда
            Набор = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
            Набор.Отбор.Документ.Установить(Выборка.Ссылка);
            
            НоваяЗапись = Набор.Добавить();
            НоваяЗапись.Документ = Выборка.Ссылка;
            НоваяЗапись.Статус = ПравильныйСтатус;
            
            Набор.Записать(Истина);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Загадка индикации: почему один статус «Не оплачен» горит красным, а другой — серым?

Еще один частый вопрос: почему в одной информационной базе статус «Не оплачен» подсвечивается ярким красным цветом, а в другой (например, после переноса или загрузки данных) — нейтральным серым?

Разберем этот механизм:

Где программа берет дату планируемой оплаты:

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

Если после переноса данных все статусы стали серыми, вам необходимо проверить заполнение реквизита ОплатаДо в документах или настроить сроки оплаты в параметрах новой информационной базы.


Как открыть скрытые регистры («Все функции») в облаке 1С:Фреш

Для детального анализа ситуации пользователю часто требуется заглянуть напрямую в регистры сведений и накопления. Но как быть, если база находится в облаке (например, в сервисе «1С:Предприятие через интернет» / 1С:Фреш), где меню «Все функции» («Функции для технического специалиста») заблокировано?

Рассмотрим два способа обхода этого ограничения:

Способ А. Активация команды в параметрах (требуются права Администратора)

  1. Откройте главное меню программы (в правом верхнем углу нажмите кнопку с изображением шестеренки или стрелочки вниз «Сервис и настройки»).
  2. Перейдите в раздел «Настройки» — «Параметры».
  3. В самом низу открывшегося окна установите флажок напротив опции «Отображать команду "Функции для технического специалиста"».
  4. Нажмите «ОК». Теперь в главном меню появится нужный технический раздел.

Способ Б. Быстрый переход по навигационной ссылке (работает всегда)

Если интерфейс облака урезан правами доступа, но у вас есть базовые административные полномочия, вы можете открыть любой регистр напрямую по его внутреннему адресу (URL):

  1. Нажмите комбинацию горячих клавиш Shift + F11 (или откройте меню «Сервис и настройки» — «Перейти по ссылке»).
  2. Вставьте в текстовое поле адрес нужного объекта:
    • Для просмотра независимого регистра сведений со статусами: e1cib/list/РегистрСведений.СтатусыДокументов
    • Для анализа движений регистра накопления оплат: e1cib/list/РегистрНакопления.ОплатаСчетов
  3. Нажмите кнопку «Перейти».

Используя этот лайфхак, вы сможете мгновенно анализировать реальное состояние записей в базах данных облачного сервиса и вовремя диагностировать расхождения в учете.

← На главную