Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 17:00

Проверка Если

Автор aboba174, 19 мая 2023, 14:18

0 Пользователей и 1 гость просматривают эту тему.

aboba174

Здравствуйте. У меня есть код который на основании справочника создает заполненный документ "ФактПриемаНаРаботу". Что нужно написать в Если чтобы он смотрел есть ли такой уже сотрудник или нету? Чтобы 2 раз не создавался документ с одним и тем же сотрудником.

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
// Заполнение шапки
АдресПрописки = ДанныеЗаполнения.АдресПрописки;
ДатаВыдачи = ДанныеЗаполнения.ДатаВыдачи;
Должность = ДанныеЗаполнения.Должность;
КемВыдан = ДанныеЗаполнения.КемВыдан;
Пол = ДанныеЗаполнения.Пол;
СерияИНомерПаспорта = ДанныеЗаполнения.СерияИНомерПаспорта;
Сотрудник = ДанныеЗаполнения.Ссылка;
Телефон = ДанныеЗаполнения.Телефон;
КонецЕсли;

КонецПроцедуры



LexaK

aboba174, попробуйте такой код добавить
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
//проверка документа
лкОтбор = Новый Структура("Сотрудник", ДанныеЗаполнения);
Выборка = Документы.ФактПриемаНаРаботу.Выбрать(,,лкОтбор); 
Если Выборка.Следующий() Тогда
//есть уже такой документ, выходим   
Сообщить("Уже есть такой документ: " + Выборка.Ссылка);                   
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;

        // Заполнение шапки   
        АдресПрописки = ДанныеЗаполнения.АдресПрописки;
        ДатаВыдачи = ДанныеЗаполнения.ДатаВыдачи;
        Должность = ДанныеЗаполнения.Должность;
        КемВыдан = ДанныеЗаполнения.КемВыдан;
        Пол = ДанныеЗаполнения.Пол;
        СерияИНомерПаспорта = ДанныеЗаполнения.СерияИНомерПаспорта;
        Сотрудник = ДанныеЗаполнения.Ссылка;
        Телефон = ДанныеЗаполнения.Телефон;
    КонецЕсли;

КонецПроцедуры
почитайте про метод Выбрать(...), если не поможет (не получится) тогда писать запрос
если помогло нажмите: Спасибо!

aboba174

LexaK,
Вот такая ошибка лезет если попытаться "создать на основании" любого сотрудника.

Ошибка при вызове метода контекста (Выбрать)
{Документ.ФактПриемаНаРаботу.МодульОбъекта(7)}:      Выборка = Документы.ФактПриемаНаРаботу.Выбрать(,,лкОтбор);
по причине:
Недопустимое значение параметра (параметр номер '3')
Недопустимое значение параметра (параметр номер '3')

Kvark5d

aboba174, хм..если
Цитата: aboba174 от 19 мая 2023, 14:18есть код который на основании справочника создает заполненный документ
, значит элемент в справочнике уже есть? Что тогда проверять?

LexaK

aboba174, попробуйте такой код, с другим поиском
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
//проверка документа
лкДок = Документы.ФактПриемаНаРаботу.НайтиПоРеквизиту("Сотрудник", ДанныеЗаполнения);   
Если ЗначениеЗаполнено(лкДок) Тогда
//есть уже такой документ, выходим                     
СтандартнаяОбработка = Ложь;
Сообщить("Уже есть такой документ: " + лкДок);                   
Возврат;
КонецЕсли;
        // Заполнение шапки   
        АдресПрописки = ДанныеЗаполнения.АдресПрописки;
        ДатаВыдачи = ДанныеЗаполнения.ДатаВыдачи;
        Должность = ДанныеЗаполнения.Должность;
        КемВыдан = ДанныеЗаполнения.КемВыдан;
        Пол = ДанныеЗаполнения.Пол;
        СерияИНомерПаспорта = ДанныеЗаполнения.СерияИНомерПаспорта;
        Сотрудник = ДанныеЗаполнения.Ссылка;
        Телефон = ДанныеЗаполнения.Телефон;
    КонецЕсли;

КонецПроцедуры
если помогло нажмите: Спасибо!

aboba174

LexaK, Попробовал, все супер.

Я хочу объяснить еще маленькую проблему, но я сначала опишу свои действия.

1) Я захожу в справочник "Сотрудники", выбираю сотрудника и нажимаю кнопку "Ввод на основании". И например такой сотрудник уже есть, у меня открывается форма  "ФактПриемаНаРаботу" и она пустая, и если ее закрыть то оказавшись в справочниках, вылазит сообщение  СУже есть такой документ: и т.д.;

А можно ли как то чтобы и у документа она вылазила? Или вообще поставить на запрет открытие тогда формы документа? Типо Ложь;

LexaK

aboba174, да можно!
разные варианты могут быть, например вот один из
на форме списка Сотрудников сделайте свою/новую кнопку: Создать документ
в обработчике кнопки (понятное дело, код не проверял, могут быть ошибки)
&НаКлиенте
Процедура КомандаСоздатьДокумент(Команда)

текДанные = Элементы.Список.ТекущиеДанные;
Если текДанные = Неопределено Тогда
//не выделен нужный Сотрудник, ни чего не делаем
Возврат;
КонецЕсли;
лкДок = ПроверитьСоздатьДокументНаСервере(текДанные.Ссылка);
ПоказатьЗначение(,лкДок);

КонецПроцедуры

&НаСервере
Функция ПроверитьСоздатьДокументНаСервере(Сотрудник)

лкДок = Документы.ФактПриемаНаРаботу.НайтиПоРеквизиту("Сотрудник", Сотрудник);   
Если Не ЗначениеЗаполнено(лкДок) Тогда
//докуумен не найден, создаем новый
НовыйДок = Документы.ФактПриемаНаРаботу.СоздатьДокумент();
НовыйДок.Заполнить(Сотрудник);
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
лкДок = НовыйДок.Ссылка;
КонецЕсли;
Возврат лкДок

КонецФункции

при нажатии на кнопку будет открываться старый документ или создаваться новый
если помогло нажмите: Спасибо!

aboba174

LexaK, Единственная ошибка

Поле объекта не обнаружено (Список)
{Справочник.Сотрудники.Форма.ФормаЭлемента.Форма(4)}:   текДанные = Элементы.Список.ТекущиеДанные;

P.S Ааа, на форме списка же надо, ну-ка сейчас исправлю.

aboba174

Поле объекта не обнаружено (Ссылка)
{Справочник.Сотрудники.Форма.ФормаСписка.Форма(10)}:    лкДок = ПроверитьСоздатьДокументНаСервере(текДанные.Ссылка);
 
Вот ошибка какая вылазит.

LexaK

aboba174,
Запустите конфигуратор,
откройте форму списка,
найдите реквизит Список,
раскройте его по Плюсику, под ним появится список "составяющих его" реквизитов,
найдите в нем реквизит Ссылка
рабом с ним квадратик отметьте галочкой.
сохраните изменения
примените их
запустите базу 1С
попробуйте работу вашей кнопки
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск