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