В типовой конфигурации «1С:Бухгалтерия 8» документ ОтчетПроизводстваЗаСмену имеет существенное ограничение: в шапке документа выбирается только один склад. Это означает, что и готовая продукция приходуется на этот склад, и все материалы, указанные в табличной части, списываются с него же. В реальной производственной деятельности часто возникает ситуация, когда материалы должны списываться с разных мест хранения (цеховых кладовых, центральных складов), а продукция — поступать на склад готовой продукции.
В данной статье мы разберем, как решить эту задачу, проанализируем различные подходы и выберем наиболее стабильный метод реализации.
Рассмотрим ситуацию глубже. Если мы решим программно изменить склад в сформированных проводках (регистр Хозрасчетный), мы столкнемся с серьезными техническими последствиями. Программа 1С при проведении документа не просто создает записи в регистре, она рассчитывает себестоимость списания. Если в учетной политике установлено списание «по среднему» или «ФИФО» в разрезе складов, то алгоритм проведения будет искать остатки именно на том складе, который указан в шапке документа.
Следовательно, простая подмена склада в проводках после их формирования приведет к следующим ошибкам:
Если заказчик категорически настаивает на использовании внешней обработки без внесения изменений в конфигурацию, мы можем пойти по пути программного включения ручной корректировки. Разберем этот алгоритм по шагам.
Для того чтобы изменения в проводках не были удалены при следующем перепроведении документа, необходимо установить флаг РучнаяКорректировка в значение Истина. Посмотрим на логику работы такой обработки:
// Пример логики внешней обработки
Для Каждого СтрокаДокумента Из ОбъектДокумент.Материалы Цикл
// Предполагается, что мы нашли нужный склад для строки
НужныйСклад = ПолучитьСкладДляМатериала(СтрокаДокумента.Номенклатура);
// Получаем набор записей регистра Хозрасчетный
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ОбъектДокумент.Ссылка);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.СырьеИМатериалы Тогда
// Условие проверки соответствия номенклатуры в проводке и строке ТЧ
Если Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = СтрокаДокумента.Номенклатура Тогда
Запись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = НужныйСклад;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ВАЖНО: устанавливаем флаг ручной корректировки в самом документе
ДокументОбъект = ОбъектДокумент.Ссылка.ПолучитьОбъект();
ДокументОбъект.РучнаяКорректировка = Истина;
ДокументОбъект.Записать();
НаборЗаписей.Записать();
КонецЦикла;
Важное замечание: После выполнения такой обработки в списке документов появится значок «карандаша». Это означает, что автоматическое перепроведение документа больше не будет обновлять проводки. Если бухгалтер изменит количество материалов в табличной части, проводки останутся старыми, пока вы снова не запустите обработку.
Проанализируем более современный и надежный способ — использование механизма расширений. Это позволит нам модифицировать логику проведения, сохранив поддержку конфигурации.
Разберем этапы реализации через расширение:
Материалы документа ОтчетПроизводстваЗаСмену новый реквизит Склад с типом СправочникСсылка.Склады.Рассмотрим пример перехвата метода через &После в модуле объекта документа:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Логика подготовки данных, если требуется
КонецПроцедуры
&Вместо("СформироватьДвиженияПоЗапасам")
Процедура Расш1_СформироватьДвиженияПоЗапасам(ПараметрыПроведения, ТаблицаМатериалов, Отказ)
// Здесь мы подменяем стандартную логику.
// Вместо использования Склада из шапки (ПараметрыПроведения.Склад),
// мы используем Склад из каждой конкретной строки ТаблицыМатериалов.
Для Каждого СтрокаМатериал Из ТаблицаМатериалов Цикл
// Если в строке склад заполнен, используем его
СкладСписания = ?(ЗначениеЗаполнено(СтрокаМатериал.Склад), СтрокаМатериал.Склад, ПараметрыПроведения.СкладШапки);
// Далее вызываем стандартные механизмы формирования проводок, передавая нужный склад
КонецЦикла;
КонецПроцедуры
Использование расширения позволяет избежать проблем с ручной корректировкой. При любом изменении документа бухгалтером система будет автоматически пересчитывать проводки, опираясь на актуальные данные о складах в строках.
Выясним, существует ли способ решить задачу штатными средствами. Если бюджет на разработку ограничен или политика компании запрещает любые изменения кода, рекомендуется использовать схему с промежуточным складом.
Схема действий выглядит так:
ПеремещениеТоваров.ОтчетПроизводстваЗаСмену в шапке указывается склад «Цех». Все материалы списываются чисто, без расхождений по аналитике.Эта методика гарантирует 100% корректность бухгалтерского учета и расчета себестоимости, так как полностью соответствует методологии типового решения.
Мы проанализировали три способа изменения логики списания материалов по складам. Наилучшим техническим решением является использование расширения. Оно сохраняет автоматизацию, обеспечивает корректный расчет себестоимости и не мешает обновлению типовой конфигурации.
Внешнюю обработку стоит использовать только для разовых корректировок или в случаях, когда база находится на жестком аудите и любые расширения запрещены. В этом случае не забывайте программно устанавливать свойство РучнаяКорректировка = Истина, чтобы ваши труды не пропали при нажатии кнопки «Провести».