Имя: Пароль:
1C
1С v8
Расширение реквизит таб. части
0 Масянька
 
21.12.21
11:10
День добрый!
Имеем: Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.19.48), 1С:Предприятие 8.3 (8.3.19.1264).
Расширение (дополнение) - добавлен документ (реквизиты, ТЧ, форма). В ТЧ добавлен новый реквизит.
Как связать?

&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Элемент = ЭтаФорма.Элементы.Добавить("ПричиныОбоснования", Тип("ПолеФормы"), ЭтаФорма.Элементы.Сотрудники);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = Объект.Сотрудники.ПричиныОбоснования;
КонецПроцедуры
Выдает ошибку:
Поле объекта не обнаружено (ПричиныОбоснования)
{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(241)}:Элемент.ПутьКДанным = Объект.Сотрудники.ПричиныОбоснования;
Спасибо.
1 Фрэнки
 
21.12.21
11:16
Добавление новых реквизитов в ТЧ типового документа Расширение разрешает, но вот таким образом "расширять" - моветон
2 Масянька
 
21.12.21
11:18
(1) А как не моветон?
3 Фрэнки
 
21.12.21
11:21
(2) либо в доп-сведения, что есть в типовом (это не всегда удобно, но застрянет в основной базе практически навсегда)
либо дописать в своем расширение регистр сведений и связать его множеством разных способов с основной ТЧ. В ЗУП для этих связок даже готовый реквзит в большинстве документов предусмотрен.
4 Фрэнки
 
21.12.21
11:22
типа, идентификатор строки ТЧ - через него можно
5 Масянька
 
21.12.21
11:24
(3) Спасибо.
Готовый - это ТЧ ДополнительныеРеквизиты?
6 Кулибин
 
21.12.21
11:25
(0)
    Если Элементы.Найти("ОСМЦ01") = Неопределено Тогда
        ТЧ = Элементы.Найти("ОС");
        ЭлементФормы = Элементы.Добавить("ОСМЦ01", Тип("ПолеФормы"), ТЧ);
        ЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;        
        ЭлементФормы.ПутьКДанным = "Объект.ОС.МЦ01";
        ЭлементФормы.ТолькоПросмотр = Истина;
        Элементы.Переместить(ЭлементФормы,Элементы.Найти("ОС"),Элементы.Найти("ОСОсновноеСредство"));
    КонецЕсли;

Вот так работает
7 Масянька
 
21.12.21
11:29
(6) Элемент.ПутьКДанным = "Объект.Сотрудники.ПричиныОбоснования";
выдает:
Недопустимое значение
{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(241)}:Элемент.ПутьКДанным = "Объект.Сотрудники._ПричиныОбоснования";
8 Кулибин
 
21.12.21
11:34
(7) Не знаю, кусок из "вчерашнего" кода, было проще скопировать, всё работает чётко.

Процедура:

&НаСервере
Процедура Адапт1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

Почему в нулевом и седьмом постах разные названия реквизита? Посмотри в отладчике, есть ли такой вообще))
9 Масянька
 
21.12.21
11:36
(8) Реквизит один и тот же - кусок названия убираю (могу косякнуть).
10 Масянька
 
21.12.21
11:47
Заработало так: ЭлементФормы.ПутьКДанным = "Сотрудники._ПричиныОбоснования";
11 Фрэнки
 
21.12.21
11:50
(5) // Готовый - это ТЧ ДополнительныеРеквизиты?

эти тч есть только у справочников
12 Масянька
 
21.12.21
11:55
13 Кулибин
 
21.12.21
11:59
(10) странно всё это, какая платформа? Но всё равно "пожалуйста")))
14 Масянька
 
21.12.21
12:00
(13) 8.3.19.1264
15 Масянька
 
21.12.21
12:00
(13) Странно - это очень мягко сказано...
16 Кулибин
 
21.12.21
12:03
У меня четвертая восьмерка и две крайние другие, скоро придется переписывать, видимо)
17 Кулибин
 
21.12.21
12:05
Проверил, без "Объект." валится.
18 Масянька
 
