v8: Полезные функции поиска/заполнения объектов Ключевые слова: заполнение
Обычно у тех, кто переходит работать с 77 на 80 возникают проблемы с поиском элементов справочников и документов - для этого нужно писать запросы.
Для тех, кто не любит писать запросы в 1С 80, предлагаю использовать функции для поиска и заполнения объектов:
ОбъектНайтиПоРеквизитам(Тип, Вид, Стр, Много=ложь);
Ищет объект по реквизитам, указанным в структуре Стр.
Если Много=истина, возвращается массив найденных элементов, иначе только первый найденный элемент. Поиск осуществляется с помощью запроса.
ОбъектСоздатьПоРеквизитам(Тип, Вид, Стр, СтрЗаписи, Много);
Ищет один объект(ы) по реквизитам, указанным в структуре Стр и заполняет его реквизиты согласно структуре СтрЗаписи.
Удобна в тех случаях, когда если объект существует нам нужно изменить его, а если не существует - создать.
ОбъектЗаполнитьПоРеквизитам(Объект, СтрЗаписи);
Просто заполняет Объект согласно структуре СтрЗаписи.
Стр(_Стр, К1=Неопределено, Зн1=Неопределено ..., К10=Неопределено, Зн10=Неопределено);
Если параметр _Стр - структура значений, то делается ее копия и в нее добавляются значения Зн(I) с ключами К(I).
Если же первый параметр не структура, то просто создается и возвращается структура согласно переданным значениям и ключам.
Это как бы более компактный альтернативный конструктор конструктору 1С 80 Новый Структура.
Примеры:
Объект.НайтиПоРеквизитам("Справочники", "Номенклатура", Стр("Наименование", "Пиво"), истина); - ищет пиво
Объект.НайтиПоРеквизитам("Задачи", "ЗадачаГлавная", Стр("БизнесПроцесс", БиснесПроцесс), истина); - ищет все задачи по данному бизнес-процессу
Объект.СоздатьПоРеквизитам("Справочник", "Номенклатура", Стр("Наименование", "Пиво"), Стр("Код", 12, "Артикул", 177));
Присваивает пиву код 12 и артикул 177.
В качестве дополнительного продвижения можно в структуре поиска и заполнения вводить функции поиска. Т.е. если значением реквизита поиска является структура, это означает что поиск или заполнение нужно делать более специфичным, согласно параметрам этой структуры, например искать на сравнение больше-меньше или устанавливать только те реквизиты, которые не заполнены. Примеры:
Объект.НайтиПоРеквизитам("Справочники", "Номенклатура", Стр("Код", Стр("<", 123)), истина); - возвращает все элементы, код которых меньше 123.
Объект.НайтиПоРеквизитам("Справочники", "Номенклатура", Стр("Код", Стр("Условие", "Элемент.Код<123 И Элемент.Код>10")), истина); - возвращает все элементы, удовлетворяющим условию, написанному на языке запросов.
Объект.ЗаполнитьПоРеквизитам(Товар, Стр("Артикул", Стр("ТолькоПустые", "123-АК"), Стр("Код", Стр("ТолькоПустые", "123"))); - устанавливает товару код 123 и артикул 123-АК только в том случае, если эти реквизиты не заполнены.
У меня в конфигурации эти функции написаны, но еще не выделены в отдельный код. Попробую это сделать и опубликовать здесь. В любом случае использовать такие функции удобнее, чем запросы, но при их выполнении в цикле эффективность меньше, чем у соответствующего запроса, т.к. идет обращение к метаданным и тратится время на конструирование и компиляцию запроса.
Также при написании таких функций нужно обратить внимание на сравнение строк неограниченной длины при поиске. Например, частый случай на практике - поиск по комментарию. В 1С 80 в запросах нельзя сравнивать строки неограниченной длины на равенство, поэтому нужно использовать оператор Выразить. |