← Назад к вопросам

Товарная ведомость по складам

2.3 Middle🔥 201 комментариев
#СКД и отчёты

Условие

Создайте конфигурацию с товарной ведомостью для учёта движения товаров.

Требования к отчёту:

  • Входящий остаток на начало периода
  • Приход за период
  • Расход за период
  • Исходящий остаток на конец периода
  • Группировка по складам
  • Отображение только количества

Пример результата

СкладТоварВх.остатокПриходРасходИсх.остаток
Основной
Товар 11005030120
Товар 2200050150

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: Товарная ведомость по складам

Запрос для сбора данных

Функция ПолучитьТовраннуюВедомость(ДатаНачала, ДатаОкончания) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Остатки.Склад,
        |   Остатки.Номенклатура,
        |   Остатки.ОстатокНаНачалоПериода,
        |   СУММА(ВЫБОР КОГДА ПриходРасход.ВидДокумента = \"Приход\" 
        |               ТОГДА ПриходРасход.Количество
        |               ИНАЧЕ 0 КОНЕЦ) КАК ПриходЗаПериод,
        |   СУММА(ВЫБОР КОГДА ПриходРасход.ВидДокумента = \"Расход\" 
        |               ТОГДА ПриходРасход.Количество
        |               ИНАЧЕ 0 КОНЕЦ) КАК РасходЗаПериод,
        |   (Остатки.ОстатокНаНачалоПериода 
        |    + СУММА(ВЫБОР КОГДА ПриходРасход.ВидДокумента = \"Приход\" 
        |                    ТОГДА ПриходРасход.Количество
        |                    ИНАЧЕ 0 КОНЕЦ)
        |    - СУММА(ВЫБОР КОГДА ПриходРасход.ВидДокумента = \"Расход\" 
        |                    ТОГДА ПриходРасход.Количество
        |                    ИНАЧЕ 0 КОНЕЦ)) КАК ОстатокНаКонец
        |ИЗ
        |   (ВЫБРАТЬ
        |       РегистрОстатков.Склад,
        |       РегистрОстатков.Номенклатура,
        |       РегистрОстатков.КоличествоОстаток КАК ОстатокНаНачалоПериода
        |    ИЗ
        |       РегистрСведений.ОстаткиТоваров.Остатки(&ДатаНачала) КАК РегистрОстатков
        |   ) КАК Остатки
        |ЛЕВ ПРИСОЕДИНИТЬ
        |   (ВЫБРАТЬ
        |       \"Приход\" КАК ВидДокумента,
        |       ПриходПостав.Склад,
        |       ПриходПостав_Товары.Номенклатура,
        |       ПриходПостав_Товары.Количество
        |    ИЗ
        |       Документ.ПриходПостав КАК ПриходПостав
        |       ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ
        |       Документ.ПриходПостав.Товары КАК ПриходПостав_Товары
        |       НА ПриходПостав.Ссылка = ПриходПостав_Товары.Ссылка
        |    ГДЕ
        |       ПриходПостав.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |       И ПриходПостав.Проведён = Истина
        |    
        |    ОБЪЕДИНИТЬ ВСЕ
        |    
        |    ВЫБРАТЬ
        |       \"Расход\" КАК ВидДокумента,
        |       РасходМат.Склад,
        |       РасходМат_Товары.Номенклатура,
        |       РасходМат_Товары.Количество
        |    ИЗ
        |       Документ.РасходМатериалов КАК РасходМат
        |       ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ
        |       Документ.РасходМатериалов.Товары КАК РасходМат_Товары
        |       НА РасходМат.Ссылка = РасходМат_Товары.Ссылка
        |    ГДЕ
        |       РасходМат.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |       И РасходМат.Проведён = Истина
        |   ) КАК ПриходРасход
        |   НА Остатки.Склад = ПриходРасход.Склад
        |   И Остатки.Номенклатура = ПриходРасход.Номенклатура
        |СГРУППИРОВАТЬ ПО
        |   Остатки.Склад,
        |   Остатки.Номенклатура,
        |   Остатки.ОстатокНаНачалоПериода
        |УПОРЯДОЧИТЬ ПО
        |   Остатки.Склад,
        |   Остатки.Номенклатура";
    
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
    
    Результат = Запрос.Выполнить();
    Возврат Результат.Выгрузить();
    
