При работе в конфигурации «1С:Управление производственным предприятием 1.3» (УПП) пользователи и разработчики часто сталкиваются со специфическими ошибками при проведении документа Корректировка реализации. Особенно остро эта проблема проявляется в базах, где включена и активно используется ордерная схема учета запасов. Проведение документа аварийно завершается технической ошибкой в процедурах партионного учета, оставляя пользователей без возможности скорректировать документы отгрузки.
В этой статье мы подробно проанализируем причины возникновения данной проблемы, разберем процесс настройки серверной отладки для локализации подобных ошибок, а также рассмотрим программные и методические варианты решения этой задачи.
В процессе проведения документа Корректировка реализации система обращается к механизмам партионного учета. Ошибка конфигуратора обычно указывает на следующую строку в общем модуле УправлениеЗапасамиПартионныйУчет:
ТаблицаПартий.ЗагрузитьКолонку(ОбщегоНазначения.РаспределитьПропорционально(СтрокаТЧ.СуммаВал, МассивКоэфф, , Ложь), "СуммаВал");
Система аварийно завершает работу с сообщением: «Ошибка при вызове метода контекста (ЗагрузитьКолонку): Несоответствие типов (параметр номер '1')».
Выясним, почему это происходит. Метод ЗагрузитьКолонку в качестве первого параметра ожидает массив распределенных числовых значений. Однако функция ОбщегоНазначения.РаспределитьПропорционально возвращает значение Неопределено вместо массива в следующих случаях:
МассивКоэфф) сумма всех его элементов оказалась равной 0, пропорциональное распределение математически невозможно.При использовании ордерного склада движения по партиям списываются не финансовым документом Реализация товаров и услуг, а складским документом Расходный ордер на товары (при включенной настройке учетной политики «Списывать партии расходным ордером»). Корректировка реализации пытается сопоставить партии по документу-основанию, но из-за «схлопывания» или дублирования движений с противоположными знаками итоговый коэффициент распределения обнуляется, что и приводит к ошибке.
Чтобы детально проанализировать, какие именно данные попадают в расчет, необходимо запустить отладку на сервере 1С:Предприятия. Рассмотрим, как по шагам включить режим отладки на стороне сервера:
regedit и нажмите Enter.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent (x86-64)ImagePath.-debug в строку запуска службы. Строка должна выглядеть примерно так:"C:\Program Files\1cv8\8.3.18.1300\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -debug -d "C:\Program Files\1cv8\srvinfo"services.msc), найдем службу Агент сервера 1С:Предприятия и перезапустим ее.УправлениеЗапасамиПартионныйУчет будут успешно срабатывать.Проанализируем программный код процедуры ПроведениеКорректировкиРеализации в общем модуле УправлениеЗапасамиПартионныйУчет. Проблема заключается в том, что алгоритм выбирает лишние движения по расходному ордеру и реализации одновременно, что в итоге дает нулевой суммарный коэффициент.
Найдем в коде инициализацию структуры отбора партий:
// Было:
Отбор = Новый Структура("НомерСтрокиДокумента, ОтражатьВБухгалтерскомУчете", СтрокаТЧ.НомерСтроки, Истина);
Для того чтобы исключить задвоение и некорректный расчет коэффициентов при ордерной схеме, необходимо ограничить выборку только финансовой частью (например, операциями возврата). Модифицируем код следующим образом:
// Стало:
Отбор = Новый Структура("НомерСтрокиДокумента, ОтражатьВБухгалтерскомУчете, ВидОперации", СтрокаТЧ.НомерСтроки, Истина, "Возврат");
Такая доработка позволит системе корректно рассчитывать коэффициенты распределения, игнорируя лишние «схлопывающиеся» движения.
Чтобы гарантировать стабильность работы системы даже при возникновении нестандартных ситуаций с распределением партий, рекомендуется внедрить безопасную проверку возвращаемого значения функции распределения. Разберем этот подход на примере кода.
Вместо вызова метода без проверки:
ТаблицаПартий.ЗагрузитьКолонку(ОбщегоНазначения.РаспределитьПропорционально(СтрокаТЧ.СуммаВал, МассивКоэфф, , Ложь), "СуммаВал");
Внедрите следующую безопасную конструкцию:
РаспределеннаяСумма = ОбщегоНазначения.РаспределитьПропорционально(СтрокаТЧ.СуммаВал, МассивКоэфф, , Ложь);
Если РаспределеннаяСумма <> Неопределено Тогда
ТаблицаПартий.ЗагрузитьКолонку(РаспределеннаяСумма, "СуммаВал");
КонецЕсли;
Эту же процедуру необходимо повторить для аналогичных блоков кода ниже по тексту модуля, где распределяются значения НДСВал, НДСИтоговый, НДСДоИзм и НДСДоКорр. Это предотвратит аварийное завершение транзакции проведения и позволит документу записаться в информационную базу.
Если ваша информационная база находится на поддержке и вносить изменения в программный код запрещено регламентом компании, либо если ошибка возникла в уже закрытом периоде, воспользуемся методическими приемами проведения документов:
Возврат товаров от покупателя совместно с документом Приходный ордер на товары. Это позволит вернуть товары на склад по ордерной схеме без сбоев в партионном учете реализации.Корректировка реализации признаки отражения в партионном или бухгалтерском учете, проведите документ для формирования печатных форм и счетов-фактур, а движения по регистрам партий и бухгалтерии скорректируйте вручную с помощью документа Корректировка записей регистров.Применение одного из описанных выше методов позволит успешно обойти или полностью устранить ошибку проведения корректировки реализации в УПП при ордерной схеме документооборота.