Как программно реализовать создание документа Данные для расчета зарплаты на основании в 1С:ЗУП 3.1

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3, особенно в таких сложных конфигурациях, как ЗУП 3.1 (Зарплата и управление персоналом), стандартного добавления связи в метаданных «Является основанием для» часто оказывается недостаточно. Типовые решения активно используют механизмы БСП (Библиотеки стандартных подсистем), которые управляют интерфейсом и формированием команд динамически. В этой статье мы подробно разберем, как интегрировать свой документ в систему создания на основании для универсального документа ДанныеДляРасчетаЗарплаты.

Понимание архитектуры механизма «Создать на основании» в БСП

Прежде чем приступать к написанию кода, проанализируем, как работает этот механизм. В современных конфигурациях список команд в подменю «Создать на основании» формируется не платформой автоматически, а программно при открытии формы документа. Это позволяет гибко управлять видимостью команд в зависимости от прав доступа, состояния документа или функциональных опций. Основная работа происходит в общих модулях и модулях менеджера соответствующих объектов.

Шаг 1. Регистрация объектов в общем модуле

Первым делом нам необходимо сообщить системе, что наш документ-источник и документ-приемник участвуют в механизме создания на основании. Для этого предназначен общий модуль СозданиеНаОснованииПереопределяемый.

Важное замечание: Мы крайне не рекомендуем вносить изменения напрямую в типовую конфигурацию. Рассмотрим, как сделать это правильно через Расширение. В расширении необходимо создать метод-обработчик для процедуры ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.


&После("ПриОпределенииОбъектовСКомандамиСозданияНаОсновании")
Процедура Расш1_ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(СписокОбъектов)
    // Добавляем наш документ-источник, из которого будем создавать
    СписокОбъектов.Добавить(Метаданные.Документы.ВашДокументИсточник);
    
    // Добавляем документ-приемник
    СписокОбъектов.Добавить(Метаданные.Документы.ДанныеДляРасчетаЗарплаты);
КонецПроцедуры

Этот шаг позволяет подсистеме БСП «увидеть» объекты и начать искать в их модулях менеджера специфические функции для формирования команд.

Шаг 2. Описание команды в модуле менеджера документа-источника

Теперь перейдем в модуль менеджера того документа, из которого мы хотим создавать ДанныеДляРасчетаЗарплаты. Нам нужно реализовать экспортную функцию ДобавитьКомандуСоздатьНаОсновании. Рассмотрим типовой пример реализации такой функции:


// Функция описывает параметры команды создания на основании
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
    
    // Проверяем права пользователя на создание документа-приемника
    Если Не ПравоДоступа("Добавление", Метаданные.Документы.ДанныеДляРасчетаЗарплаты) Тогда
        Возврат Неопределено;
    КонецЕсли;

    Команда = КомандыСозданияНаОсновании.Добавить();
    Команда.Менеджер = "Документ.ДанныеДляРасчетаЗарплаты";
    Команда.Представление = "Данные для расчета зарплаты (по нашему документу)";
    Команда.ЗаписыватьДанныеФормы = Истина;
    Команда.РежимЗаписи = "Записывать"; // Или "Проводить", если нужно сразу провести
    
    // Если нужно передать конкретный идентификатор для обработки разных сценариев
    Команда.Идентификатор = "СоздатьНаОснованииВашегоДокумента";
    
    Возврат Команда;
    
КонецФункции

Здесь КомандыСозданияНаОсновании — это таблица значений, в которую мы добавляем строку с описанием нашей команды. Обратите внимание на свойство Идентификатор. Это ключ к решению задачи, когда для одного и того же типа документа нужно создать несколько разных вариантов заполнения.

Шаг 3. Регистрация связи в модуле менеджера документа-приемника

Далее нам необходимо модифицировать модуль менеджера документа ДанныеДляРасчетаЗарплаты. В нем должна существовать процедура ДобавитьКомандыСозданияНаОсновании. Выясним, как связать источник и приемник программно:


Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
    
    // Регистрируем наш документ как источник для Данных для расчета зарплаты
    Документы.ВашДокументИсточник.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
    
КонецПроцедуры

Таким образом, когда система опрашивает документ ДанныеДляРасчетаЗарплаты на предмет того, на основании чего он может быть создан, она обращается к менеджеру вашего документа и получает описание команды.

