Как программно скопировать и разделить документ «Реализация товаров и услуг» в 1С:Управление торговлей 11.4 по складам и системам налогообложения?

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

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

Обзор проблемы: Разделение Реализации по складам и системам налогообложения

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

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

Настройка использования нескольких складов в документах

Прежде чем перейти к методам разделения, мы должны убедиться, что наша конфигурация 1С:УТ 11.4 позволяет указывать несколько складов в табличной части документов. В типовой УТ 11.4 существует специальная настройка, которая активирует эту возможность:

  1. Перейдите в раздел НСИ и администрирование.
  2. Выберите Настройка НСИ и разделов.
  3. Откройте подраздел Продажи.
  4. Перейдите в Оптовые продажи.
  5. Установите флажок (или убедитесь, что он установлен) для опции «Использовать склады в табличной части документов продажи» (может называться «Реализация товаров с нескольких складов» или аналогично).

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

Концептуальный подход к ручному разделению документов

Даже без сложного программирования, существует ручной, но вполне работоспособный процесс, который позволяет решить проблему разделения реализации по складам. Этот метод, предложенный в обсуждении, может служить основой для дальнейшей автоматизации. Давайте разберем его по шагам:

  1. Создание исходного заказа: Начнем с документа Заказ клиента. В его табличной части мы указываем все необходимые товары и для каждой позиции задаем соответствующий склад. Например:

    • ТМЦ1 = 2 шт., Склад 1 (Центральный)
    • ТМЦ2 = 3 шт., Склад 2
    • ТМЦ4 = 4 шт., Склад 1 (Центральный)

    На этом этапе мы не беспокоимся о разделении по складам или СНО; просто формируем полный заказ.

  2. Формирование первой реализации: На основании этого Заказа клиента создаем первый документ Реализация товаров и услуг. Мы это делаем, используя стандартную функцию «Создать на основании».

  3. Корректировка первой реализации: После того как новый документ реализации будет создан и заполнен данными из заказа, мы вручную удаляем из его табличной части все строки, которые относятся ко «Складу 2» (или любому другому складу, который мы хотим выделить в отдельный документ). Таким образом, в первом документе останутся только товары со «Склада 1» (Центрального).

  4. Проведение первой реализации: Проводим сформированный документ. Теперь у нас есть одна реализация, оформленная для товаров с «Склада Центрального», соответствующая одной СНО.

  5. Формирование второй (и последующих) реализаций: Повторяем шаг 2: снова создаем документ Реализация товаров и услуг на основании того же исходного Заказа клиента.

  6. Корректировка второй реализации: В этом новом документе, наоборот, мы удаляем все строки, которые относятся к «Складу 1» (Центральному), оставляя только товары со «Склада 2». При необходимости можно повторить этот шаг для третьего, четвертого склада и т.д., если их несколько.

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

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

Программное копирование и разделение документа: Автоматизация процесса

Для устранения рутинных операций по разделению документов мы можем разработать программное решение. Цель — создать механизм, который на основании одного исходного документа (например, Заказ клиента или уже существующей, но требующей разделения Реализации товаров и услуг) будет автоматически генерировать несколько новых документов, распределяя товары по складам и, соответственно, по системам налогообложения.

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

Создание нового документа и копирование данных

Первый шаг в программной реализации — это создание нового экземпляра документа Реализация товаров и услуг. Мы будем использовать стандартные методы платформы 1С для этого.

  1. Инициализация нового документа: Для каждого склада, для которого требуется отдельная реализация, мы создаем новый документ:

    НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
  2. Копирование основных реквизитов шапки: Далее нам необходимо скопировать общие для всех реализаций реквизиты из исходного документа. К таким реквизитам относятся Дата, Организация, Контрагент, Договор, Валюта и другие, которые должны быть одинаковыми для всех создаваемых реализаций. Мы можем использовать функцию ЗаполнитьЗначенияСвойств() для быстрого копирования:

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

    Обратите внимание, что реквизит Склад для шапки нового документа будет установлен в соответствии с тем складом, для которого мы формируем текущую реализацию. Если в документе «Реализация товаров и услуг» включена возможность указывать склады в табличной части, то реквизит шапки Склад может быть опциональным или использоваться как склад по умолчанию, если не указан в строке ТЧ.

