Как настроить автоматический перенос ответственного из Заказа покупателя в Расходную накладную в 1С:УНФ

Программист 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

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

Метод 1. Использование механизма расширений (рекомендуемый способ)

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

Разберем реализацию по шагам:

  1. Создадим новое расширение в конфигураторе (или откроем существующее).
  2. Добавим в расширение документ РасходнаяНакладная.
  3. В модуле объекта документа найдем процедуру ОбработкаЗаполнения и вызовем для нее метод «Создать воротник» с аннотацией &После.
  4. Напишем код, который будет проверять, на основании какого документа создается накладная.

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


&После("ОбработкаЗаполнения")
Процедура Мой_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Проверяем, что в качестве данных заполнения передан именно Заказ покупателя
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        
        // Если в Заказе ответственный заполнен, переносим его в Расходную накладную
        Если ЗначениеЗаполнено(ДанныеЗаполнения.Ответственный) Тогда
            ЭтотОбъект.Ответственный = ДанныеЗаполнения.Ответственный;
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Почему это работает: Процедура ОбработкаЗаполнения вызывается платформой в момент создания нового объекта «на основании». Параметр ДанныеЗаполнения содержит ссылку на документ-источник. Использование аннотации &После гарантирует, что сначала сработает типовой механизм заполнения 1С:УНФ, а затем наш код дозаполнит или перезаполнит нужные поля.

Метод 2. Использование подписки на события

Если по каким-то причинам использование расширений для вас неудобно, можно воспользоваться классическим методом — Подпиской на события. Этот метод хорош тем, что логика выносится в отдельный общий модуль, что упрощает контроль за изменениями.

Проанализируем алгоритм действий:

  1. Создадим новый Общий модуль (например, РаботаСДокументамиСобытия) и установим ему свойства «Сервер», «Внешнее соединение».
  2. Создадим в нем экспортную процедуру.
  3. В дереве конфигурации создадим объект Подписка на событие.
  4. В качестве Источника укажем ДокументОбъект.РасходнаяНакладная.
  5. В качестве События выберем ОбработкаЗаполнения.

Пример кода для общего модуля:


Процедура ПереносОтветственногоОбработкаЗаполнения(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт
    
    // Источник — это сама создаваемая Расходная накладная
    // ДанныеЗаполнения — это документ-основание
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        
        // Переносим реквизит
        Источник.Ответственный = ДанныеЗаполнения.Ответственный;
        
    КонецЕсли;
    
КонецПроцедуры

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

Метод 3. Нюансы и обработка сложных случаев

Разберем ситуацию подробнее. В 1С:УНФ возможна ситуация, когда одна накладная создается сразу по нескольким заказам (массив ссылок). В этом случае параметр ДанныеЗаполнения будет содержать не одну ссылку, а структуру или массив. Посмотрим на пример более универсального кода для ОбработкаЗаполнения:


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

Также стоит учитывать бизнес-логику. Если ответственный в Заказе покупателя не активен (например, сотрудник уволился), автоматический перенос может привести к ошибкам в учете. Проанализируем, как добавить простейшую проверку:


Если ЗначениеЗаполнено(ДанныеЗаполнения.Ответственный) И НЕ ДанныеЗаполнения.Ответственный.ПометкаУдаления Тогда
    ЭтотОбъект.Ответственный = ДанныеЗаполнения.Ответственный;
Иначе
    // Если в заказе пусто или сотрудник удален, подставляем текущего пользователя
    ЭтотОбъект.Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;

Метод 4. Внешние обработки заполнения

Если вы не хотите менять программный код конфигурации (даже через расширения), можно использовать механизм Дополнительных отчетов и обработок. В 1С:УНФ есть возможность подключить обработку с типом «Заполнение объекта».

Этот метод позволяет добавить в меню документа кнопку «Заполнить ответственного из заказа». Это менее автоматизировано, так как требует нажатия кнопки пользователем, но зато максимально безопасно для системы и не требует вмешательства в конфигуратор программистом при каждом обновлении.

Выясним причину, почему это может не работать

Если вы внедрили код, но поле не заполняется, проверьте следующие моменты:

  1. Тип данных: Убедитесь, что в поле Ответственный обоих документов используется один и тот же тип (обычно это СправочникСсылка.Сотрудники или СправочникСсылка.Пользователи).
  2. Права доступа: Если у текущего пользователя нет прав на чтение справочника пользователей или на изменение поля в накладной, код может отработать без ошибок, но результат не сохранится.
  3. Режим отладки: Используйте отладчик, чтобы проверить, заходит ли выполнение программы в условие ТипЗнч(ДанныеЗаполнения) = .... Иногда при создании на основании передается не ссылка, а структура с реквизитами.

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

← На главную