Имя: Пароль:
1C
1С v8
Обновление СправочникСписок в обычной форме
0 Fannasankh
 
13.10.15
14:35
Обычная форма. На форме реквизит с типом СправочникСписок. Программно пишу новый элемент в этот справочник. На форме не отображается. Записать и обновить форму программно не помогает, хотя если записать руками, то новый элемент появляется. В чём может быть дело?
1 mehfk
 
13.10.15
14:36
В том, что ты пишешь в другой справочник. В том, что у тебя включен отбор. В том, что тебе кажется, что ты пишешь, а на самом деле нет. И еще 100500 вариантов.
2 Fannasankh
 
13.10.15
14:38
(1) пишу в этот, отбор включен, но мой элемент соответствует условиям.

Элемент начинает отображаеться после того как я руками нажимаю на форме "Записать". До этого его не видно.
3 Fish
 
13.10.15
14:39
(2) Ну так естественно. Пока элемент не записан, он в списке никак не появится.
4 ibreiter
 
13.10.15
14:42
Оповестить форму потому что нужно
5 Fannasankh
 
13.10.15
14:42
(3) элемент записан. Наверно, я не правильно объяснил.
Есть справочник1, у него на форме реквизит с типом СправочникСписок(Справочник2). Я создаю программно элемент справочника2(заполняю всё правильно). На форме справочника1 не отображается новый элемент справочника2, хотя он создан и записан. Обновление формы справочника1 не помогает. Помогает только нажать руками записать на форме справочника1, программно не помогает.
6 Fannasankh
 
13.10.15
14:45
(4) оповестить о чём? Всё выполняется синхронно.
7 Fannasankh
 
13.10.15
14:58
UP
8 Lexey_
 
13.10.15
15:02
обнови свой СправочникСписок(Справочник2)
9 Fannasankh
 
13.10.15
15:02
(8) не помогает. Ни программно, ни на форме
10 Fannasankh
 
13.10.15
15:03
Обновлял через метод реквизита Обновить()
11 ibreiter
 
13.10.15
15:05
Может вот это еще раз сделать: Я создаю программно элемент справочника2(заполняю всё правильно)?
12 kosts
 
13.10.15
15:07
Попробуй ОповеститьОЗаписиНового(<Объект>)
13 Fannasankh
 
13.10.15
15:08
(11) не особо понял
14 Fannasankh
 
13.10.15
15:09
(12) так это же для управляемой формы
15 Timon1405
 
13.10.15
15:11
исходный код со словом "обновить" будет или гадаем дальше?
16 kosts
 
13.10.15
15:11
Вот еще есть ОповеститьОбИзменении(<Ссылка>)
17 Fannasankh
 
13.10.15
15:21
ЗаполнитьЗначенияСвойств(ЭтотОбъект, РеквизитыКонтрагента);
    Если ЭтотОбъект.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо Тогда
        ЗаполнитьЮридическийАдрес(РеквизитыКонтрагента.ЮридическийАдрес);
        ЗаполнитьРуководителя(РеквизитыКонтрагента.Руководитель);
        ЗаполнитьТелефон(РеквизитыКонтрагента.Телефон);
    КонецЕсли;
    ЭтотОбъект.НаименованиеПолное = РеквизитыКонтрагента.НаименованиеПолное;
    ЭтотОбъект.Записать();
    ЭтаФорма.Обновить();
18 Fannasankh
 
13.10.15
15:21
Процедура ЗаполнитьРуководителя(Руководитель)
    Если Руководитель <> Неопределено Тогда
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    КонтактныеЛицаКонтрагентов.Ссылка
        |ИЗ
        |    Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
        |ГДЕ
        |    КонтактныеЛицаКонтрагентов.Владелец = &Владелец
        |    И КонтактныеЛицаКонтрагентов.Должность = &Должность";
        
        Запрос.УстановитьПараметр("Владелец", ЭтотОбъект.Ссылка);
        Запрос.УстановитьПараметр("Должность", Руководитель.Должность);
        
        Результат = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
        
        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            РуководительЗапись = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
        Иначе
            РуководительЗапись = Справочники.КонтактныеЛицаКонтрагентов.СоздатьЭлемент();
        КонецЕсли;
        РуководительЗапись.Должность = Руководитель.Должность;
        Если РуководительЗапись.КонтактноеЛицо = Справочники.КонтактныеЛица.ПустаяСсылка() Тогда
            КонтактноеЛицо = Справочники.КонтактныеЛица.СоздатьЭлемент();
        Иначе
            КонтактноеЛицо = РуководительЗапись.КонтактноеЛицо.ПолучитьОбъект();
        КонецЕсли;
        КонтактноеЛицо.Имя = Руководитель.Имя;
        КонтактноеЛицо.Фамилия = Руководитель.Фамилия;
        КонтактноеЛицо.Отчество = Руководитель.Отчество;
        КонтактноеЛицо.Наименование = Руководитель.Представление;
        КонтактноеЛицо.Записать();
        РуководительЗапись.КонтактноеЛицо = КонтактноеЛицо.Ссылка;
        РуководительЗапись.Наименование = Руководитель.Представление;
        РуководительЗапись.Должность = Руководитель.Должность;
        РуководительЗапись.Владелец = ЭтотОбъект.Ссылка;
        РуководительЗапись.Записать();

    КонецЕсли;
19 Fannasankh
 
13.10.15
15:22
вот при создании руководителя он не появляется в форме
20 Fannasankh
 
13.10.15
15:26
КонтактныеЛицаКонтрагента.Обновить() в конце процедуры не помогает
21 Fannasankh
 
13.10.15
15:26
(16) у меня СправочникСписок, а не динамический список
22 ibreiter
 
