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