Проведение это отражение документа в учёте: запись движений по регистрам. Задачу «напишите проведение расходной накладной с контролем остатков» дают и на собесах, и на экзамене 1С:Специалист.
Где и как
Движения формируют в модуле объекта документа, в обработчике ОбработкаПроведения(Отказ, РежимПроведения). Он вызывается внутри транзакции записи документа. Наборы записей доступны через коллекцию Движения и отобраны по регистратору (этому документу).
Флаг Движения.ТоварыНаСкладах.Записывать = Истина говорит платформе записать набор после выхода из обработчика, заменив старые движения документа. Если флаг установлен, а движения не добавлены, старые движения просто удалятся.
Отказ = Истина отменяет проведение и откатывает транзакцию. Причину нужно сообщить пользователю.
Другие события модуля документа: ОбработкаЗаполнения (ввод на основании), ОбработкаПроверкиЗаполнения (обязательные данные), ПередЗаписью, ПриЗаписи, ОбработкаУдаленияПроведения.
Хорошее проведение
- Данные документа одним запросом: табличная часть, соединённая со справочниками, сгруппированная по товару. Без обращения через точку в цикле.
- Период движений равен дате документа, а не текущей дате.
- Все нужные движения: перемещение это расход с одного склада и приход на другой.
- Контроль остатков там, где он нужен.
Оперативное и неоперативное
Параметр РежимПроведения: оперативный (документ проводится «сейчас», контролируем остатки) или неоперативный (задним числом, контроль обычно не делают, чтобы не мешать вводу документов в произвольном порядке).
Старая методика контроля остатков
- Установить исключительную управляемую блокировку на остатки товаров и склада документа.
- Прочитать остатки на момент документа.
- Сравнить с количеством в документе, при нехватке Отказ.
- Сформировать и записать движения.
Без блокировки два документа одновременно прочитают один остаток и оба спишут его.
Новая методика
- У набора записей установить БлокироватьДляИзменения = Истина.
- Сформировать и записать движения (Движения.Записать()).
- Запросом получить остатки по товарам документа с границей, включающей документ:
Новый Граница(МоментВремени(), ВидГраницы.Включая). - Если остатки отрицательные, сообщить по каждой позиции и установить Отказ.
Новая методика блокирует меньше и проще: исключительная блокировка ставится при записи на изменяемые данные, и параллельный документ подождёт.
Последовательности и перепроведение
Если результат проведения зависит от предыдущих документов (себестоимость при списании), документ задним числом делает последующие неверными. Последовательность документов отслеживает границу, с которой нужно перепровести. В современных типовых себестоимость считается регламентно при закрытии месяца, а изменения закрытых периодов запрещаются датой запрета изменения.
Частые ошибки
- Забыли Записывать = Истина.
- ТекущаяДата() вместо Дата документа.
- Предупреждение() или Вопрос() в модуле объекта: на сервере интерфейса нет.
- Остатки по всей базе без момента времени и без отбора по складу.
- Проверка строк по отдельности, когда товар повторяется в нескольких строках.
Что спросят на собесе
- Напишите проведение расходной накладной с контролем остатков.
- Чем новая методика отличается от старой?
- Зачем нужна граница Включая?
- Что такое оперативное проведение?
- Как отказать в проведении и сообщить причину?