← блог
15 октября 2026 г.

Вопросы на собеседовании программиста 1С: разбор по грейдам

На собеседовании программиста 1С почти не спрашивают синтаксис. Если человек дошёл до интервью, процедуру и запрос он написать умеет. Проверяют другое: понимает ли он, что происходит с данными. Где окажется условие на правую таблицу соединения, что увидит параллельный документ, когда отработает блокировка, что станет с правкой при следующем обмене.

Ниже вопросы, которые задают чаще всего, с коротким разбором и пометкой уровня. Ответы проверены для платформы 8.3.27 и линейки 8.5.

Язык и метаданные: база для джуна

Чем Неопределено отличается от NULL? Неопределено живёт в языке: так выглядит незаполненная переменная, отсутствующий ключ соответствия, пустой реквизит составного типа. NULL приходит из базы через запрос, например из левого соединения, где не нашлось пары. Друг другу они не равны, поэтому проверка на одно не ловит другое. Сильный ответ добавляет, что пустоты из запроса закрывают ЕСТЬNULL прямо в тексте запроса.

Изменится ли массив, переданный в процедуру через Знач? Изменится. Знач копирует значение параметра, а в переменной с массивом лежит ссылка на объект. Процедура получает ссылку на тот же массив, и Добавить меняет его для вызывающего. Знач защищает только саму переменную: если внутри присвоить ей новый массив, снаружи этого не увидят. На этом вопросе отвечают «не изменится» чаще, чем кажется.

Справочник или перечисление? Перечисление зашито в конфигурацию: пользователь его не пополнит, зато код может на него опираться, например на статусы заказа. Справочник пополняют пользователи, а элементы, нужные коду, делают предопределёнными. Если бизнес завтра попросит новый вид оплаты без программиста, перечисление было ошибкой.

Где хранить цены товаров? Цена действует на дату, поэтому место ей в периодическом регистре сведений: измерения товар и вид цены, ресурс цена. На дату документа берут срез последних. Реквизит справочника теряет историю, и перепроведение старого документа возьмёт новую цену.

Куда ставить условие на правую таблицу левого соединения? В ПО. В ГДЕ условие проверится после соединения, у строк без пары поля правой таблицы равны NULL, сравнение не пройдёт, и строки пропадут. Левое соединение молча станет внутренним. Это, пожалуй, самый частый вопрос по запросам на любом уровне.

Что вернёт ПЕРВЫЕ 1 без УПОРЯДОЧИТЬ ПО? Любую строку, какую СУБД отдаст первой. На тестовой базе это может совпасть с ожиданием, а в рабочей вернётся не последняя цена, а случайная.

Регистры и проведение: территория мидла

Где ставить условие на склад: в параметре виртуальной таблицы или в ГДЕ? В параметре. Там условие работает внутри расчёта, и остатки считаются только по нужному складу. В ГДЕ таблица сначала посчитает остатки по всему регистру и потом отбросит лишнее. Результат для остатков одинаковый, разница в скорости. Условие на сам остаток, например меньше нуля, в параметр не поставить: остатка там ещё нет.

А у среза последних тоже всё равно? Нет, и это любимое продолжение. Курсы валют приходят из двух источников, нужен курс ЦБ. В параметре среза условие на источник даёт последнюю запись среди записей ЦБ. В ГДЕ срез сначала берёт последнюю запись вообще, и если она биржевая, условие её отбросит, а валюта пропадёт из результата целиком.

Запретит ли платформа списать больше, чем есть на складе? Нет. Регистр накопления примет любые движения, и остаток уйдёт в минус. Контроль пишут в проведении сами.

Чем старая методика контроля остатков отличается от новой? Старая сначала ставит исключительную управляемую блокировку на товары документа, читает остатки, сравнивает и только потом пишет движения. Новая сначала пишет движения, запись набора сама блокирует записываемые данные, а потом один запрос ищет отрицательные итоговые остатки по товарам документа, и при минусе документ отказывает. Новая читает меньше и держит блокировки короче, её используют типовые. Ответ уровня мидла заканчивается фразой: если у регистра включено разделение итогов, набору ставят БлокироватьДляИзменения, иначе документы по одному товару пройдут параллельно и минус проскочит.

Почему блокировку ставят до чтения? Блокировка защищает только то, что прочитано после неё. Если сначала прочитать остаток, параллельный документ успеет прочитать то же значение, и оба его спишут. По той же причине блокировку перед записью берут сразу исключительной: с разделяемой два документа прочитают вместе и сцепятся при записи.

