При работе в конфигурации 1С:Управление торговлей (редакция 11.4) (а также в аналогичных по архитектуре ERP и Комплексной автоматизации 2) пользователи и разработчики часто сталкиваются с ситуацией: документ Перемещение товаров проводится без ошибок, списывает остатки со склада-отправителя, но при этом по регистру накопления Товары организаций делает движение только по расходу. Ожидаемый приход на склад-получатель в регистре отсутствует.
В этой статье мы подробно разберем, как устроена финансовая и складская логика перемещения товаров, выясним причины такого поведения системы при ручном учете и на ордерных складах, а также рассмотрим технические нюансы и ошибки программистов при программном создании документов.
В современных конфигурациях 1С процесс перемещения товаров — это не одномоментное событие, а цепочка бизнес-процессов, которая может быть растянута во времени. Для разделения этапов перемещения используются статусы документа:
Товары организаций фиксируется движение Расход. Однако прихода на склад-получатель еще нет. Финансово товар переходит в состояние «в пути». Для этого задействуются специализированные регистры (например, Товары к оформлению поступления).Товары организаций, закрывая финансовый цикл операции и увеличивая остатки организации на новом месте.Если в вашем документе перемещения установлен статус «Отгружено», то отсутствие движений прихода по регистру Товары организаций является штатным и методически верным поведением системы.
Проанализируем ситуацию, когда склад-получатель работает по ордерной схеме. Здесь часто возникает методическая ошибка пользователей, приводящая к расхождению складского и финансового учета:
Приходный ордер на товары. Товар физически принимается на склад, и по регистру Товары на складах формируется приход. В отчете «Ведомость по товарам на складах» остаток увеличивается.Приходный ордер на товары — это чисто складской документ. Он не делает и не может делать движений по финансовому регистру Товары организаций.Перемещение товаров, вручную изменить статус на «Принято» и провести его. Только после этого финансовый приход отразится в регистре Товары организаций.Если документы перемещения создаются программно (например, через внешние обработки, интеграции с сайтом, мобильными приложениями или самописными кнопками), разработчики часто допускают ряд критических ошибок, из-за которых движения формируются некорректно.
Рассмотрим основные причины программных сбоев:
Статус (или записать туда пустое значение), документ проведется по умолчанию, но движения прихода сформированы не будут. Интерактивно на форме статус может подставляться автоматически при открытии формы пользователем, но в самой базе данных значение останется пустым.ХозяйственнаяОперация пуст, то алгоритмы проведения в модуле менеджера отработают не полностью.ВидыЗапасов. При программном создании без вызова соответствующих процедур проведения или перезаполнения видов запасов движения по регистру Товары организаций могут «схлопнуться» или не сформироваться вовсе.Рассмотрим пример кода на встроенном языке 1С, который позволяет корректно создать и провести документ Перемещение товаров со статусом «Принято», гарантирующим формирование как расхода, так и прихода по всем необходимым регистрам организации.
// Создаем новый документ перемещения
НовоеПеремещение = Документы.ПеремещениеТоваров.СоздатьДокумент();
// Заполняем основные реквизиты шапки
НовоеПеремещение.Дата = ТекущаяДата();
НовоеПеремещение.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701020304");
НовоеПеремещение.СкладОтправитель = Справочники.Склады.НайтиПоНаименованию("Основной склад (отправитель)");
НовоеПеремещение.СкладПолучатель = Справочники.Склады.НайтиПоНаименованию("Ордерный склад (получатель)");
// Обязательно заполняем хозяйственную операцию
НовоеПеремещение.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваров;
// Устанавливаем статус "Принято", чтобы сформировался финансовый приход на склад-получатель
НовоеПеремещение.Статус = Перечисления.СтатусыПеремещенийТоваров.Принято;
// Заполняем табличную часть "Товары"
НоваяСтрока = НовоеПеремещение.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00-000015");
НоваяСтрока.Количество = 5;
НоваяСтрока.КоличествоУпаковок = 5;
НоваяСтрока.ЗнаменательПервичногоДокумента = 1;
НоваяСтрока.ЧислительПервичногоДокумента = 1;
// Записываем документ в режиме записи для генерации ссылки
НовоеПеремещение.Записать(РежимЗаписиДокумента.Запись);
// Для корректного расчета видов запасов и проведения используем типовые механизмы
// В УТ 11 проведение документов рекомендуется выполнять в транзакции с вызовом обработчиков проведения
Попытка
НовоеПеремещение.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно проведен со статусом Принято!");
Исключение
Сообщить("Ошибка при проведении: " + ОписаниеОшибки());
КонецПопытки;
Если в базе скопилось множество документов перемещения, созданных некорректно (без статуса «Принято»), простое групповое перепроведение стандартной обработкой может не помочь, так как сами данные в базе остаются незаполненными.
Для исправления ситуации выполним следующие шаги:
Статус в значение Перечисления.СтатусыПеремещенийТоваров.Принято.Приведем пример кода для исправления существующих документов:
Выборка = Документы.ПеремещениеТоваров.Выбрать(НачалоДня(РабочаяДата), КонецДня(РабочаяДата));
Пока Выборка.Следующий() Цикл
// Проверяем, нужно ли корректировать документ
Если Выборка.Статус <> Перечисления.СтатусыПеремещенийТоваров.Принято Тогда
ДокОбъект = Выборка.ПолучитьОбъект();
// Устанавливаем правильный статус
ДокОбъект.Статус = Перечисления.СтатусыПеремещенийТоваров.Принято;
// Перезаполняем виды запасов через встроенную процедуру (если требуется)
// Для этого может потребоваться вызов серверных процедур из модуля менеджера документа
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ " + ДокОбъект.Ссылка + " успешно исправлен и проведен.");
Исключение
Сообщить("Не удалось провести документ " + ДокОбъект.Ссылка + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецЦикла;
После выполнения данного кода система автоматически сформирует недостающие записи по приходу в регистре Товары организаций, баланс организации сойдется, и расхождения между складским и финансовым учетом будут полностью устранены.