Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

В конфигураторе 1С:Предприятие имеется три справочника: сотрудники, компания, должность

Елизавета Зотова Ученик (217), на голосовании 2 недели назад
В конфигураторе 1С:Предприятие имеется три справочника: сотрудники, компания, должность
Создан документ приём на работу. С реквизитом сотрудники с ссылкой на справочник сотрудники. Создана в документе табличная часть которая называется Трудовая деятельность. Реквизиты трудовой деятельности должность и место работы с ссылками на справочник должность и компания.

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

&НаСервере
Процедура ПриЗаписи(Отказ, СтандартнаяОбработка)
ТаблицаСотрудников = Новый Соответствие;
Для каждого Строка Из ЭтотОбъект.ТрудоваяДеятельность Цикл
Сотрудник = Строка.Сотрудник;
Если ТаблицаСотрудников.Найти(Сотрудник) = Неопределено Тогда
ТаблицаСотрудников.Вставить(Сотрудник, Строка.МестоРаботы.Ссылка.Компания);
Иначе
Если ТаблицаСотрудников[Сотрудник] <> Строка.МестоРаботы.Ссылка.Компания Тогда
Сообщить("Сотрудник уже работает в другой компании. Прием запрещен!");
Отказ = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Голосование за лучший ответ
Беспрекословный Эксперт Мыслитель (5978) 1 месяц назад
Ваш код предполагает перебор строк табличной части "Трудовая деятельность" и проверку, не добавлен ли сотрудник в ТаблицаСотрудников. Если сотрудник уже есть в таблице, проверяется, совпадает ли компания в новой строке с той, что уже записана для сотрудника. Если не совпадает — выводится сообщение о запрете приема на работу.

Однако, есть несколько моментов, на которые стоит обратить внимание:
  • Неправильное использование метода Найти. В 1С Соответствие.Найти не существует. Вместо этого следует использовать СодержитКлюч. Это может быть одной из причин, почему код "не выполняет нужную функцию".
  • Логика проверки компании. В вашем коде используется выражение Строка.МестоРаботы.Ссылка.Компания, которое кажется некорректным, поскольку обычно свойство Ссылка непосредственно указывает на элемент справочника, и дополнительное свойство .Компания здесь излишне, если только место работы само по себе не является ссылкой на другой справочник, который в свою очередь содержит компанию. Убедитесь, что путь к данным корректен.
  • Обработка ошибки и отказ. Код правильно устанавливает флаг Отказ в Истина при обнаружении, что сотрудник уже работает в другой компании. Это предотвращает запись документа.
  • Вот исправленный вариант кода:
 &НаСервере  
Процедура ПриЗаписи(Отказ, СтандартнаяОбработка)
ТаблицаСотрудников = Новый Соответствие;
Для каждого Строка Из ЭтотОбъект.ТрудоваяДеятельность Цикл
Сотрудник = Строка.Сотрудник;
МестоРаботы = Строка.МестоРаботы; // Предполагаем, что это ссылка на справочник "Компания"
Если Не ТаблицаСотрудников.СодержитКлюч(Сотрудник) Тогда
ТаблицаСотрудников.Вставить(Сотрудник, МестоРаботы);
Иначе
Если ТаблицаСотрудников[Сотрудник] <> МестоРаботы Тогда
Сообщить("Сотрудник уже работает в другой компании. Прием запрещен!");
Отказ = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проверьте, соответствует ли путь к данным о месте работы вашей структуре данных. Если место работы не является прямой ссылкой на справочник "Компания", вам возможно нужно будет скорректировать обращение к данным.
Похожие вопросы