|

Подбор и обработка объектов БД системы учета 1С: Эффективные методы работы с данными


Содержание:

  1. Что понимается под объектами БД в программе 1C:Предприятие
  2.  Способы обработки подобранных объектов при работе в системе 1С
  3. Рекомендации по повышению эффективности
  4. Пример комплексной задачи в 1С:Предприятие

Работа с данными – сердцевина любой учетной системы, и 1С:Предприятие не является исключением. Ежедневно пользователи и сама система создают, изменяют и используют тысячи объектов: документы, элементы справочников, записи регистров. Эффективный подбор (поиск, выборка) нужных объектов и их последующая обработка являются ключевыми задачами как для разработчиков, так и для продвинутых пользователей. В этой статье мы рассмотрим основные подходы и инструменты для решения этих задач в среде 1С.

Что понимается под объектами БД в программе 1C:Предприятие

В контексте 1С под объектами базы данных (БД) чаще всего подразумеваются экземпляры прикладных объектов метаданных, такие как:

  • Элементы справочников: (например, СправочникОбъект.Контрагенты, СправочникОбъект.Номенклатура)
  • Документы: (например, ДокументОбъект.РеализацияТоваровУслуг, ДокументОбъект.ПоступлениеНаРасчетныйСчет)
  • Записи регистров сведений: (например, РегистрСведенийЗапись.ЦеныНоменклатуры)
  • Записи регистров накопления: (непосредственно сами записи, а не движения, которые формируются при проведении документов)
  • Планы видов характеристик, планы счетов и другие.

Каждый такой объект имеет уникальную ссылку, набор реквизитов и, возможно, табличных частей. “Подобрать” объекты означает выбрать из всего множества объектов в базе данных те, которые соответствуют определенным критериям. “Обработать” – выполнить над ними какие-либо действия: изменить реквизиты, провести, распечатать, выгрузить и т.д.

Основные методы подбора (выборки) объектов:

1. Запросы (язык запросов 1С):

  • Преимущества:
    • Высокая производительность (особенно при правильной оптимизации).
    • Возможность получения данных из нескольких таблиц одновременно (соединения).
    • Группировка, агрегация (суммы, количества, средние).
    • Гибкие условия отбора (WHERE).
    • Упорядочивание результатов.
    • Возможность получения не только ссылок на объекты, но и сразу значений их реквизитов, что снижает нагрузку на базу (не нужно для каждого объекта делать ПолучитьОбъект()).
  • Пример простого запроса для выборки номенклатуры из определенной группы:

Запрос = Новый Запрос;

Запрос.Текст =

    “ВЫБРАТЬ

    |    Номенклатура.Ссылка,

    |    Номенклатура.Наименование,

    |    Номенклатура.Артикул

    |ИЗ

    |    Справочник.Номенклатура КАК Номенклатура

    |ГДЕ

    |    Номенклатура.Родитель = &НужнаяГруппа // Или Номенклатура.ЭтоГруппа = ЛОЖЬ”;

Запрос.УстановитьПараметр(“НужнаяГруппа”, СсылкаНаНужнуюГруппу);

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

    // Обрабатываем Выборка.Ссылка, Выборка.Наименование, Выборка.Артикул

КонецЦикла;

2. Методы менеджеров объектов (Выбрать()):
Каждый менеджер объекта (например, Справочники.Номенклатура, Документы.РеализацияТоваровУслуг) предоставляет метод Выбрать(), который позволяет перебрать все элементы данного типа.

  • Преимущества:
    • Простота использования для полного перебора.
    • Недостатки:
      • Менее гибок для сложных отборов.
      • Для применения отборов нужно перебирать все элементы и проверять условия программно, что неэффективно на больших объемах.
  • Пример:

ВыборкаЭлементов = Справочники.Номенклатура.Выбрать();

Пока ВыборкаЭлементов.Следующий() Цикл

    ОбъектНоменклатуры = ВыборкаЭлементов.ПолучитьОбъект();

    Если ОбъектНоменклатуры.ПометкаУдаления = Ложь И ОбъектНоменклатуры.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Товар Тогда

        // Обработка объекта

    КонецЕсли;

