Рассмотрим ситуацию, с которой часто сталкиваются при работе с распределенными информационными базами (РИБ) в конфигурации 1С:Зарплата и Управление Персоналом, начиная с релизов 3.1.25.37. При попытке выполнить обмен данными из главной базы в подчиненную процесс прерывается критической ошибкой: Значение не является значением объектного типа (Количество). Ошибка возникает в обработчике ПередЗаписью при чтении файла сообщения обмена.
Проанализируем причину возникновения этой проблемы и разберем по шагам несколько эффективных способов ее решения.
В версиях ЗУП 3.1.25 разработчики фирмы 1С существенно доработали механизмы отражения зарплаты в бухгалтерском учете. В системе появился новый периодический регистр сведений БухучетНачисленийСотрудников. Теперь при проведении ряда кадровых и расчетных документов, в частности документа Увольнение, формируются новые движения по этому регистру.
Проблема кроется в механизме загрузки данных в подчиненном узле РИБ. При обмене вызывается системная процедура ОбновитьИнтервальныйРегистрПослеЗагрузкиПервичныхДанных из общего модуля ЗарплатаКадрыПериодическиеРегистры. Из-за недоработки типового кода в этом релизе, при чтении XML-сообщения обмена для набора записей нового регистра система возвращает тип Неопределено вместо ожидаемой пустой таблицы значений.
Далее в коде происходит попытка проверить количество строк:
ТаблицаИзменившихсяДанныхНабора = НаборЗаписей.ТаблицаИзменившихсяДанныхНабора;
Если ТаблицаИзменившихсяДанныхНабора.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
Поскольку переменная ТаблицаИзменившихсяДанныхНабора содержит Неопределено, вызов метода Количество() закономерно приводит к фатальной ошибке, и транзакция обмена полностью прерывается.
Рассмотрим подробнее способ исправления проблемы силами программиста. Мы можем создать небольшое расширение конфигурации, которое перехватит проблемную процедуру и добавит проверку переменной на тип Неопределено.
Для этого добавим процедуру ОбновитьИнтервальныйРегистрПослеЗагрузкиПервичныхДанных в расширение с аннотацией &Вместо (или аккуратно встроимся нужным образом в зависимости от режима совместимости). Нам необходимо модифицировать проверку следующим образом:
ТаблицаИзменившихсяДанныхНабора = НаборЗаписей.ТаблицаИзменившихсяДанныхНабора;
// Добавляем проверку на Неопределено
Если ТаблицаИзменившихсяДанныхНабора = Неопределено ИЛИ ТаблицаИзменившихсяДанныхНабора.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
После подключения этого расширения в подчиненную базу проверка будет проходить корректно, и обмен данными успешно завершится.
Фирма 1С зарегистрировала данную ошибку и оперативно выпустила официальное исправление. Если вы не хотите разрабатывать собственное расширение, мы рекомендуем воспользоваться встроенным механизмом патчей.
Кроме того, кардинальным решением является плановое обновление центральной и периферийных баз. Ошибка была полностью устранена разработчиками на уровне ядра конфигурации в более поздних релизах, начиная со старших сборок ветки 3.1.27.
Если обмен "встал", патч загрузить нет возможности, а программиста рядом нет, посмотрим на временный способ обхода проблемы. Мы можем вручную исключить проблемный регистр из текущего пакета выгрузки.
БухучетНачисленийСотрудников.Важно: Этот способ является исключительно временной мерой. При проведении новых увольнений или кадровых документов в главной базе, изменения по регистру зарегистрируются вновь, и ошибка повторится при следующем обмене. Мы настоятельно рекомендуем использовать установку официального патча или программное расширение как окончательное решение проблемы.