При работе в конфигурации «1С:Управление торговлей 10.3» пользователи и администраторы нередко сталкиваются с парадоксальной ситуацией: документ «Перемещение товаров» или «Реализация товаров и услуг» не проводится, сообщая об ошибке «Недостаточно товара на складе...», хотя специализированные отчеты наглядно показывают наличие необходимого количества. Особенно часто эта проблема проявляется при попытке переместить или списать старые остатки (например, оприходованные несколько лет назад).
В этой статье мы подробно разберем, почему возникает данная коллизия, проанализируем внутреннее устройство регистров УТ 10.3 и выработаем пошаговый алгоритм безопасного устранения этой ошибки в рабочей базе данных.
---
Для того чтобы понять природу ошибки, проанализируем архитектуру хранения данных в системе. В отличие от простых учетных программ, в «1С:Управление торговлей 10.3» физический остаток товара и его доступность для операций распределены по нескольким независимым регистрам накопления. Система проверяет остатки по каждому из них в зависимости от вида хозяйственной операции:
ТоварыНаСкладах (Товары на складах). Этот регистр хранит информацию о чисто физическом наличии номенклатуры на конкретных складах без привязки к организациям юридического лица. Стандартный отчет «Ведомость по товарам на складах» берет данные именно отсюда. Если товар есть здесь, мы видим его в складских отчетах.ТоварыОрганизаций (Товары организаций). Регистр отвечает за финансовую принадлежность товара конкретному юридическому лицу. Если в параметрах учета включена опция «Вести учет товаров организаций в разрезе складов», система при проведении любого списания проверяет остаток по паре «Организация + Склад». Ошибка «Недостаточно товара по организации...» возникает при нулевом или отрицательном балансе в этом регистре.ПартииТоваровНаСкладах (Партии товаров на складах). Используется для ведения партионного учета и расчета себестоимости по методам FIFO/ЛИФО или «по средней». Если в базе включено списание партий при проведении документов, система жестко контролирует наличие свободных партий. Если партий нет — документ не проведется.СвободныеОстатки (Свободные остатки). Хранит данные о доступном к отгрузке товаре за вычетом резервов, сформированных документами «Заказ покупателя».Суть проблемы: когда мы формируем отчет, мы можем видеть положительный остаток по регистру ТоварыНаСкладах. Однако при проведении «Перемещения товаров» программа обращается к регистру ТоварыОрганизаций или к партионному учету. Если в каком-то из этих регистров движение в свое время не сформировалось (например, при оприходовании товара в 2011 году), система заблокирует проведение документа, несмотря на красивые цифры в складском отчете.
---
Рассмотрим подробнее, из-за чего в документе-первоисточнике (например, старом документе «Оприходование товаров») могут отсутствовать движения по одному или нескольким регистрам накопления:
ОбменДанными.Загрузка = Истина. В таком режиме документ помечается как проведенный, но его фактические движения по регистрам не создаются вовсе либо переносятся некорректно.---
Выясним причину ошибки в нашей конкретной ситуации, последовательно выполнив следующие шаги:
Шаг 1. Проверяем резервы и доступность товара
Откроем карточку проблемного товара и сформируем отчет «Остатки и доступность товаров». Нам необходимо убедиться, что весь объем товара не зарезервирован под какой-либо старый заказ покупателя. Если резерв присутствует, его необходимо снять документом «Закрытие заказов покупателей» или «Корректировка заказа».
Шаг 2. Проверяем остатки в разрезе организаций
Поскольку перемещение происходит в рамках организации, сформируем отчет «Ведомость по товарам организаций» с группировкой по складам. Проанализируем, числится ли товар на организации на нужном складе отправителя. Часто оказывается, что на складе товар есть, но числится он за другим юрлицом.
Шаг 3. Анализируем и сравниваем движения документа
Найдем документ оприходования (источник остатка) в рабочей базе. Перейдем по кнопке «Перейти» в движения документа и посмотрим, по каким регистрам накопления сделаны записи. Проделаем ту же операцию на резервной копии базы данных после пробного перепроведения этого документа. Если в рабочей базе отсутствуют записи по регистрам Товары организаций или Партии товаров на складах (управленческий учет), которые появились в копии — мы нашли корень проблемы. Для быстрого анализа можно использовать внешний отчет для сравнения движений регистров «Товары на складах» и «Партии товаров на складах».
---
Проанализируем возможные варианты исправления ситуации в рабочей базе, разделяя их на опасные и рекомендуемые.
Как показал эксперимент автора темы на копии базы, простое перепроведение старого оприходования за 2011 год решает проблему с перемещением, так как документ заново формирует все необходимые движения по современным правилам системы.
Почему это крайне опасно в рабочей базе:
Вердикт: использовать этот метод в рабочей базе категорически не рекомендуется.
Для безопасного исправления ситуации воспользуемся штатным механизмом платформы 1С — созданием корректирующего документа текущей датой.
Рассмотрим по шагам, как это сделать:
Операции -> Документы -> Корректировка записей регистров и создадим новый документ текущей датой (или датой начала текущего незакрытого отчетного периода).Товары организаций и Партии товаров на складах).Этот способ позволяет точечно «дорисовать» недостающие движения по регистрам в текущем периоде, не затрагивая прошлые года и не вызывая пересчета партий.
Если подобных позиций номенклатуры очень много и ручной ввод корректировок нерационален, программист может написать внешнюю обработку, которая программно запишет движения непосредственно в регистры, привязав их к документу-основанию. Для автоматического исправления остатков в УТ 10.3 можно воспользоваться обработкой для выравнивания регистра «Товары организаций» по данным регистра «Товары на складах».
Рассмотрим пример кода на встроенном языке 1С, который восстанавливает движение прихода по регистру ТоварыОрганизаций без фактического интерактивного перепроведения самого документа:
// Получаем объект документа оприходования без его перепроведения
ДокОбъект = СсылкаНаОприходование.ПолучитьОбъект();
// Блокируем автоматическую запись движений при записи объекта
ДокОбъект.ОбменДанными.Загрузка = Истина;
// Очищаем существующие и создаем новые движения по регистру ТоварыОрганизаций
НаборДвижений = РегистрыНакопления.ТоварыОрганизаций.СоздатьНаборЗаписей();
НаборДвижений.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
// Формируем новую запись
НоваяЗапись = НаборДвижений.ДобавитьПриход();
НоваяЗапись.Период = ДокОбъект.Дата;
НоваяЗапись.Организация = ДокОбъект.Организация;
НоваяЗапись.Номенклатура = ВыбраннаяНоменклатура;
НоваяЗапись.Склад = ДокОбъект.Склад;
НоваяЗапись.Количество = НужноеКоличество;
// Записываем движения в базу данных
НаборДвижений.Записать(Истина);
Важное примечание: данный метод требует высокой квалификации разработчика, так как некорректная программная запись движений в обход бизнес-логики конфигурации может нарушить целостность базы данных.
---
Если вы проверили основные регистры, но перемещение все равно не проводится, проанализируем следующие параметры:
Качество (Новый, Брак, Подлежащий восстановлению). Оприходование могло пройти с качеством «Новый», а в документе перемещения по умолчанию подставилась пустая аналитика или значение «Брак». При несовпадении этого разреза программа выдаст ошибку о нехватке остатка.Проанализировав все описанные факторы и воспользовавшись методом корректировки записей регистров, мы сможем успешно провести документ перемещения товаров без риска повредить исторические данные учета.