Каждый практикующий специалист по внедрению или сопровождению систем 1С:Управление торговлей (версии 11.4 и 11.5), 1С:ERP Управление предприятием или 1С:Комплексная автоматизация хотя бы раз сталкивался с трудностями при закрытии месяца. Одной из самых неприятных и «немых» ошибок является аварийное завершение работы помощника исправления остатков с сообщением: «Превышен лимит итераций перезаполнения видов запасов».
Ситуация осложняется тем, что штатное диалоговое окно программы абсолютно неинформативно. Оно не указывает ни конкретную проблемную номенклатурную позицию, ни ошибочный документ, ни аналитику учета, которая привела к сбою. Бухгалтер или рядовой пользователь оказывается перед непреодолимой стеной, а закрытие месяца полностью блокируется. В этой статье мы подробно разберем, почему возникает эта ошибка с точки зрения архитектуры 1С, как устроен этот механизм «под капотом» конфигурации и какими практическими методами можно решить проблему.
Для того чтобы понять природу ошибки, нам необходимо погрузиться в логику работы механизмов партионного учета и интеркампани в современных конфигурациях 1С. В программах УТ 11, ERP и КА учет товаров ведется не просто в разрезе номенклатуры и складов, но и в разрезе так называемых видов запасов. Вид запаса — это специальный служебный справочник, который определяет, кому именно принадлежит товар (собственный товар организации, комиссионный товар, товар на хранении) и под какие налоговые обязательства он закуплен (НДС, налогообложение и т.д.).
В документах расхода (таких как «Реализация товаров и услуг», «Перемещение товаров», «Списание недостач») виды запасов хранятся в отдельной скрытой табличной части. Эта табличная часть заполняется автоматически при проведении документа на основе текущих остатков организации. Чтобы оптимизировать производительность базы данных, система кэширует эти данные. Это означает, что при обычном групповом перепроведении документов (например, через стандартную обработку или при закрытии месяца) скрытая табличная часть с видами запасов не перезаполняется заново, если в документе не менялись ключевые реквизиты: количество, цена, склад или сама номенклатура.
Когда в процессе работы возникают расхождения (например, документы проводились задним числом, менялись спецификации, отключался контроль остатков организаций при схеме Интеркампани), возникает развернутое сальдо по организациям. Для устранения этих расхождений запускается штатный «Помощник исправления остатков товаров организаций». Для автоматического выравнивания таких расхождений можно использовать обработку для исправления отрицательных остатков товаров организаций.
Давайте обратимся к исходному коду конфигурации, чтобы понять, в какой именно момент система генерирует исключение. В модулях обработки помощника присутствует процедура ПерезаполнитьВидыЗапасов(). Проанализируем ее логику:
Процедура ПерезаполнитьВидыЗапасов() Экспорт
Если Константы.КонтролироватьОстаткиТоваровОрганизаций.Получить() Тогда
ПараметрыСеанса.ПроводитьБезКонтроляОстатковТоваровОрганизаций = Истина;
КонецЕсли;
Завершение = Ложь;
Итерация = 1;
Пока Не Завершение Цикл
Если Итерация > 50 Тогда
ТекстИсключения = НСтр("ru = 'Превышен лимит итераций перезаполнения видов запасов'", Метаданные.ОсновнойЯзык.КодЯзыка);
ЗаписьЖурналаРегистрации(
ИмяСобытия(),
УровеньЖурналаРегистрации.Ошибка,
Метаданные.Обработки.ПомощникИсправленияОстатковТоваровОрганизаций,
,
ТекстИсключения);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ЗаполнитьСписокДокументовКПерезаполнению();
Если ДокументыКПерезаполнению.Количество() = 0 Тогда
Если СледующаяАналитикаРазвернутогоСальдо() Тогда
ОчиститьРезервы("ПоАналитике");
Итерация = 1;
Продолжить;
Иначе
Завершение = Истина;
КонецЕсли;
Иначе
СнятьФлагВидыЗапасовУказаныВручную();
ПерезаполнитьВидыЗапасовИтерация();
Итерация = Итерация + 1;
КонецЕсли;
ДокументыКПерезаполнению.Очистить();
КонецЦикла;
КонецПроцедуры
Разберем детально, как работает этот алгоритм по шагам:
ПроводитьБезКонтроляОстатковТоваровОрганизаций в значение Истина). Это необходимо, чтобы программа могла перепроводить документы даже при временных технических «минусах».Резервы товаров организаций).ЗаполнитьСписокДокументовКПерезаполнению() собирает все документы-регистраторы за закрываемый период, которые сделали движения по данной аналитике.Итерация = 1).ВызватьИсключение ТекстИсключения.Выясним, какие именно несоответствия в данных приводят к тому, что система зацикливается и не может автоматически распределить виды запасов:
1. Отсутствие номеров ГТД при партионном учете импортного товара. Это одна из самых частых причин в практике оптовой торговли. Если в системе включен учет по ГТД, но в каком-то из документов списания или перемещения партия импортного товара списалась без указания номера ГТД (либо этого номера ГТД физически нет на остатках организации-отправителя), автоматический распределитель видов запасов не сможет сопоставить расход с приходом. Он будет бесконечно пытаться перепровести документ, ожидая появления нужного номера ГТД, которого нет. Для устранения подобных расхождений подойдёт модифицированный помощник исправления сальдо товаров по ГТД.
2. Изменение Группы финансового учета (ГФУ) номенклатуры задним числом. Если в течение закрываемого месяца у карточки номенклатуры была изменена ГФУ, новые документы поступления будут формировать проводки по новой группе финучета. В то же время старые расходные документы, записанные до изменения реквизита, содержат в своей скрытой части видов запасов старую ГФУ. Помощник исправления остатков пытается сопоставить эти данные, видит несовпадение аналитик учета и уходит в бесконечный цикл.
3. Ошибки в налоговом назначении (НДС). Данная проблема часто возникает при операциях перемещения товаров между складами с разным типом налогообложения (например, с общей системы на патент или ЕНВД) или при оформлении возвратов. Если вид запаса сформировался без указания налогового назначения, система фиксирует развернутое сальдо и не может завершить итерацию.
4. Зависшие «фантомные» резервы в регистрах. Когда товар резервируется под заказ клиента, а затем этот заказ отменяется некорректно (или товар списывается другим документом в обход резерва), в регистре накопления Резервы товаров организаций зависает фиктивный остаток. Помощник видит этот резерв, пытается его учесть при распределении видов запасов, но физически товара на складе нет. Это вызывает логический тупик в алгоритме распределения.
5. Смешение владельцев запасов (Собственный и Комиссионный товар). Алгоритмы Помощника исправления остатков товаров организаций спроектированы под распределение собственных товаров в рамках схем Интеркампани. Если программа сталкивается с необходимостью исправить развернутое сальдо между собственным товаром и товаром, принятым на комиссию (или товарами разных комитентов), штатный автоматический алгоритм оказывается бессилен.
Поскольку встроенный помощник не может справиться самостоятельно и падает с ошибкой, нам придется локализовать и устранить проблему вручную. Рассмотрим несколько эффективных практических методов решения этой задачи.
Прежде чем что-то исправлять, нам нужно выяснить, какая именно номенклатура или какой документ вызывает зацикливание алгоритма. Для этого проведем расследование по шагам:
ОрганизацияНоменклатураНомер ГТД (если ведется учет импортных товаров)Вид запасовКак мы уже выяснили, простое перепроведение документов не очищает старый кэш видов запасов. Чтобы заставить систему полностью пересчитать движения документов в правильной хронологической последовательности, необходимо выполнить принудительную очистку скрытых табличных частей. Разберем этот процесс:
ВидыЗапасов во всех выбранных документах и очистит признак ручной корректировки видов запасов (снимет флаг ВидыЗапасовУказаныВручную).Если в процессе анализа отчетов вы обнаружили, что отрицательные остатки вызваны «фантомными» резервами, выполним следующие действия:
Резервы товаров организаций.Резервы товаров организаций и вручную сделаем корректирующее движение (расход), закрывающее зависший «фантомный» остаток.Иногда обычное перепроведение «поверх» существующих документов не дает результата из-за того, что коллизии в движениях регистров себестоимости блокируют правильный расчет партий. В таком случае применим метод «полного сброса»:
Проанализировав все указанные методы и выявив конкретные расхождения в учете (будь то забытый номер ГТД или изменившаяся аналитика номенклатуры), мы гарантированно избавимся от циклической ошибки и сможем успешно завершить процедуру закрытия месяца.