TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • flag Russian
    Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Е.БУДНИ программиста 1С | Роман Чумадин

29 Jan, 17:09

Открыть в Telegram Поделиться Пожаловаться

РУБРИКА «ЧёПоСтандартам»
Оптимизация использования оперативной памяти

Неоднократно попадались вопросы на собеседованиях типа "что тут не так в коде" и там какой-нибудь запрос с "Запрос.Выполнить().Выгрузить()" к какому-нибудь огромному справочнику. И вот тут есть засада, так как первым делом хочется сказать, что нужно делать через выборку, а не тут-то было... Согласно стандартам и тот и тот вариант будут не корректными.
#std725
2. При потенциально неограниченных выборках данных из ИБ следует получать данные из базы порциями фиксированного размера.
Например, неправильно:
...
Номенклатура = Запрос.Выполнить().Выгрузить();
Для каждого ПозицияНоменклатуры Из Номенклатура Цикл
...
Также неправильно:
....
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
...
РезультатЗапроса = Запрос.Выполнить();
// Обход результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
....
Второй вариант близок к истине, но без искусственного ограничения на "ВЫБРАТЬ ПЕРВЫЕ 1000" это не имеет смысла.
#std725

Правильно ограничивать результат запроса искусственно:

ВсеОбработано = Ложь;
Пока Истина Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1000
| Номенклатура.Ссылка,
....

// Обход порции результата запроса
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Обработка элемента выборки
// ...
КонецЦикла;

КонецЦикла;
Если сделать первыми двумя неправильными вариантами, то это приведет к тормозам из-за нехватки памяти, а возможно и к полному зависанию системы. А в корректном варианте данные будут выбираться порционно.

Также есть ещё один правильный вариант с отбором выборки: "Выборка = Справочники.Номенклатура.Выбрать(..., Отбор);"

P.S. Полное описание стандарта по ссылке в начале поста
#ЧёПоСтандартам #std725

4.3k 1 28 31 47
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot