Как настроить автоматическое заполнение поля "Кому" при отправке письма из документа "ПриобретениеТоваровУслуг" в 1С:Управление торговлей 11?

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

Мы часто сталкиваемся с ситуациями, когда система 1С:Управление торговлей 11 (УТ 11) ведет себя по-разному при выполнении схожих операций. Рассмотрим распространенную проблему: при отправке электронных писем из одного документа поле "Кому" заполняется автоматически электронным адресом контрагента, а из другого, например, "ПриобретениеТоваровУслуг", этого не происходит. Давайте вместе выясним, почему так происходит, и предложим пошаговое решение для настройки корректного автозаполнения.

Анализ ситуации и первичная диагностика

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

  1. Проверка наличия адреса электронной почты у контрагента (поставщика).

    Убедимся, что у контрагента, указанного в документе "ПриобретениеТоваровУслуг" в качестве поставщика, корректно заполнен адрес электронной почты. Это основное условие для любой автоматической отправки. Если адрес не указан, система просто не сможет его найти и подставить.

    1. Откройте карточку партнера (обычно находится в разделе "НСИ и администрирование" > "Партнеры").
    2. Найдите соответствующего контрагента, который является поставщиком по вашему документу.
    3. В его карточке перейдите на вкладку "Контакты" или "Контактная информация".
    4. Проверьте наличие и правильность заполнения поля "Email". Также важно убедиться, что партнер отмечен как "Поставщик", если это влияет на доступность его контактных данных для данного типа документа.
  2. Проверка стандартного функционала для других документов.

    Уточним, как система ведет себя с другими типами документов, для которых автозаполнение работает. Если для документа "СчетПоОплате" все работает корректно, а для "ПриобретениеТоваровУслуг" нет, это указывает на специфическую проблему с обработкой именно этого типа документа. Мы анализируем, есть ли отличия в стандартной логике обработки контактной информации для разных документов.

  3. Проверка доработок и расширений конфигурации.

    Выясним, были ли внесены изменения в конфигурацию или установлены расширения. Часто именно они могут влиять на стандартное поведение системы. Даже если вы закомментировали части кода, предыдущие изменения или наличие активных расширений могли повлиять на стандартную логику. Конфигурация, которая "редактируется с сохранением поддержки", все равно может содержать изменения в типовых модулях или объектах, которые приводят к нежелательному поведению.

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

Поиск места для доработки логики заполнения получателей

После первичных проверок, если проблема сохраняется, мы приходим к выводу, что она, скорее всего, кроется в отсутствии или некорректной логике определения получателей письма для конкретного типа документа. В 1С:УТ 11 для таких целей предусмотрена специальная точка расширения, которую мы будем искать и модифицировать.

При формировании электронного письма система обращается к определенным процедурам для заполнения списка получателей. Для документа "ПриобретениеТоваровУслуг" нам необходимо модифицировать или добавить логику в одну из таких процедур.

Нам потребуется найти процедуру, которая отвечает за заполнение списка получателей. Чаще всего это процедура с именем ПриЗаполненииПочтыПолучателейВСообщении.

Обычно эта процедура может находиться в модуле менеджера соответствующего объекта (например, документа "ПриобретениеТоваровУслуг"), хотя чаще она бывает реализована в общих модулях, таких как ШаблоныСообщенийПереопределяемый, КоммерческиеПредложенияДокументыПереопределяемый или других модулях, отвечающих за работу с электронной почтой и шаблонами сообщений.

