При разработке на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с задачей определения состава журнала. Казалось бы, достаточно обратиться к свойству Состав объекта метаданных Журнал, но на практике этот метод часто возвращает пустоту или ошибку. Разберем детально, почему это происходит и как правильно получить список документов для каждого типа журнала.
Для начала проанализируем, как устроена связь документов и журналов в семерке. В отличие от более современных версий платформы, здесь существует жесткое разделение на типы журналов, и логика хранения метаданных для них принципиально отличается. Выясним причину, по которой стандартное обращение к составу может не работать:
Состав всегда пуста.Состав будет заполнено списком входящих в него документов.Состав, так как его содержимое определяется скорее настройками граф и отборов.Рассмотрим ситуацию, когда нам нужно узнать, какие документы входят в журнал типа «Обычный» (например, «СкладскиеДокументы»). Поскольку сам журнал «не знает» о своем составе, нам необходимо перетряхнуть все виды документов в конфигурации и проверить, какой журнал для них назначен.
Посмотрим на пример кода, который решает эту задачу:
// Определим идентификатор интересующего нас журнала
НужныйЖурнал = "СкладскиеДокументы";
// Проходим циклом по всем видам документов в метаданных
Для Номер = 1 По Метаданные.Документ() Цикл
// Проверяем, какой журнал назначен текущему документу
Если Метаданные.Документ(Номер).Журнал.Идентификатор = НужныйЖурнал Тогда
Сообщить("Документ " + Метаданные.Документ(Номер).Идентификатор + " входит в журнал " + НужныйЖурнал);
// Здесь можно добавить идентификатор в список значений или таблицу
КонецЕсли;
КонецЦикла;
Важный нюанс: при проверке свойства Журнал.Идентификатор следует быть осторожным. Если у документа не выбран никакой журнал (он относится к общему), обращение к идентификатору может потребовать дополнительной проверки на существование объекта журнала.
Если же мы работаем с дополнительным журналом, ситуация упрощается. Здесь платформа предоставляет прямой доступ к списку документов через свойство Состав. Разберем по шагам, как правильно извлечь эти данные:
// Получаем объект метаданных конкретного журнала
МетаЖурнал = Метаданные.Журнал("НазваниеДопЖурнала");
// Проверяем количество элементов в составе
Колво = МетаЖурнал.Состав.Количество();
Если Колво > 0 Тогда
Для итератор = 1 По Колво Цикл
// Получаем ссылку на объект метаданных документа из состава
МетаДок = МетаЖурнал.Состав.Получить(итератор);
Сообщить("В дополнительный журнал входит: " + МетаДок.Идентификатор);
КонецЦикла;
Иначе
Сообщить("Журнал пуст или не является дополнительным!");
КонецЕсли;
Обратите внимание, что метод Получить() в данном контексте возвращает объект метаданных типа Документ, из которого мы можем извлечь Идентификатор, Синоним и другие свойства.
Иногда задача стоит иначе: нужно не просто узнать виды документов, а программно отобрать документы, которые отображаются в конкретном журнале. Для этого в языке 1С 7.7 предусмотрен метод ИспользоватьЖурнал(). Проанализируем ситуацию на примере объекта Документ:
ТекДок = СоздатьОбъект("Документ");
// Устанавливаем фильтр по журналу
ТекДок.ИспользоватьЖурнал("СкладскиеДокументы", 1);
// Теперь ВыбратьДокументы() вернет только те, что входят в этот журнал
ТекДок.ВыбратьДокументы(ДатаНач, ДатаКон);
Пока ТекДок.ПолучитьДокумент() = 1 Цикл
// Обработка документа
КонецЦикла;
Параметр 1 во втором аргументе метода ИспользоватьЖурнал() критически важен — он указывает системе, что выборка должна быть ограничена именно составом указанного журнала.
Если в вашей конфигурации сотни видов документов, постоянный перебор метаданных (как в случае с обычным журналом) может замедлять работу интерфейса или обработок. В таких случаях мы рекомендуем один раз при старте системы (в процедуре ПриНачалеРаботыСистемы) сформировать глобальное соответствие «Журнал -> Список видов документов».
Для реализации такого кэширования удобно использовать объект СписокЗначений или ТаблицаЗначений. Это позволит мгновенно получать состав любого обычного журнала без повторного сканирования метаданных всей конфигурации.
Резюме: Чтобы успешно выбрать документы или их виды из журнала в 1С 7.7, всегда сначала определяйте тип журнала в конфигураторе. Для Обычных журналов используйте перебор Метаданные.Документ(i), а для Дополнительных — прямое обращение к Метаданные.Журнал(j).Состав.