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