21.12.21
12:06
(17) У меня с объектом валится, а без объекта не пишет в реквизит. Один хрен - фигня полная...
19 Фрэнки
 
21.12.21
12:09
(12) в таких ТЧ Допреквизитов для документов все равно не хватает привязки к строкам из основной ТЧ, если там окажется много строк.
20 Мультук
 
гуру
21.12.21
12:13
(18)

Масянька, а вас не смущает, что "таблица" которую вы видите на форме вовсе не привязана к Объект.Сотрудники

а привязан к таблице значений "Сотрудники" (реквизит формы) ?
21 Масянька
 
21.12.21
12:15
(20) А Вы все не читаете? Принципиально?
Уже метод тыка пошел. Ошибка на "Объект.Сотрудники..."
22 Мультук
 
гуру
21.12.21
12:23
(21)

Еще раз для танкистов
>>> У меня с объектом валится, а без объекта не пишет в реквизит. Один хрен - фигня полная...

"таблица" которую вы видите на форме вовсе не привязана к Объект.Сотрудники, а привязана к таблице значений "Сотрудники" (реквизит формы)


Напишите уже код, который "При создании" будет совать ваш данные вашего реквизита в т.з. "Сотрудники", а при записи наоборот.

P.S.
ну или тыкайтесь, ага

P.P.S
Процедура ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)

Процедура ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)
23 Масянька
 
21.12.21
12:26
(22) Спасибо, буду пробовать.
24 Кулибин
 
21.12.21
12:35
(20) Ну, это в корне меняет дело)))
25 Масянька
 
22.12.21
10:22
(22) Вот:

&НаСервере
&После("ЗаполнитьФормуПоДаннымОбъекта")
Процедура _ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)
    // Массив для новых реквизитов
    ДобавляемыеРеквизиты = Новый Массив;
    
    // Опишем ревизиты формы
    Реквизит_Причины = Новый РеквизитФормы("ПричиныОбоснования", Новый ОписаниеТипов("ПеречислениеСсылка._ПричиныРаботыВыходнойПраздничныйДень"),
                                           "Объект.Сотрудники", "_ПричиныОбосновани");
    
    // Для наглядности заполним массив после описания реквизитов формы
    ДобавляемыеРеквизиты.Добавить(Реквизит_Причины);
    
    // Добавим новые реквизиты в форму
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);
    
    НовыйЭлемент = Элементы.Добавить("СотьрудникиПричиныОбоснования", Тип("ПолеФормы"), Элементы.Сотрудники);
    НовыйЭлемент.ПутьКДанным    = "Объект.Сотрудники._ПричиныОбоснования";
    НовыйЭлемент.Вид            = ВидПоляФормы.ПолеВвода;
КонецПроцедуры

Выдает:
Недопустимое значение
{_ЗУП Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(268)}:    НовыйЭлемент.ПутьКДанным    = "Объект.Сотрудники._ПричиныОбоснования";
{Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(598)}:    ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект);
{Документ.РаботаВВыходныеИПраздничныеДни.Форма.ФормаДокумента.Форма(70)}:    ПриПолученииДанныхНаСервере(ТекущийОбъект);

по причине:
Недопустимое значение
26 Мультук
 
гуру
22.12.21
10:52
(25)

1) Вас не смущает, что вы пытаетесь добавлять реквизиты в процедуре, которая при жизни формы будет вызываться более одного раза ?
2) Я написал про перенос данных, а НЕ про создание реквизитов


Наводящие вопросы.
1) Вы понимаете что фактически должны добавить новую колонку в реквизит формы "Сотрудники" (тип "ТаблицаЗначений")
2) Далее нужно где-то (например в "ПриСоздании") отобразить эту добавленную колонку на форме
3) Далее нужно модифицировать процедуры

Процедура ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)
Процедура ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)

чтобы значение из табличной части попадало в таблицу значений Сотрудники
а затем обратно
27 Масянька
 