КонецЦикла;

3. Этот метод стоит использовать только для небольших выборок или когда другие способы неприменимы.

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

5. Методы поиска (НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту()):
Менеджеры справочников предоставляют методы для быстрого поиска элементов по определенным полям.

  • Преимущества:
    • Удобны для поиска одного или нескольких конкретных элементов по известным значениям.
    • Недостатки:
      • Не подходят для массовых выборок со сложными условиями.
    • Пример:

НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту(“ИНН”, “1234567890”);

Если НЕ НайденныйКонтрагент.Пустая() Тогда

    // Контрагент найден, можно обрабатывать

КонецЕсли;   

Способы обработки подобранных объектов при работе в системе 1С

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

1. Получение объекта и изменение его реквизитов:
Для изменения данных объекта необходимо сначала получить его “объектную” форму с помощью метода ПолучитьОбъект(), который вызывается у ссылки.

СсылкаНаОбъект = …; // Получена из запроса или другого метода

ОбъектДляИзменения = СсылкаНаОбъект.ПолучитьОбъект();

Если ОбъектДляИзменения <> Неопределено Тогда

    ОбъектДляИзменения.Комментарий = “обновленный комментарий ” + ТекущаяДата();

    // Изменение других реквизитов

    // Изменение табличных частей

    Попытка

        ОбъектДляИзменения.Записать(); // Сохранение изменений в БД

    Исключение

        Сообщить(“Не удалось записать объект: ” + Строка(СсылкаНаОбъект) + “. ” + ОписаниеОшибки());

    КонецПопытки;

Иначе

    Сообщить(“Не удалось получить объект для изменения: ” + Строка(СсылкаНаОбъект));

КонецЕсли;

Важно: Вызов ПолучитьОбъект() и последующий Записать() для каждого объекта в большом цикле может быть очень ресурсоемким. По возможности, следует избегать этого в пользу пакетных операций или запросов на обновление (если это поддерживается СУБД и не нарушает бизнес-логику).

2. Пакетная обработка объектов (групповая обработка):
Во многих конфигурациях существуют стандартные обработки для группового изменения реквизитов, проведения/отмены проведения документов и т.д. (например, “Групповое изменение реквизитов”, “Групповое перепроведение документов”). Они часто используют оптимизированные алгоритмы.
При разработке собственных обработок также следует стремиться к минимизации обращений к БД. Например, если нужно обновить один и тот же реквизит у множества объектов одинаковым значением, можно рассмотреть варианты без полного перебора с ПолучитьОбъект() и Записать() для каждого (хотя универсальных решений “из коробки” для прямого пакетного обновления реквизитов произвольных объектов без перебора ссылок в 1С немного, кроме специфичных сценариев вроде Запрос.ВыполнитьПакет() для записей регистров).

3. Транзакции:
Если в процессе обработки группы объектов необходимо, чтобы все изменения либо были применены успешно, либо (в случае ошибки на любом из объектов) полностью отменены, следует использовать транзакции.

НачатьТранзакцию();

Попытка

    // Цикл по объектам, их получение, изменение и запись

    Для Каждого СсылкаНаОбъект Из МассивСсылокДляОбработки Цикл

        ОбъектДляИзменения = СсылкаНаОбъект.ПолучитьОбъект();

        // … изменения …

        ОбъектДляИзменения.Записать(РежимЗаписиДокумента.Проведение); // или другой режим

    КонецЦикла;

    ЗафиксироватьТранзакцию();

Исключение

    ОтменитьТранзакцию();

    Сообщить(“Произошла ошибка при обработке объектов. Изменения отменены. ” + ОписаниеОшибки());

КонецПопытки;

    4. Использование обработчиков событий:
При записи объектов (особенно документов) срабатывают различные обработчики событий (ПередЗаписью, ПриЗаписи, ОбработкаПроведения). Если ваша обработка объектов включает в себя изменение и запись, учитывайте логику, заложенную в этих обработчиках.

