При переходе на современные редакции программных продуктов семейства «1С:Предприятие», в частности на конфигурацию «1С:Бухгалтерия предприятия» (редакция 3.0), пользователи часто сталкиваются с изменением привычных бизнес-процессов. Одним из таких вызовов долгое время являлось оформление поступления товаров. В практической деятельности часто возникает ситуация, когда по одной входящей накладной от поставщика товары должны быть распределены по разным местам хранения (складам). Мы рассмотрим, как решить эту задачу различными методами — от штатных инструментов современных релизов до кастомных доработок и расширений для более ранних версий программы.
Прежде чем приступать к программированию, созданию расширений или обработок, выясним, позволяет ли текущий релиз программы решить задачу стандартными средствами. Начиная с версии 3.0.188 в «1С:Бухгалтерии 8» появился встроенный механизм, позволяющий распределять поступающие ценности по разным складам прямо в табличной части одного документа поступления.
Для активации этой возможности выполним простую последовательность действий в интерфейсе программы:
После включения этой настройки поведение документа Поступление (акт, накладная, УПД) с видом операции «Товары (накладная, УПД)» существенно изменится:
Товары появляется дополнительная колонка Склад. Теперь для каждой конкретной позиции номенклатуры мы можем указать свой индивидуальный склад.При проведении такого документа система автоматически сформирует проводки по дебету счета 41 (или иных счетов учета номенклатуры) в разрезе тех складов, которые были указаны в соответствующих строках табличной части. Печатные формы приходных ордеров (например, форма М-4) также сформируются корректно — отдельно под каждый склад.
Если по каким-то причинам организация использует релиз конфигурации ниже 3.0.188 и обновление программы в ближайшее время не планируется, нам потребуется доработать систему. Наиболее безопасным и предпочтительным методом доработки является создание расширения конфигурации. Этот способ позволяет сохранить типовую конфигурацию на поддержке и минимизировать сложности при последующих обновлениях.
Рассмотрим по шагам, как реализовать этот механизм в расширении:
ПоступлениеТоваровУслуг, его табличную часть Товары и форму документа ФормаДокументаОбщая (или соответствующую форму для работы с товарами).Товары внутри расширения новый реквизит Склад с типом ссылки на справочник Склады.Далее нам необходимо перехватить процедуру проведения документа, чтобы переопределить склад приемки для каждой строки. Для этого заимствуем в расширение обработчик проведения в модуле объекта документа и применим аннотацию &Вместо или &Перед. Разберем пример программного кода, который заменяет склад в движениях регистра бухгалтерии и регистра накопления «Товары на складах»:
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Если документ проводится, проверим заполнение складов в табличной части
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Для Каждого СтрокаТовара Из Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТовара.Склад) Тогда
СтрокаТовара.Склад = Склад; // Заполняем основным складом из шапки, если не указан
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
После этого нам потребуется скорректировать процедуру проведения в модуле менеджера или модуле объекта, которая отвечает за формирование движений по счетам учета. Мы должны убедиться, что при формировании проводок по счету 41.01 (или аналогичным) в качестве субконто «Склады» берется значение из строки таблицы товаров, а не из шапки документа. Для этого проанализируем типовой запрос проведения и заменим поле Документ.Склад на Документ.Товары.Склад в местах соединения и выборки данных.
Если мы принципиально не хотим вносить изменения в структуру данных (даже через расширения), мы можем использовать концепцию виртуального «склада-накопителя» и внешней обработки. Этот подход исключает любые проблемы с обновлением информационной базы.
Алгоритм работы в данном случае выглядит следующим образом:
Склады создается транзитный элемент, например, «Склад транзит (для распределения)».ПеремещениеТоваров, где отправителем выступает «Склад транзит», а получателями — конечные целевые склады.Посмотрим на пример кода обработки, которая программно создает документ перемещения на основе распределенных данных:
// Пример создания документа перемещения на основании распределения
НовыйДок = Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = ОбъектПоступления.Организация;
НовыйДок.СкладОтправитель = Справочники.Склады.НайтиПоНаименованию("Склад транзит (для распределения)");
НовыйДок.СкладПолучатель = ВыбранныйЦелевойСклад;
Для Каждого СтрокаРаспределения Из ТаблицаРаспределения Цикл
Если СтрокаРаспределения.ЦелевойСклад = ВыбранныйЦелевойСклад Тогда
НоваяСтрока = НовыйДок.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРаспределения);
КонецЕсли;
КонецЦикла;
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Успешно создан и проведен документ перемещения: " + НовыйДок.Ссылка);
Исключение
Сообщить("Ошибка проведения перемещения: " + ОписаниеОшибки());
КонецПопытки;
Основным минусом этого подхода является увеличение документооборота в базе данных (появляются дополнительные документы перемещения), однако это полностью компенсируется абсолютной типовой чистотой конфигурации и простотой поддержки системы.
Выбор конкретного пути решения зависит от текущего состояния вашей информационной системы: