При разработке расширений для 1С:Предприятие многие программисты сталкиваются с неприятной особенностью: созданные в расширении справочники или документы не содержат стандартную команду «Вывести список...» в режиме «1С:Предприятие», хотя в конфигураторе она отображается в составе командной панели. Проанализируем причины этой проблемы и разберем несколько способов её решения — от простых настроек метаданных до написания программного кода.
Выясним основную причину: платформа 1С накладывает жесткие ограничения на вывод данных, если в расширении используются собственные роли. Рассмотрим логику работы прав:
Проанализируем право «Вывод» (Output). Оно находится в самом корне дерева метаданных расширения. Если у пользователя (даже с правами Администратора) нет роли из расширения, в которой разрешен «Вывод», стандартная команда будет скрыта платформой. Посмотрим, как это исправить:
ПраваНаОбъектыРасширения).Иногда команда присутствует в меню «Еще», но мы хотим видеть её непосредственно на командной панели или заставить платформу «пересчитать» видимость кнопок. Разберем действия в конфигураторе:
КоманднаяПанель или Список.ВывестиСписок.Рассмотрим интересный нюанс, связанный с назначением расширения. Платформа по-разному инициализирует права для разных типов расширений. Проанализируем последовательность действий, которая помогла многим разработчикам:
Если стандартные механизмы не помогают (например, из-за багов платформы версий 8.3.12 или 8.3.13), мы можем реализовать вывод списка самостоятельно, используя Систему Компоновки Данных (СКД). Это более гибкий метод, так как он позволяет учитывать текущие отборы, оформление и группировки динамического списка. Посмотрим на пример кода:
&НаСервере
Функция СформироватьРеестрНаСервере()
// Получаем схему и настройки непосредственно из динамического списка на форме
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ДокументРезультат;
КонецФункции
&НаКлиенте
Процедура КомандаВывестиРеестр(Команда)
ТабличныйДок = СформироватьРеестрНаСервере();
ТабличныйДок.Показать("Реестр данных");
КонецПроцедуры
Этот метод даже превосходит стандартный «Вывести список», так как полностью сохраняет визуальное состояние списка, настроенное пользователем.
Проанализируем техническую сторону вопроса: проблема часто является «глюком» конкретных релизов платформы (особенно 8.3.13.1513). Выясним, что изменилось в новых версиях:
Подведем итог: в большинстве случаев отсутствие команды ВывестиСписок в расширении связано с тем, что платформа не видит права Вывод в контексте расширения. Создание роли в расширении с включенным правом «Вывод» и назначение её пользователю — это наиболее правильное решение с точки зрения архитектуры 1С. Для анализа взаимосвязей ролей, профилей и групп пользователей при назначении прав можно использовать инструмент для анализа и проверки прав доступа.