Рекомендации по повышению эффективности

  • Предпочитайте запросы: Для выборки данных язык запросов 1С – самый эффективный инструмент. Извлекайте только те данные, которые действительно нужны.
  • Избегайте получения объекта (ПолучитьОбъект()) в циклах без крайней необходимости: Если нужно только прочитать данные, получайте их запросом. Если нужно изменить много объектов, ищите способы пакетной обработки или оптимизируйте цикл.
  • Оптимизируйте запросы: Используйте индексы, избегайте соединений с виртуальными таблицами без отборов, правильно используйте временные таблицы.
  • Используйте транзакции осмысленно: Они обеспечивают целостность, но могут блокировать данные на время своего выполнения.
  • Тестируйте на больших объемах: Код, отлично работающий на 100 объектах, может “умереть” на 100 000. Проверяйте производительность на данных, приближенных к реальным.
  • Учитывайте режим работы (клиент/сервер): Основная логика обработки данных должна выполняться на сервере. Передавайте на сервер только необходимые параметры, а результаты – обратно на клиент.
  • Обработка ошибок: Всегда предусматривайте обработку возможных исключений, особенно при операциях записи или проведения.

Пример комплексной задачи в 1С:Предприятие

Предположим, нужно найти все не проведенные документы “РеализацияТоваровУслуг” за прошлый месяц по определенному контрагенту и попытаться их провести.

// Определяем параметры

КонецПрошлогоМесяца = НачалоМесяца(ТекущаяДата()) – 1;

НачалоПрошлогоМесяца = НачалоМесяца(КонецПрошлогоМесяца);

НужныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию(“ООО Ромашка”); // Для примера

Если НужныйКонтрагент.Пустая() Тогда

    Сообщить(“Контрагент не найден!”);

    Возврат;

КонецЕсли;

// 1. Подбор объектов запросом

Запрос = Новый Запрос;

Запрос.Текст =

    “ВЫБРАТЬ

    |    РеализацияТоваровУслуг.Ссылка

    |ИЗ

    |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

    |ГДЕ

    |    РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

    |    И РеализацияТоваровУслуг.Контрагент = &Контрагент

    |    И РеализацияТоваровУслуг.Проведен = ЛОЖЬ”;

Запрос.УстановитьПараметр(“НачалоПериода”, НачалоПрошлогоМесяца);

Запрос.УстановитьПараметр(“КонецПериода”, КонецДня(КонецПрошлогоМесяца));

Запрос.УстановитьПараметр(“Контрагент”, НужныйКонтрагент);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДокументов = РезультатЗапроса.Выбрать();

// 2. Обработка подобранных объектов

Попытка

    НачатьТранзакцию();

    Пока ВыборкаДокументов.Следующий() Цикл

        ДокументСсылка = ВыборкаДокументов.Ссылка;

        ДокументОбъект = ДокументСсылка.ПолучитьОбъект();

        Если ДокументОбъект = Неопределено Тогда

            Сообщить(“Не удалось получить объект документа: ” + Строка(ДокументСсылка));

            Продолжить;

        КонецЕсли;

        // Дополнительные проверки или изменения перед проведением (если нужно)

        // …

        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

        Сообщить(“Документ ” + Строка(ДокументСсылка) + ” успешно проведен.”);

    КонецЦикла;

    ЗафиксироватьТранзакцию();

    Сообщить(“Обработка документов завершена.”);

Исключение

    ОтменитьТранзакцию();

    Сообщить(“Ошибка при обработке документов! Изменения отменены. ” + ОписаниеОшибки());

КонецПопытки;

Умение эффективно подбирать и обрабатывать объекты базы данных – фундаментальный навык для любого, кто работает с 1С:Предприятие на уровне глубже простого ввода данных. Выбор правильного инструмента (чаще всего – языка запросов) и понимание особенностей работы платформы с объектами позволяют создавать производительные, надежные и функциональные решения, способные справляться с большими объемами информации и сложной бизнес-логикой.

Специалист компании ООО “Кодерлайн”,

Радченко Степан


Помогла ли вам статья? Оставьте свой комментарий:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Блог про 1С:Предприятие

Copyright © 2024 TopKoder

Мы занимаемся внедрением и обслуживанием программных продуктов 1С.