Вопросы для собеседования программиста 1С
Готовый набор для интервьюера: 35 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании программиста 1С хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 111 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 11 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Объясните, почему в управляемом приложении код делится на клиентский и серверный.
Что хотим услышать
- Тонкий и веб-клиент не имеют доступа к базе, только к данным формы
- Работа с базой, запросы и объекты только на сервере
- Каждый серверный вызов это сетевой обмен, их минимизируют
- Директивы задают контекст исполнения
- Без контекста быстрее: не передаются данные формы
Если ответил, копните глубже
Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.
Что хотим услышать
- WHERE фильтрует строки до группировки, HAVING фильтрует группы после
- В WHERE нельзя агрегаты, в HAVING можно
- Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT
- Условия без агрегатов лучше писать в WHERE: меньше строк до группировки
- Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Объясните, почему код с обращениями через точку в цикле работает медленно и как его переписать.
Что хотим услышать
- Каждое обращение к реквизиту ссылки читает объект целиком
- В цикле это тысячи отдельных обращений к базе
- Переписать одним запросом со всеми нужными полями
- Для одиночных случаев функции БСП ЗначениеРеквизитаОбъекта
- Сначала замерить, чтобы убедиться, что проблема здесь
Если ответил, копните глубже
Расскажи, какие бывают JOIN и как каждый влияет на число строк в результате.
Что хотим услышать
- INNER: только пары, где условие ON истинно
- LEFT/RIGHT: все строки одной стороны, у недостающей стороны NULL
- FULL: все строки обеих сторон
- CROSS: декартово произведение, N × M строк
- Связь один ко многим размножает строки «одной» стороны, два таких JOIN перемножают
- Строки с NULL в ключе не соединяются: NULL = NULL не true
Если ответил, копните глубже
Какие у вас слабые стороны?
Что хотим услышать
- Назвал реальную слабость, а не штамп
- Слабость не критична для роли
- Рассказал, что делает, чтобы её компенсировать
- Есть пример прогресса
- Коротко, без самобичевания
Если ответил, копните глубже
Объясните разницу между справочником, документом и регистром на примере складского учёта.
Что хотим услышать
- Справочник хранит условно-постоянную информацию: товары, склады, контрагенты
- Документ фиксирует хозяйственное событие с датой: приход, продажа
- Регистр хранит данные в разрезе измерений для быстрого получения итогов
- Документ при проведении делает движения по регистрам
- Отчёты строятся по регистрам, а не по документам
Если ответил, копните глубже
Объясни проблему N+1: как она возникает, как её заметить и как исправить.
Что хотим услышать
- Один запрос за списком и по запросу на каждый элемент за связанными данными
- Типично возникает из-за ленивой загрузки в ORM в цикле
- Заметить: число запросов растёт с размером списка, логи SQL, APM, счётчик запросов в тестах
- Исправить: JOIN, запрос по списку id (IN или ANY), eager loading, DataLoader в GraphQL
- Следить, чтобы JOIN не размножил строки и не тянул лишнее
Если ответил, копните глубже
Как вы выбираете между регистром сведений и регистром накопления?
Что хотим услышать
- Суммируются ли значения: остатки и обороты в регистре накопления
- Нужна ли история на даты: периодический регистр сведений
- Кто пишет: документ при проведении или пользователь и код напрямую
- Подчинение регистратору или независимый режим
- Примеры: цены и курсы против товаров и денег
Если ответил, копните глубже
Объясни, что такое NULL в SQL и какие ловушки с ним связаны.
Что хотим услышать
- NULL означает «значение неизвестно», а не ноль и не пустую строку
- Сравнение с NULL через = или <> даёт unknown, WHERE такие строки отбрасывает; проверка через IS NULL
- NOT IN со списком или подзапросом, где есть NULL, возвращает пустой результат
- Агрегаты кроме COUNT(*) игнорируют NULL, SUM на пустом наборе даёт NULL
- COALESCE подставляет значение по умолчанию, IS DISTINCT FROM сравнивает с учётом NULL
Если ответил, копните глубже
WHERE city <> 'Москва' теряет строки?Как агрегатные функции обрабатывают NULL? Какие ошибки из-за этого бывают в отчётах?
Что хотим услышать
- Все агрегаты, кроме COUNT(*), пропускают NULL
- AVG делит на число непустых значений, а не на число строк
- SUM, AVG, MIN, MAX на пустом наборе дают NULL, COUNT даёт 0
- COUNT(*) после LEFT JOIN считает строку с NULL, нужен COUNT(правая.id)
- COALESCE для подстановки нуля там, где этого требует смысл
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Как вы дорабатываете типовую конфигурацию, чтобы её можно было обновлять?
Что хотим услышать
- По возможности без изменения основной конфигурации: расширения, внешние отчёты и обработки
- В расширении минимум заимствований и правок типового кода
- &ИзменениеИКонтроль для правок внутри методов, &После и &Перед где хватает
- Механизмы БСП: дополнительные реквизиты, печатные формы, подписки
- Документирование и проверка расширения после каждого обновления типовой
Если ответил, копните глубже
Спроектируй схему базы для заказов интернет-магазина: клиенты, товары, заказы, оплаты. Какие таблицы, ключи и ограничения?
Что хотим услышать
- Таблицы customers, products, orders, order_items, payments и их связи
- order_items как связь заказа и товара с qty и ценой на момент покупки
- Ограничения: FK, NOT NULL, CHECK (qty > 0), UNIQUE там, где нужно
- Типы: numeric или копейки для денег, timestamptz для времени, статус через CHECK или enum
- Индексы на FK и под частые запросы (заказы клиента по дате)
- Платежи отдельной таблицей с идемпотентным внешним id от платёжки
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Объясните, как устроены управляемые блокировки и когда их нужно ставить вручную.
Что хотим услышать
- Блокировки ставит сервер 1С по пространству и значениям полей
- Исключительные и разделяемые, живут до конца транзакции
- Платформа сама блокирует при записи
- Вручную при схеме «прочитать, проверить, записать»
- Блокировать только нужное и как можно раньше в транзакции
Если ответил, копните глубже
Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.
Что хотим услышать
- Низкая селективность: нужна большая доля строк, seq scan дешевле
- Функция или приведение типа над колонкой: нужен индекс по выражению или переписать условие
- Условие не по ведущей колонке составного индекса
- Устаревшая статистика: оценки rows не совпадают с фактом, помогает ANALYZE
- Маленькая таблица, LIKE с % в начале, OR по разным колонкам
- Проверка: EXPLAIN (ANALYZE, BUFFERS), сравнить оценки с фактом
Если ответил, копните глубже
Почему вы считаете себя middle-разработчиком?
Что хотим услышать
- Показал самостоятельность: вёл задачу сам от требований до прода
- Привёл пример фичи, которую довёл целиком
- Упомянул работу с неясными требованиями
- Есть результат с цифрой
- Не завысил и не принизил себя
Если ответил, копните глубже
Расскажите, как бы вы написали проведение документа «Реализация товаров» с контролем остатков.
Что хотим услышать
- Данные документа одним запросом, без обращения через точку в цикле
- Движения по регистрам остатков и оборотов
- Контроль остатков только в оперативном режиме
- Новая методика: записать движения, затем проверить отрицательные остатки с границей Включая
- Блокировки: исключительная на изменяемые данные
- Отказ и сообщение пользователю с товаром и нехваткой
Если ответил, копните глубже
Когда ты выберешь NoSQL вместо PostgreSQL? Приведи примеры задач.
Что хотим услышать
- Выбор от модели доступа, объёма, консистентности и опыта команды, а не от моды
- PostgreSQL по умолчанию: транзакции, JOIN, ограничения, jsonb
- Redis: кеш, сессии, счётчики, rate limiting
- Cassandra: огромный поток записи с запросами по ключу партиции
- ClickHouse: аналитика, Elasticsearch: полнотекстовый поиск
- Цена NoSQL: денормализация, слабее консистентность, сложно менять запросы
Если ответил, копните глубже
Зачем нужны пакетные запросы и временные таблицы? Приведите пример, когда без них плохо.
Что хотим услышать
- Пакет: несколько запросов, разделённых «;», выполняются за один вызов
- Временная таблица хранит промежуточный результат и используется в следующих запросах
- Отбор один раз вместо повторения подзапроса
- Индексирование временной таблицы для соединений
- Пример: товары документа во ВТ, затем остатки и цены только по ним
Если ответил, копните глубже
Пользователи жалуются, что страница заказов стала открываться 5 секунд. Ты подозреваешь базу. Твои действия по шагам.
Что хотим услышать
- Подтвердить, что дело в базе: метрики, логи медленных запросов, pg_stat_statements
- Получить точный запрос с параметрами и выполнить EXPLAIN (ANALYZE, BUFFERS) на копии или осторожно на проде
- Читать план: где основное время, оценка строк против факта, тип сканов и соединений, сортировки на диске
- Гипотезы: нет индекса, функция над колонкой, устаревшая статистика, большой OFFSET, N+1 в коде
- Исправление и проверка эффекта (план и время после), индекс через CONCURRENTLY
- Что поменялось: релиз, рост данных, блокировки, раздувание таблиц
Если ответил, копните глубже
Спроектируйте регистры для учёта товаров на складах с ценами закупки и продажами по менеджерам.
Что хотим услышать
- Регистр накопления остатков ТоварыНаСкладах: Номенклатура, Склад; ресурс Количество
- Для себестоимости отдельный регистр с ресурсами Количество и Сумма или партионный учёт
- Регистр накопления оборотов Продажи: Номенклатура, Контрагент, Менеджер; ресурсы Количество, Сумма
- Периодический регистр сведений ЦеныНоменклатуры
- Не класть в регистр остатков измерения, по которым не нужны остатки
Если ответил, копните глубже
Чем EXISTS отличается от IN, а NOT EXISTS от NOT IN? Что выберешь и почему?
Что хотим услышать
- IN сравнивает значение со списком, EXISTS проверяет факт наличия строк в коррелированном подзапросе
- Для положительной проверки результаты совпадают, PostgreSQL превращает оба в semi-join
- NOT IN при NULL в подзапросе даёт пустой результат, NOT EXISTS работает корректно
- Для «нет в другой таблице» выбираю NOT EXISTS или LEFT JOIN ... IS NULL
- Миф «IN всегда медленнее» устарел, смотреть план
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Пользователи в филиале жалуются, что форма документа очень медленно реагирует при изменении количества в строке. Как будете разбираться и что исправлять?
Что хотим услышать
- Замер: сколько серверных вызовов и данных на одно действие
- Пересчёт суммы строки на клиенте, без сервера
- Серверные вызовы без контекста и с минимальными параметрами
- Объединение нескольких вызовов в один
- Кеширование справочных данных на клиенте или в модуле с повторным использованием
- Проверка на медленном канале и в веб-клиенте
Если ответил, копните глубже
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Что хотим услышать
UPDATEсоздаёт новую версию строки, старая остаётся сxmax;DELETEтолько помечает версию- Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
- VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
- Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
- Autovacuum настраивают по таблицам:
autovacuum_vacuum_scale_factor, лимиты стоимости; мониторинг черезpg_stat_user_tables - HOT-обновления и
fillfactorуменьшают нагрузку на индексы
Если ответил, копните глубже
VACUUM FULL отличается от обычного?Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Вы ведущий разработчик внедрения ERP с 30 доработками у крупного клиента. Как организуете разработку, чтобы обновления не превратились в ад?
Что хотим услышать
- Политика: основная конфигурация на поддержке, доработки в расширениях
- Несколько расширений по областям, с владельцами
- EDT и Git, ревью кода, стандарты 1С, проверка кода
- Автотесты ключевых сценариев (Vanessa Automation, YAxUnit)
- Регулярные обновления типовой на тестовом контуре
- Реестр доработок с обоснованием и стоимостью поддержки
Если ответил, копните глубже
На проде в логах появились ошибки deadlock detected. Как вы будете разбираться и что сделаете, чтобы они ушли?
Что хотим услышать
- Deadlock это цикл ожидания: транзакции держат блокировки и ждут друг друга
- PostgreSQL проверяет цикл после
deadlock_timeout(1 с по умолчанию) и откатывает одну из транзакций с ошибкой 40P01 - В логе есть оба запроса и тип блокировок; включаю
log_lock_waitsдля долгих ожиданий - Главное лечение: единый порядок взятия блокировок, короткие транзакции, блокировка заранее через
SELECT ... FOR UPDATEв порядке ключа - Приложение должно уметь повторять транзакцию при 40P01 и 40001
Если ответил, копните глубже
FOR UPDATE отличается от FOR NO KEY UPDATE?lock_timeout?Чем, по-вашему, резюме senior должно отличаться от резюме middle?
Что хотим услышать
- Акцент на масштаб и влияние, а не на список фич
- Метрики бизнес-эффекта
- Лидерство: менторинг, процессы, архитектурные решения
- Компактность: старый опыт свёрнут
- Понимание, что резюме под роль, а не под всё сразу
Если ответил, копните глубже
Форма заказа с табличной частью на 3000 строк открывается 10 секунд и тормозит при вводе. Как оптимизировать?
Что хотим услышать
- Замер: где время, сервер или передача данных
- Не тащить на клиент лишнее: реквизиты формы, скрытые колонки, вычисляемые поля одним запросом
- Пересчёты строк на клиенте, без серверного вызова на каждое изменение
- Тяжёлые данные подгружать по требованию
- Условное оформление вместо программной раскраски строк
- Рассмотреть другой интерфейс: подбор, фильтры, разбиение документа
Если ответил, копните глубже
Как выбрать порядок колонок в составном индексе? Разбери на примере WHERE tenantid = ? AND status = ? AND createdat ? ORDER BY createdat.
Что хотим услышать
- Индекс работает по левому префиксу: ведущие колонки должны быть в условии
- Сначала колонки с равенством, затем одна колонка с диапазоном или сортировкой
- После колонки с диапазоном следующие колонки для поиска уже не помогают
- Для примера: (tenant_id, status, created_at) закрывает и фильтр, и ORDER BY
- Учитывать, какие ещё запросы обслужит индекс, чтобы не плодить похожие
- Проверять на реальных данных через EXPLAIN ANALYZE
Если ответил, копните глубже
Обмен между УТ и БП раз в неделю «ломается»: документы не выгружаются, пользователи жалуются на расхождения. Как наведёте порядок?
Что хотим услышать
- Мониторинг: протоколы обмена, ошибки, очередь зарегистрированных изменений
- Классификация ошибок: данные, правила, конфликты, блокировки
- Исправить корень: правила конвертации, обязательные поля в источнике
- Обмен по расписанию небольшими порциями, без длинных транзакций
- Сверка данных и процедура разбора расхождений
- Тест обновлений правил на копиях перед продом
Если ответил, копните глубже
В таблице events 1 млрд строк, нужно удалить всё старше года (около 300 млн), и база при этом обслуживает прод. Как это сделать?
Что хотим услышать
- Один
DELETEна 300 млн плох: долгая транзакция, огромный WAL, лаг реплик, мёртвые строки - Удалять пачками по ключу (например, по 10 тыс. id) с паузами и отдельными транзакциями
- Следить за лагом реплик и работой autovacuum во время чистки
- Если удалить надо больше, чем остаётся, быстрее скопировать нужное в новую таблицу и переключиться
- На будущее: партиционирование по времени и удаление партиций целиком
Если ответил, копните глубже
Утром пользователи массово получают ошибки ожидания блокировок при проведении продаж. Как будете искать причину?
Что хотим услышать
- Технологический журнал: события TLOCK, TTIMEOUT, TDEADLOCK, кто держит и кто ждёт
- Найти «виновника»: длинные транзакции, регламентные задания, обмены
- Проверить избыточные блокировки: всей таблицы, лишние измерения
- Сократить транзакции: внешние вызовы и тяжёлые вычисления вынести
- Перенести тяжёлые задания на ночь, мониторинг ЦУП
Если ответил, копните глубже
Расскажите, какие типы индексов есть в PostgreSQL и как вы выбираете между ними.
Что хотим услышать
- B-tree по умолчанию: равенство, диапазоны, сортировка, уникальность,
LIKE 'abc%' - GIN для составных значений:
jsonb, массивы, полнотекстовый поиск,pg_trgmдля поиска по подстроке - GiST для диапазонов, геометрии, ближайших соседей и exclusion-ограничений
- BRIN для огромных таблиц с корреляцией значения и физического порядка
- Частичные, по выражению и покрывающие (
INCLUDE) индексы как способы сузить и ускорить - Каждый индекс замедляет запись и мешает HOT-обновлениям, неиспользуемые находят по
pg_stat_user_indexes
Если ответил, копните глубже
Задача для live coding
Доля отменённых заказов в процентах
Для каждого клиента, у которого есть заказы, посчитай долю отменённых заказов в процентах, округлив до одного знака после запятой. Гостевые заказы не учитывай.
Колонки: customer_id, cancel_pct. Порядок строк не важен.
- Подсказка, если застрял: Что вернёт
1 / 3в PostgreSQL? - Подсказка, если застрял: Условный подсчёт:
COUNT(*) FILTER (WHERE ...).
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: Разработчик 1С