Как эффективно управлять множественными адресами доставки в 1С:Управление торговлей 11.4?

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

При работе в 1С:Управление торговлей 11.4 (УТ 11.4) часто возникает ситуация, когда один клиент, представленный одним юридическим лицом, имеет множество точек доставки. Это может быть 10, 15, а иногда и 20-30 различных адресов, куда необходимо доставлять товары. Стандартные механизмы программы не всегда справляются с таким объемом или оказываются слишком сложными для операторов. Давайте рассмотрим эту проблему подробнее и найдем оптимальное решение.

Проблема и пробованные пути решения

Основная сложность заключается в том, что в типовой конфигурации УТ 11.4 управление множественными адресами доставки для одного контрагента не является тривиальной задачей. Разберем трудности, с которыми обычно сталкиваются пользователи:

  1. Поле «Адрес доставки» в документах: Стандартное поле «Адрес доставки» в документах, таких как «Реализация товаров и услуг», имеет существенное ограничение. Оно способно хранить только около 5 ранее использованных адресов, при этом логика их сохранения и отображения в списке выбора часто бывает неочевидной. Адреса могут пропадать из списка, что вынуждает операторов каждый раз вводить их вручную или копировать из внешних источников, например, из текстовых файлов на рабочем столе. Это приводит к увеличению ручного труда и ошибкам.
  2. «Виды адресов» в контактной информации: Попытки использовать механизм «Виды адресов» в контактной информации контрагента или партнера также сталкиваются с ограничениями. Если для каждого адреса создавать отдельный вид, то при 20-30 адресах это становится нецелесообразным. Кроме того, создание новых видов адресов может потребовать доработки правил обмена с другими конфигурациями (например, с 1С:Бухгалтерией), что особенно проблематично для базовых версий, где снятие с поддержки и изменение правил обмена нежелательны.
  3. Механизм «Партнеры – Контрагенты»: Это типовой механизм УТ 11.4, предназначенный для разделения управленческого и юридического учета. Партнер является управленческим понятием (например, торговая сеть или конкретная торговая точка), а Контрагент – юридическим лицом, с которым ведутся взаиморасчеты. Предполагается, что один Контрагент (юридическое лицо) может иметь множество Партнеров (торговых точек, адресов доставки).

Рассмотрим подробнее механизм «Партнеры – Контрагенты», поскольку он является наиболее функциональным, но вызывает наибольшие сложности для операторов.

Использование механизма «Партнеры – Контрагенты»

Механизм «Партнеры – Контрагенты» позволяет гибко управлять взаимоотношениями с клиентами, но требует четкого понимания и настройки. Давайте разберем, как он работает и какие возможности предоставляет:

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

Схема «Головной Партнер – Подчиненные Партнеры»

Один из вариантов использования данного механизма – это создание структуры «Головной Партнер – Подчиненные Партнеры». Мы можем рассмотреть это по шагам:

  1. Создание Головного Партнера: Для клиента, имеющего несколько точек доставки, создаем одного основного Партнера (например, «ООО 'Рога и Копыта' – Головная организация»). С этим Партнером связываем соответствующего Контрагента, который будет плательщиком и юридическим лицом для взаиморасчетов.
  2. Создание Подчиненных Партнеров (точек доставки): Для каждой точки доставки клиента создаем отдельного Подчиненного Партнера (например, «ООО 'Рога и Копыта' – Филиал 1 (ул. Ленина, 1)», «ООО 'Рога и Копыта' – Филиал 2 (ул. Гагарина, 5)» и так далее). Эти Подчиненные Партнеры указываются как дочерние по отношению к Головному Партнеру. Каждый такой Подчиненный Партнер может иметь свой адрес доставки, а при необходимости – и свои реквизиты (хотя чаще всего они используют реквизиты головного Контрагента).
  3. Связь с Контрагентами: В карточке каждого из этих подчиненных Партнеров мы можем указать одного и того же Контрагента (юридическое лицо), который является плательщиком за все поставки. Это позволяет вести взаиморасчеты с головной организацией, но отгрузку производить на конкретные адреса магазинов.

