В процессе работы с конфигурациями 1С, особенно такими крупными, как "Бухгалтерия предприятия 3.0", перед разработчиками и аналитиками часто встает задача получить полный перечень всех существующих печатных форм в привязке к документам. Это может быть необходимо для анализа, документирования системы, настройки прав доступа или для разработки новых механизмов. Вручную открывать каждый документ и смотреть меню "Печать" — долго и неэффективно. Рассмотрим, как решить эту задачу программно.
Основная цель — сформировать таблицу вида "Документ – Печатная форма", которая будет содержать все возможные комбинации для текущей конфигурации.
Современные конфигурации 1С построены на базе Библиотеки стандартных подсистем (БСП), которая предоставляет удобный и унифицированный программный интерфейс для работы с общими механизмами. Одним из таких механизмов является подсистема печати.
Для получения списка команд печати, связанных с определенным объектом метаданных, в БСП есть функция УправлениеПечатью.КомандыПечатиОбъекта(). Алгоритм наших действий будет следующим:
УправлениеПечатью.КомандыПечатиОбъекта().Посмотрим на пример кода, который реализует этот алгоритм.
// Создаем таблицу для сбора всех данных
ВсеПФ = Новый ТаблицаЗначений;
ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");
// Перебираем все документы в метаданных конфигурации
Для Каждого ДокументМетаданные ИЗ Метаданные.Документы Цикл
// Используем Попытку на случай, если для документа нет печатных форм
// или вызов функции завершится ошибкой. Это защитит наш код от аварийного завершения.
Попытка
// Получаем таблицу команд печати для текущего типа документа
ДанныеПФ = УправлениеПечатью.КомандыПечатиОбъекта(ДокументМетаданные);
Исключение
// Если произошла ошибка, просто пропускаем этот документ и переходим к следующему
Продолжить;
КонецПопытки;
// Перебираем полученные команды печати
Для Каждого СтрокаПФ ИЗ ДанныеПФ Цикл
// Добавляем новую строку в нашу итоговую таблицу
НоваяСтрока = ВсеПФ.Добавить();
НоваяСтрока.Документ = ДокументМетаданные.Представление(); // Используем синоним документа для наглядности
НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление; // Представление команды печати (название формы)
КонецЦикла;
КонецЦикла;
// Для вывода результата в 1С можно использовать специальный метод.
// Этот метод откроет отдельное окно с полученной таблицей.
ПоказатьЗначение(, ВсеПФ);
Важное замечание: данный код нужно выполнять на сервере, так как работа с метаданными и вызов функций БСП, как правило, требуют серверного контекста.
Самый простой и правильный способ для выполнения подобных сервисных задач — создать внешнюю обработку. Это позволит запускать код в любой базе на платформе 1С:Предприятие без изменения конфигурации.
Разберем по шагам, как это сделать:
Посмотрим на итоговый код модуля формы внешней обработки:
&НаКлиенте
Процедура Сформировать(Команда)
// Вызываем серверную процедуру для получения данных
ТаблицаРезультат = ПолучитьСписокПечатныхФормНаСервере();
// Отображаем результат пользователю
ПоказатьЗначение(, ТаблицаРезультат);
КонецПроцедуры
&НаСервере
Функция ПолучитьСписокПечатныхФормНаСервере()
ВсеПФ = Новый ТаблицаЗначений;
ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");
Для Каждого ДокументМетаданные ИЗ Метаданные.Документы Цикл
Попытка
ДанныеПФ = УправлениеПечатью.КомандыПечатиОбъекта(ДокументМетаданные);
Исключение
Продолжить;
КонецПопытки;
Для Каждого СтрокаПФ ИЗ ДанныеПФ Цикл
НоваяСтрока = ВсеПФ.Добавить();
НоваяСтрока.Документ = ДокументМетаданные.Представление();
НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление;
КонецЦикла;
КонецЦикла;
Возврат ВсеПФ;
КонецФункции
Сохраните обработку (Файл → Сохранить) в файл с расширением .epf. Теперь вы можете открыть ее в режиме 1С:Предприятие (Файл → Открыть) и запустить формирование списка.
Приведенный выше код отлично справляется с получением встроенных (поставляемых) печатных форм. Однако в реальной работе часто используются внешние печатные формы, которые пользователи подключают самостоятельно через раздел "Администрирование". Чтобы получить действительно полный список, наш алгоритм нужно дополнить.
Для получения внешних печатных форм в БСП есть еще одна полезная функция — УправлениеПечатью.СписокПечатныхФормИзВнешнихИсточников(). Она принимает на вход полное имя объекта метаданных (например, "Документ.РеализацияТоваровУслуг") и возвращает список подключенных для него внешних форм.
Модернизируем наш код, чтобы он собирал информацию из обоих источников.
&НаСервере
Функция ПолучитьПолныйСписокПечатныхФормНаСервере()
ВсеПФ = Новый ТаблицаЗначений;
ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");
ВсеПФ.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка"), "Тип формы");
// Перебираем все документы в метаданных
Для Каждого ДокументМетаданные ИЗ Метаданные.Документы Цикл
// --- Шаг 1: Получаем встроенные печатные формы ---
Попытка
ДанныеВстроенныхПФ = УправлениеПечатью.КомандыПечатиОбъекта(ДокументМетаданные);
Для Каждого СтрокаПФ ИЗ ДанныеВстроенныхПФ Цикл
НоваяСтрока = ВсеПФ.Добавить();
НоваяСтрока.Документ = ДокументМетаданные.Представление();
НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление;
НоваяСтрока.Тип = "Встроенная";
КонецЦикла;
Исключение
// Ошибок быть не должно, но на всякий случай
КонецПопытки;
// --- Шаг 2: Получаем внешние печатные формы ---
Попытка
// Получаем полное имя документа для передачи в функцию
ПолноеИмяДокумента = ДокументМетаданные.ПолноеИмя();
ДанныеВнешнихПФ = УправлениеПечатью.СписокПечатныхФормИзВнешнихИсточников(ПолноеИмяДокумента);
Для Каждого СтрокаПФ ИЗ ДанныеВнешнихПФ Цикл
НоваяСтрока = ВсеПФ.Добавить();
НоваяСтрока.Документ = ДокументМетаданные.Представление();
НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление; // Представление для внешних форм
НоваяСтрока.Тип = "Внешняя";
КонецЦикла;
Исключение
// Обработка возможных ошибок
КонецПопытки;
КонецЦикла;
Возврат ВсеПФ;
КонецФункции
Этот усовершенствованный вариант кода даст вам наиболее полную картину всех печатных форм в системе, разделяя их на встроенные и внешние. Это особенно полезно при аудите системы или при переносе настроек между базами данных.
Таким образом, используя стандартные функции БСП, можно легко и быстро автоматизировать сбор информации о печатных формах, экономя время и избегая ручных ошибок.