Содержание:
- Что понимается под объектами БД в программе 1C:Предприятие
- Способы обработки подобранных объектов при работе в системе 1С
- Рекомендации по повышению эффективности
- Пример комплексной задачи в 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С:Предприятие на уровне глубже простого ввода данных. Выбор правильного инструмента (чаще всего – языка запросов) и понимание особенностей работы платформы с объектами позволяют создавать производительные, надежные и функциональные решения, способные справляться с большими объемами информации и сложной бизнес-логикой.
Специалист компании ООО “Кодерлайн”,
Радченко Степан
Добавить комментарий