Сложности и альтернативы в рамках «Партнеры – Контрагенты»

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

Тем не менее, для более сложных сценариев, например, с интеграцией с мобильными приложениями (такими как «Моби-С»), механизм Партнеров и Контрагентов может быть весьма полезен. «Моби-С» поддерживает работу с торговыми точками как «по вхождению в холдинг» (используя структуру Партнеров), так и «по адресам доставки» (где каждый адрес может быть представлен как отдельный клиент-адрес на мобильном устройстве).

Другие подходы в рамках типовой конфигурации:

Как мы видим, типовые решения либо ограничены, либо слишком сложны для операторов, что приводит к возврату к ручному копированию адресов из текстовых файлов. Руководство, естественно, задается вопросом: «А зачем нам нужна такая программа?»

Рекомендуемое решение: Расширение конфигурации и доработка контактной информации

Наиболее эффективным и удобным для операторов решением, которое позволяет избежать снятия конфигурации с поддержки и значительно упростить работу, является комбинация настройки «Видов контактной информации» и доработки формы документа через расширение. Этот подход решает проблему ограниченного количества адресов и предоставляет удобный механизм выбора.

Разберем решение по шагам:

Шаг 1: Настройка справочника «Виды контактной информации»

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

  1. Откройте справочник «Виды контактной информации». Этот справочник находится в разделе «НСИ и администрирование» -> «НСИ» (или через поиск в конфигурации).
  2. Создайте новый элемент справочника для объекта «Партнер».
  3. Укажите следующие параметры для нового вида контактной информации:
    • Тип: «Адрес» (это стандартный тип для адресов).
    • Объект: Выберите «Справочник.Партнеры». Это позволит привязывать этот вид контактной информации именно к Партнерам.
    • Наименование: Присвойте понятное наименование, например, «Адрес доставки».
    • КРИТИЧНО ВАЖНО: Установите флажок «Разрешить ввод нескольких значений». Этот флажок является ключом к решению проблемы ограничения на количество адресов! Он позволяет добавлять неограниченное количество адресов одного вида для одного Партнера.
  4. После сохранения этих настроек мы можем перейти в карточку любого Партнера и в разделе «Контактная информация» добавить столько «Адресов доставки», сколько необходимо, без каких-либо ограничений.

Теперь мы можем хранить все адреса, но как сделать их удобными для выбора в документе?

Шаг 2: Создание расширения и модификация формы документа «Реализация товаров и услуг»

Для того чтобы операторам было удобно выбирать нужный адрес доставки прямо в документе «Реализация товаров и услуг» (или «Заказ клиента»), мы воспользуемся расширением конфигурации. Расширение позволяет дорабатывать функционал без снятия с поддержки.

  1. Создание расширения: Если у вас нет расширения, создайте его. Для этого в режиме «Конфигуратор» перейдите в меню «Конфигурация» -> «Расширения конфигурации». Нажмите кнопку «Добавить», присвойте расширению имя (например, «ДоработкаАдресовДоставки») и снимите флаг «Безопасный режим» (если требуется для доступа к данным).
  2. Добавление общей формы: Нам необходимо доработать форму документа, которая отвечает за реквизиты печати, где находится поле «Адрес доставки». В расширение необходимо добавить общую форму «Реквизиты печати реализации» (или аналогичную, если вы работаете с другим документом, например, Заказом клиента).
    • В Конфигураторе найдите общий модуль или форму, которая содержит поле «АдресДоставки» для печати. Чаще всего это общая форма для работы с печатными формами или сама форма документа.
    • Добавьте эту форму в расширение.
  3. Модификация поля «АдресДоставки»: В добавленной в расширение форме найдите поле «АдресДоставки».
    • В свойствах этого поля установите флажок «Режим выбора из списка». Это позволит нам программно управлять списком значений, предлагаемых пользователю.
    • Теперь нам нужно обработать событие, когда пользователь начинает выбор из этого списка.

Шаг 3: Программное заполнение списка выбора адресов

