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