Как списать товар по FIFO и не потерять копейку? Партии берут по дате и ссылке, из каждой списывают долю суммы: сумма партии, делённая на количество и умноженная на списываемое. Если партия уходит целиком, списывают всю оставшуюся сумму. Иначе после трёх списаний по 33,33 из партии в 100 рублей на ней останется копейка при нулевом количестве.

Чем &НаСервере отличается от &НаСервереБезКонтекста? Первая директива передаёт на сервер все данные формы и возвращает изменённые обратно, вторая передаёт только параметры. Чтобы получить цену товара, форма не нужна, и внеконтекстная функция гонит по сети одну ссылку вместо формы с табличной частью на пятьсот строк.

Почему строка удаляется, хотя пользователь ответил «Нет»? Потому что ПоказатьВопрос не ждёт ответа: код после него выполняется сразу. Удаление переносят в обработчик ответа через ОписаниеОповещения или переписывают на Асинх и Ждать ВопросАсинх. Этот вопрос часто дают куском кода.

Как вывести в СКД среднюю цену по группе? Ресурсом Сумма(Сумма) / Сумма(Количество). Среднее от цен не учитывает количество, а ресурс с суммой цен даёт в итогах бессмысленное число.

Производительность, обмены, типовые: уровень сеньора

Проведение тормозит у пользователей. Ваши действия? Сначала замеры: какие документы, у кого, когда и на что уходит время. Замер производительности показывает строки кода, технологический журнал показывает запросы и ожидания блокировок. Типичные находки: запрос в цикле по строкам, обращение через точку к составному полю, внешний вызов внутри транзакции. Сеньор говорит не «купим сервер», а «сниму базовую линию и сравню после правки».

Чем взаимоблокировка отличается от таймаута? Взаимоблокировка означает цикл: две транзакции ждут друг друга, и менеджер блокировок откатывает одну. Таймаут означает долгое ожидание без цикла, по умолчанию ошибка приходит через 20 секунд. Цикл лечат единым порядком захвата, таймаут лечат короткими транзакциями у того, кто держит блокировку. Увеличение таймаута ничего не лечит.

Как найти в СУБД таблицу регистра? Через ПолучитьСтруктуруХраненияБазыДанных: она вернёт служебные имена вроде _AccumRg для движений и _AccumRgT для итогов и имена полей. Номера в каждой базе свои, и называть их по памяти не нужно.

Что будет с изменениями, если сообщение обмена потерялось? Ничего страшного, если регистрацию снимают по подтверждению приёмника. Пока номер сообщения не подтверждён, изменения остаются зарегистрированными и уйдут в следующем сообщении. Плохой ответ: «удаляем регистрацию сразу после записи файла».

Как создать базу нового филиала в РИБ? Начальным образом подчинённого узла. Копия базы центра или её выгрузка в dt считает себя главным узлом, и обмен запутает обе базы.

В центре и в филиале поменяли одну карточку. Что останется? Версия узла с приоритетом: в РИБ по умолчанию главного, в обменах БСП по настройке. Слияния реквизитов нет. Зрелый ответ не останавливается на механизме: у каждого вида данных назначают одну базу-владельца и снимают права на изменение в остальных.

Как добавить проверку при записи типового документа? Расширением с аннотацией &Перед на ПередЗаписью: своя процедура выполнится до исходной и сможет поставить Отказ. &Вместо заменит метод целиком, и без ПродолжитьВызов типовая логика пропадёт. К функциям &Перед и &После не применяют.

Как обновить доработанную типовую на новый релиз? На копии, по цепочке версий поставщика. В трёхстороннем сравнении смотрят объекты, которые меняли и поставщик, и вы. «Взять из файла» на доработанном объекте сотрёт доработку. После обновления проверяют обработчики обновления, расширения, внешние обработки и время реструктуризации.

Что спросят помимо этого

Почти везде спросят про интеграции: как принять заказ с сайта в HTTP-сервис и не создать дубль при повторной отправке, какой таймаут у HTTPСоединение по умолчанию (бесконечный), почему внешний вызов не делают из проведения. Для мидла и сеньора добавляют дизайн-секцию: спроектировать обмен с маркетплейсом или проведение под нагрузкой в 300 пользователей. Там важнее рассуждение, чем точный ответ: кто владеет данными, какая задержка допустима, где узкое место.

Задачу на алгоритмы на собесе 1С дают редко. Зато могут попросить прочитать чужой запрос или процедуру и найти, что в ней тормозит или ломается.


Разбор полезно прочитать, но на собесе спросят иначе. В тренажёре «Сеньорчик» есть роль «Программист 1С»: вопросы идут от базы к сеньорским, после ответа сразу разбор, а темы, где вы ошибаетесь, движок возвращает снова. Работает в браузере и в Telegram, начать можно бесплатно.