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