Имя: Пароль:
1C
1С v8
Создание эл-та справочника из документа (8.3)
,
0 DenYuliya
 
18.12.17
15:15
Добрый день, коллеги.
Подскажите плиз, как правильно поступить?

Стоит задача при проведение документа Поступление (ПТиУ) из каждой строки ТЧ "Товары" создавать новый эл-т справочника "Характеристика номенклатуры", где "Наименование" эл-та спр-ка = "Номер документа + номер строки ТЧ".

У меня 2 варианта, откуда это делать:
1) Сделать кнопку на форме "Создать характеристики" и в модуле формы все обрабатывать.
2) В модуле объекта в "При записи" или в "Перед записью".

попыталась реализовать первый вариант.

&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
            
    Если Параметры.Ключ.Пустая() Тогда           
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
    Иначе        
         СоздатьНовуюХарактеристикуСервер();
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер()
    
    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл        
        НаименованиеХарактеристики = Объект.Номер + "/" + Объект.Дата + "/" + СтрокаТЧ.НомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        Характеристика = СтрокаТЧ.Характеристика;        
        Если (НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка()) Или (НоваяХарактеристика = Неопределено) Тогда         
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;             
            поискГОСТ  = Справочники.ркб_ГОСТ.НайтиПоКоду(строкаТЧ.ГОСТ.Код);
            Если ЗначениеЗаполнено(поискГОСТ) Тогда
                НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка;
            КонецЕсли;         
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        КонецЕсли;
        Характеристика = НоваяХарактеристика.Ссылка;                
    КонецЦикла;
    
КонецПроцедуры

Но в этом случае выдается ошибка:
{Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента.Форма(8290)}: Поле объекта недоступно для записи (ГОСТ)
НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка;


Как обойти эту ошибку? Или правильнее создавать эл-ты справочника в модуле документа, а не формы?

ГОСТ - это спр.Ссылка.
спр.Характеристики имеет реквизит спр.Гост
Форма документа ПТиУ имеет реквизит формы ГОСТ.
1 nordbox
 
18.12.17
15:23
2 DenYuliya
 
18.12.17
15:27
(1) никакой связи в статье по ссылке с заданным вопросом нет.
3 ptiz
 
18.12.17
15:52
(0) Посмотри внимательнее свой код. Я ошибку вижу сразу.
4 Lexey_
 
18.12.17
15:55
(0) Зачем искать по коду ссылку, если она уже есть?
поискГОСТ  = Справочники.ркб_ГОСТ.НайтиПоКоду(строкаТЧ.ГОСТ.Код);
5 DenYuliya
 
18.12.17
15:56
(3)
я уже тоже нашла, должно быть не

Если ЗначениеЗаполнено(поискГОСТ) Тогда
  НоваяХарактеристика.ГОСТ = поискГОСТ.Ссылка;
КонецЕсли;

а

Если ЗначениеЗаполнено(поискГОСТ) Тогда
  НовыйЭлемент.ГОСТ = поискГОСТ.Ссылка;
КонецЕсли;

Но боюсь, дело не в этом, сейчас проверю.
6 DenYuliya
 
18.12.17
15:58
(4) да)).
Что-то я сглупила, убрала эту часть. Но ошибка явно не в этом, просто избыточность кода получается.
7 Lexey_
 
18.12.17
15:58
(5) в этом
8 hhhh
 
18.12.17
16:08
(6) вот у вас

НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();

и должно быть

НовыйЭлемент.ГОСТ = поискГОСТ.Ссылка;
9 DenYuliya
 
18.12.17
17:33
Я, наверное, немного не так сформулировала вопрос.
Надо было, чтобы для каждой Номенклатуры из ТЧ "Товары" документа ПТиУ создавалась характеристика (в спр. ХарактеристикиНоменклатуры), и созданным элементом заполнялся соответствующий реквизит "Характеристика" в ТЧ "Товары" ПТиУ.

Так вот, путем незначиельных танцев с бубном Характеристики создаются.
Но реквизит "Характеристика" в ТЧ так же остается незаполненным.

По-идее можно было, наверное, так:
ТекДанные.Характеристика = НоваяХарактеристика;

Но ТекДанные у меня "На клиенте"... А создание НовойХарактеристика "НаСервере".

