Как программно получить список видов документов, входящих в журнал в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Особенности архитектуры журналов в 1С 7.7

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

  1. Обычный журнал: В системе 1С 7.7 документ может принадлежать только одному обычному журналу. Эта связь прописывается в свойствах самого документа. Поэтому в метаданных журнала типа «Обычный» коллекция Состав всегда пуста.
  2. Дополнительный журнал: Создается для того, чтобы одни и те же документы могли отображаться в разных списках. Здесь связь хранится в самом журнале, и только в этом случае свойство Состав будет заполнено списком входящих в него документов.
  3. Общий журнал: Содержит все документы системы. У него также нет заполненного списка Состав, так как его содержимое определяется скорее настройками граф и отборов.

Решение для обычного журнала: метод перебора документов

Рассмотрим ситуацию, когда нам нужно узнать, какие документы входят в журнал типа «Обычный» (например, «СкладскиеДокументы»). Поскольку сам журнал «не знает» о своем составе, нам необходимо перетряхнуть все виды документов в конфигурации и проверить, какой журнал для них назначен.

Посмотрим на пример кода, который решает эту задачу:


// Определим идентификатор интересующего нас журнала
НужныйЖурнал = "СкладскиеДокументы";

// Проходим циклом по всем видам документов в метаданных
Для Номер = 1 По Метаданные.Документ() Цикл
    // Проверяем, какой журнал назначен текущему документу
    Если Метаданные.Документ(Номер).Журнал.Идентификатор = НужныйЖурнал Тогда
        Сообщить("Документ " + Метаданные.Документ(Номер).Идентификатор + " входит в журнал " + НужныйЖурнал);
        // Здесь можно добавить идентификатор в список значений или таблицу
    КонецЕсли;
КонецЦикла;

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

Решение для дополнительного журнала: использование коллекции Состав

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


// Получаем объект метаданных конкретного журнала
МетаЖурнал = Метаданные.Журнал("НазваниеДопЖурнала");

// Проверяем количество элементов в составе
Колво = МетаЖурнал.Состав.Количество();

Если Колво > 0 Тогда
    Для итератор = 1 По Колво Цикл
        // Получаем ссылку на объект метаданных документа из состава
        МетаДок = МетаЖурнал.Состав.Получить(итератор);
        Сообщить("В дополнительный журнал входит: " + МетаДок.Идентификатор);
    КонецЦикла;
Иначе
    Сообщить("Журнал пуст или не является дополнительным!");
КонецЕсли;

Обратите внимание, что метод Получить() в данном контексте возвращает объект метаданных типа Документ, из которого мы можем извлечь Идентификатор, Синоним и другие свойства.

Работа с выборкой документов в журнале

Иногда задача стоит иначе: нужно не просто узнать виды документов, а программно отобрать документы, которые отображаются в конкретном журнале. Для этого в языке 1С 7.7 предусмотрен метод ИспользоватьЖурнал(). Проанализируем ситуацию на примере объекта Документ:


ТекДок = СоздатьОбъект("Документ");
// Устанавливаем фильтр по журналу
ТекДок.ИспользоватьЖурнал("СкладскиеДокументы", 1);
// Теперь ВыбратьДокументы() вернет только те, что входят в этот журнал
ТекДок.ВыбратьДокументы(ДатаНач, ДатаКон);
Пока ТекДок.ПолучитьДокумент() = 1 Цикл
    // Обработка документа
КонецЦикла;

Параметр 1 во втором аргументе метода ИспользоватьЖурнал() критически важен — он указывает системе, что выборка должна быть ограничена именно составом указанного журнала.

Оптимизация производительности

Если в вашей конфигурации сотни видов документов, постоянный перебор метаданных (как в случае с обычным журналом) может замедлять работу интерфейса или обработок. В таких случаях мы рекомендуем один раз при старте системы (в процедуре ПриНачалеРаботыСистемы) сформировать глобальное соответствие «Журнал -> Список видов документов».

Для реализации такого кэширования удобно использовать объект СписокЗначений или ТаблицаЗначений. Это позволит мгновенно получать состав любого обычного журнала без повторного сканирования метаданных всей конфигурации.

Резюме: Чтобы успешно выбрать документы или их виды из журнала в 1С 7.7, всегда сначала определяйте тип журнала в конфигураторе. Для Обычных журналов используйте перебор Метаданные.Документ(i), а для Дополнительных — прямое обращение к Метаданные.Журнал(j).Состав.

← На главную