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