Как в 1С:Бухгалтерии 3.0 оформить поступление товаров на несколько складов в одном документе?

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

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

Вариант 1. Штатный функционал программы (для современных релизов)

Прежде чем приступать к программированию, созданию расширений или обработок, выясним, позволяет ли текущий релиз программы решить задачу стандартными средствами. Начиная с версии 3.0.188 в «1С:Бухгалтерии 8» появился встроенный механизм, позволяющий распределять поступающие ценности по разным складам прямо в табличной части одного документа поступления.

Для активации этой возможности выполним простую последовательность действий в интерфейсе программы:

  1. Перейдем в раздел Главное, далее выберем пункт Функциональность.
  2. В открывшемся окне настроек перейдем на вкладку Запасы.
  3. Найдем и установим флажок напротив опции Поступление на несколько складов.

После включения этой настройки поведение документа Поступление (акт, накладная, УПД) с видом операции «Товары (накладная, УПД)» существенно изменится:

При проведении такого документа система автоматически сформирует проводки по дебету счета 41 (или иных счетов учета номенклатуры) в разрезе тех складов, которые были указаны в соответствующих строках табличной части. Печатные формы приходных ордеров (например, форма М-4) также сформируются корректно — отдельно под каждый склад.

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

Если по каким-то причинам организация использует релиз конфигурации ниже 3.0.188 и обновление программы в ближайшее время не планируется, нам потребуется доработать систему. Наиболее безопасным и предпочтительным методом доработки является создание расширения конфигурации. Этот способ позволяет сохранить типовую конфигурацию на поддержке и минимизировать сложности при последующих обновлениях.

Рассмотрим по шагам, как реализовать этот механизм в расширении:

  1. Создадим новое расширение конфигурации и снимем флажок «Безопасный режим».
  2. Заимствуем в расширение документ ПоступлениеТоваровУслуг, его табличную часть Товары и форму документа ФормаДокументаОбщая (или соответствующую форму для работы с товарами).
  3. Добавим в табличную часть Товары внутри расширения новый реквизит Склад с типом ссылки на справочник Склады.
  4. Вынесем добавленный реквизит на форму документа в табличное поле товаров.

Далее нам необходимо перехватить процедуру проведения документа, чтобы переопределить склад приемки для каждой строки. Для этого заимствуем в расширение обработчик проведения в модуле объекта документа и применим аннотацию &Вместо или &Перед. Разберем пример программного кода, который заменяет склад в движениях регистра бухгалтерии и регистра накопления «Товары на складах»:


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

После этого нам потребуется скорректировать процедуру проведения в модуле менеджера или модуле объекта, которая отвечает за формирование движений по счетам учета. Мы должны убедиться, что при формировании проводок по счету 41.01 (или аналогичным) в качестве субконто «Склады» берется значение из строки таблицы товаров, а не из шапки документа. Для этого проанализируем типовой запрос проведения и заменим поле Документ.Склад на Документ.Товары.Склад в местах соединения и выборки данных.

Вариант 3. Создание внешней обработки (без изменения конфигурации)

Если мы принципиально не хотим вносить изменения в структуру данных (даже через расширения), мы можем использовать концепцию виртуального «склада-накопителя» и внешней обработки. Этот подход исключает любые проблемы с обновлением информационной базы.

Алгоритм работы в данном случае выглядит следующим образом:

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

Посмотрим на пример кода обработки, которая программно создает документ перемещения на основе распределенных данных:


// Пример создания документа перемещения на основании распределения
НовыйДок = Документы.ПеремещениеТоваров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = ОбъектПоступления.Организация;
НовыйДок.СкладОтправитель = Справочники.Склады.НайтиПоНаименованию("Склад транзит (для распределения)");
НовыйДок.СкладПолучатель = ВыбранныйЦелевойСклад;

Для Каждого СтрокаРаспределения Из ТаблицаРаспределения Цикл
    Если СтрокаРаспределения.ЦелевойСклад = ВыбранныйЦелевойСклад Тогда
        НоваяСтрока = НовыйДок.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРаспределения);
    КонецЕсли;
КонецЦикла;

Попытка
    НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Успешно создан и проведен документ перемещения: " + НовыйДок.Ссылка);
Исключение
    Сообщить("Ошибка проведения перемещения: " + ОписаниеОшибки());
КонецПопытки;

Основным минусом этого подхода является увеличение документооборота в базе данных (появляются дополнительные документы перемещения), однако это полностью компенсируется абсолютной типовой чистотой конфигурации и простотой поддержки системы.

Резюме и рекомендации

Выбор конкретного пути решения зависит от текущего состояния вашей информационной системы:

← На главную