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