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