Как реализовать списание материалов с разных складов в документе «Отчет производства за смену»?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет Промышленность, строительство и АПК
← На главную

В типовой конфигурации «1С:Бухгалтерия 8» документ ОтчетПроизводстваЗаСмену имеет существенное ограничение: в шапке документа выбирается только один склад. Это означает, что и готовая продукция приходуется на этот склад, и все материалы, указанные в табличной части, списываются с него же. В реальной производственной деятельности часто возникает ситуация, когда материалы должны списываться с разных мест хранения (цеховых кладовых, центральных складов), а продукция — поступать на склад готовой продукции.

В данной статье мы разберем, как решить эту задачу, проанализируем различные подходы и выберем наиболее стабильный метод реализации.

Анализ проблемы: почему нельзя просто поменять проводки

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

Следовательно, простая подмена склада в проводках после их формирования приведет к следующим ошибкам:

  1. Отрицательные остатки: На складе из шапки возникнет необоснованный «минус», так как программа спишет товар оттуда, а на реальном складе остаток не уменьшится.
  2. Искажение себестоимости: Программа может некорректно рассчитать сумму списания, если на «целевом» складе цена материалов отличается от цены на складе шапки.
  3. Проблемы при закрытии месяца: Обработка «Закрытие месяца» может выдать ошибки при контроле последовательности проведения и распределении затрат.

Вариант 1: Использование внешней обработки и ручной корректировки

Если заказчик категорически настаивает на использовании внешней обработки без внесения изменений в конфигурацию, мы можем пойти по пути программного включения ручной корректировки. Разберем этот алгоритм по шагам.

Для того чтобы изменения в проводках не были удалены при следующем перепроведении документа, необходимо установить флаг РучнаяКорректировка в значение Истина. Посмотрим на логику работы такой обработки:


// Пример логики внешней обработки
Для Каждого СтрокаДокумента Из ОбъектДокумент.Материалы Цикл
    // Предполагается, что мы нашли нужный склад для строки
    НужныйСклад = ПолучитьСкладДляМатериала(СтрокаДокумента.Номенклатура);
    
    // Получаем набор записей регистра Хозрасчетный
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ОбъектДокумент.Ссылка);
    НаборЗаписей.Прочитать();
    
    Для Каждого Запись Из НаборЗаписей Цикл
        Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.СырьеИМатериалы Тогда
            // Условие проверки соответствия номенклатуры в проводке и строке ТЧ
            Если Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = СтрокаДокумента.Номенклатура Тогда
                Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = НужныйСклад;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    // ВАЖНО: устанавливаем флаг ручной корректировки в самом документе
    ДокументОбъект = ОбъектДокумент.Ссылка.ПолучитьОбъект();
    ДокументОбъект.РучнаяКорректировка = Истина;
    ДокументОбъект.Записать();
    
    НаборЗаписей.Записать();
КонецЦикла;

Важное замечание: После выполнения такой обработки в списке документов появится значок «карандаша». Это означает, что автоматическое перепроведение документа больше не будет обновлять проводки. Если бухгалтер изменит количество материалов в табличной части, проводки останутся старыми, пока вы снова не запустите обработку.

Вариант 2: Использование расширения (рекомендуемый метод)

Проанализируем более современный и надежный способ — использование механизма расширений. Это позволит нам модифицировать логику проведения, сохранив поддержку конфигурации.

Разберем этапы реализации через расширение:

  1. Добавление реквизита: В расширении добавим в табличную часть Материалы документа ОтчетПроизводстваЗаСмену новый реквизит Склад с типом СправочникСсылка.Склады.
  2. Визуализация: Выведем это поле на форму документа, чтобы пользователь мог интерактивно выбирать склад для каждой строки.
  3. Модификация проведения: Нам необходимо перехватить процедуру, отвечающую за формирование движений. В БП 3.0 это обычно процедуры в модуле менеджера или модуле объекта, участвующие в подготовке данных для проведения.

Рассмотрим пример перехвата метода через &После в модуле объекта документа:


&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Логика подготовки данных, если требуется
КонецПроцедуры

&Вместо("СформироватьДвиженияПоЗапасам")
Процедура Расш1_СформироватьДвиженияПоЗапасам(ПараметрыПроведения, ТаблицаМатериалов, Отказ)
    // Здесь мы подменяем стандартную логику. 
    // Вместо использования Склада из шапки (ПараметрыПроведения.Склад), 
    // мы используем Склад из каждой конкретной строки ТаблицыМатериалов.
    
    Для Каждого СтрокаМатериал Из ТаблицаМатериалов Цикл
        // Если в строке склад заполнен, используем его
        СкладСписания = ?(ЗначениеЗаполнено(СтрокаМатериал.Склад), СтрокаМатериал.Склад, ПараметрыПроведения.СкладШапки);
        // Далее вызываем стандартные механизмы формирования проводок, передавая нужный склад
    КонецЦикла;
КонецПроцедуры

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

Вариант 3: Организационный обходной путь (без программирования)

Выясним, существует ли способ решить задачу штатными средствами. Если бюджет на разработку ограничен или политика компании запрещает любые изменения кода, рекомендуется использовать схему с промежуточным складом.

Схема действий выглядит так:

  1. Создается виртуальный или реальный склад «Цех» (или «Производственный участок»).
  2. Материалы со всех удаленных складов перемещаются на этот «Цеховой склад» с помощью документа ПеремещениеТоваров.
  3. В документе ОтчетПроизводстваЗаСмену в шапке указывается склад «Цех». Все материалы списываются чисто, без расхождений по аналитике.
  4. Готовая продукция при необходимости перемещается из «Цеха» на склад ГП отдельным документом.

Эта методика гарантирует 100% корректность бухгалтерского учета и расчета себестоимости, так как полностью соответствует методологии типового решения.

Итоги и рекомендации

Мы проанализировали три способа изменения логики списания материалов по складам. Наилучшим техническим решением является использование расширения. Оно сохраняет автоматизацию, обеспечивает корректный расчет себестоимости и не мешает обновлению типовой конфигурации.

Внешнюю обработку стоит использовать только для разовых корректировок или в случаях, когда база находится на жестком аудите и любые расширения запрещены. В этом случае не забывайте программно устанавливать свойство РучнаяКорректировка = Истина, чтобы ваши труды не пропали при нажатии кнопки «Провести».

← На главную