Проверь свои навыки: новая подборка заданий по 1С для профессионалов
Подборки заданий для самопроверки стали трендом: сообщество 1С всё чаще публикует тесты, которые должны выявить «серые зоны» даже у опытных разработчиков. Но стандартное решение редко бывает единственно верным. Мы разобрали одну из типовых задач — и обнаружили ловушку, которая «съедает» производительность незаметно для автора кода.
Контекст и ситуация
Новая подборка заданий на Infostart (оригинал) обещает проверить навыки профессионалов. Формат привычен: даётся фрагмент кода или описание бизнес-логики, требуется найти ошибку или предложить оптимальное решение. Однако за 5 минут в справке 1С или на первой странице Яндекса вы найдёте лишь синтаксис и общие примеры. Реальная ценность заданий — в нюансах, которые становятся видны только при глубоком понимании платформы.
Мы взяли за основу одно из заданий, связанное с пакетной обработкой HTTP-запросов и записью результатов в JSON. На первый взгляд всё тривиально: HTTPСоединение, ЗаписьJSON, цикл. Но ровно в этом месте кроется проблема, которую годы опыта не всегда помогают заметить.
Технический разбор: когда «просто» — не значит «правильно»
Предположим, задание: получить список товаров с внешнего сервиса (массив объектов JSON) и сохранить каждый товар как отдельную запись регистра сведений. Типичное решение (псевдокод):
Товары = ПолучитьСписокТоваровСервис(); // HTTPСоединение.Получить -> ЧтениеJSON
Для Каждого Элемент Из Товары Цикл
Запись = РегистрыСведений.ТоварыВнешние.СоздатьМенеджерЗаписи();
Запись.Артикул = Элемент.Артикул;
Запись.Наименование = Элемент.Наименование;
Запись.Цена = Элемент.Цена;
Запись.Записать();
КонецЦикла;
Код рабочий, но он выполняет N отдельных вставок в транзакции. Если у регламентного задания нет явной транзакции (или она открыта на весь цикл), каждая Записать() фиксирует свою мини‑транзакцию в СУБД. При 1000+ записях мы получим 1000 транзакций, каждая из которых — обращение к диску, блокировки и ожидания.
Важно: Платформа 1С не кэширует запросы записи в регистры сведений. Каждое
Записать()— немедленный сеанс взаимодействия с базой данных. Если вы не управляете транзакцией явно, платформа создаёт неявную транзакцию на каждую запись, что катастрофически снижает пропускную способность.
Опытный специалист ответит: «Нужно открыть свою транзакцию и выполнить все записи внутри неё». Однако есть второй, менее очевидный момент.
Сравнение подходов: потоковая запись JSON vs объектная структура
Задание также предлагает записать результат обработки в JSON‑файл («для отладки»). Многие делают так:
Результат = Новый Массив;
Для Каждого Элемент Из Товары Цикл
// ... обработка
Результат.Добавить(Элемент);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Результат);
ЗаписьJSON.Закрыть();
Проблема: создание полного массива Результат в памяти. При большом количестве товаров (например, 50 000+) это может привести к Недостаточно памяти на 32‑битном клиенте или к падению производительности из‑за сборки мусора. Альтернатива — потоковая запись с помощью ЗаписатьНачалоМассива, ЗаписатьНачалоОбъекта и ЗаписатьКонецОбъекта:
ЗаписьJSON.ЗаписатьНачалоМассива();
Для Каждого Элемент Из Товары Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Артикул");
ЗаписьJSON.ЗаписатьЗначение(Элемент.Артикул);
// ... остальные поля
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.Закрыть();
Условия применимости:
- Если данные уже есть в коллекции, проще
ЗаписатьJSON(короче, читаемее). - Если данные генерируются «на лету» или их объём заранее не известен — потоковый метод спасает память.
Практическое руководство: что делать прямо сейчас
Возьмите любое задание из подборки и проверьте его на предмет скрытой транзакционной нагрузки. Для этого включите в конфигурации «Замер производительности» (Параметры → Инструменты разработки) и посмотрите количество сеансов записи.
Чек-лист для самопроверки
- Явное управление транзакцией: если в задании есть массовая запись в регистры, документы или справочники — оберните цикл в
НачатьТранзакцию()/ЗафиксироватьТранзакцию(). Но не забывайте про блокировки (размер транзакции). - Потоковое чтение/запись JSON/XML: избегайте построения большого массива или структуры только для того, чтобы потом сериализовать. Используйте
ЗаписатьНачалоМассиваи цикл. - HTTP‑запросы: проверьте, не забыли ли установить
Таймаути не переиспользуете лиHTTPСоединениебез освобождения (методЗакрыть()? — уHTTPСоединениенет методаЗакрыть(), оно освобождается при сборке мусора, но лучше обнулить переменную). - Обработка ошибок: обязательно
Попытка…Исключениес сохранениемИнформацияОбОшибке(). Одна ошибка в HTTP‑вызове не должна останавливать весь пакет.
Типичные ошибки
- Запись внутри открытой транзакции без фиксации до нового вызова HTTP — при повторном
Получитьв той же транзакции может произойти взаимоблокировка с внешним сервисом (если сервис тоже обращается к 1С). - Игнорирование кодировки при
УстановитьТелоИзСтроки— по умолчанию UTF‑8, но если внешний API требуетwindows-1251— получите кракозябры. - Повторное использование
ЗаписьJSONбез вызоваЗакрыть()— файл остаётся заблокированным до освобождения ресурса.
Опыт 15 лет: Самая дорогая ошибка — когда массовая обработка занимает 10 минут вместо 2 секунд из‑за того, что автор не обернул 500 записей в одну транзакцию. В регламентных заданиях это может вызвать тайм-аут блокировки и падение фонового задания.
Что в итоге?
Новая подборка заданий — отличный повод пересмотреть свои привычки. Но не останавливайтесь на «зелёном» ответе: копайте глубже, смотрите на производительность, на управление памятью, на граничные условия. Именно эти детали отличают инженера, который сделал «работает», от профессионала, делающего «быстро и масштабируемо». Пройдите задания, а потом перепишите свои решения с учётом описанных ловушек — и вы точно получите новые инсайты, которых нет ни в справке, ни в первой строке Яндекса.
Попробовать НОПик →
Проверить свой уровень бесплатно →