КонецФункции

Формирование табличного документа

Процедура ФормироватьВедомость(ТабличныйДокумент, ДатаНачала, ДатаОкончания) Экспорт
    
    ТабличныйДокумент.Очистить();
    
    Данные = ПолучитьТовраннуюВедомость(ДатаНачала, ДатаОкончания);
    
    // Заголовок отчёта
    СтрокаЗаголовка = ТабличныйДокумент.Добавить();
    СтрокаЗаголовка.Вставить("Склад", "ТОВАРНАЯ ВЕДОМОСТЬ");
    ТабличныйДокумент.Строки[1].Оформление = ОформлениеЗаголовка();
    
    // Строка с периодом
    СтрокаПериода = ТабличныйДокумент.Добавить();
    СтрокаПериода.Вставить("Склад", "Период: с " + Формат(ДатаНачала, "ДФ=dd.MM.yyyy") 
                                    + " по " + Формат(ДатаОкончания, "ДФ=dd.MM.yyyy"));
    
    // Пустая строка
    ТабличныйДокумент.Добавить();
    
    // Заголовок таблицы
    СтрокаЗаголовка = ТабличныйДокумент.Добавить();
    СтрокаЗаголовка.Вставить("Склад", "Склад");
    СтрокаЗаголовка.Вставить("Номенклатура", "Товар");
    СтрокаЗаголовка.Вставить("ОстатокНаНачалоПериода", "Вх.остаток");
    СтрокаЗаголовка.Вставить("ПриходЗаПериод", "Приход");
    СтрокаЗаголовка.Вставить("РасходЗаПериод", "Расход");
    СтрокаЗаголовка.Вставить("ОстатокНаКонец", "Исх.остаток");
    
    // Данные по складам
    ТекущийСклад = Неопределено;
    
    Для каждого Строка Из Данные Цикл
        
        // Если сменился склад, добавляем название
        Если ТекущийСклад <> Строка.Склад Тогда
            
            ТекущийСклад = Строка.Склад;
            СтрокаСклада = ТабличныйДокумент.Добавить();
            СтрокаСклада.Вставить("Склад", Строка.Склад.Наименование);
            ТабличныйДокумент.Строки[ТабличныйДокумент.ВысотаТаблицы()].Оформление = ОформлениеСклада();
            
        КонецЕсли;
        
        // Строка товара
        СтрокаТовара = ТабличныйДокумент.Добавить();
        СтрокаТовара.Вставить("Склад", "");
        СтрокаТовара.Вставить("Номенклатура", Строка.Номенклатура.Наименование);
        СтрокаТовара.Вставить("ОстатокНаНачалоПериода", Строка.ОстатокНаНачалоПериода);
        СтрокаТовара.Вставить("ПриходЗаПериод", Строка.ПриходЗаПериод);
        СтрокаТовара.Вставить("РасходЗаПериод", Строка.РасходЗаПериод);
        СтрокаТовара.Вставить("ОстатокНаКонец", Строка.ОстатокНаКонец);
        
    КонецЦикла;
    
КонецПроцедуры

Оформление таблицы

Функция ОформлениеЗаголовка()
    
    Оформление = Новое Оформление;
    Оформление.Шрифт = Новый Шрифт(, 14, Истина, Ложь, Ложь, Ложь);
    Оформление.ЦветТекста = ЦветВHTML(Новый Цвет(0, 0, 0));
    
    Возврат Оформление;
    
КонецФункции

Функция ОформлениеСклада()
    
    Оформление = Новое Оформление;
    Оформление.Шрифт = Новый Шрифт(, 12, Истина, Ложь, Ложь, Ложь);
    Оформление.ЦветФона = ЦветВHTML(Новый Цвет(230, 230, 230));
    
    Возврат Оформление;
    
КонецФункции

Ключевые компоненты

Запрос включает:

  • Остатки на начало периода из РегистрСведений
  • Приход и расход из документов за период
  • Группировка по складам и товарам
  • Расчёт исходящего остатка

Таблица содержит:

  • Входящий остаток
  • Приход за период
  • Расход за период
  • Исходящий остаток
  • Группировка по складам
Товарная ведомость по складам | PrepBro