В процессе работы с конфигурацией 1С:Бухгалтерия предприятия 3.0 пользователи могут столкнуться с критической ошибкой при попытке зарегистрировать сведения о трудовой деятельности (создать документ СЗВ-ТД или ЕФС-1) из документа Прием на работу. Проблема также может проявляться при проведении документов Начисление зарплаты.
Текст ошибки выглядит следующим образом: «Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)». В этой статье мы подробно разберем, почему возникает эта ситуация, как проанализировать код и какими способами можно восстановить работоспособность базы.
Проанализируем ситуацию: чаще всего данная ошибка проявляется в информационных базах, которые были созданы путем выделения организации из существующей базы через механизм РИБ (Распределенные информационные базы) с последующим отключением от главного узла. При таком способе миграции данных некоторые служебные регистры сведений, не имеющие привязки к конкретной организации, могут не перенестись в новую базу.
В частности, проблема кроется в пустом регистре сведений Даты вступления в силу нормативных актов (в конфигураторе — ДатыВступленияВСилуНА). В программном коде 1С существует множество проверок, которые сравнивают текущую дату документа с датами из этого регистра, чтобы определить, какие законодательные нормы (или форматы файлов) применять на текущий момент.
Если в регистре нет нужной записи, функция получения даты возвращает значение Неопределено. Платформа 1С (особенно версии 8.3.22 и выше) при попытке сравнить значение типа Дата со значением Неопределено прерывает работу и выдает ошибку о несовпадении типов.
Рассмотрим, в каких именно местах кода происходит сбой. Если мы воспользуемся отладчиком и установим остановку по ошибке, мы увидим следующие фрагменты.
Пример 1: Проверка изменений по 353-ФЗ
В модулях, отвечающих за расчет зарплаты, часто вызывается функция:
Функция ВступилиВСилуИзменения353ФЗ(Период) Экспорт
Возврат Период >= ЗарплатаКадрыПовтИсп.ДатаВступленияВСилуНА("ИзмененияК353ФЗ");
КонецФункции
Здесь переменная Период содержит дату (например, 31.05.2022), а вызов функции ЗарплатаКадрыПовтИсп.ДатаВступленияВСилуНА("ИзмененияК353ФЗ") возвращает Неопределено, так как в регистре отсутствует соответствующая запись.
Пример 2: Формирование файла СЗВ-ТД
При формировании электронного документа система должна выбрать формат выгрузки (старый или новый). Это происходит в процедуре формирования выходного файла:
Если ВыборкаПоШапкеДокумента.Дата < РегистрыСведений.ДатыВступленияВСилуНА.ДатаВступленияВСилуНА("ОбновлениеФорматаСЗВ_ТДСогласноПостановлению730п") Тогда
Возврат ВыходнойФайл20200101(ВыборкаПоШапкеДокумента, ВыборкаПоРаботникам);
КонецЕсли;
Если в регистре нет ключа ОбновлениеФорматаСЗВ_ТДСогласноПостановлению730п, условие сравнения вызывает исключение.
Первым делом попробуем решить проблему штатными средствами системы. Часто достаточно инициировать процедуру обновления служебных данных.
/С ЗапуститьОбновлениеИнформационнойБазы. Это принудительно запустит все процедуры обновления, предусмотренные в БСП (Библиотеке стандартных подсистем).Если автоматическое обновление не заполнило регистр ДатыВступленияВСилуНА, мы можем сделать это принудительно. Для этого воспользуемся консолью разработчика или внешней обработкой для выполнения кода.
Выполним следующий фрагмент кода:
// Инициализация заполнения служебного регистра
ЗарплатаКадрыОбновлениеInternal.ОбновитьДатыВступленияВСилуНПА();
Важно: Имя метода может незначительно меняться в зависимости от версии конфигурации. Также можно попробовать обновить идентификаторы объектов метаданных, так как записи в регистре часто привязаны к ним:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные();
Если вы являетесь опытным пользователем или администратором, выясним причину отсутствия записей через интерфейс «Функции для технического специалиста».
Даты вступления в силу нормативных актов.ОбновлениеФорматаСЗВ_ТДСогласноПостановлению730п (обычно дата 01.07.2021).ИзмененияК353ФЗ.ПрименяетсяПостановление1181.После того как вы нажмете кнопку Перечитать или выполните процедуру обновления из Способа 2, список должен заполниться актуальными датами из программного кода (макетов конфигурации).
Рассмотрим, почему эта проблема стала острой именно сейчас. В последних версиях платформы 1С:Предприятие 8.3 был ужесточен контроль типизации в режиме совместимости. Если раньше сравнение с пустым значением могло «проглатываться» системой, возвращая Ложь, то теперь это считается грубой ошибкой программирования (несоответствие типов).
Также стоит отметить интересный нюанс: иногда ошибка пропадает, если у сотрудника очистить дату рождения (как заметили пользователи в обсуждении). Это связано с тем, что некоторые проверки возраста сотрудника также используют алгоритмы сравнения дат, завязанные на законодательные периоды. Однако удаление даты рождения не является решением, так как эти данные обязательны для отчетности.
Подведем итог. Ошибка сравнения примитивных типов при работе с кадровыми документами в БП 3.0 — это следствие отсутствия записей в служебном регистре Даты вступления в силу НА. Для исправления ситуации:
ЗарплатаКадрыОбновлениеInternal.ОбновитьДатыВступленияВСилуНПА() для восстановления данных.После заполнения регистра документы Начисление зарплаты начнут проводиться, а СЗВ-ТД будет создаваться без ошибок.