Как правильно получить остатки номенклатуры и заполнить табличную часть документа в 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке учетных систем на платформе 1С часто возникают вопросы, связанные с взаимодействием документов и регистров накопления. Рассмотрим подробнее, почему возникают сложности при попытке «достать» данные из регистра и как правильно реализовать процесс автоматического заполнения табличной части документа Расходная накладная.

Разберемся с архитектурой данных

Первое, что необходимо уяснить: регистр накопления — это не хранилище «готовых объектов», а запись об изменениях состояния учета. Когда вы проводите документ Сборка, он делает движения по регистрам (например, списывает детали и приходует системный блок). В Расходной накладной мы не должны пытаться «вытащить» сам системный блок из регистра как из справочника. Мы должны обратиться к виртуальной таблице остатков, чтобы узнать, какие блоки доступны к продаже на определенный момент времени.

Правильная работа с остатками в модуле проведения

Для того чтобы исключить продажу товаров «в минус», мы используем запросы к виртуальной таблице Остатки. Важно помнить, что остатки нужно получать на момент проведения конкретного документа. Если вы не укажете период, система может выдать неактуальные данные.

Рассмотрим пример кода для проверки остатков в процедуре ОбработкаПроведения:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    Остатки.Номенклатура КАК Товар,
|    Остатки.КоличествоОстаток КАК Количество
|ИЗ
|    РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, Номенклатура В (&СписокТоваров)) КАК Остатки
|ГДЕ
|    Остатки.КоличествоОстаток < 0";

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("СписокТоваров", Товары.ВыгрузитьКолонку("Товар"));

Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
    // Обработка ошибки нехватки товара
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить("Не хватает товара: " + Выборка.Товар);
    КонецЦикла;
    Отказ = Истина;
КонецЕсли;

Реализация кнопки «Заполнить» для расходной накладной

Чтобы предоставить пользователю возможность выбора системных блоков за определенный период, мы создаем механизм заполнения табличной части. Помните, что пользователь вводит информацию о системном блоке, а система должна проверять наличие комплектующих.

  1. Создание формы: Разместите в форме документа дополнительные реквизиты ДатаНачала и ДатаКонца.
  2. Запрос к данным: При нажатии на кнопку «Заполнить» используйте запрос к виртуальной таблице Обороты или Остатки, чтобы получить список номенклатуры, которая была «оприходована» в регистр документом Сборка.
  3. Заполнение: Очистите текущую табличную часть Товары и заполните её данными, полученными из результата запроса, используя метод Добавить() для каждой строки выборки.

Важные советы для разработчика

Проанализируем основные ошибки, которые часто допускают начинающие:

Помните, что в 1С важна не только техническая реализация кода, но и правильная постановка задачи. Если вы четко опишете, что именно должно попадать в табличную часть (состав блоков или готовые изделия), написание запроса станет гораздо проще. Разбирайтесь в механизмах движения документов, и тогда любая задача по учету станет для вас прозрачной и понятной.

← На главную