Разделение табличной части по складам

Самая важная часть алгоритма — это итерация по табличной части исходного документа и распределение строк по новым реализациям в зависимости от указанного в строке склада.

  1. Идентификация уникальных складов: Сначала мы должны пройтись по табличной части исходного документа и собрать все уникальные склады, которые в ней присутствуют. Это позволит нам понять, сколько отдельных документов реализации нам потребуется создать.

    
    УникальныеСкладыВЗаказе = Новый Соответствие();
    Для Каждого СтрокаТЧ Из ИсходныйДокумент.Товары Цикл
        Если Не УникальныеСкладыВЗаказе.Содержит(СтрокаТЧ.Склад) Тогда
            УникальныеСкладыВЗаказе.Вставить(СтрокаТЧ.Склад, Новый Массив());
        КонецЕсли;
        УникальныеСкладыВЗаказе.Получить(СтрокаТЧ.Склад).Добавить(СтрокаТЧ);
    КонецЦикла;
    
  2. Создание документов для каждого склада: Теперь мы можем итерировать по найденным уникальным складам. Для каждого склада мы создаем новый документ реализации и заполняем его табличную часть соответствующими строками.

    
    Для Каждого ЭлементСклада ИЗ УникальныеСкладыВЗаказе Цикл
        ТекущийСклад = ЭлементСклада.Ключ;
        СтрокиДляТекущегоСклада = ЭлементСклада.Значение;
    
        НовыйДокументРеализации = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
        НовыйДокументРеализации.Дата         = ИсходныйДокумент.Дата;
        НовыйДокументРеализации.Организация  = ИсходныйДокумент.Организация;
        НовыйДокументРеализации.Контрагент   = ИсходныйДокумент.Контрагент;
        НовыйДокументРеализации.Договор      = ИсходныйДокумент.Договор;
        НовыйДокументРеализации.Валюта       = ИсходныйДокумент.Валюта;
        НовыйДокументРеализации.Склад        = ТекущийСклад; // Устанавливаем склад для шапки
        НовыйДокументРеализации.Комментарий  = "Создан на основании " + ИсходныйДокумент.ПредставлениеДокумента() 
                                              + " для склада " + ТекущийСклад.Наименование;
        // Можно добавить ссылку на исходный документ
        // НовыйДокументРеализации.ДокументОснование = ИсходныйДокумент.Ссылка;
    
        Для Каждого СтрокаИсходнаяТЧ Из СтрокиДляТекущегоСклада Цикл
            НоваяСтрокаТЧ = НовыйДокументРеализации.Товары.Добавить();
            // Используем ЗаполнитьЗначенияСвойств для удобства копирования всех колонок строки
            ЗаполнитьЗначенияСвойств(НоваяСтрокаТЧ, СтрокаИсходнаяТЧ);
            // Важно! Убедиться, что в новой строке ТЧ склад также заполнен
            НоваяСтрокаТЧ.Склад = СтрокаИсходнаяТЧ.Склад; 
        КонецЦикла;
    
        // Записываем и проводим новый документ
        Попытка
            НовыйДокументРеализации.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить("Документ реализации для склада " + ТекущийСклад.Наименование + " успешно создан и проведен.");
        Исключение
            Сообщить("Ошибка при записи/проведении документа для склада " + ТекущийСклад.Наименование + ": " + ОписаниеОшибки());
            // Обработка ошибок, возможно, откат транзакции или логирование
        КонецПопытки;
    КонецЦикла;
    

В приведенном примере мы группируем строки по складу, а затем создаем и заполняем отдельные документы. Если требуется сохранить один из складов в исходном документе, а остальные вынести, логика немного усложнится: сначала мы выделим строки для одного склада, оставим их в исходном документе (предварительно очистив ТЧ и заполнив ее) или создадим новый документ для них, а для остальных складов будем создавать дополнительные документы.

Автоматическое определение склада и системы налогообложения

