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