Собеседование, интервью, отбор кандидата-программиста

05.05.25

Сообщество - О жизни

Методический материал для собеседования. Помогает облегчить общение между кандидатом и работодателем.

Введ ение

Мне часто приходится участвовать в собеседованиях (отборе) кандидата-программиста. Постепенно пришел к выводу, что написание по техническому заданию новой обработки (отчета) – не лучший вариант:

  • Требуется существенное время + среда разработки (компьютер)
  • Может вызвать негативную реакцию, раздражение кандидата.
  • Для проверки требуется сотрудник высокой квалификации.
  • Увеличение длительности отбора увеличивают вероятность отказа кандидата от участия.

Поэтому было решено давать кандидату уже написанный код 1С с ошибками, которые он должен найти.

  • Поиск ошибок в чужом коде происходит быстро, читать - с листа.
  • Повышает самооценку кандидата.
  • Результат можно проверить по шаблону ответов

Благодарю всех коллег, кто морально и материально поддержал мою прошлую статью Отбор кандидата-программиста. Им всем респект и скидка 50% на новые файлы, СМ будут начислены после покупки в чатике как вознаграждение.

Пример одного вопроса

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
|Сумма(1) / 1000000
|ИЗ
|РегистрСведений.ЦеныНоменклатуры КАК Цены";

Сценарий интервью

Вопрос: Для чего может быть использован такой запрос?

(Проверяем, насколько кандидат понимает чужой код. Программисты занимаются этим большую часть времени. Обращаем внимание на навыки общения кандидата.)

Ответ: Запрос считает количество записей регистра. Похожим запросом можно считать количество элементов справочника или строк в документе.

Вопрос: Для чего делить на миллион?

(Этот вопрос неочевидный, отвечать необязательно. Для любителей, знатоков и коллекционеров)

Ответ: Деление - чтобы не было ошибки sql переполнения.

Вопрос: Какая ошибка может возникнуть при работе с данными запроса?

(Умение предусмотреть null - очень важное. Если кандидат смог ответить - в его коде будет значительно меньше ошибок)

Ответ: Сумма(1) может быть null.

Вопрос: Как правильно написать запрос?

Ответ: Слово РАЗЛИЧНЫЕ не нужно. Использовать функцию КОЛИЧЕСТВО.

(Рекомендации ИТС: https://its.1c.ru/db/v8std#content:787:hdoc Если кандидат читает ИТС - это хороший знак. С другой стороны, если кандидат ответил ВСЕ вопросы - возможно, он готовился к интервью. Выбирайте сами)

Как видите, даже короткий фрагмент кода может показать уровень квалификации кандидата. В приложенных файлах только вопросы-ответы, комментарии отсутствуют.


Еще пример

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ВводОстатковТоваров.Ссылка КАК Ссылка
|ИЗ
|    Документ.ВводОстатковТоваров КАК ВводОстатковТоваров
|
|УПОРЯДОЧИТЬ ПО
|    ВводОстатковТоваров.Дата";
//10
ТЗ = Запрос.Выполнить().Выгрузить();
НачалоГода = НачалоГода( ТекущаяДата() );
//13
Для Каждого ТЗЦикл ИЗ ТЗ Цикл
//15
Если ТЗЦикл.Ссылка.Дата < НачалоГода Тогда Продолжить; КонецЕсли;
Документ = ТЗЦикл.Ссылка.ПолучитьОбъект();
Документ.ПометкаУдаления = Истина;
Документ.ОбменДанными.Загрузка = Истина;
Документ.Записать(РежимЗаписиДокумента.Запись);
//21
КонецЦикла;

Сценарий интервью
Вопрос: Для чего может быть использован такой код?
Ответ: Для пометки на удаление документов "Ввод остатков товаров" за текущий год.


Вопрос: Что произойдет с регистрами накоплений, движениями товара? Почему?
Ответ: Ничего, код пометит документы, регистры накоплений и движений товара останутся без изменения. Помеченные на удаление документы будут изменять остатки, это очень неприятно. Такая особенность записи в режиме ОбменДанными.Загрузка = Истина.


Вопрос: Как исправить?
Ответ: Вмест
о строк 18-19-20, использовать УстановитьПометкуУдаления(Истина).


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


Вопрос: В чем проблема в строке 16?
Ответ: Отбор по дате необходимо производить в запросе выборки документов, не допуская объектного чтения.


Вопрос: Если все документы должны быть помечены на удаление, то нужно ли помечать все документы на удаление? Какие отборы должны быть в запросе?
Ответ: На удаление не нужно помечать документы, которые уже помечены на удаление. В запросе должны быть отборы "Где ВводОстатковТоваров.Дата > &НачалоГода И НЕ ВводОстатковТоваров.ПометкаУдаления".


Вопрос: В чем проблема в строке 11 ?
Ответ: Не нужно использовать выгрузку в таблицу, используйте выборку.

 
 Все вопросы

 

// 01 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	РеализацияТоваровУслуг.Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, МЕСЯЦ) = &Январь2025";

// 02 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Номенклатура,
|	ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура,
|	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
|	ЛОЖЬ";

Таблица = Запрос.Выполнить().Выгрузить();

// 03 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ
|	СрезЦен.Регистратор.Ссылка,
|	СрезЦен.Номенклатура,
|	СрезЦен.Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Завтра, ) КАК СрезЦен
|ГДЕ
|	СрезЦен.Регистратор ССЫЛКА Документ.УстановкаЦенНоменклатуры";