Шаги для поиска и модификации:

  1. Откройте конфигуратор 1С.
  2. В дереве объектов конфигурации найдите модуль, который, по нашим предположениям, обрабатывает отправку почты или связан с документом "ПриобретениеТоваровУслуг". Можно начать с модуля менеджера документа ПриобретениеТоваровУслуг.
  3. Ищите процедуру с именем ПриЗаполненииПочтыПолучателейВСообщении. Если она пустая или отсутствует, нам потребуется её создать или доработать.

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

    
    Процедура ПриЗаполненииПочтыПолучателейВСообщении(ПолучателиПисьма, ПредметСообщения) Экспорт
        // Здесь будет наша логика по определению получателей
    КонецПроцедуры
    

    Разберем параметры этой процедуры:

    • ПолучателиПисьма – это таблица значений, в которую мы будем добавлять данные об адресах наших получателей. Эта таблица обычно содержит колонки "Адрес" (строка, адрес электронной почты), "Представление" (строка, имя или представление получателя) и "ВариантОтправки" (строка, например, "Кому", "Копия", "СкрытаяКопия").
    • ПредметСообщения – это ссылка на объект, который является источником письма. В нашем случае, когда мы отправляем письмо из документа "ПриобретениеТоваровУслуг", этим объектом будет ссылка на соответствующий документ.

    Пользователь форума верно определил, что в его случае проблема прерывается именно в этот момент, когда должна быть добавлена информация в массив ПолучателиПисьма.

Реализация логики заполнения адресатов

Теперь, когда мы нашли нужную процедуру, реализуем в ней логику для извлечения адреса электронной почты поставщика из документа "ПриобретениеТоваровУслуг" и добавления его в список получателей. Мы должны учесть особенности хранения контактной информации в УТ 11.

