При работе в 1С:Управление торговлей 11.4 (УТ 11.4) часто возникает ситуация, когда один клиент, представленный одним юридическим лицом, имеет множество точек доставки. Это может быть 10, 15, а иногда и 20-30 различных адресов, куда необходимо доставлять товары. Стандартные механизмы программы не всегда справляются с таким объемом или оказываются слишком сложными для операторов. Давайте рассмотрим эту проблему подробнее и найдем оптимальное решение.
Основная сложность заключается в том, что в типовой конфигурации УТ 11.4 управление множественными адресами доставки для одного контрагента не является тривиальной задачей. Разберем трудности, с которыми обычно сталкиваются пользователи:
Рассмотрим подробнее механизм «Партнеры – Контрагенты», поскольку он является наиболее функциональным, но вызывает наибольшие сложности для операторов.
Механизм «Партнеры – Контрагенты» позволяет гибко управлять взаимоотношениями с клиентами, но требует четкого понимания и настройки. Давайте разберем, как он работает и какие возможности предоставляет:
В 1С:УТ 11.4 Партнер – это управленческое понятие. Это может быть клиент, поставщик, конкурент или даже отдельная торговая точка клиента. Контрагент – это юридическое или физическое лицо, с которым заключаются договоры и ведутся взаиморасчеты. Один Контрагент может быть связан с несколькими Партнерами. Это позволяет вести управленческий учет по Партнерам (например, по конкретным магазинам клиента), а юридический и бухгалтерский учет – по Контрагенту (головной организации).
Один из вариантов использования данного механизма – это создание структуры «Головной Партнер – Подчиненные Партнеры». Мы можем рассмотреть это по шагам:
Несмотря на свою функциональность, этот подход часто оказывается слишком сложным для операторов, особенно в небольших компаниях с простыми бизнес-процессами. Возникают следующие проблемы:
Тем не менее, для более сложных сценариев, например, с интеграцией с мобильными приложениями (такими как «Моби-С»), механизм Партнеров и Контрагентов может быть весьма полезен. «Моби-С» поддерживает работу с торговыми точками как «по вхождению в холдинг» (используя структуру Партнеров), так и «по адресам доставки» (где каждый адрес может быть представлен как отдельный клиент-адрес на мобильном устройстве).
Как мы видим, типовые решения либо ограничены, либо слишком сложны для операторов, что приводит к возврату к ручному копированию адресов из текстовых файлов. Руководство, естественно, задается вопросом: «А зачем нам нужна такая программа?»
Наиболее эффективным и удобным для операторов решением, которое позволяет избежать снятия конфигурации с поддержки и значительно упростить работу, является комбинация настройки «Видов контактной информации» и доработки формы документа через расширение. Этот подход решает проблему ограниченного количества адресов и предоставляет удобный механизм выбора.
Разберем решение по шагам:
Первым делом нам необходимо расширить возможности хранения адресов доставки для Партнера. Мы будем использовать типовой механизм контактной информации, но с одной важной настройкой.
Теперь мы можем хранить все адреса, но как сделать их удобными для выбора в документе?
Для того чтобы операторам было удобно выбирать нужный адрес доставки прямо в документе «Реализация товаров и услуг» (или «Заказ клиента»), мы воспользуемся расширением конфигурации. Расширение позволяет дорабатывать функционал без снятия с поддержки.
Далее мы добавим код, который будет заполнять список выбора поля «АдресДоставки» актуальными значениями – как ранее использованными в документах, так и всеми адресами, которые мы внесли в контактную информацию Партнера.
После стандартной обработки этого события (если она есть) или вместо неё. Создадим обработчик события АдресДоставкиНачалоВыбораПосле.
// Процедура-обработчик события НачалоВыбора для поля АдресДоставки на клиенте
// Вызывается после стандартной обработки, чтобы заполнить список выбора
&НаКлиенте
Процедура Расш1_АдресДоставкиНачалоВыбораПосле(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Очищаем текущий список выбора, чтобы заполнить его нашими значениями
Элементы.АдресДоставки.СписокВыбора.Очистить();
// Получаем список адресов с сервера
МассивАдресов = ПолучитьСписокРанееИспользованныхАдресов();
// Добавляем каждый адрес из полученного массива в список выбора поля
Для Каждого Стр Из МассивАдресов Цикл
Элементы.АдресДоставки.СписокВыбора.Добавить(Стр);
КонецЦикла;
// Отключаем стандартную обработку, если это необходимо,
// чтобы не смешивать наш список с типовым (но здесь мы просто дополняем/заменяем)
// СтандартнаяОбработка = Ложь; // Может потребоваться, если стандартная обработка мешает
КонецПроцедуры
// Функция для получения списка адресов с сервера (для доступа к данным ИБ)
&НаСервере
Функция ПолучитьСписокРанееИспользованныхАдресов()
МассивАдресов = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровУслуг.АдресДоставки КАК АдресДоставки
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Грузополучатель = &Грузополучатель
| И НЕ РеализацияТоваровУслуг.АдресДоставки ЕСТЬ NULL
| И НЕ РеализацияТоваровУслуг.АдресДоставки = """"
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПартнерыКонтактнаяИнформация.Представление
|ИЗ
| Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
| ПО ПартнерыКонтактнаяИнформация.Ссылка = Контрагенты.Партнер
|ГДЕ
| Контрагенты.Ссылка = &Грузополучатель
| И ПартнерыКонтактнаяИнформация.Вид.Наименование = ""Адрес доставки""
| И НЕ ПартнерыКонтактнаяИнформация.Представление ЕСТЬ NULL
| И НЕ ПартнерыКонтактнаяИнформация.Представление = """"";
// Передаем в запрос Грузополучателя, чтобы фильтровать адреса по текущему клиенту
// Грузополучатель должен быть доступен в контексте формы как реквизит
Запрос.УстановитьПараметр("Грузополучатель", Грузополучатель);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Добавляем только непустые адреса
Если Не ПустаяСтрока(СокрЛП(ВыборкаДетальныеЗаписи.АдресДоставки)) Тогда
МассивАдресов.Добавить(ВыборкаДетальныеЗаписи.АдресДоставки);
КонецЕсли;
КонецЦикла;
Возврат МассивАдресов;
КонецФункции
Расш1_АдресДоставкиНачалоВыбораПосле(Элемент, ДанныеВыбора, СтандартнаяОбработка): Это клиентская процедура, которая выполняется, когда пользователь пытается выбрать адрес доставки. Мы очищаем текущий список выбора поля АдресДоставки и вызываем серверную функцию ПолучитьСписокРанееИспользованныхАдресов(). Затем все полученные адреса добавляются в список выбора элемента формы, делая их доступными для пользователя.ПолучитьСписокРанееИспользованныхАдресов(): Это серверная функция, которая выполняет запрос к базе данных. Запрос состоит из двух частей, объединенных оператором ОБЪЕДИНИТЬ ВСЕ, чтобы собрать все необходимые адреса:
АдресДоставки из документов РеализацияТоваровУслуг, где Грузополучатель совпадает с текущим грузополучателем в документе. Это позволяет получить историю ранее использованных адресов для данного клиента.КонтактнойИнформации Партнеров. Здесь происходит внутреннее соединение со справочником Контрагенты, чтобы связать контактную информацию Партнера с Контрагентом, который указан как Грузополучатель в нашем документе. Мы фильтруем по Вид.Наименование = ""Адрес доставки"", чтобы получить только те адреса, которые мы настроили в Шаге 1.Важные моменты:
&Грузополучатель устанавливается из реквизита формы, в которой мы работаем. Убедитесь, что реквизит Грузополучатель (который обычно является ссылкой на справочник Контрагенты) доступен в контексте этой формы и корректно передается в параметр запроса.ВЫБРАТЬ РАЗЛИЧНЫЕ и фильтрация на НЕ NULL и НЕ "" помогают избежать дубликатов и пустых значений в списке выбора.После того как мы обеспечили удобное хранение и выбор адресов, необходимо убедиться, что выбранный адрес корректно выводится в печатные формы, например, в УПД в поле «Грузополучатель» или в товарную накладную для водителя.
АдресДоставки документа. Если стандартное поле выводит только наименование Партнера или Контрагента, возможно, потребуется заменить его на параметр, который передает полное значение АдресДоставки из документа.Данное комплексное решение позволяет:
Такой подход делает работу с множественными адресами доставки в 1С:УТ 11.4 гораздо более эффективной и менее трудоемкой, чем использование предыдущих, более сложных или ограниченных методов.