// 04 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	Сумма(1) / 1000000
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры КАК Цены";

// 05 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ
|	Выразить(РеализацияТоваровУслуг.Ссылка КАК Документ.РеализацияТоваровУслуг).Ссылка,
|	НАЧАЛОПЕРИОДА(РеализацияТоваровУслуг.Дата, МЕСЯЦ) КАК НачалоМесяца
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|
|УПОРЯДОЧИТЬ ПО
|	НачалоМесяца";

// 06 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ
|	ОстаткиТоваров.Номенклатура,
|	СрезЦен.Цена
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ОстаткиТоваров
|		Левое СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, Типцен = &Типцен) КАК СрезЦен
|		ПО ОстаткиТоваров.ХарактеристикаНоменклатуры = СрезЦен.ХарактеристикаНоменклатуры
|ГДЕ
|	НЕ СрезЦен.Номенклатура.ПометкаУдаления";

// 07 //////////////////////////////////////////////////////////////////////////////////////
НоменклатураВыбрать = Справочники.Номенклатура.Выбрать();	
Пока НоменклатураВыбрать.Следующий() = Истина Цикл
	Сообщить( НоменклатураВыбрать.Ссылка + НоменклатураВыбрать.Артикул );	
КонецЦикла; 

// 08 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 9
|	Номенклатура.Ссылка КАК Номенклатура,
|	ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|		ПО (ХарактеристикиНоменклатуры.Владелец = Номенклатура.Ссылка)
|ГДЕ
|	ХарактеристикиНоменклатуры.ПометкаУдаления";

// 09 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	ТоварыНаСкладахОстатки.Номенклатура,
|	ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
|	ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ(&ГруппаНоменклатуры)";

// 10 //////////////////////////////////////////////////////////////////////////////////////
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
|	МАКСИМУМ(РеализацияТоваровУслугТовары.Ссылка) КАК Ссылка
|ИЗ
|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|	(ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.Коэффициент КАК ЧИСЛО(5, 0))) < РеализацияТоваровУслугТовары.Коэффициент
|
|СГРУППИРОВАТЬ ПО
|	РеализацияТоваровУслугТовары.ЕдиницаИзмерения";


// 11 //////////////////////////////////////////////////////////////////////////////////////
//модуль справочника ХарактеристикиНоменклатуры
Процедура ПриЗаписи(Отказ)

	ОбработкаПрерыванияПользователя();
	Попытка
		НачатьТранзакцию();
			МойОбъект = Владелец.ПолучитьОбъект();
			МойОбъект.Наименование = СокрЛП(МойОбъект.Наименование);
			МойОбъект.Записать();
		ЗафиксироватьТранзакцию();
	Исключение
		Предупреждение("Ошибка проведения",5);
		ОтменитьТранзакцию();
	КонецПопытки;
	
