При разработке сложных механизмов в 1С 7.7 часто возникает необходимость проанализировать структуру конфигурации программным путем. Одной из таких задач является получение списка документов, которые разрешено вводить на основании конкретного вида документа. В этой статье мы подробно разберем, как работать с коллекциями метаданных, какой синтаксис использовать для обращения к объектам и на какие нюансы стоит обратить внимание.
В системе 1С 7.7 объект Метаданные предоставляет доступ ко всей структуре конфигурации. Если мы обратимся к конкретному документу через Метаданные.Документ(к), то обнаружим специальное свойство ВводимыеНаОснованииДокументы. Рассмотрим ситуацию, когда нам нужно программно сформировать список (например, строку с разделителями), содержащую все виды документов, которые могут быть созданы на базе текущего.
Важно понимать, что свойство ВводимыеНаОснованииДокументы представляет собой коллекцию ссылок на другие объекты метаданных. Простое обращение к этому свойству не вернет строку или массив имен, поэтому нам потребуется цикл для перебора элементов этой коллекции.
Давайте разберем по шагам, как правильно организовать цикл. Для начала выясним общее количество документов, вводимых на основании, с помощью метода Количество(), а затем получим каждый элемент по индексу.
Проанализируем пример кода, который решает эту задачу:
// Перебираем все виды документов в конфигурации
Для к = 1 по Метаданные.Документ() Цикл
ВидДок = Метаданные.Документ(к).Идентификатор;
// Переменная для накопления списка
СписокВводимых = "";
// Получаем коллекцию документов, вводимых на основании текущего
КоллекцияВОД = Метаданные.Документ(к).ВводимыеНаОснованииДокументы;
// Организуем цикл по количеству элементов в коллекции
Для л = 1 По КоллекцияВОД.Количество() Цикл
// Получаем объект метаданных конкретного документа из списка
ОбъектМетаданных = КоллекцияВОД.Получить(л);
// Добавляем полный идентификатор в строку
СписокВводимых = СписокВводимых + ОбъектМетаданных.ПолныйИдентификатор() + ", ";
КонецЦикла;
// Выводим результат (для примера)
Если ПустаяСтрока(СписокВводимых) = 0 Тогда
Сообщить("Для документа " + ВидДок + " разрешен ввод на основании: " + СписокВводимых);
КонецЕсли;
КонецЦикла;
В данном коде мы используем метод ПолныйИдентификатор(), который возвращает строку вида Документ.НазваниеДокумента. Это удобно, если в дальнейшем планируется использовать это значение в функции ОткрытьФорму() или для создания объекта через СоздатьОбъект().
При работе с метаданными часто возникает путаница между двумя похожими коллекциями. Разберем их различия, чтобы правильно строить логику приложения:
Если ваша задача — создать динамическое меню кнопки "Ввести на основании", вам нужно использовать именно ВводимыеНаОснованииДокументы. Если же вы хотите проверить, из каких документов можно создать текущий (например, при программной генерации цепочки), следует обращаться к ОснованиеДляДокументов.
Когда мы получаем конкретный элемент коллекции через метод Получить(л), мы работаем с объектом типа "Метаданные". Рассмотрим подробнее, какие свойства этого объекта могут быть нам полезны:
Идентификатор — возвращает краткое системное имя документа (например, РасходнаяНакладная). Используется для программной логики.ПолныйИдентификатор() — возвращает строку с префиксом типа объекта (например, Документ.РасходнаяНакладная).Представление — возвращает синоним (человекочитаемое название), заданный в Конфигураторе (например, Расходная накладная (опт)). Это свойство идеально подходит для вывода в интерфейс пользователя (в списки выбора или меню).Проанализируем технические нюансы, характерные именно для версии 7.7, которые отличают её от более современных версий платформы:
1. Индексация коллекций. В отличие от 1С 8.x, где коллекции начинаются с 0, в 1С 7.7 индексация коллекций метаданных всегда начинается с 1. Использование нулевого индекса приведет к ошибке выполнения.
2. Декларативность связей. Настройка в метаданных — это лишь разрешение на связь. Сама по себе запись в списке ВводимыеНаОснованииДокументы не гарантирует, что данные будут перенесены автоматически. Для фактической связи в модуле формы создаваемого документа должна быть определена процедура ВводНаОсновании(ДокОснование), в которой прописывается логика заполнения реквизитов и, что немаловажно, установка связи для "Структуры подчиненности" (обычно через запись документа-основания в специальный реквизит).
3. Использование синтакс-помощников. Для работы с методами метаданных программисты часто используют расширенные файлы подсказок (так называемые ALS-файлы). В файле 1cv7.als (или специализированных сборках) можно найти детальное описание всех доступных атрибутов коллекций, что значительно упрощает разработку в условиях отсутствия современного IntelliSense.
Выясним, как применить полученные знания на практике. Часто требуется проверить, можно ли создать один документ на основании другого, прежде чем вызывать форму создания. Это позволяет избежать системных предупреждений и сделать интерфейс более "дружелюбным".
Функция МожноЛиВвестиНаОсновании(ВидОснования, ВидСоздаваемого)
// ВидОснования и ВидСоздаваемого - строки, идентификаторы
Для л = 1 По Метаданные.Документ(ВидОснования).ВводимыеНаОснованииДокументы.Количество() Цикл
Если Метаданные.Документ(ВидОснования).ВводимыеНаОснованииДокументы.Получить(л).Идентификатор = ВидСоздаваемого Тогда
Возврат 1; // Да, можно
КонецЕсли;
КонецЦикла;
Возврат 0; // Нет, связь не настроена
КонецФункции
Таким образом, мы рассмотрели полный цикл работы с документами, вводимыми на основании в 1С 7.7. Мы научились обращаться к коллекции метаданных, правильно использовать индексы и различать направления связей между документами. Эти знания позволяют создавать гибкие и динамичные механизмы в рамках платформы "Предприятие 7.7".