Для решения задачи с разными СНО, нам потребуется связать склады с конкретными системами налогообложения. Мы можем реализовать это несколькими способами:

  1. Дополнительный реквизит склада: В справочнике Склады можно добавить дополнительный реквизит (например, типа «Перечисление.СистемыНалогообложения»), который будет указывать на СНО, используемую для данного склада.

  2. Регистр сведений: Создать регистр сведений, который будет хранить соответствие «Склад – Система налогообложения». Это более гибкий вариант.

  3. Настройки групп складов: В УТ 11.4 существуют настройки групп складов. Например, опция «Разрешить в заказах – товар резервируется на складах указанной группы, на каждый склад оформляется отдельный документ Реализация товаров и услуг» позволяет автоматически формировать отдельные реализации по каждому складу. Мы можем использовать эту типовую логику или адаптировать ее, если это применимо.

Когда мы будем создавать новые документы реализации программно, мы сможем использовать эту связь. Например, при создании документа для «Склада 2» мы будем знать, что для него используется патентная система, и сможем соответствующим образом установить реквизиты нового документа (например, СистемаНалогообложения, если она присутствует в документе Реализация товаров и услуг или если это требуется для правильного формирования проводок).

Также возможно использование «товарных групп», которые могут быть связаны с определенными складами и СНО. Это дает дополнительную гибкость в распределении товаров и определении налогообложения.

Обработка для пакетного создания документов

Наиболее удобным для пользователя способом активации такого функционала будет создание внешней обработки или расширения конфигурации с кнопкой, как было предложено в Сообщении 13. Эта обработка может быть добавлена, например, в форму списка документов Заказы клиентов или непосредственно в форму документа Заказ клиента.

Алгоритм работы такой обработки может быть следующим:

  1. Выбор документа-основания: Пользователь выбирает один или несколько Заказов клиентов (или Реализаций товаров и услуг), которые нужно разделить.

  2. Вызов обработки: Пользователь нажимает кнопку «Разделить реализации по складам» (или аналогичную).

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

  4. Уведомление пользователя: После завершения процесса обработка выводит сообщение о успешно созданных и проведенных документах, или об ошибках, если таковые имели место.

Мы можем также добавить в обработку дополнительные опции, такие как:

Важные аспекты и возможные доработки

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

  1. Связывание складов и СНО: Мы должны четко определить и настроить, как в системе будут храниться связи между складами и системами налогообложения. Это может быть как дополнительный реквизит в справочнике Склады, так и отдельный регистр сведений. Чем четче будет это соответствие, тем точнее будет работать автоматическое разделение.

  2. Документ-основание: В создаваемых документах реализации крайне желательно указывать ссылку на исходный Заказ клиента. Это можно сделать, добавив в документ Реализация товаров и услуг дополнительный реквизит типа «ДокументСсылка.ЗаказКлиента» или используя стандартный реквизит ДокументОснование, если он предусмотрен. Это позволит менеджерам легко отслеживать, из какого исходного заказа были созданы конкретные реализации.

    
    НовыйДокументРеализации.ДокументОснование = ИсходныйДокумент.Ссылка;
    // или использовать дополнительный реквизит
    // НовыйДокументРеализации.УстановитьРеквизитДопСведений("ИсходныйЗаказ", ИсходныйДокумент.Ссылка);
    
  3. Пользовательский интерфейс: Для удобства работы менеджеров, интерфейс вызова функции разделения должен быть максимально интуитивно понятным. Мы можем разместить кнопку вызова обработки в командной панели формы списка заказов или в самой форме заказа. Желательно предусмотреть диалоговое окно для подтверждения действия или для выбора дополнительных параметров.

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

  5. Влияние на резервирование и отгрузку: Мы должны проанализировать, как разделение документов по складам повлияет на текущие процессы резервирования товаров и их последующей отгрузки. Если в заказе клиент резервировал товар, то при создании отдельных реализаций эти резервы должны корректно переноситься или переформировываться.

  6. Тестирование: Любая доработка требует тщательного тестирования на копии рабочей базы, чтобы убедиться в корректности работы алгоритма во всех возможных сценариях, включая отмену проведения, изменения в исходном документе после разделения и т.д.

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

← На главную