Пошаговая реализация:

  1. Определим тип документа.

    В начале процедуры нам необходимо убедиться, что ПредметСообщения является именно тем документом, для которого мы хотим реализовать логику автозаполнения – в нашем случае, это "ПриобретениеТоваровУслуг". Это позволит избежать нежелательного влияния на другие типы документов.

    
    Если ТипЗнч(ПредметСообщения) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
        ДокументПриобретения = ПредметСообщения;
        // ... здесь будет дальнейшая логика
    КонецЕсли;
    
  2. Получим контрагента (поставщика).

    Из документа "ПриобретениеТоваровУслуг" нам нужно получить ссылку на контрагента, который является поставщиком. Обычно это поле Контрагент или Поставщик в структуре документа. Мы обращаемся к реквизиту документа, содержащему ссылку на объект СправочникСсылка.Контрагенты или СправочникСсылка.Партнеры.

    
    КонтрагентПартнер = ДокументПриобретения.Контрагент; // Или ДокументПриобретения.Поставщик, в зависимости от структуры
    

    Важно убедиться, что ссылка на контрагента не пустая, прежде чем пытаться получить из нее данные.

  3. Получим контактную информацию (электронную почту).

    Для полученного объекта "Контрагент" или "Партнер" нам потребуется его контактная информация, в частности, адрес электронной почты. В 1С:УТ 11 контактная информация обычно хранится в регистре сведений КонтактнаяИнформация. Мы можем использовать запрос или вспомогательные функции для извлечения нужного адреса.

    Рассмотрим типовой подход с использованием запроса:

    Пример кода, который можно вставить в процедуру ПриЗаполненииПочтыПолучателейВСообщении:

    
    Процедура ПриЗаполненииПочтыПолучателейВСообщении(ПолучателиПисьма, ПредметСообщения) Экспорт
    
        Если ТипЗнч(ПредметСообщения) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
            ДокументПриобретения = ПредметСообщения;
            
            // Получаем ссылку на контрагента (или партнера), который является поставщиком
            // В УТ11 чаще используется "Партнер", а "Контрагент" связан с ним.
            // Здесь предполагаем, что в документе есть реквизит "Контрагент".
            КонтрагентПоставщик = ДокументПриобретения.Контрагент; 
            
            Если КонтрагентПоставщик.Пустая() Тогда
                Возврат; // Если контрагент не указан, дальнейшие действия бессмысленны
            КонецЕсли;
    
            // Определяем объект, для которого ищем email. 
            // В УТ11 контактная информация может храниться как для Партнера, так и для Контрагента.
            // Предположим, что email хранится непосредственно у контрагента.
            ОбъектДляПоискаEmail = КонтрагентПоставщик;
    
            // Формируем запрос для получения адреса электронной почты из регистра сведений "КонтактнаяИнформация"
            Запрос = Новый Запрос;
            Запрос.Текст = 
            "ВЫБРАТЬ
            |    КонтактнаяИнформация.Представление КАК АдресEmail
            |ИЗ
            |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
            |ГДЕ
            |    КонтактнаяИнформация.Объект = &Объект
            |    И КонтактнаяИнформация.Тип = &ТипEmail
            |    И КонтактнаяИнформация.Вид = &ВидEmail
            |
            |УПОРЯДОЧИТЬ ПО
            |    КонтактнаяИнформация.ПорядокПредставления УБЫВ"; // Если есть несколько адресов, берем основной
    
            Запрос.УстановитьПараметр("Объект", ОбъектДляПоискаEmail);
            Запрос.УстановитьПараметр("ТипEmail", Перечисления.ТипыКонтактнойИнформации.Email);
            Запрос.УстановитьПараметр("ВидEmail", Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Email контрагента")); // Или другой вид, если настроен
    
            РезультатЗапроса = Запрос.Выполнить();
            Выборка = РезультатЗапроса.Выбрать();
    
            Если Выборка.Следующий() Тогда
                АдресЭлектроннойПочты = Выборка.АдресEmail;
                Если ЗначениеЗаполнено(АдресЭлектроннойПочты) Тогда
                    // Добавляем найденный адрес в список получателей письма
                    НоваяСтрока = ПолучателиПисьма.Добавить();
                    НоваяСтрока.Адрес = АдресЭлектроннойПочты;
                    НоваяСтрока.Представление = КонтрагентПоставщик.Наименование; // Используем наименование контрагента как представление
                    НоваяСтрока.ВариантОтправки = "Кому"; // Указываем, что это основной получатель
    
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    
    КонецПроцедуры
    

    Пояснения к представленному коду:

    • Мы начинаем с проверки типа ПредметСообщения, чтобы наш код срабатывал только для документа "ПриобретениеТоваровУслуг".
    • Из документа мы получаем ссылку на КонтрагентПоставщик. В реальных конфигурациях УТ 11 структура может быть сложнее (например, через Партнер и Контрагент). Вам следует адаптировать этот шаг под вашу конкретную структуру данных.
    • Формируется объект Запрос для обращения к регистру сведений КонтактнаяИнформация. Мы ищем запись, где Объект соответствует нашему контрагенту, Тип равен Перечисления.ТипыКонтактнойИнформации.Email, а также можем уточнить Вид контактной информации (например, "Email контрагента", если такие виды используются).
    • Параметры запроса (Объект, ТипEmail, ВидEmail) устанавливаются перед выполнением.
    • После выполнения запроса мы используем Выборка.Следующий() для получения первой (или основной) найденной записи.
    • Если адрес электронной почты найден и заполнен, мы создаем новую строку в таблице значений ПолучателиПисьма. Обязательно заполняем поля Адрес (сам email), Представление (для удобства, например, наименование контрагента) и ВариантОтправки ("Кому", "Копия", "СкрытаяКопия").
  4. Сохраните изменения.

    После внесения кода в модуль сохраните его (кнопка с дискетой или Ctrl+S). Затем обновите конфигурацию базы данных (F7 или "Конфигурация" > "Обновить конфигурацию базы данных"). Это действие необходимо для того, чтобы изменения вступили в силу.

Дополнительные рекомендации

Таким образом, с помощью целенаправленного анализа, проверки базовых настроек и модификации процедуры ПриЗаполненииПочтыПолучателейВСообщении, а также корректного извлечения контактной информации контрагента из регистра сведений, мы сможем добиться автоматического заполнения поля "Кому" при отправке писем из документа "ПриобретениеТоваровУслуг" в 1С:УТ 11. Этот подход позволяет гибко настраивать логику определения получателей для различных бизнес-процессов, адаптируя систему под наши специфические требования.

← На главную