22.12.21
10:57
(26) 1. Да
2. Да.
3. Непонятно что и как модифицировать.
Встречный вопрос: а почему нельзя вывести колонку (как обычно, в конфигураторе, в расширении) и просто установить связь?
28 Мультук
 
гуру
22.12.21
12:05
(27)

Будет три картинки

https://pastenow.ru/FF3J2

https://pastenow.ru/FF3ID

https://pastenow.ru/FF3KK

1) Добавляем в расширение нужные объекты
2) Перетаскиваем мышкой в расширении колонку "НекаяХерня" в табличную часть
3) Дописываем код
4) Смотрим, что получилось, проверяем что сохраняется и открывается
5) Пишем пост на мисту
6) Осторожнее с "ЗаполнитьФормуПоДаннымОбъекта" -- это чистой пример. Особо головой я не думал.


&НаСервере
&Вместо("ЗаполнитьОбъектПоДаннымФормы")
Процедура Расш1_ЗаполнитьОбъектПоДаннымФормы(ТекущийОбъект)
    
УстановитьПривилегированныйРежим(Истина);
    
    ТекущийОбъект.ВремяВЧасах = ВремяВЧасах = 1;
    ТекущийОбъект.Сотрудники.Очистить();
    
    ПоляБухучета = "";
    Если ТекущийОбъект.БухучетЗаданВСтрокахДокумента Тогда
        ПоляБухучета = "СтатьяФинансирования,СтатьяРасходов,СпособОтраженияЗарплатыВБухучете,ОтношениеКЕНВД";
    КонецЕсли;
    
    Для Каждого СтрокаТаблицы Из Сотрудники Цикл
        Для Каждого ДеньРаботы Из СписокДат Цикл
            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();
            НоваяСтрока.Сотрудник         = СтрокаТаблицы.Сотрудник;
            НоваяСтрока.СпособКомпенсацииПереработки = СтрокаТаблицы.СпособКомпенсацииПереработки;
            НоваяСтрока.Дата = ДеньРаботы.Значение;
            Если ТекущийОбъект.ВремяВЧасах Тогда
                НоваяСтрока.ОтработаноЧасов = СтрокаТаблицы[ИмяКолонкиДатаСтрока(ДеньРаботы.Значение)];
            Иначе
                НоваяСтрока.НеРаботал = НЕ СтрокаТаблицы[ИмяКолонкиРаботалСтрока(ДеньРаботы.Значение)];
            КонецЕсли;
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы, ПоляБухучета);
        КонецЦикла;
        Если СписокДат.Количество() = 0 Тогда
            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();
            НоваяСтрока.Сотрудник = СтрокаТаблицы.Сотрудник;
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы, ПоляБухучета);
        КонецЕсли;
        
        ///--------------------------------
        НоваяСтрока.НекаяХерня = СтрокаТаблицы.НекаяХерня;
        //---------------------------------
        
    КонецЦикла;
    
    Если Сотрудники.Количество() = 0 Тогда
        Для Каждого ДеньРаботы Из СписокДат Цикл
            НоваяСтрока = ТекущийОбъект.Сотрудники.Добавить();
            НоваяСтрока.Дата = ДеньРаботы.Значение;
        КонецЦикла;
    КонецЕсли;
    
    ТекущийОбъект.ДатаНачалаСобытия = ?(СписокДат.Количество() > 0, СписокДат[0].Значение, Объект.ПериодРегистрации);
    
    
КонецПроцедуры