КонецПроцедуры

// 12 //////////////////////////////////////////////////////////////////////////////////////
&НаКлиенте
Функция ЗначениеВДанныеФормы()
//строка 03
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
//строка 06
Запрос.Текст = 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|	1 / Номенклатура.ЕдиницаДляОтчетов.Коэффициент КАК ОбратныйКоэффициент,
|	Номенклатура.Ссылка
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура";
//строка 13
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальная = РезультатЗапроса.Выбрать();
//строка 16
Пока ВыборкаДетальная.Следующий() Цикл
	Сообщить( ВыборкаДетальная.Ссылка.Наименование + " " + ВыборкаДетальная.ОбратныйКоэффициент );
КонецЦикла;
//строка 20
УстановитьПривилегированныйРежим(Ложь);
//строка 22
КонецФункции

// 13 //////////////////////////////////////////////////////////////////////////////////////
&НаСервере
Функция ЗначенияРеквизитов(Номенклатура)
	
	ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Номенклатура, "Наименование, ВариантОформленияПродажи");
	
	Если ЗначенияРеквизитов.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг Тогда
		Возврат ЗначенияРеквизитов;
	КонецЕсли;
	
КонецФункции

&НаКлиенте
Процедура ПоказатьТовары(Команда)
	
	Для Каждого Товар Из Объект.Товары Цикл
		
		ЗначенияРеквизитов = ЗначенияРеквизитов(Товар.Номенклатура);
		
		Если ЗначенияРеквизитов <> Неопределено Тогда
			ОбщегоНазначенияКлиент.СообщитьПользователю(ЗначенияРеквизитов.Наименование);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

// 14 //////////////////////////////////////////////////////////////////////////////////////
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ВводОстатковТоваров.Ссылка КАК Ссылка
|ИЗ
|    Документ.ВводОстатковТоваров КАК ВводОстатковТоваров
|
|УПОРЯДОЧИТЬ ПО
|    ВводОстатковТоваров.Дата";
// строка 10
ТЗ = Запрос.Выполнить().Выгрузить();
НачалоГода = НачалоГода( ТекущаяДата() );

Для Каждого ТЗЦикл ИЗ ТЗ Цикл
// строка 15
Если ТЗЦикл.Ссылка.Дата < НачалоГода Тогда Продолжить; КонецЕсли;
Документ = ТЗЦикл.Ссылка.ПолучитьОбъект();
Документ.ПометкаУдаления = Истина;
Документ.ОбменДанными.Загрузка = Истина;
Документ.Записать(РежимЗаписиДокумента.Запись);
// строка 21
КонецЦикла;
 
 Послесловие

Вопрос: Вы советуете НЕ выгружать результат запроса в таблицы значений, а ERP это активно использует.
Ответ: Мы должны верить, что напишем больше и лучше, чем ERP !

Вопрос: Зачем такие тесты, ведь кандидатов можно отбирать, спрашивая про красно-черные деревья и вялые огурцы ?
Ответ: Спасибо, Кузяра! Вы сделали мой день!

Вопрос: Тут уж совсем детский уровень.
Ответ: Здесь спрятано 20 ошибок, не каждый ребенок найдет.

Вопрос: Это код одна сплошная ошибка!
Ответ: Вы нам не подходите. Слишком умных лучше не брать. Подсидят через пару лет. ))

Вопрос: Выжду годик и сам запилю такую публикацию.
Ответ: Через годик у меня уже будет четыре плюсика и одно скачивание !

Вопрос: Зачем мне код с ошибками ?
Ответ: Все хотят быть сеньором-тимлидом, но никто не хочет исправлять чужой плохой код ))

