При работе в программах на платформе 1С:Предприятие 8.3 (в частности, в конфигурациях «Зарплата и управление персоналом 3» или «Бухгалтерия предприятия 3.0») пользователи и разработчики часто сталкиваются со странным поведением системы: предопределенный элемент справочника, который точно существует в конфигураторе, физически отсутствует в режиме 1С:Предприятие. Ситуация усложняется тем, что элемент не отображается даже при запуске системы под учетной записью администратора с полными правами, а в форме списка отсутствуют видимые интерактивные или программные отборы.
В этой статье мы подробно разберем, почему возникает такое поведение платформы, как устроен механизм создания предопределенных элементов, зависящих от функциональных опций, и как сделать невидимый элемент доступным для использования.
Первая мысль, которая возникает у разработчика при обнаружении подобной проблемы, — это ограничение прав доступа на уровне записей (RLS) или программный отбор при открытии формы. Однако истинная причина кроется гораздо глубже, на уровне работы самой СУБД под управлением платформы 1С.
Рассмотрим, как платформа обрабатывает предопределенные данные. В современных типовых конфигурациях 1С активно применяется механизм оптимизации базы данных, регулирующий автоматическое создание предопределенных элементов. Для справочников и планов видов расчета, элементы которых напрямую связаны с функциональными опциями программы, разработчики устанавливают особое свойство. Согласно стандартам разработки 1С (стандарт № std697), свойство конфигурации «Обновление предопределенных данных» для таких объектов переводится в значение «Не обновлять автоматически».
Это приводит к следующему поведению системы:
В нашем случае показатель ОтработаноЧасовВПределахНормыВремени жестко связан с функциональной опцией ИспользоватьУчетВремениСотрудниковВЧасах. Пока эта опция выключена, элемент справочника не просто скрыт фильтрами — его физически не существует в базе данных.
Для того чтобы предопределенный элемент ОтработаноЧасовВПределахНормыВремени физически создался в базе данных и стал доступен для использования в формулах начислений, нам необходимо активировать соответствующую функциональную опцию в режиме 1С:Предприятие.
Выполним следующие шаги в интерфейсе программы (на примере «Зарплата и управление персоналом 3.0» / «Бухгалтерия предприятия 3.0»):
После активации этой настройки система автоматически запустит фоновое задание или обработчик обновления данных, который обратится к метаданным конфигурации, обнаружит связанный предопределенный элемент справочника Показатели расчета зарплаты и физически создаст запись ОтработаноЧасовВПределахНормыВремени в базе данных. Теперь данный показатель появится в списке выбора и будет доступен для написания формул.
Для разработчиков полезно понимать, как этот механизм контролируется на уровне встроенного языка 1С. Проанализируем пример кода, который проверяет активность нужной нам функциональной опции перед выполнением расчетов или выводом элементов:
Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетВремениСотрудниковВЧасах") Тогда
// Платформа гарантирует, что предопределенный элемент существует в БД
ПоказательВремени = Справочники.ПоказателиРасчетаЗарплаты.ОтработаноЧасовВПределахНормыВремени;
// Выполнение логики расчета
Иначе
// Опция выключена, обращение к предопределенному элементу может вызвать исключение или вернуть Null/Пустую ссылку
ПоказательВремени = Справочники.ПоказателиРасчетаЗарплаты.ПустаяСсылка();
КонецЕсли;
Именно благодаря такой проверке платформа избегает засорения базы данных неиспользуемыми записями и оптимизирует размер таблиц СУБД, повышая общую производительность системы.
Проанализируем еще один важный аспект, касающийся показателя ОтработаноЧасовВПределахНормыВремени. Даже если вы включите необходимую настройку почасовой оплаты, вам следует знать об архитектурных изменениях в решениях 1С.
Начиная с релиза 3.0.24 конфигурации «Зарплата и управление персоналом», фирма 1С изменила методику расчета начислений и признала данный показатель устаревшим (упраздненным). Вместо использования этого специализированного показателя разработчики внедрили более гибкий механизм работы со временем:
ВремяВЧасах.ОтработаноЧасовВПределахНормыВремени сохранен в системе исключительно для обеспечения обратной совместимости со старыми, измененными вручную формулами пользователей, созданными до обновления ИБ.Рекомендация: При создании новых видов начислений настоятельно не рекомендуется использовать устаревший показатель ОтработаноЧасовВПределахНормыВремени. Вместо него для расчетов по часовой тарифной ставке или окладу по часам следует применять современный предопределенный показатель ВремяВЧасах. Это гарантирует корректность расчетов в будущих обновлениях конфигурации и избавит от необходимости поиска скрытых настроек функциональных опций.