При внедрении электронного документооборота (ЭДО) в крупных организациях или при работе с торговыми сетями часто возникает проблема правильной маршрутизации документов. Просто отправить документ "на организацию" недостаточно — он может затеряться в центральной бухгалтерии контрагента. Необходимо, чтобы документ попал в конкретный магазин, на склад или в филиал. В этой статье мы подробно разберем, как устроена работа с подразделениями в модуле Диадок для 1С, как обновлять их списки и технически реализовывать маршрутизацию.
Давайте сначала разберемся с проблематикой. Как верно замечено в обсуждении, существуют контрагенты, у которых сотни точек доставки. Если отправлять все документы в "голову", центральная бухгалтерия контрагента просто "утонет" в потоке накладных, о которых она ничего не знает. Требование таких клиентов (обычно это ритейлеры) — направлять документы строго в подразделение, соответствующее точке отгрузки.
Здесь важно провести четкую границу между двумя понятиями, которые часто путают:
Мы будем рассматривать именно второй случай — работу с внутренними подразделениями (Department), которые идентифицируются по GUID, а не только по КПП.
В типовой обработке Диадока список подразделений контрагента существует, но пользователи и программисты часто сталкиваются с проблемой: список в 1С не соответствует тому, что есть на самом деле в веб-версии Диадока. Почему так происходит?
Модуль интеграции 1С использует агрессивное кэширование. Чтобы не "дергать" API при открытии каждого документа, структура контрагента сохраняется локально. Если ваш контрагент добавил новый магазин в веб-интерфейсе вчера, ваш модуль 1С может не узнать об этом сегодня.
Рассмотрим, как это работает технически. Для получения данных используется метод API GetCounterparty. В ответе сервера приходит сложная структура Organization, которая содержит коллекцию Departments.
Важные нюансы метода:
Чтобы документ ушел по правильному адресу, нам недостаточно просто выбрать контрагента. Нам нужно указать конкретный DepartmentId. Разберем процесс для входящих и исходящих документов.
Это самый частый сценарий. Вы отгружаете товар в "Магазин №5", и накладная должна "упасть" в папку этого магазина в Диадоке покупателя. Если вы не укажете подразделение, документ уйдет в корневую папку (Головное подразделение), что вызовет штрафы или отказ в приемке со стороны сетей. Кроме того, при работе с сетями критически важен контроль заполнения полей маркированного товара, так как ошибки в маркировке также приводят к блокировке приемки.
При формировании пакета документов в модуле 1С (или если используется групповая выгрузка и загрузка файлов из 1С в XML для ЭДО для массовой отправки) необходимо корректно заполнять поле идентификатора подразделения получателя — ToDepartmentId.
Алгоритм действий программиста 1С:
Примерная логика заполнения параметров отправки (псевдокод):
// Получаем GUID подразделения из наших настроек по грузополучателю накладной
ИдПодразделенияПолучателя = ПолучитьGuidПодразделения(Реализация.Грузополучатель);
Если ЗначениеЗаполнено(ИдПодразделенияПолучателя) Тогда
// Заполняем служебное поле пакета Диадок
ПараметрыОтправки.Вставить("ToDepartmentId", ИдПодразделенияПолучателя);
КонецЕсли;
Если ваша организация имеет филиальную структуру, вам нужно настроить правильное распределение входящих. Когда контрагент присылает документ, он может указать DepartmentId (ID вашего подразделения).
Модуль Диадока при загрузке документа анализирует этот ID. Если в настройках модуля выполнено сопоставление (например, ID подразделения Диадока привязан к конкретной Организации или Подразделению в терминах 1С), документ автоматически "сядет" на нужный баланс. После загрузки документа часто требуется дальнейшая обработка, например, создание заказа поставщику из приобретения товаров, а для бумажного архива может понадобиться печать УПД за поставщика для документа Приобретение товаров услуг.
В обсуждении справедливо замечено, что архитектура разных операторов ЭДО отличается, и это влияет на код 1С. Понимание различий поможет избежать ошибок при проектировании.
В СБИС (Тензор):
Подразделения часто реализуются через иерархию личных кабинетов. Каждый филиал может выступать как отдельный аккаунт, связанный с головным. Идентификация часто строится на жесткой связке ИНН + КПП. Чтобы отправить документ в филиал, иногда требуется менять контекст авторизации или использовать сложные составные идентификаторы (ID получателя).
В Диадок (Контур):
Это чаще единый аккаунт (один BoxId), внутри которого существует древовидная структура подразделений. Идентификация идет через GUID. Вы работаете в рамках одного соединения, просто переключая параметр DepartmentId или ToDepartmentId.
Поскольку API Диадока не рассылает автоматических уведомлений (Webhook) о том, что контрагент изменил структуру своих подразделений (в отличие от уведомлений о новых документах), эту информацию мы должны запрашивать сами.
Чтобы поддерживать актуальность справочника подразделений контрагентов в вашей 1С, рекомендуем:
DepartmentId не найден или неактивен, реализуйте алгоритм, который:
GetCounterparty.Departments.Подводя итог: работа со списком подразделений в Диадоке возможна и предусмотрена штатным функционалом, но требует внимательного отношения к кэшированию и правильного хранения GUID-идентификаторов на стороне 1С.