Почему не редактируется динамический список в расширении 1С и как это исправить

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

При разработке расширений часто возникает задача создать отдельное рабочее место или журнал, где должны отображаться документы разных типов. Казалось бы, достаточно создать обработку, добавить на форму ДинамическийСписок с произвольным запросом, использующим оператор ОБЪЕДИНИТЬ (UNION), и задача решена. Однако на практике разработчики сталкиваются с неприятной особенностью: документы в таком списке отображаются, но их невозможно открыть двойным кликом, а кнопки «Создать», «Изменить» и «Удалить» просто отсутствуют или неактивны. В этой статье мы подробно разберем, почему так происходит, и рассмотрим несколько способов решения проблемы.

Разбираем причину: магия свойства Основная таблица

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

  1. Генерирует стандартные команды (создание, копирование, изменение, пометка на удаление).
  2. Определяет права доступа текущего пользователя к объекту.
  3. Обеспечивает стандартную обработку события выбора (открытие формы документа или элемента справочника).

Проблема заключается в том, что когда мы пишем сложный запрос, объединяющий несколько таблиц через ОБЪЕДИНИТЬ, поле Основная таблица в настройках списка становится недоступным или очищается. Платформа не может однозначно определить, к какой таблице относятся действия пользователя, если в одной строке списка может быть «Реализация товаров», а в другой — «Поступление товаров». В результате список переходит в режим «Только просмотр».

Решение 1: Программная обработка открытия и команд

Если нам необходимо оставить текущую структуру запроса с объединением, мы можем «оживить» список вручную. Рассмотрим, как программно реализовать открытие документов и добавление команд редактирования.

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


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

Во-вторых, для реализации кнопок «Изменить» или «Создать» нам придется создать собственные команды формы. Рассмотрим пример команды для редактирования:


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

Этот путь быстрый, но он требует ручного дублирования всей стандартной логики (права доступа, обработка удаления и т.д.).

Решение 2: Создание Журнала документов в расширении

Многие разработчики ошибочно полагают, что в расширении нельзя создавать новые Журналы документов. Однако в современных версиях платформы (начиная с 8.3.11) это возможно. Если ваша цель — объединить несколько типов документов в один список с сохранением всей стандартной функциональности, создание журнала является наиболее правильным подходом.

Разберем последовательность действий:

  1. Проверьте Режим совместимости вашего расширения и основной конфигурации. Для создания новых объектов он должен быть не ниже 8.3.11.
  2. Добавьте в расширение новый объект Журнал документов.
  3. Заимствуйте в расширение те документы из основной конфигурации, которые вы хотите включить в журнал.
  4. В свойствах журнала на вкладке «Данные» укажите состав документов.

Преимущество: Платформа сама создаст динамический список с заполненной основной таблицей (вашим журналом), и все стандартные кнопки будут работать «из коробки».

Решение 3: Архитектурный подход «Реестр документов»

Проанализируем опыт типовых конфигураций, таких как 1С:Управление торговлей 11 или 1С:ERP. В них для подобных целей часто используется специальный вспомогательный Регистр сведений (например, «Реестр документов»).

Суть метода заключается в следующем:

Этот метод считается самым производительным. Посмотрим на пример настройки такого списка:


ВЫБРАТЬ
    Реестр.Ссылка,
    Реестр.Дата,
    Реестр.Номер,
    Реестр.Контрагент,
    Реестр.СуммаДокумента
ИЗ
    РегистрСведений.РеестрДокументов КАК Реестр

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

Особенности прав доступа в расширениях

Выясним еще одну важную причину, по которой кнопки могут быть недоступны. Даже если вы указали основную таблицу, команды редактирования не появятся, если в самом расширении не добавлены соответствующие Роли. Помните: права в основной базе и права в расширении суммируются. Если вы создали новую форму или динамический список внутри расширения, убедитесь, что в расширении есть роль, дающая права на чтение и изменение задействованных объектов, и эта роль назначена пользователю.

Важный нюанс: Если вы используете произвольный запрос, обязательно убедитесь, что в расширение заимствованы все объекты, участвующие в запросе (документы, справочники, перечисления), иначе запрос просто не скомпилируется в контексте расширения.

Резюме

Подведем итоги нашего анализа. Если вы столкнулись с невозможностью редактирования в динамическом списке расширения:

  1. Проверьте наличие Основной таблицы. Если ее нет из-за UNION, выберите другой путь.
  2. Для простых задач используйте программную обработку события Выбор и ПоказатьЗначение().
  3. Для серьезных интерфейсных решений используйте Журнал документов (если позволяет режим совместимости).
  4. Для высоконагруженных систем с большим количеством типов документов внедряйте механизм Реестра документов через регистр сведений.

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

← На главную