Почему в Акте о расхождениях после поступления в УТ 11 возникает отрицательный приход и как это исправить?

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

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

Проанализируем суть проблемы

Рассмотрим стандартный бизнес-процесс: мы получили товар от поставщика, оформили Приобретение товаров и услуг, а затем обнаружили, что фактически товара пришло больше. Мы создаем Акт о расхождениях после приемки, чтобы отразить этот факт. Логика подсказывает, что раз это излишек, то в складских регистрах должен появиться дополнительный "плюс".

Однако при анализе движений документа мы видим следующую картину:

  1. По строкам на уменьшение (недостача) — формируется вид движения Расход с положительным количеством. Здесь все верно.
  2. По строкам на увеличение (излишек) — формируется вид движения Приход, но количество указано со знаком "минус".

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

Разберем влияние на учет и отчетность

Может показаться, что "минус на минус дает плюс", и итоговый остаток на складе будет верным. Но проанализируем ситуацию глубже:

  1. Отчеты: В отчете Ведомость по товарам на складах в колонке "Приход" сумма будет уменьшена, что введет в заблуждение материально ответственных лиц. Вместо увеличения оборота по приходу они увидят его искусственное занижение.
  2. Себестоимость: Регистр Себестоимость товаров может некорректно воспринять отрицательный приход, что приведет к ошибкам при закрытии месяца и расчете финансового результата.
  3. Инвентаризация: При сопоставлении данных отрицательные приходы часто "зависают" в аналитике, создавая расхождения между управленческим и регламентированным учетом.

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

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

В типовом решении для серийных товаров запрос выглядит следующим образом (упрощенно):


ВЫБОР
    КОГДА НЕ ДанныеСерий.Серия ЕСТЬ NULL
    ТОГДА ДанныеСерий.КоличествоПоДокументу - ДанныеСерий.Количество
    ИНАЧЕ ТаблицаТовары.Количество
КОНЕЦ

Здесь и зарыта проблема: формула ДанныеСерий.КоличествоПоДокументу - ДанныеСерий.Количество при излишке (когда "Количество" факт больше "Количества по документу") всегда будет возвращать отрицательное число. Система видит, что это Акт о расхождениях (поступление), ставит вид движения Приход, но записывает туда этот отрицательный результат.

Рассмотрим решение через расширение конфигурации

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

Ниже приведен пример кода для общего модуля СкладыСервер, который решает задачу методом замены текста в теле запроса:


&После("ОформитьПоступлениеТоваровПоОдноходовкеВнутренний")
Процедура Расш1_ОформитьПоступлениеТоваровПоОдноходовкеВнутренний(Запрос, ТекстыЗапроса, Регистры, ТекстЗапросаДокумента, ОбъектМетаданных, ПараметрыМетода)
    
    // Проверяем, что работаем именно с Актом о расхождениях
    Если ОбъектМетаданных = Метаданные.Документы.АктОРасхожденияхПослеПриемки Тогда
        
        Для Каждого ЭлементСписка Из ТекстыЗапроса Цикл
        
            // Находим конкретную временную таблицу, отвечающую за серии
            Если ЭлементСписка.Представление = "ВТСерииОформитьПоступлениеТоваровПоОдноходовке" Тогда
                
                // Исправляем формулу расчета количества, чтобы избежать отрицательного прихода
                СтараяФормула = "ДанныеСерий.КоличествоПоДокументу - ДанныеСерий.Количество";
                НоваяФормула = "ВЫБОР КОГДА ДанныеСерий.КоличествоПоДокументу - ДанныеСерий.Количество > 0 
                               ТОГДА ДанныеСерий.КоличествоПоДокументу - ДанныеСерий.Количество 
                               ИНАЧЕ ДанныеСерий.Количество - ДанныеСерий.КоличествоПоДокументу КОНЕЦ";
                
                ЭлементСписка.Значение = СтрЗаменить(ЭлементСписка.Значение, СтараяФормула, НоваяФормула);
                
            КонецЕсли;
            
        КонецЦикла;
        
    КонецЕсли; 
    
КонецПроцедуры

Проанализируем нюансы этого решения

При использовании данного кода важно понимать несколько моментов:

  1. Использование функции модуля (ABS): Некоторые разработчики предлагают просто использовать функцию ABS(Количество). Однако это может быть опасно, если логика программы в других схемах (например, при сложной пересортице серий) все же ожидает отрицательный знак для сторнирования. Использование конструкции ВЫБОР...КОНЕЦ более безопасно, так как мы явно контролируем логику смены знака.
  2. Схемы "ходовки": В УТ 11 существует множество схем оформления: одноходовая, двухходовая, через ордера и т.д. Описанная ошибка чаще всего "живет" именно в ОформитьПоступлениеТоваровПоОдноходовкеВнутренний. Если вы используете ордерные склады, проверьте также аналогичные процедуры для работы с ордерами.
  3. Обновления: Поскольку мы используем СтрЗаменить, при обновлении конфигурации на новый релиз нужно проверять, не изменила ли компания 1С текст исходного запроса (например, добавив туда пробел или новое поле). Если текст изменится, СтрЗаменить не сработает, и костыль перестанет действовать.

Выясним, есть ли альтернативы

Прежде чем внедрять код, рекомендуем проверить наличие официальных патчей (исправлений) от 1С. Для многих релизов веток 11.4 и 11.5 выпущены расширения с префиксами EF_..., которые исправляют ошибки в расчете серий. Если для вашего релиза патча нет, то программное вмешательство через расширение остается единственным надежным способом обеспечить чистоту складского учета.

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

Подводя итог, отметим, что корректное отображение движений в регистре Товары на складах — это залог правильного расчета остатков и себестоимости. Описанное решение позволяет восстановить логику "Приход = Положительное число", что сделает ваши отчеты понятными для пользователей, а учет — прозрачным.

← На главную