Как получить полный список печатных форм для всех документов в 1С:Бухгалтерия 3.0?

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

В процессе работы с конфигурациями 1С, особенно такими крупными, как "Бухгалтерия предприятия 3.0", перед разработчиками и аналитиками часто встает задача получить полный перечень всех существующих печатных форм в привязке к документам. Это может быть необходимо для анализа, документирования системы, настройки прав доступа или для разработки новых механизмов. Вручную открывать каждый документ и смотреть меню "Печать" — долго и неэффективно. Рассмотрим, как решить эту задачу программно.

Основная цель — сформировать таблицу вида "Документ – Печатная форма", которая будет содержать все возможные комбинации для текущей конфигурации.

Основной способ: используем подсистему "Управление печатью" (БСП)

Современные конфигурации 1С построены на базе Библиотеки стандартных подсистем (БСП), которая предоставляет удобный и унифицированный программный интерфейс для работы с общими механизмами. Одним из таких механизмов является подсистема печати.

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

  1. Создадим пустую таблицу значений для хранения результатов.
  2. Организуем цикл по всем объектам метаданных типа "Документ".
  3. Внутри цикла для каждого типа документа будем вызывать функцию УправлениеПечатью.КомандыПечатиОбъекта().
  4. Результат выполнения этой функции — это таблица со списком доступных печатных форм. Мы переберем ее и добавим данные в нашу итоговую таблицу.

Посмотрим на пример кода, который реализует этот алгоритм.


// Создаем таблицу для сбора всех данных
ВсеПФ = Новый ТаблицаЗначений;
ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");

// Перебираем все документы в метаданных конфигурации
Для Каждого ДокументМетаданные ИЗ Метаданные.Документы Цикл
    
    // Используем Попытку на случай, если для документа нет печатных форм
    // или вызов функции завершится ошибкой. Это защитит наш код от аварийного завершения.
    Попытка
        // Получаем таблицу команд печати для текущего типа документа
        ДанныеПФ = УправлениеПечатью.КомандыПечатиОбъекта(ДокументМетаданные);
    Исключение
        // Если произошла ошибка, просто пропускаем этот документ и переходим к следующему
        Продолжить;
    КонецПопытки;
    
    // Перебираем полученные команды печати
    Для Каждого СтрокаПФ ИЗ ДанныеПФ Цикл
        // Добавляем новую строку в нашу итоговую таблицу
        НоваяСтрока = ВсеПФ.Добавить();
        НоваяСтрока.Документ = ДокументМетаданные.Представление(); // Используем синоним документа для наглядности
        НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление; // Представление команды печати (название формы)
    КонецЦикла;
    
КонецЦикла;

// Для вывода результата в 1С можно использовать специальный метод.
// Этот метод откроет отдельное окно с полученной таблицей.
ПоказатьЗначение(, ВсеПФ);

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

Как выполнить этот код? Создаем внешнюю обработку

Самый простой и правильный способ для выполнения подобных сервисных задач — создать внешнюю обработку. Это позволит запускать код в любой базе на платформе 1С:Предприятие без изменения конфигурации.

Разберем по шагам, как это сделать:

  1. Запустите 1С в режиме "Конфигуратор".
  2. В главном меню выберите Файл → Новый... → Внешняя обработка.
  3. В открывшемся окне введите имя обработки, например, "СписокПечатныхФорм", и нажмите "Готово".
  4. В дереве метаданных обработки нажмите правой кнопкой мыши на "Формы" и выберите "Добавить". Создайте новую форму.
  5. На созданной форме разместите элемент "Кнопка". В свойствах кнопки задайте имя (например, "Сформировать") и заголовок ("Сформировать список ПФ").
  6. В свойствах кнопки найдите событие "Действие" и нажмите на значок лупы, чтобы создать обработчик команды на клиенте и процедуру на сервере.
  7. В модуль формы будет добавлен шаблон процедуры. Наш код нужно разместить в серверной процедуре.

Посмотрим на итоговый код модуля формы внешней обработки:


&НаКлиенте
Процедура Сформировать(Команда)
    // Вызываем серверную процедуру для получения данных
    ТаблицаРезультат = ПолучитьСписокПечатныхФормНаСервере();
    
    // Отображаем результат пользователю
    ПоказатьЗначение(, ТаблицаРезультат);
КонецПроцедуры

&НаСервере
Функция ПолучитьСписокПечатныхФормНаСервере()
    
    ВсеПФ = Новый ТаблицаЗначений;
    ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
    ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");

    Для Каждого ДокументМетаданные ИЗ Метаданные.Документы Цикл
        Попытка
            ДанныеПФ = УправлениеПечатью.КомандыПечатиОбъекта(ДокументМетаданные);
        Исключение
            Продолжить;
        КонецПопытки;
        
        Для Каждого СтрокаПФ ИЗ ДанныеПФ Цикл
            НоваяСтрока = ВсеПФ.Добавить();
            НоваяСтрока.Документ = ДокументМетаданные.Представление();
            НоваяСтрока.ПечатнаяФорма = СтрокаПФ.Представление;
        КонецЦикла;
    КонецЦикла;
    
    Возврат ВсеПФ;

КонецФункции

Сохраните обработку (Файл → Сохранить) в файл с расширением .epf. Теперь вы можете открыть ее в режиме 1С:Предприятие (Файл → Открыть) и запустить формирование списка.

Расширенная версия: учитываем внешние печатные формы

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

Для получения внешних печатных форм в БСП есть еще одна полезная функция — УправлениеПечатью.СписокПечатныхФормИзВнешнихИсточников(). Она принимает на вход полное имя объекта метаданных (например, "Документ.РеализацияТоваровУслуг") и возвращает список подключенных для него внешних форм.

Модернизируем наш код, чтобы он собирал информацию из обоих источников.


&НаСервере
Функция ПолучитьПолныйСписокПечатныхФормНаСервере()
    
    ВсеПФ = Новый ТаблицаЗначений;
    ВсеПФ.Колонки.Добавить("Документ", Новый ОписаниеТипов("Строка"), "Документ");
    ВсеПФ.Колонки.Добавить("ПечатнаяФорма", Новый ОписаниеТипов("Строка"), "Печатная форма");
    ВсеПФ.Колонки.Добавить("Тип", Новый ОписаниеТипов("Строка"), "Тип формы");

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

КонецФункции

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

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

← На главную