13.10.15
15:29
У вас СправочникСписок(Справочник2) как заполняется?
23 Kondarat
 
13.10.15
15:33
Для Справочник2 установлен отбор по владельцу?
24 Fannasankh
 
13.10.15
15:33
(22) Процедура ЗаполнитьРуководителя(Руководитель)
    Если Руководитель <> Неопределено Тогда
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    КонтактныеЛицаКонтрагентов.Ссылка
        |ИЗ
        |    Справочник.КонтактныеЛицаКонтрагентов КАК КонтактныеЛицаКонтрагентов
        |ГДЕ
        |    КонтактныеЛицаКонтрагентов.Владелец = &Владелец
        |    И КонтактныеЛицаКонтрагентов.Должность = &Должность";
        
        Запрос.УстановитьПараметр("Владелец", ЭтотОбъект.Ссылка);
        Запрос.УстановитьПараметр("Должность", Руководитель.Должность);
        
        Результат = Запрос.Выполнить();
        
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
        
        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            РуководительЗапись = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
        Иначе
            РуководительЗапись = Справочники.КонтактныеЛицаКонтрагентов.СоздатьЭлемент();
        КонецЕсли;
        РуководительЗапись.Должность = Руководитель.Должность;
        Если РуководительЗапись.КонтактноеЛицо = Справочники.КонтактныеЛица.ПустаяСсылка() Тогда
            КонтактноеЛицо = Справочники.КонтактныеЛица.СоздатьЭлемент();
        Иначе
            КонтактноеЛицо = РуководительЗапись.КонтактноеЛицо.ПолучитьОбъект();
        КонецЕсли;
        КонтактноеЛицо.Имя = Руководитель.Имя;
        КонтактноеЛицо.Фамилия = Руководитель.Фамилия;
        КонтактноеЛицо.Отчество = Руководитель.Отчество;
        КонтактноеЛицо.Наименование = Руководитель.Представление;
        КонтактноеЛицо.Записать();
        РуководительЗапись.КонтактноеЛицо = КонтактноеЛицо.Ссылка;
        РуководительЗапись.Наименование = Руководитель.Представление;
        РуководительЗапись.Должность = Руководитель.Должность;
        РуководительЗапись.Владелец = ЭтотОбъект.Ссылка;
        РуководительЗапись.Записать();

    КонецЕсли;
25 Fannasankh
 
13.10.15
15:34
(23) установлен, он там по умолчанию установлен, я его не менял
26 Fannasankh
 
13.10.15
15:43
up
27 Nuobu
 
13.10.15
15:47
(26) Попробуй обновить реквизит формы, к которому элемент формы привязан.
Что-то вроде ЭтаФорма.СправочникСписок.Прочитать();
28 Fannasankh
 
13.10.15
15:48
(27) ЭтаФорма.СправочникСписок.Обновить() - имеется. И никакого эффекта.
29 Nuobu
 
13.10.15
15:48
(28) А можно вместо "Обновить()" попробовать "Прочитать()"? Есть там такой метод?
30 Fannasankh
 
13.10.15
15:50
(29) нет, там единственный метод - "Обновить()"
31 ibreiter
 
13.10.15
15:50
(24) Ну ее можно вызвать после создания справочника?
32 Nuobu
 
13.10.15
15:52
(30) Вижу.
У тебя на форме, скорее всего, есть кнопка "Обновить" попробуй её нажать после создания своих записей.
33 Fannasankh
 
13.10.15
15:52
(31) кого её? Можно зайти в справочник "КонтактныеЛицаКонтрагентов" и там будет новый элемент. С проставленным владельцем. А в форме владельца не будет в списке нового элемента.
34 Fannasankh
 
13.10.15
15:53
(32) это было самое очевидное :) не помогает
есть ещё ЭтаФорма.ЭлементыФормы.КонтактныеЛицаКонтрагента.ОбновитьСтроки() - но тоже не туда
35 Nuobu
 
13.10.15
15:54
(34) А после переоткрытия формы оно появляется?
36 Nuobu
 
13.10.15
15:57
(34)     КонтактныеЛица.Отбор.ОбъектВладелец.Значение      = Ссылка;
    КонтактныеЛица.Отбор.ОбъектВладелец.Использование = Истина;

Попробуй это добавить.
37 Fannasankh
 
13.10.15
16:03
(35) появляется
38 Nuobu
 
13.10.15
16:04
(37) - (36) Пробовал?
39 ibreiter
 
13.10.15
16:04
(33) Я правильно понимаю, у вас справочник 2 заполняется вызовом ЗаполнитьРуководителя(Руководитель)?
40 Fannasankh
 
13.10.15
16:05
(39) да
41 ibreiter
 
13.10.15
16:05
(40) В модуле формы Справочника 1 вы программно добавляете новый элемент?
42 ibreiter
 
13.10.15
16:06
(41) В справочник 2
43 Fannasankh
 
13.10.15
16:08
(38) спасибо огромное, помогло. А то я уже убил на эту фигню половину от того, что вообще согласовано по задаче.
Хотя принцип мне на самом деле не ясен. Отбор и до этого стоял. Типа чтобы перечитать, нужно внести изменения в отбор... А почему нельзя просто обновить.
44 Fannasankh
 
13.10.15
16:08
(42) да. Проблема решилась. Решение в (36)
45 ibreiter
 
13.10.15
16:10
Я так представляю примерно порядок действий для формы справочника 1:

Проц ПриОткрытии
ЗаполнитьРуководителя(Руководитель)

Проц ДобавоениеВСпр2
Добавили новый элемент
ЗаполнитьРуководителя(Руководитель)
46 ibreiter
 
13.10.15
16:11
(44) Ну и хорошо)
Программист всегда исправляет последнюю ошибку.