Как получить ссылку на исходный документ из внешней обработки заполнения

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

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

Рассмотрим подробнее, как реализовать этот механизм, разберем программный код и проанализируем различные подходы к решению данной задачи.

Способ 1: Использование контекста формы (ВладелецФормы)

Этот метод часто выбирают разработчики, когда обработка открывается визуально (как форма). Суть заключается в том, что форма обработки «знает», из какой формы она была вызвана. Это позволяет обращаться к данным документа напрямую через программный интерфейс владельца.

Разберем пример кода, который позволяет изменить данные в документе Премия непосредственно из формы внешней обработки:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    // Формируем строковое представление периода
    ДатаМесяца = Формат(Объект.ПериодРегистрации, "ДФ='MMMM yyyy'"); 
    
    // Обращаемся к коллекции "Начисления" документа-владельца
    Для каждого Строка из ВладелецФормы.Объект.Начисления Цикл
        Строка.ПериодДействияСтрокой = ДатаМесяца;
        Строка.ДатаНачала = Объект.ДатаНачалаПериодИсправления;
        Строка.ДатаОкончания = Объект.ДатаОкончанияПериодИсправления; 
    КонецЦикла;
    
    // Обязательно устанавливаем флаг модифицированности, 
    // чтобы форма документа предложила сохранить изменения
    ВладелецФормы.Модифицированность = Истина;
       
КонецПроцедуры

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

Способ 2: Использование стандартного механизма БСП (ОбъектыНазначения)

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

Выясним, как получить ссылку на документ правильно. При создании внешней обработки в модуле формы в процедуре ПриСозданииНаСервере мы можем извлечь ссылку на документ следующим образом:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметра ОбъектыНазначения
    Если Параметры.Свойство("ОбъектыНазначения") И ТипЗнч(Параметры.ОбъектыНазначения) = Тип("Массив") Тогда
        Если Параметры.ОбъектыНазначения.Количество() > 0 Тогда
            // Получаем ссылку на первый выбранный документ
            СсылкаНаДокумент = Параметры.ОбъектыНазначения[0];
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Этот метод позволяет работать с объектом даже на сервере, используя СсылкаНаДокумент.ПолучитьОбъект(), что гораздо эффективнее для массовой обработки данных.

Важные нюансы работы с документом «Премия» в ЗУП 3.1

Документ Премия в конфигурации ЗУП 3.1 является технически сложным. Он тесно связан с механизмами расчета зарплаты, НДФЛ и страховых взносов. Посмотрим на критические моменты, которые нужно учитывать при изменении периодов:

  1. Связь с регистрами расчета: Если вы программно меняете ДатаНачала и ДатаОкончания в табличной части, система может потребовать пересчета документа. Простого изменения текста в колонке ПериодДействияСтрокой недостаточно для корректного отражения в учете.
  2. Период регистрации: Убедитесь, что период регистрации самого документа соответствует измененным датам в строках, иначе возникнут проблемы при формировании отчетности (например, в 6-НДФЛ или ЕФС-1).
  3. Метод КопироватьДанныеФормы: Если вы изменяете объект на сервере и хотите, чтобы изменения отобразились в уже открытой форме, рекомендуется использовать процедуру КопироватьДанныеФормы(Источник, Приемник).

Разбор регистрации команды во внешней обработке

Чтобы кнопка вызова обработки появилась в меню документа, необходимо правильно описать функцию СведенияОВнешнейОбработке в модуле объекта. Выберем правильный тип использования команды:


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

Использование типа ТипКомандыЗаполнениеФормы гарантирует, что система передаст управление в форму документа, и вы сможете взаимодействовать с данными через ВладелецФормы или ОбъектыНазначения.

Заключение и рекомендации

Мы проанализировали два основных способа получения ссылки на исходный документ. Для простых задач визуального изменения данных в открытой форме подходит обращение к ВладелецФормы. Однако для профессиональной разработки и обеспечения совместимости с будущими обновлениями 1С, старайтесь использовать массив ОбъектыНазначения из параметров формы.

Помните: любые изменения в документах расчета зарплаты должны сопровождаться проверкой целостности данных. Всегда устанавливайте свойство Модифицированность = Истина, чтобы пользователь осознанно сохранил результаты работы вашей обработки.

← На главную