&НаСервере
&Вместо("ЗаполнитьФормуПоДаннымОбъекта")
Процедура Расш1_ЗаполнитьФормуПоДаннымОбъекта(ТекущийОбъект)
        СписокДат.Очистить();
    Сотрудники.Очистить();
    
    ПраздничныеДни = ОбщегоНазначения.ВыгрузитьКолонку(ТекущийОбъект.Сотрудники, "Дата", Истина);
    Для каждого ПраздничныйДень Из ПраздничныеДни Цикл
        СписокДат.Добавить(ПраздничныйДень, Формат(ПраздничныйДень, "ДЛФ=Д"));
    КонецЦикла;
    ДобавитьКолонкиТаблицыСотрудники(СписокДат.ВыгрузитьЗначения());
    
    СтрокиСотрудников = Новый Соответствие;
    СотрудникиДокумента = Новый Массив;
    Для каждого СтрокаТЧ Из ТекущийОбъект.Сотрудники Цикл
        Если СотрудникиДокумента.Найти(СтрокаТЧ.Сотрудник) = Неопределено Тогда
            СотрудникиДокумента.Добавить(СтрокаТЧ.Сотрудник);
        КонецЕсли;
        СтрокиСотрудника = СтрокиСотрудников[СтрокаТЧ.Сотрудник];
        Если СтрокиСотрудника = Неопределено Тогда
            СтрокиСотрудникаПоСпособуКомпенсации = Новый Массив;
            СтрокиСотрудника = Новый Соответствие;
            СтрокиСотрудника.Вставить(СтрокаТЧ.СпособКомпенсацииПереработки, СтрокиСотрудникаПоСпособуКомпенсации);
            СтрокиСотрудников.Вставить(СтрокаТЧ.Сотрудник, СтрокиСотрудника);
        Иначе
            СтрокиСотрудникаПоСпособуКомпенсации = СтрокиСотрудника[СтрокаТЧ.СпособКомпенсацииПереработки];
            Если СтрокиСотрудникаПоСпособуКомпенсации = Неопределено Тогда
                СтрокиСотрудникаПоСпособуКомпенсации = Новый Массив;
                СтрокиСотрудника.Вставить(СтрокаТЧ.СпособКомпенсацииПереработки, СтрокиСотрудникаПоСпособуКомпенсации);
            КонецЕсли;
        КонецЕсли;
        СтрокиСотрудникаПоСпособуКомпенсации.Добавить(СтрокаТЧ);
    КонецЦикла;
    
    Для каждого СотрудникДокумента Из СотрудникиДокумента Цикл
        
        СтрокиСотрудника = СтрокиСотрудников[СотрудникДокумента];
        Для каждого СтрокиПоСпособуКомпенсации Из СтрокиСотрудника Цикл
            
            НоваяСтрока = Сотрудники.Добавить();
            НоваяСтрока.Сотрудник = СотрудникДокумента;
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокиПоСпособуКомпенсации.Значение[0]);
            
            
            
            Для каждого СтрокаТЧ Из СтрокиПоСпособуКомпенсации.Значение Цикл
                Если ЗначениеЗаполнено(СтрокаТЧ.Дата) Тогда
                    НоваяСтрока[ИмяКолонкиДатаСтрока(СтрокаТЧ.Дата)] = СтрокаТЧ.ОтработаноЧасов;
                    НоваяСтрока[ИмяКолонкиРаботалСтрока(СтрокаТЧ.Дата)] = НЕ СтрокаТЧ.НеРаботал;
                    
                    //------------------------------
                    НоваяСтрока.НекаяХерня = СтрокаТЧ.НекаяХерня;
                    //------------------------------
                    
                КонецЕсли;
            КонецЦикла;
        
        КонецЦикла;
        
    КонецЦикла;
    
    УстановитьДоступностьЭлементов();

КонецПроцедуры
29 Масянька
 
22.12.21
12:24
(28) 2-ой скрин: после того, как я добавила реквизит в табличную часть - этот реквизит не появляется в ТЗ -
https://ibb.co/RhjKr6f
30 Мультук
 
гуру
22.12.21
12:32
(29)
А он сам и не появится.
Добавляем его ручками в унаследованной форме в таблицу значений (см мой скриншот). Саму таблицу значений тоже придется унаследовать.
31 osa1C
 
22.12.21
12:34
(29) мат в два хода
32 Масянька
 
22.12.21
12:37
(30) В инструкции нету :)
(31) Я так и делала.
33 Масянька
 
22.12.21
13:31
(30) ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
😘😘😘😘😘😘
34 Масянька
 
22.12.21
13:37
Блин... А связь?
35 Масянька
 
22.12.21
13:43
(34) Мой косяк.
Еще раз СПАСИБО!
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.