В типовой конфигурации «1С:Управление производственным предприятием 1.3» (УПП) регистр накопления Свободные остатки часто становится объектом жарких споров среди администраторов, программистов и пользователей. На первый взгляд он кажется избыточным, ведь в системе уже есть регистры Товары на складах и Товары в резерве на складах. Возникает логичный вопрос: зачем дублировать информацию и тратить ресурсы сервера на проведение документов по еще одному регистру? Особенно остро эта дилемма встает, когда данные между этими регистрами начинают расходиться.
В этой статье мы подробно разберем, какую роль выполняет регистр Свободные остатки, проанализируем последствия расхождений данных, выясним причины рассинхронизации и рассмотрим пошаговые алгоритмы исправления ошибок без радикального отключения этого важного механизма.
Давайте разберем внутреннюю кухню оперативного учета 1С:УПП. Чтобы понять важность регистра Свободные остатки, нам нужно рассмотреть альтернативный сценарий — его отсутствие. Если бы этого регистра не было, системе при каждом проведении расходного документа (например, Реализация товаров и услуг, Требование-накладная или Перемещение товаров) приходилось бы вычислять доступный остаток «на лету».
Для вычисления свободного остатка платформе пришлось бы выполнять следующий запрос:
ВЫБРАТЬ
СкладыОстатки.Номенклатура КАК Номенклатура,
СкладыОстатки.Склад КАК Склад,
ЕСТЬNULL(СкладыОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(РезервыОстатки.КоличествоОстаток, 0) КАК СвободныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК СкладыОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, ) КАК РезервыОстатки
ПО СкладыОстатки.Номенклатура = РезервыОстатки.Номенклатура
И СкладыОстатки.Склад = РезервыОстатки.Склад
При небольшом количестве пользователей и малой номенклатурной базе такой запрос работает быстро. Однако в условиях реального предприятия, где одновременно работают десятки менеджеров по продажам и кладовщиков, постоянное выполнение операции LEFT JOIN (левое соединение) для таблиц остатков двух массивных регистров неизбежно приведет к критическому падению производительности СУБД. Начнутся блокировки таблиц, пользователи будут жаловаться на зависание системы при проведении документов, а СУБД будет перегружать процессор.
Именно для этого разработчики фирмы 1С создали регистр Свободные остатки. Он выполняет роль консолидирующего узла, хранящего готовое агрегированное значение. Запрос к нему выглядит максимально просто и отрабатывает мгновенно:
ВЫБРАТЬ
СвободныеОстатки.Номенклатура КАК Номенклатура,
СвободныеОстатки.Склад КАК Склад,
СвободныеОстатки.КоличествоОстаток КАК СвободныйОстаток
ИЗ
РегистрНакопления.СвободныеОстатки.Остатки(&Период, ) КАК СвободныеОстатки
Помимо колоссального ускорения подбора товаров и проведения документов, регистр Свободные остатки выполняет еще несколько критически важных функций:
Свободные остатки.Свободные остатки служит единой точкой входа для наложения блокировок СУБД при проверке остатков. Без него заблокировать остатки без риска возникновения дедлоков (deadlocks — взаимных блокировок) практически невозможно.Рассмотрим ситуацию, когда данные в Свободных остатках разошлись с физическими остатками на складе и резервами. Это чревато возникновением двух крайне неприятных проблем:
Товары на складах образуется отрицательный остаток. В результате ломается партионный учет, а расчет себестоимости при закрытии месяца превращается в головную боль для бухгалтера.Проанализируем основные причины, из-за которых ломается синхронизация между физическими остатками, резервами и свободными остатками:
Заказ покупателя резервируется товар без указания серии, а в документе Реализация товаров и услуг менеджер указывает конкретную серию, по одной аналитике свободный остаток уйдет в «минус», а по другой останется висеть «плюс».Свободные остатки, расхождения гарантированы.Если вы обнаружили расхождения, не торопитесь отключать регистр в настройках или переписывать модули проведения документов «в обход». Рассмотрим системные способы решения проблемы.
В конфигурации 1С:УПП 1.3 предусмотрен отличный инструмент для поиска ошибок — отчет «Анализ расхождений по свободным остаткам». Запустите его, укажите интересующий период и склад. Отчет сопоставит математическую разницу (Товары на складах минус Резервы) с фактическим значением в Свободных остатках. Вы сразу увидите конкретные номенклатурные позиции и документы, которые послужили причиной рассинхронизации.
Выясним, как быстро «срезать» старые ошибки, не перепроводя базу за несколько лет. В настройках параметров учета (раздел контроля остатков) предусмотрена константа: «Дата начала использования регистра Свободные остатки».
Если ошибки копились годами, вы можете сдвинуть эту дату на начало текущего месяца или квартала. При этом движения по регистру до указанной даты перестанут учитываться, а система сформирует корректные стартовые остатки на новую дату. Это позволяет быстро реанимировать учет без тотального перепроведения прошлых периодов.
Если расхождения вызваны хаотичным вводом документов задним числом, лучшим решением будет проведение группового перепроведения документов. Выполните восстановление последовательности партионного учета и расчетов. В процессе перепроведения система заново запишет движения по всем регистрам в правильной хронологической последовательности, что автоматически устранит расхождения.
Если вы программируете в УПП и создаете новые механизмы списания товаров, всегда проверяйте, чтобы в коде обработчика проведения присутствовала запись в регистр Свободные остатки. Посмотрим на пример корректного заполнения движений при списании товара:
Движения.СвободныеОстатки.Записывать = Истина;
Для Каждого ТекСтрокаИзТабличнойЧасти Из Товары Цикл
Движение = Движения.СвободныеОстатки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Ссылка.Дата;
Движение.Номенклатура = ТекСтрокаИзТабличнойЧасти.Номенклатура;
Движение.Склад = Ссылка.Склад;
// Обязательно учитываем характеристики, если они используются в учете
Движение.ХарактеристикаНоменклатуры = ТекСтрокаИзТабличнойЧасти.ХарактеристикаНоменклатуры;
Движение.Количество = ТекСтрокаИзТабличнойЧасти.Количество;
КонецЦикла;
Регистр Свободные остатки — это фундамент высокой производительности и стабильности складского учета в 1С:УПП 1.3. Отключать его или игнорировать расхождения категорически не рекомендуется. Регулярно используйте отчет «Анализ расхождений по свободным остаткам», при необходимости корректируйте дату начала использования регистра и следите за аккуратностью работы пользователей. Соблюдение этих простых правил убережет вашу систему от зависаний, а учет — от хаоса при закрытии месяца.