Чтобы их за ногу, эти УФ(((. Вроде погуглила этот вопрос в инете, но не поняла, что у меня не так((.
10 DenYuliya
 
18.12.17
17:33
Если делать так, то ошибок нет, но реквизит "Характеристика" в ТЧ документа все равно пустой:

&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    
    Если Параметры.Ключ.Пустая() Тогда           
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
    Иначе        
        СоздатьНовуюХарактеристикуСервер();        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер()
    
    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл        
        
        Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        
        Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда        
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;
            НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата;
            НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ;
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();        
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        КонецЕсли;        
        СтрокаТЧ.Характеристика = НоваяХарактеристика;                
    КонецЦикла;    
КонецПроцедуры
11 DenYuliya
 
18.12.17
17:34
Подскажите плиз, какой метод/из какого модуля (формы/документа?) надо использовать вместо
СтрокаТЧ.Характеристика = НоваяХарактеристика;  

?
12 Скиурус
 
18.12.17
17:48
Факультативный вопрос, а почему вы ЭТО пихаете в характеристики номенклатуры, а не в партию?
13 DenYuliya
 
18.12.17
17:53
(12) потому что)). Объяснять пару листов займет, особенность специфики отрасли.

Скажем так - это решение было выведено путем пары месяцев споров/обсуждений, в том числе с привлечением пары известных франчей.
14 DenYuliya
 
18.12.17
17:55
(12) ИМХО - "номер документа + номер строки" не очень читабельно и информативно для Характеристики, даже с учетом того, как Характеристику в УТ 11 позиционирует 1С (характеристики&доп.реквизиты...).
Но сра..ся на эту тему с гендиром и ИТ начальником надоело. Хотят они так - пущай будет так.
15 nordbox
 
18.12.17
18:01
ну вот блин, щазз опять скажешь не то ))
Порядок действий:
- получаем характеристику
- записываем свойства к характеристике
16 nordbox
 
18.12.17
18:23
http://www.itland.ru/forum/index.php?showtopic=6466
вот тут есть ответ на твой вопрос, если код читать захочешь
17 DenYuliya
 
19.12.17
09:44
(16) прочитала. В приведенной статье нет ответа на мой вопрос. Или я совсем слепая.
В приведенной ссылке описан процесс создания элемента (в примере РС, у меня справочника).
ВОПРОС НЕ В ЭТОМ!
У меня создается элемент справочника в справочник! В (10) описано. В справочнике "ХарактеристикиНом" после нажатия кнопки "СоздатьХарактеристики" на форме документа запись появляется.

Но созданный элемент не подставляется в реквизит "Характеристика" в строку ТЧ "Товары" документа ПТиУ.

Вопрос в том, как созданный элемент справочника записать в реквизит строки ТЧ.
18 DenYuliya
 
19.12.17
09:46
(15) да не надо мне создавать характеристику, она у меня создается нормально))))! И свойства у нас вообще не используются.

Мне надо созданный элемент справочника запихнуть в строку ТЧ, в реквизит.
У меня это не получается))).
19 FIXXXL
 
19.12.17
09:50
(18) покажи код, как в строку пихаешь
20 DenYuliya
 
19.12.17
09:51
&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    
    Если Параметры.Ключ.Пустая() Тогда           
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
    Иначе        
        СоздатьНовуюХарактеристикуСервер();        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер()
    
    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл        
        
        Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        
        Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда        
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;
            НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата;
            НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ;
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();        
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        КонецЕсли;
        
        СтрокаТЧ.Характеристика = НоваяХарактеристика;
                
    КонецЦикла;
        
КонецПроцедуры



Мне кажется, что проблема в этой части:
СтрокаТЧ.Характеристика = НоваяХарактеристика;

Может я что-то не доделала просто? Ошибок после выполнения нету, но "СтрокаТЧ.Характеристика" в документе(!) остается незаполненной.
Элемент в справочнике - создается, но не подставляется.
21 PiotrLoginov
 
19.12.17
09:51
Так. Много букв. Можно еще раз кратко сформулировать, в чем сейчас "затык"?

Если в заполнении реквизита, то кто мешает пройтись по ТЧ объекта и заполнить этот реквизит? В чем проблема?
22 PiotrLoginov
 