Вопрос: Мне нужно просеять кандидатов через воронку отбора (остаться должен 1%)
Ответ: Вы затеяли "Голодные игры"? Интер есная воронка - но напрашивается аналогия с большим динозавром - пока сигнал от хвоста дойдет до мозга, хвост уже отгрызут :-)

Вопрос: Где Вы берете такой плохой код ?
Ответ: Проекты прошлых лет (шутка).

Найти ошибки в коде - популярная тема на собеседованиях. Например, используется на собеседованиях Вайлдберриз-Тех для программистов Java.

Содержит избранные комментарии из предыдущей статьи Отбор кандидата-программиста.
Благодарю модератора Ирину Пятакову, которая помогает сделать статьи более читабельными. Без нее у меня получилась бы просто куча неструктурированной информации.

См. также

О жизни Россия Бесплатно (free)

Данная статья сугубо для раздела «О жизни», но может оказаться полезна многим членам сообщества. Все описанное ниже соответствует актуальному российскому законодательству на момент публикации статьи. У вас нет и в ближайшее время не предвидится детей возрастом до 1.5 лет? Вспомните о родственниках / друзьях / коллегах / знакомых, у которых они есть, и отправьте ссылку на эту статью — она может быть им чрезвычайно полезна. Распространите среди жильцов вашего ЖЭКа, как говорилось в одном классическом произведении. Помните, что, ставя плюсы к статье, вы поддерживаете её автора!

01.07.2024    7055    madonov    48    

54

О жизни Linux Системный администратор Программист Платформа 1С v8.3 Россия Бесплатно (free)

Использование Linux в качестве основной ОС для программиста 1С, возможно ли это? Решил поделиться личным опытом работы перехода на эту систему. В статье моя история без технических деталей максимально простым языком. И, спойлер, да, жизнь на Линуксе для разработчика 1С возможна и с каждым годом становится всё комфортней. Статья рассчитана на людей, с Линуксом не знакомых, специалистов прошу не кидаться помидорами.

16.05.2024    7322    soulner    33    

49

О жизни Россия Бесплатно (free)

Подводим итоги работы в 1С за 2023 год. Все о вас: 4 подробных раздела с цифрами, графиками и ужасными цветами диаграмм (должна же где-то быть стабильность).

08.02.2024    30457    Neti    86    

123

О жизни Сообщество Бесплатно (free)

Прочитав название публикации, мысль возникает о свадьбе... Но речь не об этом!

25.08.2023    3636    biimmap    24    

51

О жизни Россия Бесплатно (free)

«Многие кандидаты хотят от собеседования простую вещь: чтобы оно длилось пять минут и брали сразу на 300 000 в наносекунду», — Эльдар Мингалиев, разрабатывает новые форматы собеседований.

22.08.2023    16245    Neti    161    

108

О жизни Бесплатно (free)

Не раз сталкивался с тем, что пользователи сайта не очень понимают, как ставить плюсы и зачем. Многие думают, что поставить плюс = добавить публикацию в избранное. В статье будет кратко об этом.

21.08.2023    5811    biimmap    93    

138

О жизни Бесплатно (free)

Эта статья открывает цикл статей по поиску работы программистом. В ней я поделюсь опытом своим и своих знакомых. Вы получите ответ на вопрос, стоит ли искать работу программистом, как новичкам, так и профессионалам. Как подготовиться к поиску работы и как начать искать.

11.08.2023    17102    Viki_push    136    

107
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. vasilev2015 2757 05.05.25 10:02 Сейчас в теме
Коллеги, этот плохой, очень плохой код надо ... обсуждать ))
Как лучше продавать ответы ? По одному или все сразу ?
2. aximo 2319 05.05.25 10:40 Сейчас в теме
знакомый программист в наше время нужен как знакомый зубной врач . Подобные "тестики" считаю унизительными для кандидатов - следует помнить, что на этом месте может оказаться любой!
kuzyara; mironoff87; +2 Ответить
3. vasilev2015 2757 05.05.25 11:10 Сейчас в теме
(2) Хорошо, когда программист передается из уст в уста, из поколения - в поколение ))
А если город большой, с небоскребами, программист незнакомый ? Какие тестики считаете неунизительными ?
9. aximo 2319 05.05.25 13:22 Сейчас в теме
(3) Если город большой с небоскребами и нет знакомых программистов - становись в очередь в общественную поликлинику - в супер-мега-гига франч!

