Почему при создании или копировании документа в списке открывается другой объект и как это исправить?

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

При разработке в среде 1С:Предприятие 8.3, особенно в таких развитых конфигурациях, как 1С:Документооборот, программисты часто сталкиваются с ситуацией, когда стандартные команды формы ведут себя непредсказуемо. Типичный сценарий: вы создаете новую форму списка, настраиваете динамический список для отображения ваших документов (например, ЗаявкаУИиС), но при попытке нажать кнопку «Создать» или «Скопировать» внезапно открывается форма создания элемента справочника Пользователи или другого объекта. Давайте подробно разберем, почему система «забывает» о вашем документе и как вернуть командам правильный контекст.

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

Чаще всего корень проблемы кроется в том, что форма или её элементы были созданы путем копирования существующих объектов или переделки типовых форм. В 1С управляемая форма — это не просто набор визуальных элементов, это сложная структура метаданных, где команды жестко связаны с источниками данных. Если вы просто заменили запрос в динамическом списке, этого может быть недостаточно для корректной работы стандартного контекстного меню.

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

Причина 1: Свойство «Основная таблица» динамического списка

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

  1. Перейдите на вкладку «Реквизиты» в редакторе формы.
  2. Найдите ваш динамический список (он обычно выделен жирным шрифтом, если является основным).
  3. В окне свойств найдите поле «Основная таблица».

Если в этом поле указан справочник Справочник.Пользователи (или любой другой объект, который ошибочно открывается), то платформа будет игнорировать текст вашего SQL-запроса при генерации стандартных команд. Для системы именно это свойство определяет тип создаваемого объекта. Выясним, что нужно сделать: установите в этом поле ваш документ Документ.ЗаявкаУИиС. Если ваше отображение данных строится на сложном запросе с объединением таблиц, где нет одной главной таблицы, свойство должно быть пустым, но тогда вам придется реализовывать команды создания программно.

Причина 2: Свойство «Источник действий» (ActionSource)

Выясним причину, по которой контекстное меню может ссылаться на старый объект. У элементов управления типа Командная панель и Контекстное меню есть свойство Источник действий. Это свойство связывает кнопки панели с конкретной таблицей на форме.

Если вы скопировали командную панель из другой формы или перетащили таблицу, связь может «залипнуть». Рассмотрим, как это проверить:

  1. Выберите в дереве элементов формы вашу таблицу (список документов).
  2. Откройте её свойства и найдите раздел «Использование».
  3. Проверьте, какая командная панель там указана.
  4. Затем выберите саму Командную панель и проверьте свойство Источник действий. Там должна быть выбрана именно ваша таблица списка.

Важный момент: Если в «Источнике действий» указана старая таблица, которая была удалена или переименована, команды «Создать» и «Скопировать» будут работать по инерции, используя метаданные предыдущего объекта.

Причина 3: Основной реквизит формы

В платформе 1С существует понятие Основной реквизит. Он помечается жирным шрифтом в списке реквизитов формы. Стандартные команды формы (ФормаСоздать, ФормаСкопировать, ФормаИзменить) по умолчанию ориентируются на тип данных основного реквизита.

Если ваша форма была изначально формой справочника Пользователи, и вы просто добавили на неё новый динамический список документов, не назначив его основным, кнопки в командной панели будут продолжать пытаться создать пользователя. Чтобы исправить это, щелкните правой кнопкой мыши на вашем новом реквизите-списке и выберите «Установить как основной реквизит».

Причина 4: Механизмы БСП и программные перехваты

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

Если вы копировали форму целиком, обязательно проверьте модуль формы на наличие строк типа:


ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("ТипОбъекта", "Справочник.Пользователи");
// Или вызовы БСП
СтандартныеПодсистемыСервер.УстановитьПараметрыСписка(ЭтаФорма, ...);

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

Радикальное, но эффективное решение: Пересоздание таблицы

Как показывает практика (и опыт автора темы), иногда внутренние связи XML-описания формы повреждаются настолько, что ручная правка свойств не помогает. Это происходит из-за особенностей кэширования структуры формы в платформе.

Разберем алгоритм «сброса», который помог решить проблему:

  1. Запомните или скопируйте настройки вашего динамического списка (запрос, настройки компоновки).
  2. Полностью удалите таблицу с формы и командную панель, которая ведет себя некорректно.
  3. Удалите реквизит формы, если он был скопирован.
  4. Создайте новый реквизит типа ДинамическийСписок, настройте его «с нуля», указав правильную Основную таблицу.
  5. Перетащите этот реквизит на форму, чтобы платформа автоматически создала таблицу и связанные с ней стандартные команды.

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

Программная альтернатива для полного контроля

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

Алгоритм реализации собственной команды копирования:

  1. Отключите автозаполнение командной панели таблицы.
  2. Создайте команду формы, например, КомандаСкопироватьЗаявку.
  3. В обработчике команды на клиенте напишите следующий код:

&НаКлиенте
Процедура КомандаСкопироватьЗаявку(Команда)
    
    ТекущиеДанные = Элементы.СписокЗаявок.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначениеКопирования", ТекущиеДанные.Ссылка);
    
    ОткрытьФорму("Документ.ЗаявкаУИиС.ФормаОбъекта", ПараметрыФормы);
    
КонецПроцедуры

Этот подход полностью исключает путаницу с объектами, так как вы явно указываете имя формы и передаете ссылку для копирования. Для команды создания код будет аналогичным, но без параметра ЗначениеКопирования.

Подведем итог: Некорректное поведение контекстного меню в 1С чаще всего вызвано тем, что в свойствах Основная таблица динамического списка или Источник действий командной панели остались ссылки на старые объекты метаданных. Самым быстрым способом исправления зачастую является полное пересоздание элемента формы «Таблица», что принудительно обновляет все внутренние связи платформы.

← На главную