19.12.17
09:52
(20) Тип значения реквизита и создаваемого элемента совпадает?
23 PiotrLoginov
 
19.12.17
09:53
тут три сосны. Заблудиться невозможно.
24 FIXXXL
 
19.12.17
09:53
(20) типы значений в отладчике сравни
25 hhhh
 
19.12.17
09:59
(20) проверь может у номенклатуры не включено использование характеристик.
26 DenYuliya
 
19.12.17
10:00
(21) Проблема в заполнить реквизит созданными элементами справочника.
Мешает незнание, как это сделать.
Создается элемент - &НаСервере  (в (20) )
&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер()  

"Пройтись и присвоить значение" - вроде бы &НаКлиенте через ТекущиеДанные надо делать.  (в (20) )
&НаКлиенте
Процедура СоздатьХарактеристики(Команда)

Как передать с серверной на клиентскую созданный элемент?
Пыталась сделать так - не верно, ошибка (текст не помню, щас посмотрю, если надо):

&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    парХарактеристика = ТекДанные.Характеристика;
        
    Если Параметры.Ключ.Пустая() Тогда           
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
    Иначе        
        СоздатьНовуюХарактеристикуСервер(парХарактеристика);            
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер(парХарактеристика)
    
    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл            
        Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        
        Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда        
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;
            НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата;
            НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ;
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();        
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        КонецЕсли;
        
        парХарактеристика = НоваяХарактеристика;                
    КонецЦикла;
        
КонецПроцедуры
27 DenYuliya
 
19.12.17
10:02
(25) включено. Иначе бы характеристика не создавалась и "характеристика" не было бы обязательным для заполнения реквизитом ПТиУ - это как минимум).

(22),(24) вроде вчера все проверяла - спр.Ссылка.ХарактеристикиНом , но сейчас еще раз посмотрю, конечно.
28 PiotrLoginov
 
19.12.17
10:04
(26)
это можно делать на сервере. В (20) код "СтрокаТЧ.Характеристика = НоваяХарактеристика;" правильный


В типовых как программное дозаполнение ТЧ происходит? На клиенте, если это возможно. А если необходим вызов сервера, то всё происходит на сервере. Это нормально.
29 DenYuliya
 
19.12.17
10:07
(28) да вот и я что-то понять не могу((.
Я так на днях буквально заполняла обработкой, правда справочник...

Да я с клиент-сервером на "вы" пока что, вот и засомневалась, вдруг что-то упустила...
30 hhhh
 
19.12.17
10:12
(29)  ТекДанные = Элементы.Товары.ТекущиеДанные;   - выкинь

потому что ты в

    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл            

ты все строки заполняешь, а не только текущую

парХарактеристика выкинь

потому что ты в

    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл            

ты все строки заполняешь, а не только текущую


парХарактеристика = НоваяХарактеристика;   выкинь, до этого у тебя правильно было.
31 DenYuliya
 
19.12.17
10:16
(30)это я показала, как пробовала раньше, так не работает.
Хотя в принципе , как в (20) тоже не работает почему-то)).
32 hhhh
 
19.12.17
10:18
(30) а вообще-то где-то так

&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
        
    Если Параметры.Ключ.Пустая() Тогда          
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
    Иначе        
            ТекДанные.Характеристика = СоздатьНовуюХарактеристикуСервер(ТекДанные.НОменклатура, ТекДанные.НомерСтроки);            
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция СоздатьНовуюХарактеристикуСервер(парНоменклатура, парНомерСтроки)
    
        Если Не ЗначениеЗаполнено(парНоменклатура) Тогда
            Возврат НЕопределено;
        КонецЕсли;
        
        НаименованиеХарактеристики = Объект.Номер + "/" + парНомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        
        Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда        
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = парНоменклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;
            НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + парНомерСтроки + "/" + Объект.Дата;
            НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ;
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();        
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        КонецЕсли;
        
        Возврат НоваяХарактеристика;                
        
КонецФункции
33 Dmitrii
 
