Имя: Пароль:
1C
1С v8
посоветуйте как заполнить реквизит
0 dvrk
 
07.04.22
07:15
привет, в справочнике пользователи есть реквизит, ссылающийся на другой справочник, мне нужно заполнить у всех пользователей этот реквизит, наименование этого реквизита = наименование пользователя, как это сделать? написать обработку, которая будет искать по наименованию и наименование = наименование пользователя?
1 dvrk
 
07.04.22
07:43
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Пользователи.Ссылка КАК Ссылка,
                   |    Пользователи.Наименование КАК Наименование,
                   |    Пользователи.СотрКАК Сотр
                   |ИЗ
                   |    Справочник.Пользователи КАК Пользователи
                   |ГДЕ
                   |    Пользователи.ПометкаУдаления = ЛОЖЬ";
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого Польз из Результат Цикл
       Об = Польз.Ссылка.ПолучитьОбъект();
         Сотрд = Справочники.Сотр.НайтиПоНаименованию(Об.Наименование);
         Об.СотрудникИзЗУП = Сотрд;
         Об.записать();
         Сообщить("Записан " + Об);
        
        КонецЦикла;
КонецПроцедуры
2 dvrk
 
07.04.22
07:43
тип того?
3 XLife
 
07.04.22
07:49
позовите программиста
4 dvrk
 
07.04.22
07:53
(3) че не так написал?
5 Kigo_Kigo
 
07.04.22
08:38
если это одноразовая акция, то пойдет, но
Если Сотрд = Справочники.Сотр.НайтиПоНаименованию(Об.Наименование) тогда
Иначе
//Создать и записать
6 Ёпрст
 
07.04.22
09:08
(5) И зачем это ? условие всегда ложь
7 Ёпрст
 
07.04.22
09:08
за исключением случая с повтором наименования
8 Ryzeman
 
07.04.22
09:39
(2) Да, всё правильно. 1с штатно не умеет записывать объекты кроме как перебором по одному, так что в цикле. Единственное что за экономию букв в переменных в приличных обществах в бубен бьют) Ну и если вдруг повторно надо будет запустить в запрос я бы добавил "И НЕ Пользователи.СотрудникИзЗУП = ЗНАЧЕНИЕ(Справочник.Сотр.ПустаяСсылка)
Ещё надо проверить уникальны ли у тебя наименования...
9 dvrk
 
07.04.22
09:59
(8) так не даёт записать дубли
10 dvrk
 
07.04.22
10:02
(8) а про переменные - это разовая работа, дальше реквизит уже будет при создании элмента справочника заполняться
11 Kigo_Kigo
 
07.04.22
10:06
(6) (7)
Ну
Сотрд = Справочники.Сотр.НайтиПоНаименованию(Об.Наименование)
Если ЗначениеЗаполнено(Сотрд) тогда
12 Ёпрст
 
07.04.22
10:10
(11) И ? Это условие всегда Истина
13 Ёпрст
 
07.04.22
10:11
еще подумай.
14 Ryzeman
 
07.04.22
10:13
(10) судя по реквизитам СотрКАК  и справочнику "Сотр" у вас дефицит букв там острый) Попробуйте ctrl+пробел в отделе что ли...
15 dvrk
 
07.04.22
10:14
(14) это я его переименовал чтобы в глаза не бросался в топике именно, там нормально всё
16 Ryzeman
 
07.04.22
10:15
(15) Тогда ладно, беру свои слова назад)
17 Kassern
 
07.04.22
10:15
(12) почему вы решили, что всегда истина?
https://disk.yandex.ru/i/p35GM1ZzJZ4Zdw
18 Ёпрст
 
07.04.22
10:17
(17) подумай

Возвращаемое значение:
Тип: СправочникСсылка.<Имя справочника>, Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.
19 Ёпрст
 
07.04.22
10:17
Неопределено там будет только для справочника с длиной наименования =0.
20 Ёпрст
 
07.04.22
10:18
Во всех остальных случаях там  будет ссылка (не важно, пустая или найденная), которая всегда будет ЗначениеЗаполнено = истина.
21 Kassern
 
07.04.22
10:19
(0) Учитесь пользоваться запросами. Соедините левым соединением ваш справочник пользователей с сотрудниками. Свяжите их наименованиями в соединении. В отборе можете указать ЕстьNull(Сотрудники.Ссылка,"")="", тогда обрежутся строки пользователей, у которых наименование сотрудника совпадает с наименованием пользователя.
22 dvrk
 
07.04.22
10:19
(21) а чем мой вариант плох?
23 Kassern
 
07.04.22
10:20
(20) я вам только что скрин отправил, в котором пустая ссылка = ложь
24 Kassern
 
07.04.22
10:20
(20) вы вообще переходили по ссылке?)
25 Ryzeman
 
07.04.22
10:21
(20) Только что проверил - на пустую ссылку выдаёт ложь
26 Kassern
 
07.04.22
10:22
(22) не оптимальный. Вы обходите всех пользователей, не проверяя а нужно ли в них что-то менять. А если у вас половина пользователей уже имеет сотрудника? Смысл перезаписывать их. Поэтому проще сразу в запросе все сделать и проверить. А в выборке уже записать только нужные позиции
27 Ryzeman
 
07.04.22
10:22
28 Kassern
 
07.04.22
10:23
(25) незадокументированная фича)
Возвращаемое значение:
Тип: Булево.
Для значений типа Булево всегда возвращается Истина.
Для значений типа Строка возвращается Истина, если в строке есть непробельные символы.
Для массивов и коллекций возвращается Истина, если в них есть хотя бы 1 элемент.
Для Неопределено и Null всегда возвращается Ложь.
29 dvrk
 
07.04.22
10:23
(26) у меня ни у кого не заполнен реквизит этот
30 Ryzeman
 
07.04.22
10:24
(28) К слову, я этим даже как то раз пользовался. Но всё-таки предпочитаю явно проверять на пустую ссылку, если по логике возможно - в запросах
31 Kassern
 
07.04.22
10:24
(29) я вам просто указал на практику, как лучше делать. Сегодня вы раз запишите, завтра появится новый сотрудник, что делать будете?
32 dvrk
 
07.04.22
10:25
(31)у нового автоматом будет проставляться, но я понял о чем вы, спасибо
33 Kigo_Kigo
 
07.04.22
11:24
(12) (13) Да вот хрен там
Программист всегда исправляет последнюю ошибку.