Как отключить ордерную схему при приобретении товаров, но оставить при перемещении в 1С:УТ 11?

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

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

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

Почему задачу невозможно решить типовыми настройками склада?

Проанализируем структуру карточки склада в 1С:УТ 11. Перейдем в настройки склада на вкладку «Ордерная схема и структура». Мы увидим флаг «При поступлении». Данная настройка является глобальной для выбранного склада. В системе нет штатной возможности указать детализацию вроде: «Использовать ордерную схему при поступлении, кроме документов приобретения».

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

Техническая архитектура складского учета под капотом: почему «хардкод» опасен

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

В системе 1С:УТ 11 складские движения распределены по двум ключевым регистрам накопления:

  1. Товары к поступлению — этот регистр выступает в роли «буфера». При проведении финансового документа (накладной приобретения) на ордерный склад, в этот регистр делается запись со знаком «+» (приход). При этом физические остатки товаров на складе не увеличиваются.
  2. Товары на складах — этот регистр хранит фактические, физические остатки на складах. Записи в этот регистр при ордерной схеме делает исключительно документ ПриходныйОрдерНаТовары (делает «+» (приход) в этот регистр и одновременно закрывает буфер, делая «-» (расход) в регистр Товары к поступлению).

Если мы просто «обманем» проведение документа Приобретение товаров и услуг и заставим его думать, что склад не ордерный, документ сделает прямые движения по регистру Товары на складах. Однако при этом сломается вся остальная цепочка: отчеты «Ведомость товаров по складам», «Контроль оформления документов при поступлении» начнут показывать некорректные остатки и требовать несуществующие документы. Логика распределения товаров по ячейкам (если используется адресное хранение) также полностью нарушится.

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


Вариант решения №1: Подписка на событие проведения документа (Автосоздание ордера)

Рассмотрим наиболее популярный и надежный способ реализации — создание расширения конфигурации и подписки на событие проведения документа ПриобретениеТоваровУслуг. Наша задача: при успешном проведении приобретения программно сформировать, заполнить и провести документ ПриходныйОрдерНаТовары в статусе «Принят».

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

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

Посмотрим на пример программной реализации обработчика подписки на событие ОбработкаПроведения для документа ПриобретениеТоваровУслуг:


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

Теперь детально спроектируем процедуру создания самого приходного ордера. Нам нужно перенести номенклатуру, характеристики, серии (если используются), упаковки и количество:


Процедура СоздатьИПровестиПриходныйОрдер(ДокументИсточник)
    
    // Ищем, не создан ли ордер по этому распоряжению ранее
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ПриходныйОрдерНаТовары.Ссылка КАК Ссылка
        |ИЗ
        |	Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
        |ГДЕ
        |	ПриходныйОрдерНаТовары.Распоряжение = &Распоряжение
        |	И НЕ ПриходныйОрдерНаТовары.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("Распоряжение", ДокументИсточник.Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        ОрдерОбъект = Документы.ПриходныйОрдерНаТовары.СоздатьДокумент();
    Иначе
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        ОрдерОбъект = Выборка.Ссылка.ПолучитьОбъект();
    КонецЕсли;
    
    // Заполняем шапку ордера
    ОрдерОбъект.Дата = ДокументИсточник.Дата + 1; // Сдвигаем на секунду позже для хронологии
    ОрдерОбъект.Склад = ДокументИсточник.Склад;
    ОрдерОбъект.Распоряжение = ДокументИсточник.Ссылка;
    ОрдерОбъект.Статус = Перечисления.СтатусыПриходныхОрдеров.Принят;
    ОрдерОбъект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
    
    // Очищаем ТЧ перед заполнением (актуально для обновления существующего ордера)
    ОрдерОбъект.Товары.Очистить();
    
    // Заполняем табличную часть Товары из документа приобретения
    Для Каждого СтрокаИсточника Из ДокументИсточник.Товары Цикл
        
        НоваяСтрока = ОрдерОбъект.Товары.Добавить();
        ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
        
        // Дополнительное заполнение специфичных реквизитов складского учета
        НоваяСтрока.Количество = СтрокаИсточника.Количество;
        НоваяСтрока.КоличествоУпаковок = СтрокаИсточника.КоличествоУпаковок;
        
    КонецЦикла;
    
    Попытка
        ОрдерОбъект.Записать(РежимЗаписиДокумента.Проведение);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            НСтр("ru = 'Не удалось автоматически создать и провести Приходный ордер на товары: '") + ОписаниеОшибки()
        );
    КонецПопытки;
    
КонецПроцедуры

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


Вариант решения №2: Автоматизация через регламентное задание (Фоновое создание)

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

Чтобы избежать этих проблем, применим альтернативный подход — фоновое создание ордеров через регламентные задания. Схема работы выглядит следующим образом:

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

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


Вариант решения №3: Использование специализированного рабочего места «Приемка»

Если дорабатывать конфигурацию кодом категорически не хочется, рассмотрим организационный вариант решения проблемы. В системе 1С:УТ 11 присутствует удобное рабочее место «Склад и доставка» — «Приемка».

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

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

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

Подведем итоги нашего анализа:

← На главную