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