Смена штатного программиста 1С — это всегда критический момент для компании. Особенно остро этот вопрос стоит в организациях, где развернут целый «зоопарк» конфигураций, таких как Управление торговлей 11, Бухгалтерия предприятия 3.0 и Зарплата и управление персоналом 3.1, работающих в связке под управлением СУБД PostgreSQL. В такой среде специалист должен обладать не просто навыками кодинга, но и глубоким пониманием типовых бизнес-процессов, логики работы СУБД и механизмов интеграции.
Рассмотрим, как правильно составить тестовое задание и сформировать пул проверочных вопросов для соискателя уровня Middle или Senior, чтобы быстро оценить его реальный опыт и отсеять «теоретиков».
Часто работодатели совершают ошибку, давая кандидатам абстрактные задачи на логику или написание простых отчетов с нуля. Это не дает представления о том, как человек будет вести себя в реальной боевой обстановке вашей базы. Проанализируем наиболее эффективные подходы к формированию проверочных материалов.
Для создания качественного теста выполним три простых шага:
Управление торговлей за последние полгода. Выделите ключевую доработку (например, интеграцию с локальной CRM-системой или специфический механизм резервирования товаров) и упростите ее до рамок тестовой задачи.Зарплатный учет в 1С таит в себе множество нюансов, и проверка кандидата на знание специфических механизмов ЗУП 3.1 позволяет сразу оценить уровень его практического опыта. Разберем показательный вопрос-ловушку.
Вопрос: Как отражается в программе Зарплата и управление персоналом 3.1 начисление и выплата прибыли (дивидендов) учредителям компании?
Разбор ситуации и правильный ответ:
Этот вопрос содержит классическую подставу, на которой срезаются многие программисты, не знающие реального функционала ЗУП. Начисление дивидендов регистрируется в программе специализированным документом НачислениеДивидендов. Однако с выплатой все гораздо интереснее.
В старых релизах ЗУП 3.1 (в рамках ветки 3.1.5 и ранее) функционал автоматической выплаты дивидендов отсутствовал — они проводились только для целей учета НДФЛ, а сама выплата отражалась в бухгалтерской базе. В современных релизах (начиная с ветки 3.1.7) появился специализированный документ ВедомостьНаВыплатуПрочихДоходов. Если кандидат отвечает, что выплата дивидендов оформляется стандартной ведомостью в банк или в кассу, это явный признак того, что он плохо знаком с логикой учета незарплатных доходов в ЗУП. Дивиденды относятся к прочим доходам, и их выплата должна производиться через реестр выплат прочих доходов.
В конфигурации Управление торговлей 11 механизмы планирования и контроля оплат существенно отличаются от старых версий (например, УТ 10.3). Проверим понимание архитектуры взаиморасчетов.
Вопрос: В каком случае используются объекты расчетов по заказам и каковы их главные плюсы и минусы?
Разбор ситуации и правильный ответ:
Объекты расчетов по заказам (детализация расчетов «По заказам» в договоре или соглашении) используются тогда, когда компании важно жестко контролировать оплату и отгрузку в разрезе каждой конкретной сделки (заказа клиента или заказа поставщику).
ПоступлениеБезналичныхДенежныхСредств) должны быть строго привязаны к конкретному заказу. Если менеджер или бухгалтер ошибается и указывает не тот заказ (или оставляет поле пустым), система распределяет оплату некорректно, ломая логику автоматического резервирования и отгрузки. Клиент-банк при автоматическом распознавании платежей часто не может сопоставить входящий платеж со счетом, если покупатель указал неверное назначение платежа, что требует постоянной ручной корректировки распределения оплат.Поскольку базы данных в вашей компании работают на СУБД PostgreSQL, кандидат должен понимать ключевые отличия этой СУБД от коммерческой MS SQL Server. Запросы, которые быстро выполняются в файловом режиме или на MS SQL, под управлением Postgres могут вызывать серьезные проблемы с производительностью.
Вопрос: Почему один и тот же запрос к базе 1С может мгновенно выполняться на MS SQL, но приводить к критическому зависанию на PostgreSQL? Что такое проблема Nested Loop в Postgres и как ее избежать?
Разбор ситуации и правильный ответ:
Планировщик запросов (Query Planner) СУБД PostgreSQL очень чувствителен к актуальности статистических данных таблиц. При неверной или устаревшей статистике планировщик некорректно оценивает кардинальность (количество строк), которые будут получены в результате выполнения подзапросов или соединений таблиц.
В результате этого Postgres часто выбирает алгоритм соединения вложенным циклом — Nested Loop вместо более эффективного Hash Join или Merge Join. Если внешняя таблица содержит десятки тысяч строк, выполнение вложенного цикла для каждой строки приводит к лавинообразному росту нагрузки на дисковую подсистему и процессор.
Для решения этой проблемы в 1С под PostgreSQL необходимо:
ANALYZE для таблиц баз данных).ГДЕ.Рассмотрим пример неоптимального запроса, который гарантированно вызовет проблемы производительности на PostgreSQL:
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество,
Цены.Цена
ИЗ
РегистрНакопления.ВыручкаИПродажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонецПериода) КАК Цены
ПО Продажи.Номенклатура = Цены.Номенклатура
Проанализируем этот запрос: здесь выполняется соединение двух виртуальных таблиц напрямую. Для оптимизации под PostgreSQL мы должны переписать этот код с использованием временных таблиц:
// Шаг 1: Выбираем продажи во временную таблицу
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
Продажи.Количество КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
РегистрНакопления.ВыручкаИПродажи.Обороты(&НачалоПериода, &КонецПериода) КАК Продажи
;
// Обязательно индексируем временную таблицу по полю соединения
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
// Шаг 2: Выбираем цены во вторую временную таблицу
ВЫБРАТЬ
Цены.Номенклатура КАК Номенклатура,
Цены.Цена КАК Цена
ПОМЕСТИТЬ ВТ_Цены
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонецПериода, Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТ_Продажи)) КАК Цены
;
ИНДЕКСИРОВАТЬ ПО
Номенклатура
;
// Шаг 3: Соединяем подготовленные временные таблицы
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Количество,
Цены.Цена
ИЗ
ВТ_Продажи КАК Продажи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цены КАК Цены
ПО Продажи.Номенклатура = Цены.Номенклатура
Кандидат уровня Middle+ должен хорошо ориентироваться в стандартах разработки фирмы «1С», механизмах БСП (Библиотеки стандартных подсистем) и управлении блокировками данных.
Ниже приведены три варианта практических заданий, которые можно предложить соискателю для выполнения непосредственно на собеседовании или в качестве домашнего задания (на выполнение должно уходить не более 1–2 часов).
Постановка задачи: Напишите фрагмент кода для проведения документа, который списывает остатки товаров со склада. Код должен быть защищен от ситуации «избыточного блокирования» и гарантировать корректность остатков при высокой параллельной работе пользователей. Использование механизма управляемых блокировок обязательно.
Ожидаемое решение: Кандидат должен продемонстрировать понимание работы объекта БлокировкаДанных. Блокировка должна накладываться строго перед чтением данных из регистра накопления остатков, чтобы исключить чтение грязных или изменяемых в этот момент данных другими сессиями.
Пример правильной реализации процедуры проведения документа на сервере:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Инициализируем объект управляемой блокировки
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
// Устанавливаем режим блокировки - Исключительный для предотвращения чтения другими транзакциями с целью изменения
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
// Передаем источник данных для блокировки (табличную часть документа)
ЭлементБлокировки.ИсточникДанных = Товары;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Склад", "Склад");
// Блокируем данные в транзакции перед выполнением запроса контроля остатков
Блокировка.Заблокировать();
// Далее следует запрос на получение текущих остатков и проверка на превышение остатка
// ...
КонецПроцедуры
В современных конфигурациях (включая УТ 11, БП 3.0, ЗУП 3.1) любые доработки печатных форм должны выполняться в виде внешних обработок, подключаемых через механизм «Дополнительные отчеты и обработки» Библиотеки стандартных подсистем (БСП). Это позволяет обновлять конфигурацию безболезненно.
Постановка задачи: Создать внешнюю печатную форму для документа РеализацияТоваровУслуг в УТ 11, которая выводит в макет значение дополнительного реквизита номенклатуры (например, «Артикул производителя»). Печатная форма должна регистрироваться в информационной базе без изменения конфигурации.
Ожидаемые действия кандидата:
СведенияОВнешнейОбработке().ПечатнаяФорма, назначение — соответствующий документ).Печать(), принимающей массив объектов и коллекцию печатных форм на входе.Иногда важнее проверить не то, насколько быстро кандидат пишет код, а то, как он мыслит в стрессовых ситуациях, когда «все упало».
Ситуация для обсуждения: Пользователи начали массово жаловаться на то, что время проведения документов реализации в УТ 11 увеличилось примерно в 5 раз по сравнению со вчерашним днем. Ваши действия по локализации и устранению проблемы?
Ожидаемый ход рассуждений кандидата:
ЗамерПроизводительности в конфигураторе (если проблему можно воспроизвести на тестовой копии базы). Это позволит точечно найти строку кода или запрос, на выполнение которого уходит больше всего времени.DBPOSTGRS (или DBMSSQL в зависимости от СУБД) и TTIMEOUT / TDEADLOCK для выявления взаимных блокировок СУБД или долгих запросов.Использование комплексного подхода, сочетающего проверку теоретических знаний специфики используемых конфигураций (УТ, БП, ЗУП), понимания платформенных механизмов работы с СУБД PostgreSQL и небольшого практического задания на разработку по стандартам БСП, позволит вам гарантированно подобрать квалифицированного специалиста, способного быстро и безболезненно войти в рабочий процесс компании.