При автоматизации производственного учета в программе 1С:Управление производственным предприятием (редакция 1.3) разработчики часто сталкиваются с логистической схемой, когда между физическими складами организации зажат производственный процесс. Детали или полуфабрикаты списываются со Склада 1 в производство, проходят технологическую обработку, меняют свое качество или характеристики, а затем приходуются на Склад 2.
Сложность возникает тогда, когда часть запущенной партии застревает на промежуточном этапе обработки (например, на испытательном стенде или в термокамере). На складах этих деталей уже нет, а до следующего склада они еще не дошли. Как вывести это «зависшее» количество в отчет на схеме компоновки данных (СКД), если на самих производственных участках оперативный компьютерный учет не ведется? Выясним причину этой проблемы и подробно разберем два метода решения: расчетный (через сопоставление складских движений в СКД) и методологически верный (с использованием механизмов незавершенного производства).
---
Прежде чем приступать к написанию запросов, проанализируем движение документов и логику регистров в 1С:УПП. Когда мы передаем приборы в производство, мы оформляем документ Требование-накладная. Этот документ делает движение Расход по регистру накопления ТоварыНаСкладах (или ПартииТоваровНаСкладах). В этот момент для склада деталь перестает существовать.
Когда этап производства завершается, оформляется документ Отчет производства за смену (ОПзС), который приходует уже модифицированную деталь (например, с другим качеством) на Склад 2. Он делает движение Приход по складским регистрам.
Если со Склада 1 ушло 50 деталей, а на Склад 2 поступило только 40, разница в 10 штук физически находится в цехе. Пытаясь построить стандартный отчет по регистру ТоварыНаСкладахОстаткиИОбороты, мы увидим остатки только на самих складах, но не увидим то, что зависло «между» ними.
---
Этот способ незаменим, если на вашем предприятии учет в производстве ведется «упрощенно»: материалы списываются, выпуск оформляется, но распределение затрат и подетальное списание в НЗП в системе не отражаются. Наша задача в СКД — сопоставить расход со Склада 1 с приходом на Склад 2 по конкретной номенклатуре, проигнорировав при этом изменение реквизита Качество.
Разберем по шагам, как построить такой запрос в конструкторе СКД. Мы не можем просто связать приход и расход по номенклатуре и качеству, так как качество на первом и втором складе различается (например, «готовые к испытаниям» и «прошедшие термоциклы»). Мы должны сделать соединение таблиц только по полям Номенклатура и ХарактеристикаНоменклатуры (если она используется).
Рассмотрим структуру пакетного запроса, который решит эту задачу:
// ШАГ 1. Получаем расход по Складу-отправителю (Склад 1)
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
СУММА(ТоварыНаСкладахОбороты.КоличествоРасход) КАК КоличествоПередано
ПОМЕСТИТЬ ВТ_РасходСклад1
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , Склад = &Склад1) КАК ТоварыНаСкладахОбороты
ГРУППИРОВАТЬ ПО
ТоварыНаСкладахОбороты.Номенклатура,
ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры
;
////////////////////////////////////////////////////////////////////////////////
// ШАГ 2. Получаем приход по Складу-получателю (Склад 2)
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПолучено
ПОМЕСТИТЬ ВТ_ПриходСклад2
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , Склад = &Склад2) КАК ТоварыНаСкладахОбороты
ГРУППИРОВАТЬ ПО
ТоварыНаСкладахОбороты.Номенклатура,
ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры
;
////////////////////////////////////////////////////////////////////////////////
// ШАГ 3. Объединяем данные и рассчитываем разницу (остаток в производстве)
ВЫБРАТЬ
ЕСТЬNULL(ВТ_РасходСклад1.Номенклатура, ВТ_ПриходСклад2.Номенклатура) КАК Номенклатура,
ЕСТЬNULL(ВТ_РасходСклад1.ХарактеристикаНоменклатуры, ВТ_ПриходСклад2.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатуры,
ЕСТЬNULL(ВТ_РасходСклад1.КоличествоПередано, 0) КАК КоличествоПередано,
ЕСТЬNULL(ВТ_ПриходСклад2.КоличествоПолучено, 0) КАК КоличествоПолучено,
ЕСТЬNULL(ВТ_РасходСклад1.КоличествоПередано, 0) - ЕСТЬNULL(ВТ_ПриходСклад2.КоличествоПолучено, 0) КАК ОстатокВПроизводстве
ИЗ
ВТ_РасходСклад1 КАК ВТ_РасходСклад1
ПОЛНОЕ СОЕДИНЕНИЕ ВТ_ПриходСклад2 КАК ВТ_ПриходСклад2
ПО ВТ_РасходСклад1.Номенклатура = ВТ_ПриходСклад2.Номенклатура
И ВТ_РасходСклад1.ХарактеристикаНоменклатуры = ВТ_ПриходСклад2.ХарактеристикаНоменклатуры
Важное примечание к запросу: Мы применили ПОЛНОЕ СОЕДИНЕНИЕ вместо ЛЕВОГО СОЕДИНЕНИЯ. Это необходимо на случай, если на Склад 2 поступили детали, по которым не было зафиксировано расхода со Склада 1 за выбранный период (например, незавершенное производство перешло из прошлых периодов). Функция ЕСТЬNULL страхует нас от пустых значений (NULL), преобразуя их в нулевые показатели для корректного вычитания.
---
Использование складских регистров для расчета остатков в производстве — это «костыль», который может давать сбои при сложных схемах (например, если деталь возвращается обратно или списывается в брак). Программа 1С:УПП содержит мощный функционал для ведения оперативного учета в незавершенном производстве (НЗП). Посмотрим, как задействовать его, чтобы СКД получал точные данные автоматически.
Для реализации этого подхода необходимо выполнить следующие настройки в системе:
МатериалыВПроизводстве. Детали зависают в цехе на материально-ответственном лице (цеховая кладовая или мастер участка).МатериалыВПроизводстве.Если эти правила соблюдены, нам больше не нужно связывать склады в запросах. Количество деталей, оставшихся на производственном этапе, всегда можно получить из остатков регистра МатериалыВПроизводстве. Запрос в СКД в этом случае будет максимально простым и производительным:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
МатериалыВПроизводствеОстатки.Номенклатура КАК Номенклатура,
МатериалыВПроизводствеОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
МатериалыВПроизводствеОстатки.Подразделение КАК Подразделение,
МатериалыВПроизводствеОстатки.КоличествоОстаток КАК ОстатокВПроизводстве
ИЗ
РегистрНакопления.МатериалыВПроизводстве.Остатки(&Период, ) КАК МатериалыВПроизводствеОстатки
При таком подходе отчет СКД мгновенно покажет актуальный остаток деталей, находящихся в обработке, в разрезе производственных подразделений.
Совет для баз с включенным РАУЗ (Расширенная аналитика учета затрат): Если в вашей базе УПП включен РАУЗ, регистр МатериалыВПроизводстве не задействуется. В этом случае все остатки НЗП хранятся в регистре УчетЗатратРегламентированный. Вам нужно будет получать остатки из таблицы РегистрНакопления.УчетЗатрат.Остатки, наложив отбор по разделу учета «Затраты» или «НЗП».
---
Анализируя ситуацию, когда для каждого этапа доработки создается отдельный склад (Склад 1, Склад 2, Склад 3 и т.д.) только ради изменения качества прибора, стоит задуматься о реинжиниринге бизнес-процесса в программе.
Такое дробление усложняет документооборот и перегружает систему лишними перемещениями. Вместо создания множества складов гораздо эффективнее использовать один реальный склад, а изменение состояния прибора (качества) фиксировать документами выпуска или комплектации в рамках одного складского пространства. Это упростит структуру данных и сделает отчеты на СКД более прозрачными и легкими в поддержке.