При адаптации механизмов контроля остатков из современных конфигураций (например, УТ 11 или ERP) в конфигурацию 1С:Управление производственным предприятием 1.3 разработчики часто сталкиваются с техническими сложностями. Типовая логика проведения документов в УПП устроена иначе: при проведении документа регистр партий может перезаписываться несколько раз за одну транзакцию.
Рассмотрим типовую цепочку записи регистра ПартииТоваровНаСкладах при проведении документа ПоступлениеТоваровУслуг:
Если мы попытаемся встроить контроль отрицательных остатков в модуль набора записей регистра (события ПередЗаписью или ПриЗаписи), алгоритм выдаст ошибку уже на первом шаге очистки или на промежуточных итерациях, когда итоговая картина движений еще не сформирована. Разберем по шагам, как корректно и с минимальными трудозатратами обойти данное поведение платформы.
Проанализируем ситуацию: в УПП 1.3 логика проведения разнесена по серверным общим модулям, поэтому накапливать записи в памяти и однократно сбросить их в конце транзакции без глобальной переработки типового кода невозможно. При попытке контролировать остатки непосредственно в модуле набора записей мы сталкиваемся с тем, что документ сначала очищает регистр (что при проверке задним числом сразу дает минус), а затем пишет партии частями.
Для решения этой задачи существует два архитектурных пути:
Наиболее надежный подход заключается в переносе контрольного алгоритма из модуля набора записей регистра в подписки на события документа: ОбработкаПроведения (или ПриПроведении) и ОбработкаУдаленияПроведения.
Поскольку типовые механизмы УПП выполняют все промежуточные очистки и записи движений в рамках одной транзакции документа, к моменту завершения обработчика проведения все движения уже зафиксированы внутри транзакции. Запрос к базе данных внутри этой же транзакции видит окончательный результат движений документа.
Разберем по шагам реализацию данного механизма:
ОбработкаПроведения (источник — проверяемые документы).ОбработкаУдаленияПроведения, чтобы предотвратить появление минусов при распроведении приходных накладных задним числом.ПартииТоваровНаСкладах.Отказ = Истина. Вся транзакция проведения или отмены проведения документа целиком откатывается платформой.В модуле набора записей контроль в таком случае оставляют исключительно для ручных операций и документа КорректировкаЗаписейРегистров, где набор движений формируется и записывается пользователем ровно один раз.
Выясним причину популярной ошибки при проверке остатков: соединение движений документа с остатками на текущий момент времени. Если мы отменяем проведение поступления от прошлого месяца, проверка остатка на текущую дату может сработать некорректно. Например, после спорного документа было еще одно поступление. Тогда на текущий момент остаток положителен, но в периоде между документами образуется скрытый отрицательный остаток.
Рассмотрим, как правильно организовать контрольный запрос при проведении или отмене документа задним числом:
БлокировкаДанных) по проверяемым позициям (номенклатура, склад), чтобы исключить параллельное списание другими транзакциями.Если по техническим требованиям проектные стандарты требуют оставить проверку внутри модуля набора записей регистра накопления, необходимо отличать технические промежуточные записи от финальной записи.
Проанализируем алгоритм с использованием свойств объекта:
ДополнительныеСвойства.Записать() устанавливается признак:
НаборЗаписей.ДополнительныеСвойства.Вставить("ПромежуточнаяЗапись", Истина);
ПередЗаписью или ПриЗаписи выполняется анализ этого флага:
Если НаборЗаписей.ДополнительныеСвойства.Свойство("ПромежуточнаяЗапись")
И НаборЗаписей.ДополнительныеСвойства.ПромежуточнаяЗапись Тогда
Возврат; // Пропускаем проверку, так как данные еще не окончательные
КонецЕсли;
// Выполняем полноценный контроль остатков
Однако данный метод требует вмешательства в типовые общие модули проведения конфигурации УПП 1.3, поэтому использование подписок на события документа остается более предпочтительным и сопровождаемым решением.
Стоит помнить о базовой концепции партионного учета в УПП 1.3. Разработчики конфигурации изначально не закладывали жесткий оперативный запрет на проведение документов задним числом. Архитектура типового решения рассчитана на то, что:
Тем не менее, внедрение оперативного контроля через подписку на события позволяет полностью исключить человеческий фактор и предотвратить возникновение отрицательных остатков еще на этапе редактирования документов пользователями.