Далее мы добавим код, который будет заполнять список выбора поля «АдресДоставки» актуальными значениями – как ранее использованными в документах, так и всеми адресами, которые мы внесли в контактную информацию Партнера.

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

// Процедура-обработчик события НачалоВыбора для поля АдресДоставки на клиенте
// Вызывается после стандартной обработки, чтобы заполнить список выбора
&НаКлиенте
Процедура Расш1_АдресДоставкиНачалоВыбораПосле(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Очищаем текущий список выбора, чтобы заполнить его нашими значениями
    Элементы.АдресДоставки.СписокВыбора.Очистить();
    
    // Получаем список адресов с сервера
    МассивАдресов = ПолучитьСписокРанееИспользованныхАдресов();
    
    // Добавляем каждый адрес из полученного массива в список выбора поля
    Для Каждого Стр Из МассивАдресов Цикл
        Элементы.АдресДоставки.СписокВыбора.Добавить(Стр);
    КонецЦикла;
    
    // Отключаем стандартную обработку, если это необходимо,
    // чтобы не смешивать наш список с типовым (но здесь мы просто дополняем/заменяем)
    // СтандартнаяОбработка = Ложь; // Может потребоваться, если стандартная обработка мешает
КонецПроцедуры

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

Разберем логику кода:

  1. Расш1_АдресДоставкиНачалоВыбораПосле(Элемент, ДанныеВыбора, СтандартнаяОбработка): Это клиентская процедура, которая выполняется, когда пользователь пытается выбрать адрес доставки. Мы очищаем текущий список выбора поля АдресДоставки и вызываем серверную функцию ПолучитьСписокРанееИспользованныхАдресов(). Затем все полученные адреса добавляются в список выбора элемента формы, делая их доступными для пользователя.
  2. ПолучитьСписокРанееИспользованныхАдресов(): Это серверная функция, которая выполняет запрос к базе данных. Запрос состоит из двух частей, объединенных оператором ОБЪЕДИНИТЬ ВСЕ, чтобы собрать все необходимые адреса:
    • Первая часть запроса: Извлекает все уникальные значения поля АдресДоставки из документов РеализацияТоваровУслуг, где Грузополучатель совпадает с текущим грузополучателем в документе. Это позволяет получить историю ранее использованных адресов для данного клиента.
    • Вторая часть запроса: Извлекает адреса из КонтактнойИнформации Партнеров. Здесь происходит внутреннее соединение со справочником Контрагенты, чтобы связать контактную информацию Партнера с Контрагентом, который указан как Грузополучатель в нашем документе. Мы фильтруем по Вид.Наименование = ""Адрес доставки"", чтобы получить только те адреса, которые мы настроили в Шаге 1.

Важные моменты:

Настройка вывода адреса в печатных формах

После того как мы обеспечили удобное хранение и выбор адресов, необходимо убедиться, что выбранный адрес корректно выводится в печатные формы, например, в УПД в поле «Грузополучатель» или в товарную накладную для водителя.

  1. Изменение макетов печатных форм: Большинство стандартных печатных форм в УТ 11.4 можно изменить без привлечения программиста (если требуется простое изменение полей).
    • Перейдите в «НСИ и администрирование» -> «Администрирование» -> «Печатные формы, отчеты и обработки» -> «Макеты печатных форм».
    • Найдите нужную печатную форму (например, «ТОРГ-12», «УПД») и нажмите «Изменить».
    • В открывшемся макете найдите поле, которое отвечает за вывод адреса грузополучателя, и убедитесь, что оно берет значение из реквизита АдресДоставки документа. Если стандартное поле выводит только наименование Партнера или Контрагента, возможно, потребуется заменить его на параметр, который передает полное значение АдресДоставки из документа.
    • В сложных случаях, если простой замены недостаточно, потребуется доработка макета через расширение или программист, чтобы в процедуру формирования печатной формы добавить нужный реквизит.

Итоги и преимущества решения

Данное комплексное решение позволяет:

Такой подход делает работу с множественными адресами доставки в 1С:УТ 11.4 гораздо более эффективной и менее трудоемкой, чем использование предыдущих, более сложных или ограниченных методов.

← На главную