При разработке отчетов или внешних обработок в 1С часто возникает задача собрать данные из разных регистров: актуальную должность из кадровой истории и контактную информацию из справочников. Начинающие разработчики часто сталкиваются с тем, что запрос возвращает «историю» изменений должностей вместо текущего значения, либо используют неоптимальные соединения. Давайте разберем, как решить эту задачу правильно и профессионально. Для автоматизации точечной миграции сведений между базами можно использовать инструмент для переноса данных между похожими конфигурациями 1С с гибкой настройкой правил сопоставления.
Основная сложность заключается в работе с виртуальными таблицами. Использование СрезПоследних без правильных параметров или попытка соединить таблицы через ИСТИНА приводит к тому, что система строит декартово произведение. Это означает, что для каждого email-адреса запрос пытается перебрать все записи кадровой истории. Нам же нужно только одно — актуальное состояние на текущий момент.
Рассмотрим, как правильно структурировать запрос. Вместо того чтобы пытаться сделать все в одном громоздком соединении, разобьем задачу на логические этапы:
СрезПоследних. Это гарантирует, что мы получим только последнюю актуальную запись для каждого сотрудника.Важно помнить, что если вы строите отчет на определенную дату, передавайте эту дату в параметры виртуальной таблицы СрезПоследних(&Дата, ), иначе запрос может вести себя непредсказуемо.
В современных конфигурациях, таких как БГУ 2.0, ЗУП 3.1 или ERP, не рекомендуется изобретать велосипед. Разработчики фирмы «1С» уже создали мощные инструменты в рамках БСП (Библиотеки стандартных подсистем).
В модулях менеджера многих справочников (в частности, в справочнике Сотрудники) существуют готовые функции, которые возвращают нужные данные. Например, функция ПолучитьДанныеСотрудников позволяет передать список сотрудников и массив полей, которые вы хотите получить. Это гораздо надежнее, чем прямой запрос к таблицам базы данных, так как:
БСП автоматически учитывают статусы сотрудников и периодичность данных.Если вам все же необходимо вывести email и обрезать его до символа «@», воспользуйтесь встроенными функциями языка запросов 1С. Рассмотрим, как это сделать программно:
ВЫБРАТЬ
ПОДСТРОКА(АдресЭП, 1, НАЙТИ(АдресЭП, "@") - 1) КАК ИмяПочты
ИЗ
Справочник.ФизическиеЛица.КонтактнаяИнформация
ГДЕ
НАЙТИ(АдресЭП, "@") > 0
Однако будьте внимательны: такой запрос вернет ошибку, если в базе данных есть записи, где поле АдресЭП пустое или не содержит знака «@». Всегда используйте конструкцию ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ для проверки наличия символа перед применением функции ПОДСТРОКА.
Прежде чем приступать к написанию кода, проанализируйте стандартные отчеты конфигурации. В БГУ 2.0 и других типовых решениях уже есть отчеты типа Личные данные сотрудников или Штатные сотрудники.
Совет: Откройте конфигуратор, найдите нужный отчет и посмотрите его схему компоновки данных (СКД). Там вы увидите, как опытные разработчики делают соединения таблиц, какие виртуальные таблицы используют и как фильтруют данные. Скопировать этот подход в свою задачу — это самый быстрый и правильный путь обучения.
В заключение, старайтесь максимально использовать готовые функции модулей. Это сделает ваш код более читаемым, поддерживаемым и устойчивым к обновлениям конфигурации. Если задача кажется слишком сложной — значит, вы, скорее всего, пытаетесь решить её «в лоб» через прямые соединения регистров, вместо того чтобы использовать готовые API системы. В случаях, когда прямая работа с кодом или API слишком трудозатратна, можно настроить программного робота для автоматизации действий пользователя без изменения конфигурации.