Урок 5 из 8 · 25 мин · обновлено
Документы и проведение: как документ меняет учёт
Что происходит, когда пользователь нажимает «Провести»: движения документа, регистр накопления, обработчик ОбработкаПроведения и конструктор движений. Учим приходную накладную менять остатки товаров.
Зачем проводить документы
Склад получил 10 кастрюль, потом продал 3. Сколько кастрюль осталось? Можно каждый раз пересчитывать все накладные за всё время, но через год их будут тысячи, и отчёт станет открываться минуту.
В 1С поступают иначе: в момент проведения документ записывает итог своего события в специальную таблицу — регистр. Остатки потом берут из регистра — быстро, без пересчёта документов.
Так в 1С разделены две вещи:
- документ — что произошло: накладная с датой, складом и строками товаров;
- регистр — как это повлияло на учёт: плюс 10 кастрюль на основном складе.
Движения
Записи, которые документ делает в регистре, называются движениями. Каждое движение помнит, какой документ его сделал, — этот документ называют регистратором.
Поэтому учёт всегда можно разобрать обратно:
- отменили проведение — движения документа удалились, остатки вернулись к прежним;
- исправили и провели снова — старые движения заменились новыми, двойного учёта не будет;
- открыли движения документа — видно, что именно он изменил.
Регистр накопления
Для остатков служит регистр накопления. Его устройство:
- измерения — в каком разрезе считаем: товар, склад;
- ресурсы — что считаем: количество, сумма;
- вид движения — приход увеличивает остаток, расход уменьшает.
Регистр «Остатки товаров» с измерениями «Товар» и «Склад» и ресурсом «Количество» ответит на вопрос «сколько какого товара на каком складе».
Код проведения
Проведение описывают кодом в модуле объекта документа — в процедуре ОбработкаПроведения. Платформа вызывает её каждый раз, когда документ проводят:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого СтрокаТоваров Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Товар = СтрокаТоваров.Товар;
Движение.Склад = Склад;
Движение.Количество = СтрокаТоваров.Количество;
КонецЦикла;
КонецПроцедуры
Читается почти как текст:
- для каждой строки табличной части «Товары» добавить движение в регистр «Остатки товаров»;
- вид движения — приход, дата — дата документа;
- товар и количество взять из строки, склад — из реквизита документа.
Параметр Отказ позволяет запретить проведение: если присвоить ему Истина, документ не проведётся. Этим воспользуемся в уроке 7, чтобы не продавать товар, которого нет.
Писать такой код вручную не обязательно: конструктор движений в Конфигураторе составит его сам по выбранным полям. Разработчику остаётся проверить результат и при необходимости дописать.
Попробуйте сами. Создайте в учебной базе регистр накопления «Остатки товаров» и научите документ «Приход товара» делать в нём движения. Проведите два прихода и посмотрите движения регистра.
Решение по шагам
- Регистр. Правой кнопкой по «Регистры накопления» → Добавить. Имя —
ОстаткиТоваров, вид регистра — «Остатки», подсистема — «Склад». - На вкладке Данные добавьте измерения
Товар— тип «СправочникСсылка.Товары» — иСклад— тип «СправочникСсылка.Склады», и ресурсКоличество— тип «Число». - Документ. Откройте документ
ПриходТовара, вкладку Движения. Отметьте регистр «Остатки товаров» — документ станет его регистратором. - Нажмите Конструктор движений. Выберите табличную часть «Товары», нажмите Заполнить выражения и ОК. Конструктор создаст процедуру
ОбработкаПроведения, похожую на код выше. Строки-метки, которые он добавит вокруг кода, нужны ему самому — их можно оставить. - Нажмите F5 и примите обновление конфигурации базы.
- Проведите два прихода на разные склады. Затем откройте в разделе «Склад» список «Остатки товаров».
В списке регистра — строка на каждую строку накладных: период, регистратор, товар, склад, количество со значком прихода. Отмените проведение одной накладной — её строки исчезнут из регистра.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что происходит при проведении документа?
Сам документ — это запись о событии. Влияние на учёт выражается в движениях, которые он делает в регистрах.
-
Пользователь исправил количество в проведённой накладной и провёл её снова. Что будет с движениями?
Каждое движение помнит свой документ-регистратор. При повторном проведении платформа заменяет движения этого документа целиком.
-
Где пишут код, который выполняется при проведении документа?
Проведение — действие с объектом, а не с окном. Поэтому его код живёт в модуле объекта и работает, даже если документ проводят без открытия формы.