Ошибка «Не распределилось по партиям» в типовой конфигурации «1С:Торговля и Склад 7.7» (ТиС) является одной из самых распространенных и в то же время комплексных проблем партионного учета. Она сигнализирует о том, что система не может сопоставить списываемое количество товара по регистру остатков с накопленными партиями в регистре партионного учета. Разберем детально, почему возникает эта ошибка и как её исправить в различных ситуациях: после свертки информационной базы, при обменах данными через МОД или при операционной работе пользователей.
В конфигурации «1С:Торговля и Склад 7.7» параллельно ведутся два ключевых регистра учета запасов:
ОстаткиТМЦ — отвечает за оперативный количественный учет товаров в разрезе складов. Здесь система проверяет, физически ли присутствует товар на складе.ПартииНаличие — отвечает за стоимостный (партионный) учет товаров в разрезе фирм, МОЛ (материально-ответственных лиц), статусов партий и цен. Именно отсюда списывается себестоимость по методам FIFO или LIFO.Когда мы проводим расходный документ (например, «Реализация ТМЦ» или «Отчет ККМ»), программа сначала проверяет наличие свободного количества в регистре ОстаткиТМЦ. Если товар есть, она переходит к алгоритму списания себестоимости из регистра ПартииНаличие. Если на данном этапе по партионному регистру товара не хватает (или не совпадают важные аналитические разрезы), система выдает предупреждение: «Не распределилось по партиям...».
Рассмотрим подробнее программный код процедуры глСписаниеПартийТМЦ, которая отвечает за проведение этих движений. Обратим внимание на то, как именно система определяет нераспределенный остаток и выводит предупреждение в окно сообщений:
Если ОстПогКоличество > 0 Тогда
// Если после обхода всех доступных партий осталась несписанная потребность
Если ПустоеЗначение(ТаблНоменклатуры.Партия) = 1 Тогда
глСообщениеПроведения ("При проведении партий ТМЦ по " + Конт.ТекущийДокумент + " от " + Конт.ДатаДок + " по ТМЦ " + СокрЛП(Номенклатура) + " не распределилось по партиям " + ОстПогКоличество + " " + Номенклатура.БазоваяЕдиница, Конт.ТекущийДокумент,,, 1);
Иначе
глСообщениеПроведения("По указанной к списанию партии ТМЦ """ + ТаблНоменклатуры.Партия.ПриходныйДокумент + """ по ТМЦ " + СокрЛП(Номенклатура) + " не распределилось " + ОстПогКоличество + " " + Номенклатура.БазоваяЕдиница, Конт.ТекущийДокумент,,, 1);
КонецЕсли;
// Записываем движение по пустой партии с отрицательным значением для сохранения баланса остатков
РегПартии.Фирма = Фирма;
РегПартии.Номенклатура = Номенклатура;
РегПартии.СтатусПартии = глПолучитьСтатусПартииПрихода(Перечисление.ВидыТМЦ.Товар, Номенклатура, КодОперации, Склад);
РегПартии.Партия = ПолучитьПустоеЗначение("Справочник.Партии");
// ... заполнение остальных реквизитов ...
РегПартии.Количество = ОстПогКоличество;
РегПартии.ДвижениеРасходВыполнить();
КонецЕсли;
Выясним основные причины возникновения этой коллизии и разберем по шагам методы их устранения.
Очень часто ошибка проявляется в распределенных информационных базах после проведения обменов. Например, в филиале документы проводятся без ошибок, а в центральной базе после миграции те же документы не могут распределиться по партиям. Почему это происходит?
В типовой конфигурации «1С:Торговля и Склад 7.7» элементы справочника Партии создаются интерактивно в модуле формы приходного документа в процедуре ПриЗаписи(). Если приходный документ переносится через МОД (Модуль обмена данными) или загружается программно сторонней обработкой, разработчики часто используют метод Записать() непосредственно для объекта документа. При этом код формы не отрабатывает, и новые элементы в справочнике Партии не создаются.
В результате документ поступления в базе-приемнике существует и проведен по регистру ОстаткиТМЦ, но в регистре ПартииНаличие его движения зависают на пустой партии <не выбран>, либо движений вообще нет. Любая последующая продажа этого товара завершится ошибкой распределения партий.
Решение проблемы:
Для исправления ситуации необходимо программно или вручную заставить систему сгенерировать недостающие элементы справочника Партии. Если таких документов немного, можно открыть документ поступления в базе, внести любое мелкое изменение (например, пересортировать строки или перевыбрать склад) и нажать кнопку «ОК». Сработает интерактивный обработчик формы, партия создастся, и документ перепроведется корректно.
Если документов много, напишем простую групповую обработку для автоматического восстановления партий:
// Пример кода для принудительного создания элементов справочника Партии
Процедура СформироватьПартииДляДокумента(ТекущийДок)
СпрПартии = СоздатьОбъект("Справочник.Партии");
ТекущийДок.ВыбратьСтроки();
Пока ТекущийДок.ПолучитьСтроку() = 1 Цикл
Номенклатура = ТекущийДок.Номенклатура;
Если Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга Тогда
Продолжить;
КонецЕсли;
СпрПартии.ИспользоватьВладельца(Номенклатура);
// Проверяем, создана ли уже партия под этот документ
Если СпрПартии.НайтиПоРеквизиту("ПриходныйДокумент", ТекущийДок.ТекущийДокумент(), 1) = 0 Тогда
СпрПартии.Новый();
СпрПартии.ПриходныйДокумент = ТекущийДок.ТекущийДокумент();
СпрПартии.СтатусПартии = глПолучитьСтатусПартииПрихода(Перечисление.ВидыТМЦ.Товар, Номенклатура,, ТекущийДок.Склад);
СпрПартии.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию, когда товар физически есть на остатках склада, но при продаже система все равно выдает ошибку списания партий. Нам нужно сопоставить ключевые измерения двух регистров:
ОстаткиТМЦ хранит остатки в разрезе измерения Склад.ПартииНаличие хранит остатки в разрезе измерения МОЛ (Материально-ответственное лицо). При проведении документа программа определяет МОЛ динамически из реквизита склада: МОЛ = Склад.МОЛ.Если в процессе работы пользователь зашел в справочник «Склады» и изменил ответственное лицо (МОЛ) у конкретного склада, мы получим серьезное расхождение данных. Все старые приходы останутся числиться за старым МОЛ в регистре партий. Но при попытке провести новый расходный документ система обратится к текущему значению склада, получит нового МОЛ и попытается списать партии по нему. Не найдя партий по новому МОЛ, программа выдаст ошибку распределения.
Решение проблемы:
Сформируем два отчета за один и тот же период с максимальной детализацией по проблемной номенклатуре:
Если мы обнаружим, что остатки по складу сходятся, а в ведомости по партиям товар числится за другим материально-ответственным лицом или другой фирмой (например, приходы оформлены на ИП, а продать пытаемся с ООО), то причина именно в этом. Для исправления ситуации необходимо либо вернуть прежнего МОЛ в свойствах склада на момент перепроведения документов, либо оформить документы внутреннего перемещения/корректировки остатков партий.
При свертке информационной базы на определенную дату (например, 31.12.2023) формируются документы ввода остатков. Если процедура свертки была выполнена с ошибками или до свертки не была полностью восстановлена последовательность документов (имелись отрицательные остатки по партиям), мы получим «разорванный» учет в новой базе.
Ввод остатков по регистру ОстаткиТМЦ создаст корректные количественные остатки по складам. Однако документ ввода остатков по регистру ПартииНаличие запишет неполные данные или проигнорирует позиции с отрицательной стоимостью. Любые попытки продать такой товар в новом периоде приведут к ошибкам распределения партий, так как физически товару не сопоставлены документы ввода остатков в качестве партиеобразующих документов.
Решение проблемы:
Необходимо тщательно проверить документы «Ввод остатков ТМЦ» и «Ввод остатков партий». Если обнаружены расхождения, придется вручную скорректировать партионные документы ввода остатков, сопоставив количество товара актуальным приходным ценам и соответствующим аналитикам (Фирма, Склад, МОЛ, Статус партии).
Иногда пользователи сталкиваются с «мистическим» поведением программы: при проведении документа «Отчет ККМ» или «Реализация» возникает ошибка списания партий, но стоит скопировать документ поступления, перенести его на начало дня и удалить старый — всё проводится без замечаний.
Разберем причину этого явления. В платформе 1С 7.7 отсутствует понятие миллисекунд. Если в течение одной секунды в базу записываются и приходный, и расходный документы (что часто бывает при автоматическом обмене данными), их физический порядок в базе определяется системным временем записи. Если расходный документ записан хотя бы на мгновение раньше прихода, при проведении он «не увидит» партий, которые создает приходный документ.
Решение проблемы:
Если вы столкнулись с ошибкой распределения партий, рекомендуем действовать по следующему проверенному алгоритму:
<не выбран>, это означает, что ранее товар списывался в «минус». Необходимо найти первоисточник этого минуса, исправить его и восстановить границу последовательности (ГП).