При развитии систем автоматизации на базе 1С:Зарплата и Управление Персоналом 3.1 часто возникает ситуация, когда типового функционала недостаточно для ведения управленческого учета. Если в базе уже существует нетиповой документ для расчета "особой" зарплаты, а бизнес-логика требует внедрения новых алгоритмов для других организаций, перед разработчиком встает дилемма: модифицировать старый объект или создавать новый. Разберем эту ситуацию подробно, проанализируем риски и выберем оптимальную стратегию разработки.
Рассмотрим исходные данные: в конфигурации (или расширении) уже реализован Документ1нетиповой. Он успешно выполняет расчеты для группы "старых" организаций. В базу добавляются "новые" организации, чей алгоритм расчета управленческой зарплаты принципиально отличается. Нам необходимо решить, как масштабировать систему, чтобы сохранить стабильность текущих расчетов и обеспечить гибкость для будущих изменений.
Этот подход предполагает использование Документ1нетиповой для всех организаций. Для разделения логики мы можем использовать признак в справочнике Организации. Проанализируем, как это реализовать технически.
Для начала добавим дополнительный реквизит к справочнику Организации (через механизм дополнительных реквизитов или расширение), который будет определять используемую "Методику расчета". В модуле документа при выполнении расчета мы будем обращаться к этому признаку.
Преимущества этого метода:
Однако, как справедливо отмечают эксперты, при сильных различиях в алгоритмах (например, если меняется сама структура данных: в одном случае расчет идет по дням, в другом — сводно за месяц), код внутри одного документа может превратиться в трудночитаемое нагромождение условий Если... ИначеЕсли.
Пример программной реализации выбора алгоритма в модуле менеджера или объекта:
Процедура РассчитатьЗарплату(ДокументСсылка) Экспорт
Организация = ДокументСсылка.Организация;
МетодРасчета = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Организация, "МетодУправленческогоРасчета");
Если МетодРасчета = Перечисления.МетодыРасчета.Стандартный Тогда
ВыполнитьСтандартныйРасчет(ДокументСсылка);
ИначеЕсли МетодРасчета = Перечисления.МетодыРасчета.ПоОсобомуАлгоритму Тогда
ВыполнитьОсобыйРасчет(ДокументСсылка);
КонецЕсли;
КонецПроцедуры
Второй путь — создание Документ2нетиповой, специально "заточенного" под новые организации. Это решение часто кажется более быстрым и безопасным в краткосрочной перспективе.
Разберем причины, по которым стоит выбрать этот вариант:
Основные риски: плодение документов ведет к тому, что при необходимости внесения общих изменений (например, добавление нового реквизита "Подразделение" во все управленческие документы) вам придется повторять работу дважды. Также усложняется поддержка интеграций и выгрузок в сторонние системы.
Современным стандартом разработки под ЗУП 3.1 является использование расширений конфигурации. Проанализируем продвинутый метод: разделение функционала по разным расширениям.
Если организации в базе принадлежат разным юридическим лицам или разным бизнес-направлениям, можно вынести функционал для "новых" организаций в отдельное расширение. Это позволит физически изолировать код. Важно помнить: при использовании нескольких расширений необходимо следить за тем, чтобы они не заимствовали одни и те же типовые объекты с целью их модификации, иначе возникнет конфликт приоритетов.
Независимо от того, выберете вы один документ или два, ключевым моментом в ЗУП 3.1 является запись данных в регистры. Чтобы управленческая зарплата была видна в системе, документ должен делать движения по соответствующим регистрам.
Рассмотрим основные объекты, которые должны быть задействованы:
РегистрыРасчета.ОсновныеНачисления — если вы хотите, чтобы суммы попадали в стандартные отчеты и расчетные листки (хотя для управленческого учета часто используют свои регистры).РегистрыНакопления.ВзаиморасчетыССотрудниками — для учета задолженности перед персоналом.РегистрыНакопления.НачисленияУдержанияПоСотрудникам — основной регистр для формирования расчетных ведомостей.Если вы создаете второй документ, проанализируем трудозатраты на дублирование логики проведения. Оптимальным решением будет вынос общих процедур проведения в отдельный Общий модуль, доступный обоим документам. Это позволит соблюсти принцип DRY (Don't Repeat Yourself).
Чтобы принять окончательное решение, проанализируем степень различия алгоритмов. Выясним следующие моменты:
Данные для расчета зарплаты).Итог: Если различия только в формулах — выбираем один документ с ветвлением логики. Если различия в структуре данных, правах доступа и бизнес-процессах — создаем второй документ, но выносим общую логику формирования движений по регистрам в общие модули.