При поиске работы программисты 1С часто сталкиваются с тестовыми заданиями, которые кажутся простыми на первый взгляд. Однако дьявол кроется в деталях: современная разработка на платформе 1С:Предприятие 8.3 требует соблюдения жестких стандартов качества кода, оптимизации запросов и использования механизмов Библиотеки стандартных подсистем (БСП). Рассмотрим ситуацию, когда рабочая внешняя обработка получила отрицательный отзыв, и разберем по шагам, какие именно технические и методологические ошибки совершил автор.
Одной из главных претензий к коду автора стала «проблема с оптимизацией в запросе». Проанализируем исходный текст запроса. Мы видим, что автор использует временные таблицы (ВТ), что само по себе является хорошей практикой, но допускает ряд критических промахов.
Во-первых, индексация временных таблиц. В коде полностью отсутствует инструкция ИНДЕКСИРОВАТЬ ПО. Когда мы создаем временную таблицу, которая в дальнейшем будет участвовать в соединении (например, ВТ_КлючиАналитикиУчетаНоменклатуры или ВТ_КлючиАналитикиУчетаПоПартнерам), СУБД должна быстро находить соответствующие записи. Без индексов на больших объемах данных время выполнения запроса растет экспоненциально. Всегда индексируйте поля, по которым планируется СОЕДИНЕНИЕ.
Во-вторых, работа с виртуальными таблицами. В коде мы видим соединение виртуальной таблицы оборотов с временными таблицами:
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, , ) КАК ВыручкаИСебестоимостьПродажОбороты
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КлючиАналитикиУчетаПоПартнерам КАК ВТ_КлючиАналитикиУчетаПоПартнерам
| ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаПоПартнерам = ВТ_КлючиАналитикиУчетаПоПартнерам.Ссылка
Это классическая ошибка. Согласно стандартам 1С, условия отбора должны передаваться в параметры виртуальной таблицы, а не накладываться через СОЕДИНЕНИЕ или ГДЕ. Если мы уже получили массив ключей аналитики, их нужно передать в третий параметр таблицы Обороты. Это позволит платформе построить максимально эффективный SQL-запрос, который отсечет лишние данные еще на этапе обращения к таблицам итогов.
В-третьих, использование конструкции В ИЕРАРХИИ. Для справочника Номенклатура, который может содержать сотни тысяч записей, такой отбор крайне тяжел для СУБД. В реальных задачах рекомендуется сначала программно получить список всех ссылок внутри группы и передать их в запрос как массив через оператор В.
Рассмотрим ситуацию с фильтром И НЕ Номенклатура.ПометкаУдаления. На первый взгляд, это кажется логичным — не показывать удаленные объекты. Однако в отчетах по продажам это грубая ошибка. Если товар был успешно продан полгода назад, а сегодня менеджер пометил его на удаление (например, товар снят с производства), то отчет за прошлый период не покажет эти продажи. В управленческом учете данные об оборотах должны быть достоверными независимо от текущего состояния объекта в справочнике.
Также проанализируем способ получения юридического адреса. Автор использует соединение с табличной частью КонтактнаяИнформация и выбирает МАКСИМУМ(НомерСтроки). Это крайне ненадежный метод:
УправлениеКонтактнойИнформацией. Прямое обращение к табличным частям справочников для получения КИ считается «устаревшим стилем» и нарушает принцип инкапсуляции данных в БСП.ДействуетС). Использование номера строки для определения актуальности — верный способ получить неверный адрес в базе с богатой историей изменений.Использование объекта ПостроительОтчета в управляемых формах — это анахронизм. Этот объект пришел из эпохи 1С 8.1 и обычных форм. В современных условиях (УТ 11, ERP, КА 1.1) стандартом является Система компоновки данных (СКД). Даже для самой простой таблицы ожидается использование СКД по следующим причинам:
Работодатель справедливо заметил отсутствие БСП при выводе. Для внешней обработки это означает два момента:
СведенияОВнешнейОбработке() в модуле объекта, чтобы обработку можно было подключить через справочник «Дополнительные отчеты и обработки».ТабличногоДокумента вручную или через Построитель, рекомендуется использовать подсистему «Печать». Это включает создание макета печатной формы, описание команды печати и использование менеджера печати. Такой подход позволяет администратору системы редактировать макет прямо в пользовательском режиме, не привлекая программиста.Рассмотрим пример того, как должен выглядеть фрагмент кода для формирования ТЗ с учетом индексации (правильный подход):
// Создаем ВТ с индексацией для последующего соединения
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ Ссылка ПОМЕСТИТЬ ВТ_Номенклатура ИЗ Справочник.Номенклатура
|ГДЕ Ссылка В (&МассивСсылок) ИНДЕКСИРОВАТЬ ПО Ссылка";
Запрос.УстановитьПараметр("МассивСсылок", ПолучитьМассивСсылокИерархично(ОтборНоменклатуры));
Запрос.Выполнить();
Разгромный отзыв часто является следствием не того, что программа «не работает», а того, что она написана без учета современных требований к производительности и масштабируемости. В больших системах (ERP, УТ 11) каждый неоптимальный запрос или отказ от стандартных механизмов БСП ведет к деградации производительности всей базы. Чтобы успешно проходить подобные тесты, мы рекомендуем:
Помните, что тестовое задание — это не просто проверка на умение «написать код, который выдает результат», а демонстрация вашего знакомства с актуальной культурой разработки в экосистеме 1С.