и я не нанимаю программистов, я стараюсь взаимодействовать с менеджерами продаж
10. vasilev2015 2757 05.05.25 13:29 Сейчас в теме
(9) запись к франчам через госуслуги, по СНИЛСу ?
12. aximo 2319 05.05.25 13:42 Сейчас в теме
(10) не воспринимайте все буквально
4. DmitryKSL 171 05.05.25 11:18 Сейчас в теме
Вопрос: Для чего делить на миллион?
(Этот вопрос неочевидный, отвечать необязательно. Для любителей, знатоков и коллекционеров)
Ответ: Деление - чтобы не было ошибки sql переполнения.

Не знал и знать не хочу.
Вот еще вопросик из разряда попробуй догадайся. Для чего нужна первая и вторая строка в процедуре. Дипсик сказал что это не по феншую, и порекомендовал их удалить.

Процедура СохранитьНастройкиСервер(Знач КлючОбъекта, Знач КлючНастроек, Данные)
	
	КлючОбъекта = СтрЗаменить(КлючОбъекта, """", "");
	КлючНастроек = СтрЗаменить(КлючНастроек, """", "");
	ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Данные);	
	
КонецПроцедуры
5. lada2011 05.05.25 11:26 Сейчас в теме
Меня на собеседование спросили рассказать о ВР и ПР в налоговом учете, а вы все про кодики. Оптимальный код - код который можно быстро адаптировать под запросы пользователя, а не запрос на несколько страниц, который для адаптации нужно переписывать заново.
6. vasilev2015 2757 05.05.25 11:33 Сейчас в теме
(5) Вопрос про
ВР и ПР в налоговом учете
лучше подойдет аналитику. Хочу, чтобы у меня был личный тестер, личный аналитик и личный менеджер (как в майкрософте). (шутка).
7. ZOMI 398 05.05.25 13:11 Сейчас в теме
Мучают претендентов всякими заумностями, а потом у них 1С-ник примитивные печ. формы рисует и коллонтитулы правит. А автор методики отбора щеки раздувает и похлопывает по плечу.
vandalsvq; v8_088; akR00b; aximo; +4 Ответить
11. vasilev2015 2757 05.05.25 13:38 Сейчас в теме
(7) Кто-то считает эти тесты "заумными", кто-то "детскими".
Разный уровень умения программировать ?

А чтобы не рисовать примитивные печатные формы - просите достойную заработную плату.
И пребудет с вами сила !
13. v8_088 05.05.25 16:14 Сейчас в теме
(7) Дарю лайфхак уважаемому работодателю: тесты прогеру должны максимально отражать те задачи, которые он будет выполнять в вашей компании. По крайней мере в ближайшее время. Тогда и человек сразу начнет понимать, на что идет, и ваш поиск станет намного релевантней. Да, а чтоб сие действо не стало "унизительным" для спеца, ему можно предложить среднечасовую оплату по вашим тарифам. Опять же кандидат сразу почувствует вкус к вашим задачам. Ну или наоборот свалит без объяснений ;)
14. vasilev2015 2757 05.05.25 17:04 Сейчас в теме
(13) Возможно кто-то заблуждается, считая что я причастен к работодателю ))
Отнюдь нет - я просто программист, который любит программировать.
15. vandalsvq 1608 05.05.25 22:26 Сейчас в теме
(7) хотели отсеять 99% кандидатов.

Стесняюсь спросить, а кто они такие и что предлагаете, чтобы 1% хотел к вам настолько? )))))
8. aximo 2319 05.05.25 13:20 Сейчас в теме
(7) категорически согласен
Оставьте свое сообщение