Мы рассмотрим, как настроить автоматическое заполнение поля "Менеджер" в документе "Реализация товаров и услуг" на основании "Заказа клиента" в конфигурации 1С:Управление торговлей (УТ), особенно для версий 11.4 и 11.5. Эта задача часто возникает при необходимости сохранения ответственного менеджера, который работал с клиентом на этапе заказа, во всех последующих документах отгрузки, а также при создании и печати полного комплекта документов по заказу клиента. Мы разберем различные подходы, включая стандартные механизмы и доработки с использованием расширений, а также рассмотрим важные нюансы, такие как безопасный режим расширений и особенности структуры данных в разных версиях конфигурации.
Автоматизация цепочек документов, таких как создание документа "Заказ клиента" на основании документа "Заказ поставщику", является важной частью оптимизации бизнес-процессов.
Прежде чем приступать к доработкам, важно понимать, как типовая конфигурация 1С:УТ по умолчанию заполняет поле "Менеджер" в документах. В 1С:Управление торговлей 11.5 (и аналогично в более ранних версиях) менеджер может быть определен по следующей иерархии:
ИнициализироватьДокумент модуля объекта документа, где может быть строка типа Менеджер = Пользователи.ТекущийПользователь;.Если стандартные механизмы не обеспечивают требуемое заполнение (например, вы хотите всегда брать менеджера именно из заказа-основания, игнорируя другие источники) или требуется создание доверенности на основании заказа клиента, тогда требуется доработка.
Наиболее предпочтительным и современным способом внесения изменений в функциональность 1С без модификации типовой конфигурации является использование расширений. Этот подход значительно упрощает процесс обновления конфигурации и позволяет избежать потенциальных проблем при переходе на новые версии платформы или при получении обновлений от разработчика.
Этот метод предполагает добавление кода в расширение, который будет выполняться после стандартной процедуры заполнения документа. Мы будем использовать обработчик &После("ОбработкаЗаполнения") в модуле объекта документа "Реализация товаров и услуг".
&После.
Мы проанализируем параметр ДанныеЗаполнения, который может быть либо структурой, содержащей документ-основание, либо непосредственно ссылкой на документ-основание (в нашем случае - "Заказ клиента").
&После("ОбработкаЗаполнения")
Процедура од_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Перем ТипДанныхЗаполнения;
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
// Проверяем, если ДанныеЗаполнения — это структура
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
// Проверяем, содержит ли структура свойство "ДокументОснование"
Если ДанныеЗаполнения.Свойство("ДокументОснование") Тогда
// В некоторых версиях УТ 11.5 "ДокументОснование" может быть массивом.
// Поэтому проверяем тип первого элемента массива, если это массив.
Если ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив") Тогда
Если ДанныеЗаполнения.ДокументОснование.Количество() > 0
И ТипЗнч(ДанныеЗаполнения.ДокументОснование[0]) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЭтотОбъект.Менеджер = ДанныеЗаполнения.ДокументОснование[0].Менеджер;
КонецЕсли;
// Если "ДокументОснование" — это не массив, а просто ссылка
ИначеЕсли ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЭтотОбъект.Менеджер = ДанныеЗаполнения.ДокументОснование.Менеджер;
КонецЕсли;
КонецЕсли;
// Проверяем, если ДанныеЗаполнения — это непосредственно ссылка на "Заказ клиента"
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЭтотОбъект.Менеджер = ДанныеЗаполнения.Менеджер;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование ЭтотОбъект.Менеджер для прямого обращения к реквизиту объекта документа, который мы заполняем. Также учтите проверку ДокументОснование[0], которая стала актуальной для некоторых версий УТ 11.5, где основание может передаваться как массив ссылок.
ИнициализироватьДокумент или другие части кода могут устанавливать менеджера по умолчанию (например, текущего пользователя). Чтобы наша логика сработала корректно, нам нужно убедиться, что стандартное значение менеджера не перетирает то, что мы установили из заказа, или что оно будет установлено после нашего. В данном случае, так как мы используем &После, наша установка будет выполняться после типовой, и должна переопределить стандартное значение. Однако, если вы столкнетесь с тем, что менеджер все равно заполняется неправильно, возможно, придется рассмотреть вариант с &Вместо или детально проанализировать типовой код. В большинстве случаев подход с &После и прямым присваиванием ЭтотОбъект.Менеджер оказывается достаточным.Этот метод более ориентирован на модуль формы документа и использует обработчик, который срабатывает после создания документа на сервере, но до его отображения пользователю.
&ПриСозданииНаСервереПосле.
Параметры, передаваемые в этот обработчик, содержат информацию об основании. Мы можем получить ее через Параметры.Основание.
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Основание")
И Параметры.Основание.Свойство("ДокументОснование")
И ТипЗнч(Параметры.Основание.ДокументОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Объект.Менеджер = Параметры.Основание.ДокументОснование.Менеджер;
КонецЕсли;
КонецПроцедуры
Здесь мы используем Объект.Менеджер, так как находимся в контексте модуля формы, где переменная Объект ссылается на объект документа.
Часто причиной того, что код в расширении не срабатывает, даже если он кажется синтаксически верным, является включенный безопасный режим для расширения. По умолчанию, при создании расширения, этот флажок установлен. Безопасный режим ограничивает возможности расширения по доступу к серверным модулям и данным, чтобы предотвратить выполнение потенциально вредоносного кода.
Для корректной работы расширения, которое модифицирует логику в модуле объекта или обращается к серверным данным, вам потребуется отключить безопасный режим.
Внимание: Отключение безопасного режима должно производиться с пониманием возможных рисков. Убедитесь, что код расширения надежен и не содержит уязвимостей.
В более новых версиях 1С:Управление торговлей (начиная с 11.5 и выше, например 11.5.13.104, 11.5.16.107, 11.5.17.143, 11.5.17.179) были замечены изменения в структуре параметра ДанныеЗаполнения, передаваемого в процедуру ОбработкаЗаполнения. В частности, ДанныеЗаполнения.ДокументОснование может быть не просто ссылкой на документ, а массивом ссылок, даже если документ-основание всего один.
В таком случае, для получения ссылки на "Заказ клиента", необходимо обращаться к первому элементу этого массива, используя индекс [0]. Пример кода, адаптированного для этих версий:
&После("ОбработкаЗаполнения")
Процедура СД_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Перем ТипДанныхЗаполнения;
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
// Проверяем, содержит ли структура свойство "ДокументОснование" и является ли оно массивом
Если ДанныеЗаполнения.Свойство("ДокументОснование")
И ТипЗнч(ДанныеЗаполнения.ДокументОснование) = Тип("Массив")
И ДанныеЗаполнения.ДокументОснование.Количество() > 0 Тогда
// Проверяем тип первого элемента массива
Если ТипЗнч(ДанныеЗаполнения.ДокументОснование[0]) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
// Если ДанныеЗаполнения — это структура, то мы можем прямо присвоить менеджеру объекта
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
ЭтотОбъект.Менеджер = ДанныеЗаполнения.ДокументОснование[0].Менеджер;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот код более точно учитывает возможную структуру ДанныеЗаполнения в свежих релизах 11.5, где основание может быть представлено в виде массива.
В процессе обсуждения на форуме поднимались идеи о прямом изменении типового кода конфигурации, например, в процедурах ЗаполнитьДокументНаОснованииЗаказаКлиента или ИнициализироватьДокумент модуля объекта документа "Реализация товаров и услуг". Этот подход, хотя и может решить задачу, крайне не рекомендуется по следующим причинам:
Мы настоятельно рекомендуем использовать расширения конфигурации для любых доработок, так как это позволяет сохранить типовую конфигурацию неизменной, упрощает обновления и соответствует современным стандартам разработки в 1С.
Мы рассмотрели, как эффективно настроить автоматическое заполнение поля "Менеджер" в документе "Реализация товаров и услуг" на основе данных из "Заказа клиента" в 1С:Управление торговлей. Мы выяснили, что наиболее надежным и рекомендуемым способом является использование расширений конфигурации с обработчиками &После("ОбработкаЗаполнения") в модуле объекта или &ПриСозданииНаСервереПосле в модуле формы. Критически важным шагом для успешной работы расширений является отключение безопасного режима. Также мы проанализировали особенности работы с данными в различных версиях УТ 11.5, где структура параметра ДанныеЗаполнения.ДокументОснование может представлять собой массив. Следуя этим рекомендациям, вы сможете настроить необходимое поведение системы, минимизируя риски при последующих обновлениях.