Шаг 4. Реализация логики заполнения (Модуль объекта)

Самый ответственный этап — это написание кода заполнения. Переходим в модуль объекта документа ДанныеДляРасчетаЗарплаты и находим (или создаем) процедуру ОбработкаЗаполнения.

Проанализируем специфику документа ДанныеДляРасчетаЗарплаты. Этот документ является «контейнером», структура которого меняется в зависимости от выбранного реквизита Настройка (ссылка на справочник ВидыДанныхДляРасчетаЗарплаты). Без заполнения этого реквизита создание документа на основании не имеет смысла, так как состав колонок табличной части останется неопределенным.


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ВашДокументИсточник") Тогда
        
        // Блокируем стандартный механизм, если пишем свою логику
        СтандартнаяОбработка = Ложь;
        
        // 1. Устанавливаем основной вид данных (Настройку)
        // Это критически важно для ЗУП!
        НастройкаПоУмолчанию = Справочники.ВидыДанныхДляРасчетаЗарплаты.НайтиПоНаименованию("ВашВидДанных");
        ЭтотОбъект.Настройка = НастройкаПоУмолчанию;
        
        // 2. Заполняем основные реквизиты
        ЭтотОбъект.Организация = ДанныеЗаполнения.Организация;
        ЭтотОбъект.Дата = ТекущаяДата();
        ЭтотОбъект.ПериодРегистрации = НачалоМесяца(ДанныеЗаполнения.Дата);
        
        // 3. Вызываем инициализацию ТЧ согласно настройке
        // В ЗУП 3.1 есть внутренние механизмы, которые перестраивают форму.
        // При заполнении программно важно наполнить ТЧ "Данные"
        
        Для Каждого СтрокаИсточника Из ДанныеЗаполнения.Состав Цикл
            НоваяСтрока = ЭтотОбъект.Данные.Добавить();
            НоваяСтрока.Сотрудник = СтрокаИсточника.Сотрудник;
            // Здесь заполняем показатели, определенные в ВидеДанных
            // Например: НоваяСтрока.Показатель1 = СтрокаИсточника.Значение;
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры

Шаг 5. Как обрабатывать несколько разных команд?

Если в Сообщении 10 на форуме возник вопрос о создании двух разных команд для одного типа документа, решение кроется в параметре ТекстЗаполнения процедуры ОбработкаЗаполнения. Когда вы вызываете команду через БСП, в ТекстЗаполнения (или в структуру ДанныеЗаполнения в зависимости от версии БСП) передается Идентификатор, который вы указали в модуле менеджера на Шаге 2.

Разберем пример обработки разных идентификаторов:


Если ТекстЗаполнения = "СоздатьПоНорме" Тогда
    ЗаполнитьПоНормативнымПоказателям(ДанныеЗаполнения);
ИначеЕсли ТекстЗаполнения = "СоздатьПоФакту" Тогда
    ЗаполнитьПоФактическимПоказателям(ДанныеЗаполнения);
КонецЕсли;

Шаг 6. Использование внешних обработок (Альтернативный путь)

Рассмотрим ситуацию, когда конфигурацию менять нельзя даже через расширение (например, жесткие корпоративные стандарты). В этом случае можно воспользоваться механизмом Дополнительных отчетов и обработок.

  1. Создаем внешнюю обработку.
  2. В модуле объекта прописываем функцию СведенияОВнешнейОбработке.
  3. Указываем вид обработки: ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов().
  4. В таблице команд указываем наш документ-источник как объект назначения.

Плюс этого метода в полной автономности. Минус — команда создания на основании появится не в основном подменю, а в разделе «Отчеты и заполнение» или «Дополнительные обработки», что может быть неочевидно для конечного пользователя ЗУП.

Резюме

Создание документа ДанныеДляРасчетаЗарплаты на основании — это задача, требующая комплексного подхода. Мы выяснили, что:

Применяя эти шаги, вы сможете корректно встроить свои алгоритмы в типовой процесс работы бухгалтерии и расчетчиков зарплаты, обеспечив бесшовную интеграцию кастомных документов с типовым функционалом 1С:ЗУП.

← На главную