Как добавить и сохранить дополнительный реквизит (склад) в адресе доставки БСП?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто при автоматизации бизнес-процессов возникает необходимость привязать к конкретному адресу доставки (например, партнера или контрагента) определенный склад отгрузки. Стандартные подсистемы (БСП) предоставляют мощный механизм контактной информации (КИ), однако добавление в него новых реквизитов имеет свои архитектурные особенности. Давайте разберем по шагам, почему простое добавление поля на форму не работает, и проанализируем правильные способы решения этой задачи.

Почему добавленное на форму поле не сохраняется автоматически?

Для начала выясним причину такого поведения системы. Многие разработчики пытаются просто добавить реквизит на форму ввода адреса или в табличную часть КонтактнаяИнформация, но обнаруживают, что после перезапуска формы поле очищается.

Дело в том, что в современных версиях Библиотеки стандартных подсистем (БСП) контактная информация не хранится в виде классических отдельных колонок (индекс, город, улица и т.д.) в базе данных. Для каждого адреса система формирует специальную структурированную строку в формате XML (XDTO-пакет) или JSON. Эта строка записывается в скрытое системное поле (обычно ЗначенияПолей или Значение) табличной части справочника-владельца.

Когда вы нажимаете кнопку сохранения, типовой программный код собирает только строго определенные стандартом поля. Ваш нетиповой реквизит Склад алгоритмом игнорируется. Более того, попытки "вклиниться" в типовую XML-строку и добавить туда свой тег могут привести к ошибкам обмена данными, так как схемы XDTO жестко валидируют структуру.

Рассмотрим подробнее три рабочих варианта решения этой задачи от простых к более сложным.

Вариант 1: Использование независимого Регистра Сведений (Рекомендуемый подход)

Это наиболее архитектурно правильное и чистое решение. Оно не требует снятия типовой конфигурации с поддержки и не ломает стандарты обмена контактной информацией. Мы просто свяжем адрес и склад в отдельной таблице.

  1. Создание регистра: Создайте независимый регистр сведений, например, СкладыАдресовДоставки.
  2. Измерения: ОбъектВладелец (тип: СправочникСсылка.Партнеры или Контрагенты) и ИдентификаторСтрокиКИ (или ВидКонтактнойИнформации, если у партнера только один адрес такого вида).
  3. Ресурс: Склад (тип: СправочникСсылка.Склады).
  4. Использование расширений: Создайте расширение конфигурации. В нем перехватите форму редактирования контактной информации. При открытии формы (в событии ПриСозданииНаСервере) читайте склад из регистра по владельцу и идентификатору и заполняйте добавленный на форму реквизит.
  5. При сохранении адреса (например, в ПослеЗаписиНаСервере или при закрытии формы ввода адреса) записывайте выбранное значение обратно в ваш регистр сведений.

Этот метод гарантирует, что обновления БСП не затрут вашу логику, а типовой функционал останется нетронутым.

Вариант 2: Использование типового поля «Комментарий» (Продвинутый)

Если вы не хотите плодить новые объекты метаданных (регистры), проанализируем ситуацию с использованием существующего поля Комментарий, которое есть в табличной части КИ.

Пользователю все так же выводится красивое поле со списком складов. Но программно под капотом мы будем "упаковывать" этот склад вместе с текстом комментария.

  1. Добавляем поле Склад на форму программно через расширение.
  2. При записи адреса перехватываем введенные данные. Формируем структуру (например, JSON), в которую помещаем реальный текст комментария, введенный пользователем, и GUID выбранного склада.
  3. Записываем этот JSON в стандартное поле Комментарий табличной части.
  4. При следующем открытии формы система читает строку из поля Комментарий. Наш код парсит JSON, извлекает GUID, находит по нему ссылку на склад и подставляет в визуальное поле выбора склада. Оставшийся текст выводится в обычное поле комментария.

Пример концептуальной структуры в поле комментарий:


{
  "ТекстКомментария": "Доставлять только после 14:00",
  "СкладУИД": "123e4567-e89b-12d3-a456-426614174000"
}

Вариант 3: Модификация табличной части и общих модулей (Сложный в поддержке)

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

Посмотрим на алгоритм:

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

Минусы подхода: Очень много изменений в типовых модулях. Выгружаться в другие базы стандартными планами обмена это поле не будет (потребуется доработка правил конвертации). При каждом обновлении 1С придется вручную проверять и переносить этот код.

Итоги

Мы настоятельно рекомендуем использовать Вариант 1 (Регистр сведений). Он наиболее прозрачный, легко интегрируется через механизм расширений и не ломает типовые XDTO-пакеты библиотеки стандартных подсистем. Работа с адресами в БСП требует аккуратности, и вынесение дополнительных свойств в отдельные сущности — залог стабильной работы вашей базы.

← На главную