гуру
19.12.17
10:26
ОФФ. Какое забавное решение...
А что произойдёт, если в документе ПТиУ, по которому номенклатуру уже списали (продали или пустили в производство) вдруг задним числом поменяли порядок строк (переместили строки, добавили строку в середине, удалили строку из середины и т.п.)?
Создадутся новые характеристики на каждую строку?
А что в документах списания? - там как поменяется характеристика?
Зачем вообще нужен номер строки в характеристике?

(0) >> У меня 2 варианта... на форме ... В модуле объекта

Делать надо либо оба, либо только второй.
Ограничиться только первым нельзя так как документ может создаваться программно (без использования формы).

А еще надо не забыть про обработки заполнения (например, при копировании, чтобы характеристики очищались).
34 Мимохожий Однако
 
19.12.17
10:31
Отладчиком пошагово с проверкой подставляемых значений....Кофе у всех закончится от гадания.
35 DenYuliya
 
19.12.17
10:42
//Денисенко
&НаКлиенте
Процедура СоздатьХарактеристики(Команда)
    
    Если Параметры.Ключ.Пустая() Тогда           
        ПоказатьПредупреждение(,НСтр("ru = 'Запишите документ!'"), 10);
        Возврат;
    КонецЕсли;
        
    СоздатьНовуюХарактеристикуСервер()
    
КонецПроцедуры

&НаСервере
Процедура СоздатьНовуюХарактеристикуСервер()
    
    Для Каждого СтрокаТЧ  Из Объект.Товары Цикл    
        
        Если Не ЗначениеЗаполнено(СтрокаТЧ.Номенклатура) Тогда
            Продолжить;
        КонецЕсли;
        
        НаименованиеХарактеристики = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки;
        НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(НаименованиеХарактеристики);
        
        Если НоваяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда        
            НовыйЭлемент = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            НовыйЭлемент.Владелец = СтрокаТЧ.Номенклатура;    
            НовыйЭлемент.Наименование = НаименованиеХарактеристики;
            НовыйЭлемент.НаименованиеПолное = Объект.Номер + "/" + СтрокаТЧ.НомерСтроки + "/" + Объект.Дата;
            НовыйЭлемент.ГОСТ = СтрокаТЧ.ГОСТ;
            НовыйЭлемент.ДокументПоступления = Объект.Ссылка;
            НовыйЭлемент.Записать();        
            НоваяХарактеристика = НовыйЭлемент.Ссылка;
        Иначе
            Сообщить("Такая характерстика для номенклатуры " + СтрокаТЧ.Номенклатура + "уже существует!",СтатусСообщения.ОченьВажное);
            Возврат;
        КонецЕсли;
        
        СтрокаТЧ.Характеристика = НоваяХарактеристика;    
        
    КонецЦикла;
        
КонецПроцедуры



Так - работает.
мистика какая-то, вчера не работало. Сейчас сравню с тем, что вчера в тему выкладывала, но вроде бы ничего не меняла...
36 DenYuliya
 
19.12.17
10:44
(33) номер строки в характеристике - для уникальности наименования.
За ваши вопросы и дополнения - спасибо, подумаю над ними.
37 DenYuliya
 
19.12.17
10:47
Ничего не понимаю (((. (35) и (10) код одинаковый. Вчера не работало. Сегодня заработало. Все создается и заполняется норм.
Ночью перезапускли сервер... Барабашки шалят что ли?
38 PiotrLoginov
 
19.12.17
11:04
(37) вчера не надо было столько столько работать. Отдых тоже нужен. Цвет кожи восстанавливается, мысли приводятся в порядок, барабашки перестают шалить... ну и вообще настроение повышается
39 DenYuliya
 
19.12.17
11:12
(38) это точно))))
40 FIXXXL
 
19.12.17
11:42
"Миста - лучший отладчик" (с)
и бубен :)
41 Альбатрос
 
19.12.17
11:46
(33) Старые хар-ки на удаление метятся, новые заводятся.
(0) Посмотри конфу "Управление аптечной сетью". Один в один реализованы твои хотелки.
42 DenYuliya
 
19.12.17
11:52
(41) спасиб, поищу. Даже не слышала о такой.

Посидели, подумали с начальником- с "Номером стр" и правда дурная идея, (33) прав.
Сейчас что-нибудь еще подумаю))
43 Альбатрос
 
19.12.17
12:10
(42) Я бы не сказал, что дурная. Своеобразная это да.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан