Как в 1С:Управление торговлей 11 получить остатки и обороты товаров по складам для выгрузки

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

При разработке внешних обработок выгрузки и отчетов в конфигурации «1С:Управление торговлей 11» разработчики часто сталкиваются с многообразием товарных регистров накопления. Возникает вопрос: по какому именно регистру собирать начальные остатки, приход, расход и конечные остатки в разрезе складов и номенклатуры, и как правильно обрабатывать ресурсы ВНаличии и КОтгрузке. Разберем архитектуру складского учета в УТ 11 и пошагово построим правильный запрос для получения данных.

Архитектура товарных регистров в УТ 11: разделение физического и финансового учета

В отличие от более ранних редакций (например, УТ 10.3), в УТ 11 учет разделен на два независимых контура:

  1. Физический складской учет — фиксирует реальное нахождение товаров в местах хранения. За него отвечает регистр накопления ТоварыНаСкладах.
  2. Финансовый (организационный) учет — отражает принадлежность товаров конкретным собственным организациям (включая учет по ГТД, комиссионный товар и схему «Интеркампани»). За это отвечает регистр накопления ТоварыОрганизаций.

Если стоит задача получить фактические движения товаров по конкретным складам компании (классическая ведомость движения ТМЦ), нашим основным источником данных всегда выступает регистр накопления ТоварыНаСкладах.

Ресурсы «В наличии» и «К отгрузке»: как правильно рассчитать остаток

В регистре ТоварыНаСкладах присутствуют два ключевых ресурса: ВНаличии и КОтгрузке. Выясним причину их разделения:

  1. Ресурс ВНаличии — это фактическое физическое количество товара, находящееся на складе. Именно этот ресурс используется для классического материального баланса: Начальный остаток + Приход − Расход = Конечный остаток.
  2. Ресурс КОтгрузке — это оперативное зарезервированное количество. Оно увеличивается, когда на складе с ордерной схемой формируется распоряжение на отгрузку (например, создается РасходныйОрдерНаТовары в статусе «К отбору» или «К отгрузке»), и списывается в момент фактической отгрузки.

Важно: для получения корректных начальных и конечных остатков, а также оборотов за период не нужно вычитать ресурс КОтгрузке из ресурса ВНаличии. Если вычесть «К отгрузке», нарушится балансовое равенство ведомости, так как «К отгрузке» не имеет замкнутого финансово-складского оборота. Для выгрузки реального движения товаров берутся исключительно поля ресурса ВНаличии.

Составление запроса к виртуальной таблице «ОстаткиИОбороты»

Рассмотрим пример запроса к виртуальной таблице РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты. Запрос выбирает начальный остаток, приход, расход и конечный остаток по номенклатуре и складам за указанный период:


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

Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ПериодВыгрузки.ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", Новый Граница(КонецДня(ПериодВыгрузки.ДатаОкончания), ВидГраницы.Включая));

РезультатЗапроса = Запрос.Выполнить();

Проанализируем важные детали при работе с данным запросом:

  1. Параметр границы окончания: Чтобы в выборку попали все движения, проведенные в последнюю секунду периода, обязательно передаем дату окончания через объект Граница с видом ВидГраницы.Включая либо используем функцию КонецДня().
  2. Характеристики, серии и назначения: В регистре ТоварыНаСкладах есть дополнительные измерения: Характеристика, Серия и Назначение. Если принимающая сторона требует данные только в разрезе номенклатуры, в запросе следует явно сгруппировать результат по полям Склад и Номенклатура, применив агрегатную функцию СУММА() к остаткам и оборотам.

Особенности ордерной схемы и адресного хранения

Разберем по шагам, как настройки складского учета влияют на данные регистра ТоварыНаСкладах:

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

Формирование файла DBF для передачи данных

Если сформированные остатки и обороты необходимо сохранить в файл формата DBF, используем объект платформы XBase. Посмотрим на типовой алгоритм создания и заполнения таблицы:


ФайлDBF = Новый XBase;
ФайлDBF.Кодировка = КодировкаXBase.ANSI;

// Создаем структуру полей
ФайлDBF.Поля.Добавить("SKLAD", "S", 50);
ФайлDBF.Поля.Добавить("TOVAR", "S", 100);
ФайлDBF.Поля.Добавить("START_BAL", "N", 15, 3);
ФайлDBF.Поля.Добавить("IN_QTY", "N", 15, 3);
ФайлDBF.Поля.Добавить("OUT_QTY", "N", 15, 3);
ФайлDBF.Поля.Добавить("END_BAL", "N", 15, 3);

ФайлDBF.СоздатьФайл(ПутьКФайлу);

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	ФайлDBF.Добавить();
	ФайлDBF.SKLAD = СокращенныйТекст(Выборка.Склад.Наименование);
	ФайлDBF.TOVAR = СокращенныйТекст(Выборка.Номенклатура.Наименование);
	ФайлDBF.START_BAL = Выборка.НачальныйОстаток;
	ФайлDBF.IN_QTY = Выборка.Приход;
	ФайлDBF.OUT_QTY = Выборка.Расход;
	ФайлDBF.END_BAL = Выборка.КонечныйОстаток;
	ФайлDBF.Записать();
КонецЦикла;

ФайлDBF.ЗакрытьФайл();

При выгрузке в DBF учитываем ограничения формата: имена полей не должны превышать 10 символов и должны состоять только из латинских букв, а для числовых колонок количества обязательно задается достаточная разрядность и точность (как правило, 3 знака после запятой).

← На главную