Inkognito писав: ↑15 грудня 2021, 16:59
Споідівався, що вже створили недокументований метод
Увы.
Я так понимаю подразумевается, что люди, которые используют СОМ для заполнения по полям отдельно, обычно знают, что им нужно заполнять, а что не нужно. Соответственно +- догадываются, есть там такое-то поле или его и не может быть.
Если часто возникает ситуация, когда неизвестно есть ли искомое поле или нет - вместо ожидания, пока сделают какой-то новый метод, можно, к примеру, взять топорный способ с Попыткой:
- TryGetValue | Показать
Код: Виділити все
Function TryGetValue(dataSet, field)
Try
Return dataSet.FldVal(field);
Except
Message("Поле " + field + " не существует в шаблоне.");
EndTry;
Return Undefined;
EndFunction
Или усложнённый вариант с неким Кэшем шаблонов. Кэш шаблонов в данном случае некая Структура, где Ключ - это чаркод шаблона, а значение - XML-представление шаблона, полученное методом GetTemplate.
Идея в том, что перед началом работы с каким-то документом в M.E.Doc через СОМ, мы проверяем наличие структуры шаблона в этом Кэше и либо получаем эту структуру из Кэша (в виде XML-строки) либо получаем её через GetTemplate и сохраняем её Структуру (КэшШаблонов), если по ключу (ЧарКоду) ранее в кэше такого шаблона небыло.
- | Показать
Код: Виділити все
Перем КэшШаблонов;
Процедура ПриОткрытии()
КэшШаблонов = Новый Структура();
// ...
КонецПроцедуры
Процедура ЧтотоТамДелаемСДокументом(...)
// ...
структураШаблона = "";
Если НЕ КэшШаблонов.Свойство(КакойтоЧарКод, структураШаблона) Тогда
структураШаблона = СокрЛП(App.GetPrimaryDocs().GetTemplate(7, КакойтоЧарКод));
КэшШаблонов.Вставить(КакойтоЧарКод, структураШаблона);
КонецЕсли;
// ...
документ = ...OpenDocumentByCode(...).
датаСет = документ.DataSets("MAIN");
датаДокумента = TryGetValue(структураШаблона, датаСет, "DocDate")
КонецПроцедуры
Ну а далее просто обычным Найти ищем в XML-строке поле:
- TryGetValue | Показать
Код: Виділити все
Function TryGetValue(template, dataSet, field)
If Find(template, "field name=""" + Upper(field) + """") > 0 Then
Return dataSet.FldVal(field);
EndIf;
Message("Поле " + Field + " не существует в шаблоне.");
Return Undefined;
EndFunction
И в обратную сторону, если нужно проверить наличие поля перед заполнением:
- TrySetValue | Показать
Код: Виділити все
Function TrySetValue(template, dataSet, field, value)
If Find(template, field) > 0 Then
dataSet.Fields.Item(field).Value = value;
Else
Message("Поле " + field + " не существует в шаблоне");
EndIf;
EndFunction
Таким образом, через XML-структуру шаблона можно не только наличие поля проверять, но и, например, его тип (из аттрибута type).